diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2015-04-16 13:40:14 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2015-05-21 19:57:28 -0700 |
commit | b304b20073556d442764696dbe5ac09d5462ada0 (patch) | |
tree | 5f71825286162b893691874f3b0c72e0ea986f24 /test | |
parent | d8274639a8a7a57bf11bac2e0c2b13b02c636bd4 (diff) | |
download | qtlocation-mapboxgl-b304b20073556d442764696dbe5ac09d5462ada0.tar.gz |
Add Thread tests; get argument transfer working for all cases
Diffstat (limited to 'test')
-rw-r--r-- | test/miscellaneous/thread.cpp | 102 | ||||
-rw-r--r-- | test/test.gypi | 3 |
2 files changed, 104 insertions, 1 deletions
diff --git a/test/miscellaneous/thread.cpp b/test/miscellaneous/thread.cpp new file mode 100644 index 0000000000..b0dd2210e9 --- /dev/null +++ b/test/miscellaneous/thread.cpp @@ -0,0 +1,102 @@ +#include <mbgl/util/thread.hpp> +#include <mbgl/util/run_loop.hpp> + +#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<int> val) { + EXPECT_EQ(tid, std::this_thread::get_id()); + EXPECT_EQ(*val, 1); + } + + std::unique_ptr<int> transferOut() { + EXPECT_EQ(tid, std::this_thread::get_id()); + return std::make_unique<int>(1); + } + + std::unique_ptr<int> transferInOut(std::unique_ptr<int> val) { + EXPECT_EQ(tid, std::this_thread::get_id()); + EXPECT_EQ(*val, 1); + return std::move(val); + } + + void transferInShared(std::shared_ptr<int> val) { + EXPECT_EQ(tid, std::this_thread::get_id()); + EXPECT_EQ(*val, 1); + } + + std::shared_ptr<int> transferOutShared() { + EXPECT_EQ(tid, std::this_thread::get_id()); + return std::make_shared<int>(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<TestObject> thread("Test", ThreadPriority::Regular, tid); + + thread.invoke(&TestObject::fn1, 1); + thread.invokeWithResult<int>(&TestObject::fn2, [&] (int result) { + EXPECT_EQ(tid, std::this_thread::get_id()); + EXPECT_EQ(result, 1); + }); + + thread.invoke(&TestObject::transferIn, std::make_unique<int>(1)); + thread.invokeWithResult<std::unique_ptr<int>>(&TestObject::transferOut, [&] (std::unique_ptr<int> result) { + EXPECT_EQ(tid, std::this_thread::get_id()); + EXPECT_EQ(*result, 1); + }); + + thread.invokeWithResult<std::unique_ptr<int>>(&TestObject::transferInOut, [&] (std::unique_ptr<int> result) { + EXPECT_EQ(tid, std::this_thread::get_id()); + EXPECT_EQ(*result, 1); + }, std::make_unique<int>(1)); + + thread.invoke(&TestObject::transferInShared, std::make_shared<int>(1)); + thread.invokeWithResult<std::shared_ptr<int>>(&TestObject::transferOutShared, [&] (std::shared_ptr<int> result) { + EXPECT_EQ(tid, std::this_thread::get_id()); + EXPECT_EQ(*result, 1); + }); + + std::string test("test"); + thread.invokeWithResult<std::string>(&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); +} diff --git a/test/test.gypi b/test/test.gypi index 75301751cf..926a899cfc 100644 --- a/test/test.gypi +++ b/test/test.gypi @@ -53,8 +53,9 @@ 'miscellaneous/rotation_range.cpp', 'miscellaneous/style_parser.cpp', 'miscellaneous/text_conversions.cpp', - 'miscellaneous/transform.cpp', + 'miscellaneous/thread.cpp', 'miscellaneous/tile.cpp', + 'miscellaneous/transform.cpp', 'miscellaneous/variant.cpp', 'miscellaneous/worker.cpp', |