// 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 <string>

#include "base/cancelable_callback.h"
#include "base/format_macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/stringprintf.h"
#include "base/test/test_pending_task.h"
#include "cc/test/ordered_simple_task_runner.h"
#include "testing/gtest/include/gtest/gtest.h"

// We pass EXPECT_TRUE / EXPECT_FALSE macros rather than a boolean as on some
// compilers EXPECT_EQ(false, XXXX) fails to compile as  gtest tries to convert
// the false value to null causing a -Werror=conversion-null error.
#define RUN_AND_CHECK_RESULT(                             \
    tasks_remain_expect_macro, run_func, expected_result) \
  tasks_remain_expect_macro(task_runner_->run_func);      \
  EXPECT_EQ(expected_result, executed_tasks_);            \
  executed_tasks_ = "";

namespace {

bool ReturnTrue() {
  return true;
}

bool ReturnFalse() {
  return false;
}
};

namespace cc {

TEST(TestOrderablePendingTask, Ordering) {
  TestOrderablePendingTask a;
  TestOrderablePendingTask b;
  TestOrderablePendingTask c;

  EXPECT_EQ(a, a);
  EXPECT_EQ(b, b);
  EXPECT_EQ(c, c);
  EXPECT_LT(a, b);
  EXPECT_LT(b, c);
  EXPECT_LT(a, c);

  TestOrderablePendingTask a2 = a;
  EXPECT_EQ(a, a2);
  EXPECT_LT(a2, b);
  EXPECT_LT(b, c);
  EXPECT_LT(a2, c);
}

class OrderedSimpleTaskRunnerTest : public testing::Test {
 public:
  OrderedSimpleTaskRunnerTest()
      : now_src_(TestNowSource::Create(base::TimeTicks())) {
    task_runner_ = new OrderedSimpleTaskRunner(now_src_, true);
  }
  virtual ~OrderedSimpleTaskRunnerTest() {}

 protected:
  std::string executed_tasks_;
  scoped_refptr<TestNowSource> now_src_;
  scoped_refptr<OrderedSimpleTaskRunner> task_runner_;

  void PostTask(int task_num, base::TimeDelta delay) {
    base::Closure test_task = base::Bind(&OrderedSimpleTaskRunnerTest::Task,
                                         base::Unretained(this),
                                         task_num);
    task_runner_->PostDelayedTask(FROM_HERE, test_task, delay);
  }

  void PostTaskWhichPostsInstantTask(int task_num, base::TimeDelta delay) {
    base::Closure test_task =
        base::Bind(&OrderedSimpleTaskRunnerTest::TaskWhichPostsInstantTask,
                   base::Unretained(this),
                   task_num);
    task_runner_->PostDelayedTask(FROM_HERE, test_task, delay);
  }

  void PostTaskWhichPostsDelayedTask(int task_num,
                                     base::TimeDelta delay1,
                                     base::TimeDelta delay2) {
    base::Closure test_task =
        base::Bind(&OrderedSimpleTaskRunnerTest::TaskWhichPostsDelayedTask,
                   base::Unretained(this),
                   task_num,
                   delay2);
    task_runner_->PostDelayedTask(FROM_HERE, test_task, delay1);
  }

  void PostTaskWhichCallsRun(int task_num, base::TimeDelta delay) {
    base::Closure test_task =
        base::Bind(&OrderedSimpleTaskRunnerTest::TaskWhichCallsRun,
                   base::Unretained(this),
                   task_num);
    task_runner_->PostDelayedTask(FROM_HERE, test_task, delay);
  }

  void PostTaskWhichPostsTaskAgain(int task_num, base::TimeDelta delay) {
    base::Closure test_task =
        base::Bind(&OrderedSimpleTaskRunnerTest::TaskWhichPostsAgain,
                   base::Unretained(this),
                   task_num,
                   delay);
    task_runner_->PostDelayedTask(FROM_HERE, test_task, delay);
  }

