summaryrefslogtreecommitdiff
path: root/test/util/thread_local.cpp
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2016-02-02 11:09:16 -0800
committerJohn Firebaugh <john.firebaugh@gmail.com>2016-02-02 11:31:13 -0800
commitb97dcbc12592fc93d2c8137f3d56a523e994a136 (patch)
tree12e5f91d686f2853c5322a525663193a546ab130 /test/util/thread_local.cpp
parentce8c6e26d58f91bba46576080caf48e4765c176f (diff)
downloadqtlocation-mapboxgl-b97dcbc12592fc93d2c8137f3d56a523e994a136.tar.gz
[tests] Reorganize tests to match src structure
Diffstat (limited to 'test/util/thread_local.cpp')
-rw-r--r--test/util/thread_local.cpp95
1 files changed, 95 insertions, 0 deletions
diff --git a/test/util/thread_local.cpp b/test/util/thread_local.cpp
new file mode 100644
index 0000000000..aeaf187540
--- /dev/null
+++ b/test/util/thread_local.cpp
@@ -0,0 +1,95 @@
+#include <mbgl/util/run_loop.hpp>
+#include <mbgl/util/thread.hpp>
+#include <mbgl/util/thread_local.hpp>
+
+#include "../fixtures/util.hpp"
+
+using namespace mbgl::util;
+
+namespace {
+
+class TestThread {
+public:
+ TestThread(int *number_) {
+ number.set(number_);
+ }
+
+ ~TestThread() {
+ number.set(nullptr);
+ }
+
+ int getNumber() {
+ return *number.get();
+ }
+
+private:
+ static ThreadLocal<int> number;
+};
+
+ThreadLocal<int> TestThread::number;
+
+} // namespace
+
+TEST(ThreadLocalStorage, Basic) {
+ RunLoop loop;
+
+ int number1 = 1;
+ int number2 = 2;
+ int number3 = 3;
+
+ ThreadContext context = {"Test", ThreadType::Map, ThreadPriority::Regular};
+
+ Thread<TestThread> thread1(context, &number1);
+ Thread<TestThread> thread2(context, &number2);
+ Thread<TestThread> thread3(context, &number3);
+
+ EXPECT_EQ(number1, thread1.invokeSync<int>(&TestThread::getNumber));
+ EXPECT_EQ(number2, thread2.invokeSync<int>(&TestThread::getNumber));
+ EXPECT_EQ(number3, thread3.invokeSync<int>(&TestThread::getNumber));
+}
+
+TEST(ThreadLocalStorage, NotSetReturnsNull) {
+ static ThreadLocal<int> number;
+
+ EXPECT_EQ(nullptr, number.get());
+}
+
+namespace {
+
+struct DtorCounter {
+ ~DtorCounter() { ++(*value); }
+ unsigned *value;
+};
+
+class TestThreadReclaim {
+public:
+ TestThreadReclaim(DtorCounter* counter_) {
+ counter.set(counter_);
+ }
+
+private:
+ static ThreadLocal<DtorCounter> counter;
+};
+
+ThreadLocal<DtorCounter> TestThreadReclaim::counter;
+
+} // namespace
+
+TEST(ThreadLocalStorage, AutoReclaim) {
+ RunLoop loop;
+
+ unsigned counter = 0;
+
+ DtorCounter* dtorCounter1 = new DtorCounter{ &counter };
+ DtorCounter* dtorCounter2 = new DtorCounter{ &counter };
+
+ ThreadContext context = {"Test", ThreadType::Map, ThreadPriority::Regular};
+
+ auto thread1 = std::make_unique<Thread<TestThreadReclaim>>(context, dtorCounter1);
+ auto thread2 = std::make_unique<Thread<TestThreadReclaim>>(context, dtorCounter2);
+
+ thread1.reset();
+ thread2.reset();
+
+ EXPECT_EQ(counter, 2);
+}