// Copyright 2018 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.

#include <lib/async-testing/test_loop.h>
#include <lib/async/cpp/task.h>
#include <lib/async/cpp/time.h>
#include <lib/async/cpp/wait.h>
#include <lib/async/default.h>
#include <lib/async/dispatcher.h>
#include <lib/async/task.h>
#include <lib/fit/function.h>
#include <lib/zx/event.h>
#include <lib/zx/time.h>
#include <sys/socket.h>
#include <zircon/assert.h>
#include <zircon/syscalls.h>
#include <zircon/types.h>

#include <array>
#include <memory>
#include <string>
#include <utility>

#include <zxtest/zxtest.h>

namespace {

// Initializes |wait| to wait on |event| to call |closure| once |trigger| is
// signaled.
void InitWait(async::Wait* wait, fit::closure closure, const zx::event& event,
              zx_signals_t trigger) {
  wait->set_handler([closure = std::move(closure)](async_dispatcher_t*, async::Wait*, zx_status_t,
                                                   const zx_packet_signal_t*) { closure(); });
  wait->set_object(event.get());
  wait->set_trigger(trigger);
}

TEST(TestLoopTest, DefaultDispatcherIsSetAndUnset) {
  ASSERT_NULL(async_get_default_dispatcher());
  {
    async::TestLoop loop;
    EXPECT_EQ(loop.dispatcher(), async_get_default_dispatcher());
  }
  EXPECT_NULL(async_get_default_dispatcher());
}

TEST(TestLoopTest, RandomSeedFromEnv) {
  const char* kTestRandomSeed = "1234";
  char* old_random_seed = getenv("TEST_LOOP_RANDOM_SEED");
  setenv("TEST_LOOP_RANDOM_SEED", kTestRandomSeed, /*overwrite=*/true);

  async::TestLoop loop;
  EXPECT_EQ(loop.initial_state(), 1234u);

  if (old_random_seed) {
    setenv("TEST_LOOP_RANDOM_SEED", old_random_seed, /*overwrite=*/true);
  } else {
    unsetenv("TEST_LOOP_RANDOM_SEED");
  }
}

TEST(TestLoopDispatcher, FakeClockTimeIsCorrect) {
  async::TestLoop loop;

  EXPECT_EQ(0, loop.Now().get());
  EXPECT_EQ(0, async::Now(loop.dispatcher()).get());

  loop.RunUntilIdle();
  EXPECT_EQ(0, loop.Now().get());
  EXPECT_EQ(0, async::Now(loop.dispatcher()).get());

  loop.RunFor(zx::nsec(1));
  EXPECT_EQ(1, loop.Now().get());
  EXPECT_EQ(1, async::Now(loop.dispatcher()).get());

  loop.RunUntil(zx::time() + zx::nsec(3));
  EXPECT_EQ(3, loop.Now().get());
  EXPECT_EQ(3, async::Now(loop.dispatcher()).get());

  loop.RunFor(zx::nsec(7));
  EXPECT_EQ(10, loop.Now().get());
  EXPECT_EQ(10, async::Now(loop.dispatcher()).get());

  loop.RunUntil(zx::time() + zx::nsec(12));
  EXPECT_EQ(12, loop.Now().get());
  EXPECT_EQ(12, async::Now(loop.dispatcher()).get());

  // t = 12, so nothing should happen in trying to reset the clock to t = 10.
  loop.RunUntil(zx::time() + zx::nsec(10));
  EXPECT_EQ(12, loop.Now().get());
  EXPECT_EQ(12, async::Now(loop.dispatcher()).get());
}

TEST(TestLoopTest, TasksAreDispatched) {
  async::TestLoop loop;
  bool called = false;
  async::PostDelayedTask(
      loop.dispatcher(), [&called] { called = true; }, zx::sec(2));

  // t = 1: nothing should happen.
  loop.RunFor(zx::sec(1));
  EXPECT_FALSE(called);

  // t = 2: task should be dispatched.
  loop.RunFor(zx::sec(1));
  EXPECT_TRUE(called);

  called = false;
  async::PostTask(loop.dispatcher(), [&called] { called = true; });
  loop.RunUntilIdle();
  EXPECT_TRUE(called);
}

TEST(TestLoopTest, QuitAndReset) {
  async::TestLoop loop;
  async::PostDelayedTask(
      loop.dispatcher(), [] {}, zx::sec(1));
  loop.Quit();

  // Loop has quit, so time does not advance and no work is done.
  EXPECT_FALSE(loop.RunFor(zx::sec(1)));
  EXPECT_EQ(loop.Now(), zx::time(0));

  // Loop has reset, so time does advance and work is done.
  EXPECT_TRUE(loop.RunFor(zx::sec(1)));
  EXPECT_EQ(loop.Now(), zx::time(0) + zx::sec(1));

  // Quit task is posted, followed by another task. The quit task is
  // dispatched and work is reported.
  async::PostTask(loop.dispatcher(), [&loop] { loop.Quit(); });
  async::PostTask(loop.dispatcher(), [] {});
  EXPECT_TRUE(loop.RunUntilIdle());

  // Loop was quit, but it is now reset  the remaining task will be dispatched
  // on the next run.
  EXPECT_TRUE(loop.RunUntilIdle());
}

TEST(TestLoopTest, RunRepeatedly) {
  async::TestLoop loop;
  for (int i = 0; i <= 60; ++i) {
    async::PostDelayedTask(
        loop.dispatcher(), [] {}, zx::sec(i));
  }
  // Run the loop repeatedly at ten second intervals until the delayed tasks
  // are all dispatched.
  loop.RunRepeatedlyFor(zx::sec(10));
  EXPECT_GE(loop.Now(), zx::time(0) + zx::min(1));

  // There should be nothing further to dispatch.
  EXPECT_FALSE(loop.RunUntilIdle());
}

TEST(TestLoopTest, SameDeadlinesDispatchInPostingOrder) {
  async::TestLoop loop;
  bool calledA = false;
  bool calledB = false;

  async::PostTask(loop.dispatcher(), [&] {
    EXPECT_FALSE(calledB);
    calledA = true;
  });
  async::PostTask(loop.dispatcher(), [&] {
    EXPECT_TRUE(calledA);
    calledB = true;
  });

  loop.RunUntilIdle();
  EXPECT_TRUE(calledA);
  EXPECT_TRUE(calledB);

  calledA = false;
  calledB = false;
  async::PostDelayedTask(
      loop.dispatcher(),
      [&] {
        EXPECT_FALSE(calledB);
        calledA = true;
      },
      zx::sec(5));
  async::PostDelayedTask(
      loop.dispatcher(),
      [&] {
        EXPECT_TRUE(calledA);
        calledB = true;
      },
      zx::sec(5));

  loop.RunFor(zx::sec(5));
  EXPECT_TRUE(calledA);
  EXPECT_TRUE(calledB);
}

// Test tasks that post tasks.
TEST(TestLoopTest, NestedTasksAreDispatched) {
  async::TestLoop loop;
  bool called = false;

  async::PostTask(loop.dispatcher(), [&] {
    async::PostDelayedTask(
        loop.dispatcher(),
        [&] {
          async::PostDelayedTask(
              loop.dispatcher(), [&] { called = true; }, zx::min(25));
        },
        zx::min(35));
  });

  loop.RunFor(zx::hour(1));
  EXPECT_TRUE(called);
}

TEST(TestLoopTest, TimeIsCorrectWhileDispatching) {
  async::TestLoop loop;
  bool called = false;

  async::PostTask(loop.dispatcher(), [&] {
    EXPECT_EQ(0, loop.Now().get());

    async::PostDelayedTask(
        loop.dispatcher(),
        [&] {
          EXPECT_EQ(10, loop.Now().get());
          async::PostDelayedTask(
              loop.dispatcher(),
              [&] {
                EXPECT_EQ(15, loop.Now().get());
                async::PostTask(loop.dispatcher(), [&] {
                  EXPECT_EQ(15, loop.Now().get());
                  called = true;
                });
              },
              zx::nsec(5));
        },
        zx::nsec(10));
  });

  loop.RunFor(zx::nsec(15));
  EXPECT_TRUE(called);
}

TEST(TestLoopTest, TasksAreCanceled) {
  async::TestLoop loop;
  bool calledA = false;
  bool calledB = false;
  bool calledC = false;

  async::TaskClosure taskA([&calledA] { calledA = true; });
  async::TaskClosure taskB([&calledB] { calledB = true; });
  async::TaskClosure taskC([&calledC] { calledC = true; });

  ASSERT_OK(taskA.Post(loop.dispatcher()));
  ASSERT_OK(taskB.Post(loop.dispatcher()));
  ASSERT_OK(taskC.Post(loop.dispatcher()));

  ASSERT_OK(taskA.Cancel());
  ASSERT_OK(taskC.Cancel());

  loop.RunUntilIdle();

  EXPECT_FALSE(calledA);
  EXPECT_TRUE(calledB);
  EXPECT_FALSE(calledC);
}

TEST(TestLoopTest, TimeIsAdvanced) {
  async::TestLoop loop;

  bool called = false;
  async::TaskClosure task([&called] { called = true; });
  auto time1 = async::Now(loop.dispatcher());

  ASSERT_EQ(ZX_OK, task.PostDelayed(loop.dispatcher(), zx::duration(1)));

  loop.RunUntilIdle();

  EXPECT_FALSE(called);
  EXPECT_EQ(time1.get(), async::Now(loop.dispatcher()).get());

  loop.AdvanceTimeByEpsilon();

  auto time2 = async::Now(loop.dispatcher());

  EXPECT_FALSE(called);
  EXPECT_GT(time2.get(), time1.get());

  loop.RunUntilIdle();

  EXPECT_TRUE(called);
  EXPECT_EQ(time2.get(), async::Now(loop.dispatcher()).get());
}

TEST(TestLoopTest, WaitsAreDispatched) {
  async::TestLoop loop;
  async::Wait wait;
  zx::event event;
  bool called = false;

  ASSERT_EQ(ZX_OK, zx::event::create(0u, &event));
  InitWait(
      &wait, [&called] { called = true; }, event, ZX_USER_SIGNAL_0);
  ASSERT_EQ(ZX_OK, wait.Begin(loop.dispatcher()));

  // |wait| has not yet been triggered.
  loop.RunUntilIdle();
  EXPECT_FALSE(called);

  ASSERT_EQ(ZX_OK, event.signal(0u, ZX_USER_SIGNAL_1));

  // |wait| will only be triggered by |ZX_USER_SIGNAL_0|.
  loop.RunUntilIdle();
  EXPECT_FALSE(called);

  ASSERT_EQ(ZX_OK, event.signal(0u, ZX_USER_SIGNAL_0));

  loop.RunUntilIdle();
  EXPECT_TRUE(called);
}

// Test waits that trigger waits.
TEST(TestLoopTest, NestedWaitsAreDispatched) {
  async::TestLoop loop;
  zx::event event;
  async::Wait waitA;
  async::Wait waitB;
  async::Wait waitC;
  bool calledA = false;
  bool calledB = false;
  bool calledC = false;

  ASSERT_EQ(ZX_OK, zx::event::create(0u, &event));
  InitWait(
      &waitA,
      [&] {
        InitWait(
            &waitB,
            [&] {
              InitWait(
                  &waitC, [&] { calledC = true; }, event, ZX_USER_SIGNAL_2);
              waitC.Begin(loop.dispatcher());
              calledB = true;
            },
            event, ZX_USER_SIGNAL_1);
        waitB.Begin(loop.dispatcher());
        calledA = true;
      },
      event, ZX_USER_SIGNAL_0);

  ASSERT_EQ(ZX_OK, waitA.Begin(loop.dispatcher()));

  loop.RunUntilIdle();
  EXPECT_FALSE(calledA);
  EXPECT_FALSE(calledB);
  EXPECT_FALSE(calledC);

  ASSERT_EQ(ZX_OK, event.signal(0u, ZX_USER_SIGNAL_0));

  loop.RunUntilIdle();
  EXPECT_TRUE(calledA);
  EXPECT_FALSE(calledB);
  EXPECT_FALSE(calledC);

  ASSERT_EQ(ZX_OK, event.signal(0u, ZX_USER_SIGNAL_1));

  loop.RunUntilIdle();
  EXPECT_TRUE(calledA);
  EXPECT_TRUE(calledB);
  EXPECT_FALSE(calledC);

  ASSERT_EQ(ZX_OK, event.signal(0u, ZX_USER_SIGNAL_2));

  loop.RunUntilIdle();
  EXPECT_TRUE(calledA);
  EXPECT_TRUE(calledB);
  EXPECT_TRUE(calledC);
}

TEST(TestLoopTest, WaitsAreCanceled) {
  async::TestLoop loop;
  zx::event event;
  async::Wait waitA;
  async::Wait waitB;
  async::Wait waitC;
  bool calledA = false;
  bool calledB = false;
  bool calledC = false;

  ASSERT_EQ(ZX_OK, zx::event::create(0u, &event));

  InitWait(
      &waitA, [&calledA] { calledA = true; }, event, ZX_USER_SIGNAL_0);
  InitWait(
      &waitB, [&calledB] { calledB = true; }, event, ZX_USER_SIGNAL_0);
  InitWait(
      &waitC, [&calledC] { calledC = true; }, event, ZX_USER_SIGNAL_0);

  ASSERT_OK(waitA.Begin(loop.dispatcher()));
  ASSERT_OK(waitB.Begin(loop.dispatcher()));
  ASSERT_OK(waitC.Begin(loop.dispatcher()));

  ASSERT_OK(waitA.Cancel());
  ASSERT_OK(waitC.Cancel());
  ASSERT_OK(event.signal(0u, ZX_USER_SIGNAL_0));

  loop.RunUntilIdle();
  EXPECT_FALSE(calledA);
  EXPECT_TRUE(calledB);
  EXPECT_FALSE(calledC);
}

// Test a task that begins a wait to post a task.
TEST(TestLoopTest, NestedTasksAndWaitsAreDispatched) {
  async::TestLoop loop;
  zx::event event;
  async::Wait wait;
  bool wait_begun = false;
  bool wait_dispatched = false;
  bool inner_task_dispatched = false;

  ASSERT_OK(zx::event::create(0u, &event));
  InitWait(
      &wait,
      [&] {
        async::PostDelayedTask(
            loop.dispatcher(), [&] { inner_task_dispatched = true; }, zx::min(2));
        wait_dispatched = true;
      },
      event, ZX_USER_SIGNAL_0);
  async::PostDelayedTask(
      loop.dispatcher(),
      [&] {
        wait.Begin(loop.dispatcher());
        wait_begun = true;
      },
      zx::min(3));

  loop.RunFor(zx::min(3));
  EXPECT_TRUE(wait_begun);
  EXPECT_FALSE(wait_dispatched);
  EXPECT_FALSE(inner_task_dispatched);

  ASSERT_OK(event.signal(0u, ZX_USER_SIGNAL_0));

  loop.RunUntilIdle();
  EXPECT_TRUE(wait_begun);
  EXPECT_TRUE(wait_dispatched);
  EXPECT_FALSE(inner_task_dispatched);

  loop.RunFor(zx::min(2));
  EXPECT_TRUE(wait_begun);
  EXPECT_TRUE(wait_dispatched);
  EXPECT_TRUE(inner_task_dispatched);
}

TEST(TestLoopTest, DefaultDispatcherIsCurrentLoop) {
  async::TestLoop loop;
  auto subloop = loop.StartNewLoop();
  bool main_loop_task_run = false;
  async_dispatcher_t* main_loop_task_dispatcher = nullptr;
  bool sub_loop_task_run = false;
  async_dispatcher_t* sub_loop_task_dispatcher = nullptr;

  async::PostTask(loop.dispatcher(), [&] {
    main_loop_task_run = true;
    main_loop_task_dispatcher = async_get_default_dispatcher();
  });

  async::PostTask(subloop->dispatcher(), [&] {
    sub_loop_task_run = true;
    sub_loop_task_dispatcher = async_get_default_dispatcher();
  });

  loop.RunUntilIdle();
  EXPECT_TRUE(main_loop_task_run);
  EXPECT_EQ(main_loop_task_dispatcher, loop.dispatcher());
  EXPECT_TRUE(sub_loop_task_run);
  EXPECT_EQ(sub_loop_task_dispatcher, subloop->dispatcher());
}

TEST(TestLoopTest, HugeAmountOfTaskAreDispatched) {
  // This value must be less than or equal to kernel.port.max-observers.
  constexpr size_t kPostCount = 50000;
  async::TestLoop loop;
  zx::event event;
  ASSERT_OK(zx::event::create(0u, &event));

  size_t called_count = 0;
  size_t wait_count = 0;
  // Creating the array on the heap as its size is greater than the available
  // stack.
  auto waits_ptr = std::make_unique<std::array<async::Wait, kPostCount>>();
  auto& waits = *waits_ptr;

  for (size_t i = 0; i < kPostCount; ++i) {
    InitWait(
        &waits[i], [&] { wait_count++; }, event, ZX_USER_SIGNAL_0);
    ASSERT_OK(waits[i].Begin(loop.dispatcher()));
  }
  ASSERT_OK(event.signal(0u, ZX_USER_SIGNAL_0));
  for (size_t i = 0; i < kPostCount; ++i) {
    async::PostTask(loop.dispatcher(), [&] { called_count++; });
  }

  loop.RunUntilIdle();

  EXPECT_EQ(kPostCount, called_count);
  EXPECT_EQ(kPostCount, wait_count);
}

TEST(TestLoopTest, TasksAreDispatchedOnManyLoops) {
  async::TestLoop loop;
  auto loopA = loop.StartNewLoop();
  auto loopB = loop.StartNewLoop();
  auto loopC = loop.StartNewLoop();

  bool called = false;
  bool calledA = false;
  bool calledB = false;
  bool calledC = false;
  async::TaskClosure taskC([&calledC] { calledC = true; });

  async::PostTask(loopB->dispatcher(), [&calledB] { calledB = true; });
  async::PostDelayedTask(
      loop.dispatcher(), [&called] { called = true; }, zx::sec(1));
  ASSERT_OK(taskC.PostDelayed(loopC->dispatcher(), zx::sec(1)));
  async::PostDelayedTask(
      loopA->dispatcher(), [&calledA] { calledA = true; }, zx::sec(2));

  loop.RunUntilIdle();
  EXPECT_FALSE(called);
  EXPECT_FALSE(calledA);
  EXPECT_TRUE(calledB);
  EXPECT_FALSE(calledC);

  taskC.Cancel();
  loop.RunFor(zx::sec(1));
  EXPECT_TRUE(called);
  EXPECT_FALSE(calledA);
  EXPECT_TRUE(calledB);
  EXPECT_FALSE(calledC);

  loop.RunFor(zx::sec(1));
  EXPECT_TRUE(called);
  EXPECT_TRUE(calledA);
  EXPECT_TRUE(calledB);
  EXPECT_FALSE(calledC);
}

TEST(TestLoopTest, WaitsAreDispatchedOnManyLoops) {
  async::TestLoop loop;
  auto loopA = loop.StartNewLoop();
  auto loopB = loop.StartNewLoop();
  auto loopC = loop.StartNewLoop();
  async::Wait wait;
  async::Wait waitA;
  async::Wait waitB;
  async::Wait waitC;
  bool called = false;
  bool calledA = false;
  bool calledB = false;
  bool calledC = false;
  zx::event event;

  ASSERT_EQ(ZX_OK, zx::event::create(0u, &event));

  InitWait(
      &wait, [&called] { called = true; }, event, ZX_USER_SIGNAL_0);
  InitWait(
      &waitA, [&calledA] { calledA = true; }, event, ZX_USER_SIGNAL_0);
  InitWait(
      &waitB, [&calledB] { calledB = true; }, event, ZX_USER_SIGNAL_0);
  InitWait(
      &waitC, [&calledC] { calledC = true; }, event, ZX_USER_SIGNAL_0);

  ASSERT_OK(wait.Begin(loop.dispatcher()));
  ASSERT_OK(waitA.Begin(loopA->dispatcher()));
  ASSERT_OK(waitB.Begin(loopB->dispatcher()));
  ASSERT_OK(waitC.Begin(loopC->dispatcher()));

  ASSERT_OK(waitB.Cancel());
  ASSERT_OK(event.signal(0u, ZX_USER_SIGNAL_0));

  loop.RunUntilIdle();
  EXPECT_TRUE(called);
  EXPECT_TRUE(calledA);
  EXPECT_FALSE(calledB);
  EXPECT_TRUE(calledC);
}

// Populates |order| with the order in which two tasks and two waits on four
// loops were dispatched, given a |loop|.
void DetermineDispatchOrder(std::unique_ptr<async::TestLoop> loop, int (*order)[4]) {
  auto loopA = loop->StartNewLoop();
  auto loopB = loop->StartNewLoop();
  auto loopC = loop->StartNewLoop();
  async::Wait wait;
  async::Wait waitB;
  zx::event event;
  int i = 0;

  ASSERT_OK(zx::event::create(0u, &event));

  InitWait(
      &wait, [&] { (*order)[0] = ++i; }, event, ZX_USER_SIGNAL_0);
  async::PostTask(loopA->dispatcher(), [&] { (*order)[1] = ++i; });
  InitWait(
      &waitB, [&] { (*order)[2] = ++i; }, event, ZX_USER_SIGNAL_0);
  async::PostTask(loopC->dispatcher(), [&] { (*order)[3] = ++i; });

  ASSERT_OK(wait.Begin(loop->dispatcher()));
  ASSERT_OK(waitB.Begin(loopB->dispatcher()));
  ASSERT_OK(event.signal(0u, ZX_USER_SIGNAL_0));

  loop->RunUntilIdle();

  EXPECT_EQ(4, i);
  EXPECT_NE(0, (*order)[0]);
  EXPECT_NE(0, (*order)[1]);
  EXPECT_NE(0, (*order)[2]);
  EXPECT_NE(0, (*order)[3]);
}

void SeedTestLoopWithEnv(uint32_t random_seed, std::unique_ptr<async::TestLoop>* loop) {
  char buf[12];
  snprintf(buf, sizeof(buf), "%u", random_seed);
  EXPECT_EQ(0, setenv("TEST_LOOP_RANDOM_SEED", buf, 1));
  *loop = std::make_unique<async::TestLoop>();
  EXPECT_EQ(0, unsetenv("TEST_LOOP_RANDOM_SEED"));
}

void DispatchOrderIsDeterministicFor(uint32_t random_seed) {
  int expected_order[4] = {0, 0, 0, 0};
  std::unique_ptr<async::TestLoop> loop;

  ASSERT_NO_FAILURES(SeedTestLoopWithEnv(random_seed, &loop));
  ASSERT_NO_FAILURES(DetermineDispatchOrder(std::move(loop), &expected_order));

  for (int i = 0; i < 5; ++i) {
    for (int j = 0; j < 2; j++) {
      int actual_order[4] = {0, 0, 0, 0};
      if (j == 0) {
        ASSERT_NO_FAILURES(SeedTestLoopWithEnv(random_seed, &loop));
      } else {
        loop = std::make_unique<async::TestLoop>(random_seed);
      }
      ASSERT_NO_FAILURES(DetermineDispatchOrder(std::move(loop), &actual_order));
      EXPECT_EQ(expected_order[0], actual_order[0]);
      EXPECT_EQ(expected_order[1], actual_order[1]);
      EXPECT_EQ(expected_order[2], actual_order[2]);
      EXPECT_EQ(expected_order[3], actual_order[3]);
    }
  }
}

TEST(TestLoopTest, DispatchOrderIsDeterministic) {
  DispatchOrderIsDeterministicFor(1);
  DispatchOrderIsDeterministicFor(43);
  DispatchOrderIsDeterministicFor(893);
  DispatchOrderIsDeterministicFor(39408);
  DispatchOrderIsDeterministicFor(844018);
  DispatchOrderIsDeterministicFor(83018299);
  DispatchOrderIsDeterministicFor(3213);
  DispatchOrderIsDeterministicFor(139133113);
  DispatchOrderIsDeterministicFor(1323234373);
}

void BlockCurrentSubLoopAndRunOthersUntilOtherLoopFor(uint32_t random_seed) {
  std::unique_ptr<async::TestLoop> loop;

  ASSERT_NO_FAILURES(SeedTestLoopWithEnv(random_seed, &loop));
  auto loopB = loop->StartNewLoop();
  std::vector<int> elements;

  async::PostTask(loop->dispatcher(), [&] {
    async::PostTask(loopB->dispatcher(), [&] { elements.push_back(0); });
    EXPECT_TRUE(loop->BlockCurrentSubLoopAndRunOthersUntil(
        [&] { return elements.size() == 1 && elements[0] == 0; }));
    elements.push_back(1);
  });

  loop->RunUntilIdle();
  EXPECT_EQ(elements.size(), 2);
  EXPECT_EQ(elements[0], 0);
  EXPECT_EQ(elements[1], 1);
}

TEST(TestLoopTest, BlockCurrentSubLoopAndRunOthersUntilOtherLoop) {
  BlockCurrentSubLoopAndRunOthersUntilOtherLoopFor(1);
  BlockCurrentSubLoopAndRunOthersUntilOtherLoopFor(43);
  BlockCurrentSubLoopAndRunOthersUntilOtherLoopFor(893);
  BlockCurrentSubLoopAndRunOthersUntilOtherLoopFor(39408);
  BlockCurrentSubLoopAndRunOthersUntilOtherLoopFor(844018);
  BlockCurrentSubLoopAndRunOthersUntilOtherLoopFor(83018299);
  BlockCurrentSubLoopAndRunOthersUntilOtherLoopFor(3213);
  BlockCurrentSubLoopAndRunOthersUntilOtherLoopFor(139133113);
  BlockCurrentSubLoopAndRunOthersUntilOtherLoopFor(1323234373);
}

void BlocksFinishWhenOtherLoopQuitFor(uint32_t random_seed) {
  std::unique_ptr<async::TestLoop> loop;

  ASSERT_NO_FAILURES(SeedTestLoopWithEnv(random_seed, &loop));
  auto loopB = loop->StartNewLoop();
  auto loopC = loop->StartNewLoop();

  async::PostTask(loop->dispatcher(), [&] { loop->Quit(); });
  bool loopB_called = false;
  async::PostTask(loopB->dispatcher(), [&] { loopB_called = true; });
  bool block_current_subloop = false;
  async::PostTask(loopC->dispatcher(), [&] {
    block_current_subloop =
        loop->BlockCurrentSubLoopAndRunOthersUntil([&] { return loopB_called; });
  });

  auto time = loop->Now();
  loop->RunFor(zx::sec(1));
  // Run until Idle for the case where the Quit() task is scheduled before the
  // blocking task. This ensure that all task have been run, but doesn't advance
  // the time.
  loop->RunUntilIdle();

  EXPECT_TRUE(loopB_called);
  EXPECT_TRUE(block_current_subloop);
  // Time should not have flown, as a Quit() has been posted.
  EXPECT_EQ(time.get(), loop->Now().get());
}

TEST(TestLoopTest, BlocksFinishWhenOtherLoopQuit) {
  BlocksFinishWhenOtherLoopQuitFor(1);
  BlocksFinishWhenOtherLoopQuitFor(43);
  BlocksFinishWhenOtherLoopQuitFor(893);
  BlocksFinishWhenOtherLoopQuitFor(39408);
  BlocksFinishWhenOtherLoopQuitFor(844018);
  BlocksFinishWhenOtherLoopQuitFor(83018299);
  BlocksFinishWhenOtherLoopQuitFor(3213);
  BlocksFinishWhenOtherLoopQuitFor(139133113);
  BlocksFinishWhenOtherLoopQuitFor(1323234373);
}

void BlocksWhileOtherLoopAdvanceTimeFor(uint32_t random_seed) {
  std::unique_ptr<async::TestLoop> loop;

  ASSERT_NO_FAILURES(SeedTestLoopWithEnv(random_seed, &loop));
  auto loopB = loop->StartNewLoop();

  auto initial_time = loop->Now();
  bool block_current_subloop = false;

  async::PostTask(loop->dispatcher(), [&] { loop->AdvanceTimeByEpsilon(); });
  async::PostTask(loopB->dispatcher(), [&] {
    block_current_subloop =
        loop->BlockCurrentSubLoopAndRunOthersUntil([&] { return loop->Now() > initial_time; });
  });
  loop->RunUntilIdle();

  EXPECT_TRUE(block_current_subloop);
  EXPECT_TRUE(loop->Now() > initial_time);
}

TEST(TestLoopTest, BlocksWhileOtherLoopAdvanceTime) {
  BlocksWhileOtherLoopAdvanceTimeFor(1);
  BlocksWhileOtherLoopAdvanceTimeFor(43);
  BlocksWhileOtherLoopAdvanceTimeFor(893);
  BlocksWhileOtherLoopAdvanceTimeFor(39408);
  BlocksWhileOtherLoopAdvanceTimeFor(844018);
  BlocksWhileOtherLoopAdvanceTimeFor(83018299);
  BlocksWhileOtherLoopAdvanceTimeFor(3213);
  BlocksWhileOtherLoopAdvanceTimeFor(139133113);
  BlocksWhileOtherLoopAdvanceTimeFor(1323234373);
}

// Test that non-async-dispatcher loops run fine.
struct ExternalLoop : async_test_subloop_t {
  ExternalLoop() { ops = &kOps; }