 private:
  void Task(int task_num) {
    if (!executed_tasks_.empty())
      executed_tasks_ += " ";
    executed_tasks_ +=
        base::StringPrintf("%d(%" PRId64 "ms)",
                           task_num,
                           now_src_->Now().ToInternalValue() /
                               base::Time::kMicrosecondsPerMillisecond);
  }

  void TaskWhichPostsInstantTask(int task_num) {
    Task(task_num);
    PostTask(-task_num, base::TimeDelta());
  }

  void TaskWhichPostsDelayedTask(int task_num, base::TimeDelta delay) {
    Task(task_num);
    PostTask(-task_num, delay);
  }

  void TaskWhichCallsRun(int task_num) {
    Task(task_num);
    task_runner_->RunPendingTasks();
  }

  void TaskWhichPostsAgain(int task_num, base::TimeDelta delay) {
    Task(task_num);
    PostTaskWhichPostsTaskAgain(task_num, delay);
  }

  DISALLOW_COPY_AND_ASSIGN(OrderedSimpleTaskRunnerTest);
};

TEST_F(OrderedSimpleTaskRunnerTest, SimpleOrderingTest) {
  PostTask(1, base::TimeDelta());
  PostTask(2, base::TimeDelta());
  PostTask(3, base::TimeDelta());

  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "1(0ms) 2(0ms) 3(0ms)");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "");

  PostTask(4, base::TimeDelta());
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "4(0ms)");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "");
}

TEST_F(OrderedSimpleTaskRunnerTest, SimpleOrderingTestPostingTasks) {
  PostTaskWhichPostsInstantTask(1, base::TimeDelta());
  PostTaskWhichPostsInstantTask(2, base::TimeDelta());
  PostTaskWhichPostsInstantTask(3, base::TimeDelta());

  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunPendingTasks(), "1(0ms) 2(0ms) 3(0ms)");
  RUN_AND_CHECK_RESULT(
      EXPECT_FALSE, RunPendingTasks(), "-1(0ms) -2(0ms) -3(0ms)");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "");
}

TEST_F(OrderedSimpleTaskRunnerTest, SimpleOrderingTestPostingDelayedTasks) {
  PostTaskWhichPostsDelayedTask(
      1, base::TimeDelta(), base::TimeDelta::FromMilliseconds(1));
  PostTaskWhichPostsDelayedTask(
      2, base::TimeDelta(), base::TimeDelta::FromMilliseconds(1));
  PostTaskWhichPostsDelayedTask(
      3, base::TimeDelta(), base::TimeDelta::FromMilliseconds(1));

  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunPendingTasks(), "1(0ms) 2(0ms) 3(0ms)");
  RUN_AND_CHECK_RESULT(
      EXPECT_FALSE, RunPendingTasks(), "-1(1ms) -2(1ms) -3(1ms)");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "");
}

TEST_F(OrderedSimpleTaskRunnerTest,
       SimpleOrderingTestPostingReordingDelayedTasks) {
  PostTaskWhichPostsDelayedTask(1,
                                base::TimeDelta::FromMilliseconds(1),
                                base::TimeDelta::FromMilliseconds(20));
  PostTaskWhichPostsDelayedTask(2,
                                base::TimeDelta::FromMilliseconds(2),
                                base::TimeDelta::FromMilliseconds(5));
  PostTaskWhichPostsDelayedTask(3,
                                base::TimeDelta::FromMilliseconds(3),
                                base::TimeDelta::FromMilliseconds(5));

  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunPendingTasks(), "1(1ms) 2(2ms) 3(3ms)");
  RUN_AND_CHECK_RESULT(
      EXPECT_FALSE, RunPendingTasks(), "-2(7ms) -3(8ms) -1(21ms)");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "");
}

