summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/miscellaneous/worker.cpp46
1 files changed, 40 insertions, 6 deletions
diff --git a/test/miscellaneous/worker.cpp b/test/miscellaneous/worker.cpp
index 50fabcebc8..3d3c781b8c 100644
--- a/test/miscellaneous/worker.cpp
+++ b/test/miscellaneous/worker.cpp
@@ -1,6 +1,7 @@
#include "../fixtures/util.hpp"
#include <mbgl/util/worker.hpp>
+#include <mbgl/util/work_request.hpp>
#include <mbgl/util/run_loop.hpp>
using namespace mbgl;
@@ -10,7 +11,7 @@ TEST(Worker, ExecutesWorkAndAfter) {
RunLoop loop(uv_default_loop());
Worker worker(1);
- WorkRequest request;
+ std::unique_ptr<WorkRequest> request;
bool didWork = false;
bool didAfter = false;
@@ -29,19 +30,22 @@ TEST(Worker, ExecutesWorkAndAfter) {
EXPECT_TRUE(didAfter);
}
-TEST(Worker, WorkRequestJoinWaitsForWorkToComplete) {
+TEST(Worker, WorkRequestDeletionWaitsForWorkToComplete) {
RunLoop loop(uv_default_loop());
Worker worker(1);
+ std::promise<void> started;
bool didWork = false;
loop.invoke([&] {
- WorkRequest request = worker.send([&] {
+ auto request = worker.send([&] {
+ started.set_value();
usleep(10000);
didWork = true;
}, [&] {});
+ started.get_future().get();
- request.join();
+ request.reset();
EXPECT_TRUE(didWork);
loop.stop();
});
@@ -53,18 +57,48 @@ TEST(Worker, WorkRequestJoinCancelsAfter) {
RunLoop loop(uv_default_loop());
Worker worker(1);
+ std::promise<void> started;
bool didAfter = false;
loop.invoke([&] {
- WorkRequest request = worker.send([&] {
+ auto request = worker.send([&] {
+ started.set_value();
}, [&] {
didAfter = true;
});
+ started.get_future().get();
- request.join();
+ request.reset();
loop.stop();
});
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
EXPECT_FALSE(didAfter);
}
+
+TEST(Worker, WorkRequestCancelsImmediately) {
+ RunLoop loop(uv_default_loop());
+
+ Worker worker(1);
+
+ loop.invoke([&] {
+ std::promise<void> started;
+ // First worker item.
+ auto request1 = worker.send([&] {
+ usleep(10000);
+ started.set_value();
+ }, [&] {});
+
+ auto request2 = worker.send([&] {
+ ADD_FAILURE() << "Second work item should not be invoked";
+ }, [&] {});
+ request2.reset();
+
+ started.get_future().get();
+ request1.reset();
+
+ loop.stop();
+ });
+
+ uv_run(uv_default_loop(), UV_RUN_DEFAULT);
+}