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

#include <deque>

#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/test/test_pending_task.h"
#include "base/test/test_simple_task_runner.h"
#include "cc/base/delayed_unique_notifier.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cc {
namespace {

class TestNotifier : public DelayedUniqueNotifier {
 public:
  TestNotifier(base::SequencedTaskRunner* task_runner,
               const base::Closure& closure,
               const base::TimeDelta& delay)
      : DelayedUniqueNotifier(task_runner, closure, delay) {}
  ~TestNotifier() override {}

  // Overridden from DelayedUniqueNotifier:
  base::TimeTicks Now() const override { return now_; }

  void SetNow(base::TimeTicks now) { now_ = now; }

 private:
  base::TimeTicks now_;
};

class DelayedUniqueNotifierTest : public testing::Test {
 public:
  DelayedUniqueNotifierTest() : notification_count_(0) {}

  virtual void SetUp() override {
    notification_count_ = 0;
    task_runner_ = make_scoped_refptr(new base::TestSimpleTaskRunner);
  }

  void Notify() { ++notification_count_; }

  int NotificationCount() const { return notification_count_; }

  std::deque<base::TestPendingTask> TakePendingTasks() {
    std::deque<base::TestPendingTask> tasks = task_runner_->GetPendingTasks();
    task_runner_->ClearPendingTasks();
    return tasks;
  }

