# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import time
from typing import List


class Clock:
    """A clock source, allowing faking of time in tests."""

    def wait(self, seconds: float) -> None:
        time.sleep(seconds)


class FakeClock(Clock):
    """A fake Clock implementation, for testing."""

    def __init__(self) -> None:
        self.pauses: List[float] = []

    def wait(self, seconds: float) -> None:
        self.pauses.append(seconds)


class ExponentialBackoff:
    """Track a polling period, exponentially backing off each poll."""

    def __init__(
        self,
        clock: Clock,
        min_poll_seconds: float = 1.0,
        max_poll_seconds: float = 600.0,
        backoff: float = 1.4142135,
    ):
        self.min_poll_seconds: float = min_poll_seconds
        self.max_poll_seconds: float = max_poll_seconds
        self.current: float = min_poll_seconds
        self.backoff: float = backoff
        self.clock: Clock = clock

    def wait(self) -> None:
        self.clock.wait(self.current)
        self.current = min(self.current * self.backoff, self.max_poll_seconds)
