// Copyright 2015 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 "mojo/edk/base_edk/message_loop_test_helper.h"

#include <thread>
#include <vector>

#include "mojo/edk/platform/message_loop.h"
#include "mojo/edk/platform/task_runner.h"
#include "mojo/edk/util/ref_ptr.h"
#include "testing/gtest/include/gtest/gtest.h"

using mojo::platform::MessageLoop;
using mojo::platform::TaskRunner;
using mojo::util::RefPtr;

namespace base_edk {
namespace test {

void MessageLoopTestHelper(MessageLoop* message_loop) {
  RefPtr<TaskRunner> task_runner = message_loop->GetTaskRunner();
  EXPECT_TRUE(task_runner);

  // |GetTaskRunner()| should always return the same |TaskRunner()|.
  EXPECT_EQ(task_runner, message_loop->GetTaskRunner());

  std::vector<int> stuff;
  task_runner->PostTask([&stuff, message_loop, &task_runner]() {
    EXPECT_TRUE(message_loop->IsRunningOnCurrentThread());
    stuff.push_back(1);
    task_runner->PostTask([&stuff]() { stuff.push_back(3); });
    message_loop->QuitWhenIdle();
  });
  task_runner->PostTask([&stuff]() { stuff.push_back(2); });
  EXPECT_TRUE(stuff.empty());
  message_loop->Run();
  EXPECT_EQ(std::vector<int>({1, 2, 3}), stuff);

  stuff.clear();
  task_runner->PostTask([&stuff, message_loop, &task_runner]() {
    EXPECT_TRUE(message_loop->IsRunningOnCurrentThread());
    stuff.push_back(4);
    task_runner->PostTask([&stuff]() { stuff.push_back(6); });
  });
  task_runner->PostTask([&stuff]() { stuff.push_back(5); });
  message_loop->RunUntilIdle();
  EXPECT_EQ(std::vector<int>({4, 5, 6}), stuff);

  stuff.clear();
  task_runner->PostTask([&stuff, message_loop, &task_runner]() {
    EXPECT_TRUE(message_loop->IsRunningOnCurrentThread());
    stuff.push_back(7);
    message_loop->QuitNow();
    task_runner->PostTask([&stuff]() { stuff.push_back(9); });
  });
  task_runner->PostTask([&stuff]() { stuff.push_back(8); });
  message_loop->Run();
  EXPECT_EQ(std::vector<int>({7}), stuff);
  stuff.clear();
  message_loop->RunUntilIdle();
  EXPECT_EQ(std::vector<int>({8, 9}), stuff);

  stuff.clear();
  message_loop->RunUntilIdle();
  EXPECT_TRUE(stuff.empty());

  {
    std::thread other_thread([message_loop]() {
      // |IsRunningOnCurrentThread()| may be called on any thread.
      EXPECT_FALSE(message_loop->IsRunningOnCurrentThread());
    });
    other_thread.join();
  }

  stuff.clear();
  task_runner->PostTask([&stuff, message_loop, &task_runner]() {
    EXPECT_TRUE(message_loop->IsRunningOnCurrentThread());
    std::thread other_thread([&stuff, message_loop, task_runner]() {
      EXPECT_FALSE(message_loop->IsRunningOnCurrentThread());
      EXPECT_EQ(task_runner, message_loop->GetTaskRunner());
      stuff.push_back(10);
      task_runner->PostTask([&stuff, message_loop]() {
        EXPECT_TRUE(message_loop->IsRunningOnCurrentThread());
        stuff.push_back(11);
        message_loop->QuitWhenIdle();
      });
    });
    other_thread.join();
    EXPECT_EQ(std::vector<int>({10}), stuff);
    stuff.clear();
  });
  message_loop->Run();
  EXPECT_EQ(std::vector<int>({11}), stuff);
}

}  // namespace test
}  // namespace base_edk