  // The loop keeps a state, that is repeatedly incremented.
  // 0: advance to 1
  // 1: wait until |time_ >= kState1Deadline|, advance to 2
  // 2: advance to 3
  // 3: blocked, needs to be manually advanced
  // 4: advance to 5
  // 5: done, do not increment
  // 6: finalized
  int state_ = 0;

  // The current time, according to the TestLoop.
  zx_time_t time_ = ZX_TIME_INFINITE_PAST;

  constexpr static zx_time_t kState1Deadline = 1000;
  constexpr static int kStateFinalized = 6;

  // Returns the minimum time for the next transition starting from |state|.
  // If |ZX_TIME_INFINITE| is returned, the state should not be advanced.
  static zx_time_t NextTransitionTime(int state) {
    switch (state) {
      case 0:
      case 2:
      case 4:
        // Advance immediately.
        return ZX_TIME_INFINITE_PAST;
      case 1:
        return kState1Deadline;
      case 3:
      case 5:
        return ZX_TIME_INFINITE;
      default:
        ZX_ASSERT(false);
    }
  }

  static void advance_time_to(async_test_subloop_t* self_generic, zx_time_t time) {
    ExternalLoop* self = static_cast<ExternalLoop*>(self_generic);
    ZX_ASSERT(self->state_ != kStateFinalized);
    static_cast<ExternalLoop*>(self)->time_ = time;
  }

