/*
 *  Copyright (c) 2020 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "test/run_loop.h"

#include "api/environment/environment.h"
#include "api/task_queue/task_queue_base.h"
#include "api/units/time_delta.h"
#include "api/units/timestamp.h"
#include "test/create_test_environment.h"
#include "test/gtest.h"

namespace webrtc {

TEST(RunLoopTest, TaskQueueOnThread) {
  test::RunLoop loop;
  EXPECT_EQ(TaskQueueBase::Current(), loop.task_queue());
  EXPECT_TRUE(loop.task_queue()->IsCurrent());
}

TEST(RunLoopTest, Flush) {
  test::RunLoop loop;
  int counter = 0;
  loop.PostTask([&counter]() { ++counter; });
  EXPECT_EQ(counter, 0);
  loop.Flush();
  EXPECT_EQ(counter, 1);
}

TEST(RunLoopTest, Delayed) {
  test::RunLoop loop;
  bool ran = false;
  loop.task_queue()->PostDelayedTask(
      [&ran, &loop]() {
        ran = true;
        loop.Quit();
      },
      TimeDelta::Millis(100));
  loop.Flush();
  EXPECT_FALSE(ran);
  loop.Run();
  EXPECT_TRUE(ran);
}

TEST(RunLoopTest, PostAndQuit) {
  test::RunLoop loop;
  bool ran = false;
  loop.PostTask([&ran, &loop]() {
    ran = true;
    loop.Quit();
  });
  loop.Run();
  EXPECT_TRUE(ran);
}

TEST(RunLoopTest, RunForWaitsForMaxWaitDurationIfNoQuit) {
  Environment env = CreateTestEnvironment();
  test::RunLoop loop;
  Timestamp start = env.clock().CurrentTime();
  loop.RunFor(TimeDelta::Millis(20));
  EXPECT_GE(env.clock().CurrentTime() - start, TimeDelta::Millis(19));
}

TEST(RunLoopTest, RunForQuitsEarlyIfQuitCalled) {
  Environment env = CreateTestEnvironment();
  test::RunLoop loop;
  Timestamp start = env.clock().CurrentTime();
  loop.task_queue()->PostDelayedHighPrecisionTask(loop.QuitClosure(),
                                                  TimeDelta::Millis(10));
  loop.RunFor(TimeDelta::Millis(20));
  EXPECT_LE(env.clock().CurrentTime() - start, TimeDelta::Millis(11));
}

TEST(RunLoopTest, RunForQuitsEarlyAndCancelsQuitCalls) {
  Environment env = CreateTestEnvironment();
  test::RunLoop loop;
  Timestamp start = env.clock().CurrentTime();
  loop.task_queue()->PostDelayedHighPrecisionTask(loop.QuitClosure(),
                                                  TimeDelta::Millis(10));
  loop.RunFor(TimeDelta::Millis(20));
  EXPECT_LE(env.clock().CurrentTime() - start, TimeDelta::Millis(11));

  Timestamp seconds_task_start = env.clock().CurrentTime();
  loop.task_queue()->PostDelayedHighPrecisionTask(loop.QuitClosure(),
                                                  TimeDelta::Millis(100));
  loop.Run();
  // If the old `RunFor` causes the loop to quit then this will be much shorter
  // than 100ms.
  EXPECT_GE(env.clock().CurrentTime() - seconds_task_start,
            TimeDelta::Millis(99));
}

}  // namespace webrtc
