#include #include #include "../fixtures/util.hpp" using namespace mbgl::util; class TestObject { public: TestObject(uv_loop_t*, std::thread::id otherTid) : tid(std::this_thread::get_id()) { EXPECT_NE(tid, otherTid); } void fn1(int val) { EXPECT_EQ(tid, std::this_thread::get_id()); EXPECT_EQ(val, 1); } int fn2() { EXPECT_EQ(tid, std::this_thread::get_id()); return 1; } void transferIn(std::unique_ptr val) { EXPECT_EQ(tid, std::this_thread::get_id()); EXPECT_EQ(*val, 1); } std::unique_ptr transferOut() { EXPECT_EQ(tid, std::this_thread::get_id()); return std::make_unique(1); } std::unique_ptr transferInOut(std::unique_ptr val) { EXPECT_EQ(tid, std::this_thread::get_id()); EXPECT_EQ(*val, 1); return std::move(val); } void transferInShared(std::shared_ptr val) { EXPECT_EQ(tid, std::this_thread::get_id()); EXPECT_EQ(*val, 1); } std::shared_ptr transferOutShared() { EXPECT_EQ(tid, std::this_thread::get_id()); return std::make_shared(1); } std::string transferString(const std::string& string) { EXPECT_EQ(tid, std::this_thread::get_id()); EXPECT_EQ(string, "test"); return string; } const std::thread::id tid; }; TEST(Thread, invoke) { const std::thread::id tid = std::this_thread::get_id(); RunLoop loop(uv_default_loop()); loop.invoke([&] { EXPECT_EQ(tid, std::this_thread::get_id()); Thread thread("Test", ThreadPriority::Regular, tid); thread.invoke(&TestObject::fn1, 1); thread.invokeWithResult(&TestObject::fn2, [&] (int result) { EXPECT_EQ(tid, std::this_thread::get_id()); EXPECT_EQ(result, 1); }); thread.invoke(&TestObject::transferIn, std::make_unique(1)); thread.invokeWithResult>(&TestObject::transferOut, [&] (std::unique_ptr result) { EXPECT_EQ(tid, std::this_thread::get_id()); EXPECT_EQ(*result, 1); }); thread.invokeWithResult>(&TestObject::transferInOut, [&] (std::unique_ptr result) { EXPECT_EQ(tid, std::this_thread::get_id()); EXPECT_EQ(*result, 1); }, std::make_unique(1)); thread.invoke(&TestObject::transferInShared, std::make_shared(1)); thread.invokeWithResult>(&TestObject::transferOutShared, [&] (std::shared_ptr result) { EXPECT_EQ(tid, std::this_thread::get_id()); EXPECT_EQ(*result, 1); }); std::string test("test"); thread.invokeWithResult(&TestObject::transferString, [&] (std::string result){ EXPECT_EQ(tid, std::this_thread::get_id()); EXPECT_EQ(result, "test"); loop.stop(); }, test); test.clear(); }); uv_run(uv_default_loop(), UV_RUN_DEFAULT); }