  static uint8_t dispatch_next_due_message(async_test_subloop_t* self_generic) {
    ExternalLoop* self = static_cast<ExternalLoop*>(self_generic);
    ZX_ASSERT(self->state_ != kStateFinalized);
    zx_time_t transition_time = NextTransitionTime(self->state_);
    if (transition_time != ZX_TIME_INFINITE && transition_time <= self->time_) {
      self->state_++;
      return true;
    } else {
      return false;
    }
  }

  static uint8_t has_pending_work(async_test_subloop_t* self_generic) {
    ExternalLoop* self = static_cast<ExternalLoop*>(self_generic);
    ZX_ASSERT(self->state_ != kStateFinalized);
    zx_time_t transition_time = NextTransitionTime(self->state_);
    return (transition_time != ZX_TIME_INFINITE && transition_time <= self->time_);
  }

  static zx_time_t get_next_task_due_time(async_test_subloop_t* self_generic) {
    ExternalLoop* self = static_cast<ExternalLoop*>(self_generic);
    ZX_ASSERT(self->state_ != kStateFinalized);
    return NextTransitionTime(self->state_);
  }

  static void finalize(async_test_subloop_t* self_generic) {
    ExternalLoop* self = static_cast<ExternalLoop*>(self_generic);
    ZX_ASSERT(self->state_ != kStateFinalized);
    self->state_ = kStateFinalized;
  }