TEST_F(OrderedSimpleTaskRunnerTest,
       SimpleOrderingTestPostingReordingDelayedTasksOverlap) {
  PostTaskWhichPostsDelayedTask(1,
                                base::TimeDelta::FromMilliseconds(1),
                                base::TimeDelta::FromMilliseconds(5));
  PostTaskWhichPostsDelayedTask(2,
                                base::TimeDelta::FromMilliseconds(5),
                                base::TimeDelta::FromMilliseconds(10));
  PostTaskWhichPostsDelayedTask(3,
                                base::TimeDelta::FromMilliseconds(10),
                                base::TimeDelta::FromMilliseconds(1));

  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunPendingTasks(), "1(1ms) 2(5ms)");
  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunPendingTasks(), "-1(6ms) 3(10ms)");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "-3(11ms) -2(15ms)");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "");
}

TEST_F(OrderedSimpleTaskRunnerTest, SimpleOrderingTestPostingAndRentrantTasks) {
  PostTaskWhichPostsInstantTask(1, base::TimeDelta());
  PostTaskWhichCallsRun(2, base::TimeDelta());
  PostTaskWhichPostsInstantTask(3, base::TimeDelta());

  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunPendingTasks(), "1(0ms) 2(0ms) 3(0ms)");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "-1(0ms) -3(0ms)");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "");
}

TEST_F(OrderedSimpleTaskRunnerTest,
       SimpleOrderingTestPostingDelayedAndRentrantTasks) {
  PostTaskWhichPostsDelayedTask(
      1, base::TimeDelta(), base::TimeDelta::FromMilliseconds(1));
  PostTaskWhichCallsRun(2, base::TimeDelta());
  PostTaskWhichPostsDelayedTask(
      3, base::TimeDelta(), base::TimeDelta::FromMilliseconds(1));

  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunPendingTasks(), "1(0ms) 2(0ms) 3(0ms)");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "-1(1ms) -3(1ms)");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "");
}

TEST_F(OrderedSimpleTaskRunnerTest, OrderingTestWithDelayedTasks) {
  PostTask(1, base::TimeDelta());
  PostTask(2, base::TimeDelta::FromMilliseconds(15));
  PostTask(3, base::TimeDelta());
  PostTask(4, base::TimeDelta::FromMilliseconds(8));

  RUN_AND_CHECK_RESULT(
      EXPECT_FALSE, RunPendingTasks(), "1(0ms) 3(0ms) 4(8ms) 2(15ms)");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "");
}

TEST_F(OrderedSimpleTaskRunnerTest, OrderingTestWithDelayedPostingTasks) {
  PostTaskWhichPostsInstantTask(1, base::TimeDelta());
  PostTaskWhichPostsInstantTask(2, base::TimeDelta::FromMilliseconds(15));
  PostTaskWhichPostsInstantTask(3, base::TimeDelta());
  PostTaskWhichPostsInstantTask(4, base::TimeDelta::FromMilliseconds(8));

  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunPendingTasks(), "1(0ms) 3(0ms)");
  RUN_AND_CHECK_RESULT(
      EXPECT_TRUE, RunPendingTasks(), "-1(0ms) -3(0ms) 4(8ms)");
  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunPendingTasks(), "-4(8ms) 2(15ms)");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "-2(15ms)");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "");
}

TEST_F(OrderedSimpleTaskRunnerTest, OrderingTestWithDelayedTasksManualNow) {
  task_runner_->SetAutoAdvanceNowToPendingTasks(false);
  PostTask(1, base::TimeDelta());
  PostTask(2, base::TimeDelta::FromMilliseconds(15));
  PostTask(3, base::TimeDelta());
  PostTask(4, base::TimeDelta::FromMilliseconds(8));

  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunPendingTasks(), "1(0ms) 3(0ms)");
  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunPendingTasks(), "");
  EXPECT_EQ(task_runner_->DelayToNextTaskTime(),
            base::TimeDelta::FromMilliseconds(8));
  now_src_->SetNow(base::TimeTicks::FromInternalValue(5000));
  EXPECT_EQ(task_runner_->DelayToNextTaskTime(),
            base::TimeDelta::FromMilliseconds(3));
  now_src_->SetNow(base::TimeTicks::FromInternalValue(25000));
  EXPECT_EQ(task_runner_->DelayToNextTaskTime(), base::TimeDelta());
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "4(25ms) 2(25ms)");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "");
}