 protected:
  int notification_count_;
  scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
};

TEST_F(DelayedUniqueNotifierTest, ZeroDelay) {
  base::TimeDelta delay = base::TimeDelta::FromInternalValue(0);
  TestNotifier notifier(
      task_runner_.get(),
      base::Bind(&DelayedUniqueNotifierTest::Notify, base::Unretained(this)),
      delay);

  EXPECT_EQ(0, NotificationCount());

  // Basic schedule for |delay| from now.
  base::TimeTicks schedule_time =
      base::TimeTicks() + base::TimeDelta::FromInternalValue(10);

  notifier.SetNow(schedule_time);
  notifier.Schedule();

  std::deque<base::TestPendingTask> tasks = TakePendingTasks();
  ASSERT_EQ(1u, tasks.size());
  EXPECT_EQ(base::TimeTicks() + delay, tasks[0].GetTimeToRun());

  tasks[0].task.Run();
  EXPECT_EQ(1, NotificationCount());

  // 5 schedules should result in only one run.
  for (int i = 0; i < 5; ++i)
    notifier.Schedule();

  tasks = TakePendingTasks();
  ASSERT_EQ(1u, tasks.size());
  EXPECT_EQ(base::TimeTicks() + delay, tasks[0].GetTimeToRun());

  tasks[0].task.Run();
  EXPECT_EQ(2, NotificationCount());
}

TEST_F(DelayedUniqueNotifierTest, SmallDelay) {
  base::TimeDelta delay = base::TimeDelta::FromInternalValue(20);
  TestNotifier notifier(
      task_runner_.get(),
      base::Bind(&DelayedUniqueNotifierTest::Notify, base::Unretained(this)),
      delay);

  EXPECT_EQ(0, NotificationCount());

  // Basic schedule for |delay| from now (now: 30, run time: 50).
  base::TimeTicks schedule_time =
      base::TimeTicks() + base::TimeDelta::FromInternalValue(30);

  notifier.SetNow(schedule_time);
  notifier.Schedule();

  std::deque<base::TestPendingTask> tasks = TakePendingTasks();

  ASSERT_EQ(1u, tasks.size());
  EXPECT_EQ(base::TimeTicks() + delay, tasks[0].GetTimeToRun());

  // It's not yet time to run, so we expect no notifications.
  tasks[0].task.Run();
  EXPECT_EQ(0, NotificationCount());

  tasks = TakePendingTasks();

  ASSERT_EQ(1u, tasks.size());
  // Now the time should be delay minus whatever the value of now happens to be
  // (now: 30, run time: 50).
  base::TimeTicks scheduled_run_time = notifier.Now() + delay;
  base::TimeTicks scheduled_delay =
      base::TimeTicks() + (scheduled_run_time - notifier.Now());
  EXPECT_EQ(scheduled_delay, tasks[0].GetTimeToRun());

  // Move closer to the run time (time: 49, run time: 50).
  notifier.SetNow(notifier.Now() + base::TimeDelta::FromInternalValue(19));

  // It's not yet time to run, so we expect no notifications.
  tasks[0].task.Run();
  EXPECT_EQ(0, NotificationCount());

  tasks = TakePendingTasks();
  ASSERT_EQ(1u, tasks.size());

  // Now the time should be delay minus whatever the value of now happens to be.
  scheduled_delay = base::TimeTicks() + (scheduled_run_time - notifier.Now());
  EXPECT_EQ(scheduled_delay, tasks[0].GetTimeToRun());

  // Move to exactly the run time (time: 50, run time: 50).
  notifier.SetNow(notifier.Now() + base::TimeDelta::FromInternalValue(1));

  // It's time to run!
  tasks[0].task.Run();
  EXPECT_EQ(1, NotificationCount());

  tasks = TakePendingTasks();
  EXPECT_EQ(0u, tasks.size());
}

TEST_F(DelayedUniqueNotifierTest, RescheduleDelay) {
  base::TimeDelta delay = base::TimeDelta::FromInternalValue(20);
  TestNotifier notifier(
      task_runner_.get(),
      base::Bind(&DelayedUniqueNotifierTest::Notify, base::Unretained(this)),
      delay);

  base::TimeTicks schedule_time;
  // Move time 19 units forward and reschedule, expecting that we still need to
  // run in |delay| time and we don't get a notification.
  for (int i = 0; i < 10; ++i) {
    EXPECT_EQ(0, NotificationCount());

    // Move time forward 19 units.
    schedule_time = notifier.Now() + base::TimeDelta::FromInternalValue(19);
    notifier.SetNow(schedule_time);
    notifier.Schedule();

    std::deque<base::TestPendingTask> tasks = TakePendingTasks();

    ASSERT_EQ(1u, tasks.size());
    EXPECT_EQ(base::TimeTicks() + delay, tasks[0].GetTimeToRun());

    // It's not yet time to run, so we expect no notifications.
    tasks[0].task.Run();
    EXPECT_EQ(0, NotificationCount());
  }

  // Move time forward 20 units, expecting a notification.
  schedule_time = notifier.Now() + base::TimeDelta::FromInternalValue(20);
  notifier.SetNow(schedule_time);

  std::deque<base::TestPendingTask> tasks = TakePendingTasks();

  ASSERT_EQ(1u, tasks.size());
  EXPECT_EQ(base::TimeTicks() + delay, tasks[0].GetTimeToRun());

  // Time to run!
  tasks[0].task.Run();
  EXPECT_EQ(1, NotificationCount());
}

TEST_F(DelayedUniqueNotifierTest, CancelAndHasPendingNotification) {
  base::TimeDelta delay = base::TimeDelta::FromInternalValue(20);
  TestNotifier notifier(
      task_runner_.get(),
      base::Bind(&DelayedUniqueNotifierTest::Notify, base::Unretained(this)),
      delay);

  EXPECT_EQ(0, NotificationCount());

  // Schedule for |delay| seconds from now.
  base::TimeTicks schedule_time =
      notifier.Now() + base::TimeDelta::FromInternalValue(10);
  notifier.SetNow(schedule_time);
  notifier.Schedule();
  EXPECT_TRUE(notifier.HasPendingNotification());

  // Cancel the run.
  notifier.Cancel();
  EXPECT_FALSE(notifier.HasPendingNotification());

  std::deque<base::TestPendingTask> tasks = TakePendingTasks();

  ASSERT_EQ(1u, tasks.size());
  EXPECT_EQ(base::TimeTicks() + delay, tasks[0].GetTimeToRun());

  // Time to run, but a canceled task!
  tasks[0].task.Run();
  EXPECT_EQ(0, NotificationCount());
  EXPECT_FALSE(notifier.HasPendingNotification());

  tasks = TakePendingTasks();
  EXPECT_EQ(0u, tasks.size());

  notifier.Schedule();
  EXPECT_TRUE(notifier.HasPendingNotification());
  tasks = TakePendingTasks();

  ASSERT_EQ(1u, tasks.size());
  EXPECT_EQ(base::TimeTicks() + delay, tasks[0].GetTimeToRun());

  // Advance the time.
  notifier.SetNow(notifier.Now() + delay);

  // This should run since it wasn't canceled.
  tasks[0].task.Run();
  EXPECT_EQ(1, NotificationCount());
  EXPECT_FALSE(notifier.HasPendingNotification());

  for (int i = 0; i < 10; ++i) {
    notifier.Schedule();
    EXPECT_TRUE(notifier.HasPendingNotification());
    notifier.Cancel();
    EXPECT_FALSE(notifier.HasPendingNotification());
  }

  tasks = TakePendingTasks();

  ASSERT_EQ(1u, tasks.size());
  EXPECT_EQ(base::TimeTicks() + delay, tasks[0].GetTimeToRun());

  // Time to run, but a canceled task!
  notifier.SetNow(notifier.Now() + delay);
  tasks[0].task.Run();
  EXPECT_EQ(1, NotificationCount());

  tasks = TakePendingTasks();
  EXPECT_EQ(0u, tasks.size());
  EXPECT_FALSE(notifier.HasPendingNotification());
}

TEST_F(DelayedUniqueNotifierTest, ShutdownWithScheduledTask) {
  base::TimeDelta delay = base::TimeDelta::FromInternalValue(20);
  TestNotifier notifier(
      task_runner_.get(),
      base::Bind(&DelayedUniqueNotifierTest::Notify, base::Unretained(this)),
      delay);

  EXPECT_EQ(0, NotificationCount());

  // Schedule for |delay| seconds from now.
  base::TimeTicks schedule_time =
      notifier.Now() + base::TimeDelta::FromInternalValue(10);
  notifier.SetNow(schedule_time);
  notifier.Schedule();
  EXPECT_TRUE(notifier.HasPendingNotification());

  // Shutdown the notifier.
  notifier.Shutdown();

  // The task is still there, but...
  std::deque<base::TestPendingTask> tasks = TakePendingTasks();
  ASSERT_EQ(1u, tasks.size());

  // Running the task after shutdown does nothing since it's cancelled.
  tasks[0].task.Run();
  EXPECT_EQ(0, NotificationCount());

  tasks = TakePendingTasks();
  EXPECT_EQ(0u, tasks.size());

  // We are no longer able to schedule tasks.
  notifier.Schedule();
  tasks = TakePendingTasks();
  ASSERT_EQ(0u, tasks.size());

  // Verify after the scheduled time happens there is still no task.
  notifier.SetNow(notifier.Now() + delay);
  tasks = TakePendingTasks();
  ASSERT_EQ(0u, tasks.size());
}

TEST_F(DelayedUniqueNotifierTest, ShutdownPreventsSchedule) {
  base::TimeDelta delay = base::TimeDelta::FromInternalValue(20);
  TestNotifier notifier(
      task_runner_.get(),
      base::Bind(&DelayedUniqueNotifierTest::Notify, base::Unretained(this)),
      delay);

  EXPECT_EQ(0, NotificationCount());

  // Schedule for |delay| seconds from now.
  base::TimeTicks schedule_time =
      notifier.Now() + base::TimeDelta::FromInternalValue(10);
  notifier.SetNow(schedule_time);

  // Shutdown the notifier.
  notifier.Shutdown();

  // Scheduling a task no longer does anything.
  notifier.Schedule();
  std::deque<base::TestPendingTask> tasks = TakePendingTasks();
  ASSERT_EQ(0u, tasks.size());

  // Verify after the scheduled time happens there is still no task.
  notifier.SetNow(notifier.Now() + delay);
  tasks = TakePendingTasks();
  ASSERT_EQ(0u, tasks.size());
}

}  // namespace
}  // namespace cc
