diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2015-05-06 13:19:00 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2015-05-06 14:30:02 -0700 |
commit | 5b4015ccbab12f17335b2ef91cb9bf65bc77f7fb (patch) | |
tree | a4c551d3698c6ec7bc48c58252f5a1c2af13176f /test | |
parent | 6c31d928e1c32ceaee07384e47c644f3643be447 (diff) | |
download | qtlocation-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.cpp | 70 | ||||
-rw-r--r-- | test/test.gypi | 1 |
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', |