diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/util/run_loop.test.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/test/util/run_loop.test.cpp b/test/util/run_loop.test.cpp index 4d2c704421..62bfbb0fc1 100644 --- a/test/util/run_loop.test.cpp +++ b/test/util/run_loop.test.cpp @@ -3,6 +3,10 @@ #include <mbgl/test/util.hpp> +#include <atomic> +#include <condition_variable> +#include <thread> + using namespace mbgl::util; TEST(RunLoop, Stop) { @@ -64,3 +68,48 @@ TEST(RunLoop, Priorities) { EXPECT_EQ((std::vector<int>{ 2, 4, 1, 3 }), order); } + +TEST(RunLoop, PlatformIntegration) { + std::atomic<int> count1(0); + + // No need to be atomic, it will run + // on the main thread. + int count2(0); + + std::thread::id mainThread = std::this_thread::get_id(); + + RunLoop loop; + + std::mutex mutex; + std::condition_variable cv; + + loop.setPlatformCallback([&] { + EXPECT_NE(mainThread, std::this_thread::get_id()); + count1++; + cv.notify_one(); + }); + + auto threadBody = [&]() { + for (unsigned i = 0; i < 100000; ++i) { + loop.invoke([&] { + EXPECT_EQ(mainThread, std::this_thread::get_id()); + count2++; + }); + } + }; + + std::thread thread1(threadBody); + std::thread thread2(threadBody); + + while (count2 < 200000) { + std::unique_lock<std::mutex> lock(mutex); + cv.wait(lock); + loop.runOnce(); + } + + EXPECT_EQ(count1, 200000); + EXPECT_EQ(count2, 200000); + + thread1.join(); + thread2.join(); +} |