summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2015-05-06 13:19:00 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2015-05-06 14:30:02 -0700
commit5b4015ccbab12f17335b2ef91cb9bf65bc77f7fb (patch)
treea4c551d3698c6ec7bc48c58252f5a1c2af13176f /test
parent6c31d928e1c32ceaee07384e47c644f3643be447 (diff)
downloadqtlocation-mapboxgl-5b4015ccbab12f17335b2ef91cb9bf65bc77f7fb.tar.gz
Reference safety for Worker after callbacks
Joining a WorkRequest now ensures that either the after callback has already been executed, or will never be executed. Fixes #1438
Diffstat (limited to 'test')
-rw-r--r--test/miscellaneous/worker.cpp70
-rw-r--r--test/test.gypi1
2 files changed, 71 insertions, 0 deletions
diff --git a/test/miscellaneous/worker.cpp b/test/miscellaneous/worker.cpp
new file mode 100644
index 0000000000..50fabcebc8
--- /dev/null
+++ b/test/miscellaneous/worker.cpp
@@ -0,0 +1,70 @@
+#include "../fixtures/util.hpp"
+
+#include <mbgl/util/worker.hpp>
+#include <mbgl/util/run_loop.hpp>
+
+using namespace mbgl;
+using namespace mbgl::util;
+
+TEST(Worker, ExecutesWorkAndAfter) {
+ RunLoop loop(uv_default_loop());
+
+ Worker worker(1);
+ WorkRequest request;
+
+ bool didWork = false;
+ bool didAfter = false;
+
+ loop.invoke([&] {
+ request = worker.send([&] {
+ didWork = true;
+ }, [&] {
+ didAfter = true;
+ loop.stop();
+ });
+ });
+
+ uv_run(uv_default_loop(), UV_RUN_DEFAULT);
+ EXPECT_TRUE(didWork);
+ EXPECT_TRUE(didAfter);
+}
+
+TEST(Worker, WorkRequestJoinWaitsForWorkToComplete) {
+ RunLoop loop(uv_default_loop());
+
+ Worker worker(1);
+ bool didWork = false;
+
+ loop.invoke([&] {
+ WorkRequest request = worker.send([&] {
+ usleep(10000);
+ didWork = true;
+ }, [&] {});
+
+ request.join();
+ EXPECT_TRUE(didWork);
+ loop.stop();
+ });
+
+ uv_run(uv_default_loop(), UV_RUN_DEFAULT);
+}
+
+TEST(Worker, WorkRequestJoinCancelsAfter) {
+ RunLoop loop(uv_default_loop());
+
+ Worker worker(1);
+ bool didAfter = false;
+
+ loop.invoke([&] {
+ WorkRequest request = worker.send([&] {
+ }, [&] {
+ didAfter = true;
+ });
+
+ request.join();
+ loop.stop();
+ });
+
+ uv_run(uv_default_loop(), UV_RUN_DEFAULT);
+ EXPECT_FALSE(didAfter);
+}
diff --git a/test/test.gypi b/test/test.gypi
index 3898090c73..9c6abb7d31 100644
--- a/test/test.gypi
+++ b/test/test.gypi
@@ -53,6 +53,7 @@
'miscellaneous/text_conversions.cpp',
'miscellaneous/tile.cpp',
'miscellaneous/variant.cpp',
+ 'miscellaneous/worker.cpp',
'storage/storage.hpp',
'storage/storage.cpp',