TEST_F(OrderedSimpleTaskRunnerTest, RunUntilIdle) {
  PostTaskWhichPostsInstantTask(1, base::TimeDelta());
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunUntilIdle(), "1(0ms) -1(0ms)");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunUntilIdle(), "");
}

TEST_F(OrderedSimpleTaskRunnerTest, RunUntilTimeAutoNow) {
  PostTaskWhichPostsInstantTask(1, base::TimeDelta());
  PostTaskWhichPostsInstantTask(2, base::TimeDelta::FromMilliseconds(2));
  PostTaskWhichPostsInstantTask(3, base::TimeDelta::FromMilliseconds(3));

  task_runner_->SetAutoAdvanceNowToPendingTasks(true);

  base::TimeTicks run_at = base::TimeTicks();

  run_at += base::TimeDelta::FromMilliseconds(2);
  RUN_AND_CHECK_RESULT(
      EXPECT_TRUE, RunUntilTime(run_at), "1(0ms) -1(0ms) 2(2ms) -2(2ms)");
  EXPECT_EQ(run_at, now_src_->Now());

  run_at += base::TimeDelta::FromMilliseconds(1);
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunUntilTime(run_at), "3(3ms) -3(3ms)");
  EXPECT_EQ(run_at, now_src_->Now());

  run_at += base::TimeDelta::FromMilliseconds(1);
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunUntilTime(run_at), "");
  EXPECT_EQ(run_at, now_src_->Now());
}

TEST_F(OrderedSimpleTaskRunnerTest, RunUntilTimeManualNow) {
  PostTaskWhichPostsInstantTask(1, base::TimeDelta());
  PostTaskWhichPostsInstantTask(2, base::TimeDelta::FromMilliseconds(2));
  PostTaskWhichPostsInstantTask(3, base::TimeDelta::FromMilliseconds(3));

  task_runner_->SetAutoAdvanceNowToPendingTasks(false);

  base::TimeTicks run_at = base::TimeTicks();

  run_at += base::TimeDelta::FromMilliseconds(2);
  RUN_AND_CHECK_RESULT(
      EXPECT_TRUE, RunUntilTime(run_at), "1(2ms) 2(2ms) -1(2ms) -2(2ms)");
  EXPECT_EQ(run_at, now_src_->Now());

  run_at += base::TimeDelta::FromMilliseconds(1);
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunUntilTime(run_at), "3(3ms) -3(3ms)");
  EXPECT_EQ(run_at, now_src_->Now());

  run_at += base::TimeDelta::FromMilliseconds(1);
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunUntilTime(run_at), "");
  EXPECT_EQ(run_at, now_src_->Now());
}

TEST_F(OrderedSimpleTaskRunnerTest, RunForPeriod) {
  PostTaskWhichPostsInstantTask(1, base::TimeDelta());
  PostTaskWhichPostsInstantTask(2, base::TimeDelta::FromMilliseconds(2));
  PostTaskWhichPostsInstantTask(3, base::TimeDelta::FromMilliseconds(3));

  RUN_AND_CHECK_RESULT(EXPECT_TRUE,
                       RunForPeriod(base::TimeDelta::FromMilliseconds(2)),
                       "1(0ms) -1(0ms) 2(2ms) -2(2ms)");
  EXPECT_EQ(base::TimeTicks() + base::TimeDelta::FromMilliseconds(2),
            now_src_->Now());

  RUN_AND_CHECK_RESULT(EXPECT_FALSE,
                       RunForPeriod(base::TimeDelta::FromMilliseconds(1)),
                       "3(3ms) -3(3ms)");
  EXPECT_EQ(base::TimeTicks() + base::TimeDelta::FromMilliseconds(3),
            now_src_->Now());

  RUN_AND_CHECK_RESULT(
      EXPECT_FALSE, RunForPeriod(base::TimeDelta::FromMilliseconds(1)), "");
  EXPECT_EQ(base::TimeTicks() + base::TimeDelta::FromMilliseconds(4),
            now_src_->Now());
}

