summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/util/run_loop.test.cpp49
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();
+}