// Copyright 2020 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

#include <chrono>

#include "pw_chrono/system_clock.h"
#include "pw_chrono/system_timer.h"
#include "pw_sync/thread_notification.h"
#include "pw_unit_test/framework.h"

using namespace std::chrono_literals;

namespace pw::chrono {
namespace {

// We can't control the SystemClock's period configuration, so just in case
// duration cannot be accurately expressed in integer ticks, round the
// duration up.
constexpr SystemClock::duration kRoundedArbitraryShortDuration =
    SystemClock::for_at_least(42ms);
constexpr SystemClock::duration kRoundedArbitraryLongDuration =
    SystemClock::for_at_least(1s);

void ShouldNotBeInvoked(SystemClock::time_point) { FAIL(); }

TEST(SystemTimer, CancelInactive) {
  SystemTimer timer(ShouldNotBeInvoked);
  timer.Cancel();
}

TEST(SystemTimer, CancelExplicitly) {
  SystemTimer timer(ShouldNotBeInvoked);
  timer.InvokeAfter(kRoundedArbitraryLongDuration);
  timer.Cancel();
}

TEST(SystemTimer, CancelThroughDestruction) {
  SystemTimer timer(ShouldNotBeInvoked);
  timer.InvokeAfter(kRoundedArbitraryLongDuration);
}

TEST(SystemTimer, CancelThroughRescheduling) {
  SystemTimer timer(ShouldNotBeInvoked);
  timer.InvokeAfter(kRoundedArbitraryLongDuration);
  // Cancel the first with this rescheduling.
  timer.InvokeAfter(kRoundedArbitraryLongDuration);
  timer.Cancel();
}

// Helper class to let test cases easily instantiate a timer with a handler
// and its own context.
class TimerWithHandler {
 public:
  TimerWithHandler()
      : timer_([this](SystemClock::time_point expired_deadline) {
          this->OnExpiryCallback(expired_deadline);
        }) {}
  virtual ~TimerWithHandler() = default;

  // To be implemented by the test case.
  virtual void OnExpiryCallback(SystemClock::time_point expired_deadline) = 0;

  SystemTimer& timer() { return timer_; }