TEST_F(OrderedSimpleTaskRunnerTest, RunTasksWhileWithCallback) {
  base::Callback<bool(void)> return_true = base::Bind(&ReturnTrue);
  base::Callback<bool(void)> return_false = base::Bind(&ReturnFalse);

  PostTask(1, base::TimeDelta());

  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunTasksWhile(return_false), "");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunTasksWhile(return_true), "1(0ms)");
}

TEST_F(OrderedSimpleTaskRunnerTest, EmptyTaskList) {
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunPendingTasks(), "");
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunUntilIdle(), "");

  ASSERT_EQ(base::TimeTicks(), now_src_->Now());

  RUN_AND_CHECK_RESULT(
      EXPECT_FALSE, RunUntilTime(base::TimeTicks::FromInternalValue(100)), "");
  EXPECT_EQ(base::TimeTicks::FromInternalValue(100), now_src_->Now());

  RUN_AND_CHECK_RESULT(
      EXPECT_FALSE, RunForPeriod(base::TimeDelta::FromInternalValue(100)), "");
  EXPECT_EQ(base::TimeTicks::FromInternalValue(200), now_src_->Now());

  base::Callback<bool(void)> return_true = base::Bind(&ReturnTrue);
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunTasksWhile(return_true), "");
}

TEST_F(OrderedSimpleTaskRunnerTest, RunPendingTasksTimeout) {
  PostTask(1, base::TimeDelta());
  PostTask(2, base::TimeDelta());
  PostTask(3, base::TimeDelta());
  PostTask(4, base::TimeDelta());
  PostTask(5, base::TimeDelta());
  PostTask(6, base::TimeDelta());

  task_runner_->SetRunTaskLimit(3);
  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunPendingTasks(), "1(0ms) 2(0ms) 3(0ms)");

  task_runner_->SetRunTaskLimit(2);
  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunPendingTasks(), "4(0ms) 5(0ms)");

  task_runner_->SetRunTaskLimit(0);
  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunPendingTasks(), "");
}

TEST_F(OrderedSimpleTaskRunnerTest, RunUntilIdleTimeout) {
  PostTaskWhichPostsTaskAgain(1, base::TimeDelta::FromMilliseconds(3));

  task_runner_->SetRunTaskLimit(3);
  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunUntilIdle(), "1(3ms) 1(6ms) 1(9ms)");

  task_runner_->SetRunTaskLimit(2);
  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunUntilIdle(), "1(12ms) 1(15ms)");

  task_runner_->SetRunTaskLimit(0);
  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunUntilIdle(), "");
}

TEST_F(OrderedSimpleTaskRunnerTest, RunUntilTimeout) {
  base::TimeTicks run_to = base::TimeTicks() + base::TimeDelta::FromSeconds(1);

  PostTask(1, base::TimeDelta::FromMilliseconds(1));
  PostTask(2, base::TimeDelta::FromMilliseconds(2));
  PostTask(3, base::TimeDelta::FromMilliseconds(3));
  PostTask(4, base::TimeDelta::FromMilliseconds(4));
  PostTask(5, base::TimeDelta::FromMilliseconds(5));

  EXPECT_EQ(base::TimeTicks(), now_src_->Now());
  task_runner_->SetRunTaskLimit(3);
  RUN_AND_CHECK_RESULT(
      EXPECT_TRUE, RunUntilTime(run_to), "1(1ms) 2(2ms) 3(3ms)");
  EXPECT_EQ(base::TimeTicks() + base::TimeDelta::FromMilliseconds(3),
            now_src_->Now());

  task_runner_->SetRunTaskLimit(0);
  RUN_AND_CHECK_RESULT(EXPECT_TRUE, RunUntilTime(run_to), "");

  task_runner_->SetRunTaskLimit(100);
  RUN_AND_CHECK_RESULT(EXPECT_FALSE, RunUntilTime(run_to), "4(4ms) 5(5ms)");
  EXPECT_EQ(run_to, now_src_->Now());
}

}  // namespace cc
