mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
100 lines
3.1 KiB
C++
100 lines
3.1 KiB
C++
// 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/platform/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::util::RefPtr;
|
|
|
|
namespace mojo {
|
|
namespace platform {
|
|
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 platform
|
|
} // namespace mojo
|