 private:
  SystemTimer timer_;
};

TEST(SystemTimer, StaticInvokeAt) {
  class TimerWithContext : public TimerWithHandler {
   public:
    void OnExpiryCallback(SystemClock::time_point expired_deadline) override {
      EXPECT_GE(SystemClock::now(), expired_deadline);
      EXPECT_EQ(expired_deadline, expected_deadline);
      callback_ran_notification.release();
    }

    SystemClock::time_point expected_deadline;
    sync::ThreadNotification callback_ran_notification;
  };
  static TimerWithContext uut;

  uut.expected_deadline = SystemClock::now() + kRoundedArbitraryShortDuration;
  uut.timer().InvokeAt(uut.expected_deadline);
  uut.callback_ran_notification.acquire();

  // Ensure you can re-use the timer.
  uut.expected_deadline = SystemClock::now() + kRoundedArbitraryShortDuration;
  uut.timer().InvokeAt(uut.expected_deadline);
  uut.callback_ran_notification.acquire();
}

TEST(SystemTimer, InvokeAt) {
  class TimerWithContext : public TimerWithHandler {
   public:
    void OnExpiryCallback(SystemClock::time_point expired_deadline) override {
      EXPECT_GE(SystemClock::now(), expired_deadline);
      EXPECT_EQ(expired_deadline, expected_deadline);
      callback_ran_notification.release();
    }

    SystemClock::time_point expected_deadline;
    sync::ThreadNotification callback_ran_notification;
  };
  TimerWithContext uut;

  uut.expected_deadline = SystemClock::now() + kRoundedArbitraryShortDuration;
  uut.timer().InvokeAt(uut.expected_deadline);
  uut.callback_ran_notification.acquire();

  // Ensure you can re-use the timer.
  uut.expected_deadline = SystemClock::now() + kRoundedArbitraryShortDuration;
  uut.timer().InvokeAt(uut.expected_deadline);
  uut.callback_ran_notification.acquire();

  // Ensure scheduling it in the past causes it to execute immediately.
  uut.expected_deadline = SystemClock::now() - SystemClock::duration(1);
  uut.timer().InvokeAt(uut.expected_deadline);
  uut.callback_ran_notification.acquire();
}

TEST(SystemTimer, InvokeAfter) {
  class TimerWithContext : public TimerWithHandler {
   public:
    void OnExpiryCallback(SystemClock::time_point expired_deadline) override {
      EXPECT_GE(SystemClock::now(), expired_deadline);
      EXPECT_GE(expired_deadline, expected_min_deadline);
      callback_ran_notification.release();
    }

    SystemClock::time_point expected_min_deadline;
    sync::ThreadNotification callback_ran_notification;
  };
  TimerWithContext uut;

  uut.expected_min_deadline =
      SystemClock::TimePointAfterAtLeast(kRoundedArbitraryShortDuration);
  uut.timer().InvokeAfter(kRoundedArbitraryShortDuration);
  uut.callback_ran_notification.acquire();

  // Ensure you can re-use the timer.
  uut.expected_min_deadline =
      SystemClock::TimePointAfterAtLeast(kRoundedArbitraryShortDuration);
  uut.timer().InvokeAfter(kRoundedArbitraryShortDuration);
  uut.callback_ran_notification.acquire();

  // Ensure scheduling it immediately works.
  uut.expected_min_deadline = SystemClock::now();
  uut.timer().InvokeAfter(SystemClock::duration(0));
  uut.callback_ran_notification.acquire();
}

TEST(SystemTimer, CancelFromCallback) {
  class TimerWithContext : public TimerWithHandler {
   public:
    void OnExpiryCallback(SystemClock::time_point) override {
      timer().Cancel();
      callback_ran_notification.release();
    }

    sync::ThreadNotification callback_ran_notification;
  };
  TimerWithContext uut;

  uut.timer().InvokeAfter(kRoundedArbitraryShortDuration);
  uut.callback_ran_notification.acquire();
}

TEST(SystemTimer, RescheduleAndCancelFromCallback) {
  class TimerWithContext : public TimerWithHandler {
   public:
    void OnExpiryCallback(SystemClock::time_point) override {
      timer().InvokeAfter(kRoundedArbitraryShortDuration);
      timer().Cancel();
      callback_ran_notification.release();
    }

    sync::ThreadNotification callback_ran_notification;
  };
  TimerWithContext uut;

  uut.timer().InvokeAfter(kRoundedArbitraryShortDuration);
  uut.callback_ran_notification.acquire();
}

TEST(SystemTimer, RescheduleFromCallback) {
  class TimerWithContext : public TimerWithHandler {
   public:
    void OnExpiryCallback(SystemClock::time_point expired_deadline) override {
      EXPECT_GE(SystemClock::now(), expired_deadline);

      EXPECT_EQ(expired_deadline, expected_deadline);
      invocation_count++;
      ASSERT_LE(invocation_count, kRequiredInvocations);
      if (invocation_count < kRequiredInvocations) {
        expected_deadline = expired_deadline + kPeriod;
        timer().InvokeAt(expected_deadline);
      } else {
        callbacks_done_notification.release();
      }
    }

    const uint8_t kRequiredInvocations = 5;
    const SystemClock::duration kPeriod = kRoundedArbitraryShortDuration;
    uint8_t invocation_count = 0;
    SystemClock::time_point expected_deadline;
    sync::ThreadNotification callbacks_done_notification;
  };
  TimerWithContext uut;

  uut.expected_deadline = SystemClock::now() + kRoundedArbitraryShortDuration;
  uut.timer().InvokeAt(uut.expected_deadline);
  uut.callbacks_done_notification.acquire();
}

TEST(SystemTimer, DoubleRescheduleFromCallback) {
  class TimerWithContext : public TimerWithHandler {
   public:
    void OnExpiryCallback(SystemClock::time_point expired_deadline) override {
      EXPECT_GE(SystemClock::now(), expired_deadline);

      EXPECT_EQ(expired_deadline, expected_deadline);
      invocation_count++;
      ASSERT_LE(invocation_count, kExpectedInvocations);
      if (invocation_count == 1) {
        expected_deadline = expired_deadline + kPeriod;
        timer().InvokeAt(expected_deadline);
        timer().InvokeAt(expected_deadline);
      } else {
        callbacks_done_notification.release();
      }
    }

    const uint8_t kExpectedInvocations = 2;
    const SystemClock::duration kPeriod = kRoundedArbitraryShortDuration;
    uint8_t invocation_count = 0;
    SystemClock::time_point expected_deadline;
    sync::ThreadNotification callbacks_done_notification;
  };
  TimerWithContext uut;

  uut.expected_deadline = SystemClock::now() + kRoundedArbitraryShortDuration;
  uut.timer().InvokeAt(uut.expected_deadline);
  uut.callbacks_done_notification.acquire();
}

}  // namespace
}  // namespace pw::chrono