  constexpr static async_test_subloop_ops_t kOps = {advance_time_to, dispatch_next_due_message,
                                                    has_pending_work, get_next_task_due_time,
                                                    finalize};
};

TEST(TestLoopTest, ExternalLoopIsRunAndFinalized) {
  auto loop = std::make_unique<async::TestLoop>();
  ExternalLoop subloop;
  auto token = loop->RegisterLoop(&subloop);
  EXPECT_TRUE(loop->RunUntilIdle());
  EXPECT_EQ(1, subloop.state_);

  EXPECT_TRUE(loop->RunUntil(zx::time(subloop.kState1Deadline)));
  EXPECT_EQ(3, subloop.state_);
  EXPECT_LE(subloop.kState1Deadline, subloop.time_);

  subloop.state_ = 4;
  EXPECT_TRUE(loop->RunUntilIdle());
  EXPECT_EQ(5, subloop.state_);

  token.reset();
  EXPECT_EQ(subloop.kStateFinalized, subloop.state_);
}

TEST(TestLoopTest, BlockCurrentSubLoopAndRunOthersUntilTrue) {
  async::TestLoop loop;
  bool block_current_subloop = false;
  async::PostTask(loop.dispatcher(), [&] {
    block_current_subloop = loop.BlockCurrentSubLoopAndRunOthersUntil([] { return true; });
  });

  loop.RunUntilIdle();
  EXPECT_TRUE(block_current_subloop);
}

TEST(TestLoopTest, BlockCurrentSubLoopAndRunOthersUntilFalse) {
  async::TestLoop loop;
  bool block_current_subloop = true;
  async::PostTask(loop.dispatcher(), [&] {
    block_current_subloop = loop.BlockCurrentSubLoopAndRunOthersUntil([] { return false; });
  });

  loop.RunUntilIdle();
  EXPECT_FALSE(block_current_subloop);
}

struct Task {
  async_task_t task;
  bool handled = false;
};

void ReentrantHandler(async_dispatcher_t* dispatcher, async_task_t* task, zx_status_t result) {
  // This is reentrant.
  auto* typed_task = reinterpret_cast<Task*>(task);
  typed_task->handled = true;
  async::Now(dispatcher);
}

// This test just verifies that reentrant tasks dont hang and that proper lock releases exists.
TEST(TestLoopTest, TaskHandlerIsReentrant) {
  async::TestLoop loop;

  auto task_factory = [] {
    Task task;
    task.task.state = ASYNC_STATE_INIT;
    task.task.handler = &ReentrantHandler;
    return task;
  };

  auto dispatched_task = task_factory();
  // Dispatching it
  EXPECT_OK(async_post_task(loop.dispatcher(), &dispatched_task.task));
  loop.RunUntilIdle();
  EXPECT_TRUE(dispatched_task.handled);

  // Cancelling it.
  auto cancelled_task = task_factory();
  EXPECT_OK(async_post_task(loop.dispatcher(), &cancelled_task.task));
  EXPECT_OK(async_cancel_task(loop.dispatcher(), &cancelled_task.task));

  // On Shutdown
  auto shutdown_task = task_factory();
  {
    async::TestLoop shutdown_loop;
    EXPECT_OK(async_post_task(shutdown_loop.dispatcher(), &shutdown_task.task));
  }
  EXPECT_TRUE(shutdown_task.handled);
}

void ReentrantWaitHandler(async_dispatcher_t* dispatcher, async_wait_t* wait, zx_status_t status,
                          const zx_packet_signal_t* signal) {
  async::Now(dispatcher);
}

TEST(TestLoopTest, WaitHandlerIsReentrant) {
  async::TestLoop loop;
  zx::event event;
  ASSERT_OK(zx::event::create(0, &event));

  auto wait_factory = [&event] {
    async_wait_t wait;
    wait.state = ASYNC_STATE_INIT;
    wait.handler = &ReentrantWaitHandler;
    wait.object = event.borrow()->get();
    wait.trigger = ZX_USER_SIGNAL_0;
    wait.options = 0;
    return wait;
  };

  auto dispatched_wait = wait_factory();
  // Dispatching activated wait.
  ASSERT_OK(async_begin_wait(loop.dispatcher(), &dispatched_wait));
  event.signal(0, ZX_USER_SIGNAL_0);
  loop.RunUntilIdle();

  // Cancelling it.
  auto cancelled_wait = wait_factory();
  ASSERT_OK(async_begin_wait(loop.dispatcher(), &cancelled_wait));
  ASSERT_OK(async_cancel_wait(loop.dispatcher(), &cancelled_wait));
  loop.RunUntilIdle();

  // On Shutdown
  auto shutdown_wait = wait_factory();
  {
    async::TestLoop shutdown_loop;

    ASSERT_OK(async_begin_wait(shutdown_loop.dispatcher(), &shutdown_wait));
  }
}

}  // namespace
