From 8d3fd199b26c770c262141e736ccf4c7830c22f6 Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Thu, 26 Nov 2015 20:18:14 +0200 Subject: [PATCH] [tests] Add utests for ThreadLocal --- test/miscellaneous/thread_local.cpp | 95 +++++++++++++++++++++++++++++ test/test.gypi | 1 + 2 files changed, 96 insertions(+) create mode 100644 test/miscellaneous/thread_local.cpp diff --git a/test/miscellaneous/thread_local.cpp b/test/miscellaneous/thread_local.cpp new file mode 100644 index 000000000..6f9523f6e --- /dev/null +++ b/test/miscellaneous/thread_local.cpp @@ -0,0 +1,95 @@ +#include +#include +#include + +#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 number; +}; + +ThreadLocal TestThread::number; + +} + +TEST(ThreadLocalStorage, Basic) { + RunLoop loop; + + int number1 = 1; + int number2 = 2; + int number3 = 3; + + ThreadContext context = {"Test", ThreadType::Map, ThreadPriority::Regular}; + + Thread thread1(context, &number1); + Thread thread2(context, &number2); + Thread thread3(context, &number3); + + EXPECT_EQ(number1, thread1.invokeSync(&TestThread::getNumber)); + EXPECT_EQ(number2, thread2.invokeSync(&TestThread::getNumber)); + EXPECT_EQ(number3, thread3.invokeSync(&TestThread::getNumber)); +} + +TEST(ThreadLocalStorage, NotSetReturnsNull) { + static ThreadLocal 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 counter; +}; + +ThreadLocal TestThreadReclaim::counter; + +} + +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>(context, dtorCounter1); + auto thread2 = std::make_unique>(context, dtorCounter2); + + thread1.reset(); + thread2.reset(); + + EXPECT_EQ(counter, 2); +} diff --git a/test/test.gypi b/test/test.gypi index a9fe316e6..981440d8f 100644 --- a/test/test.gypi +++ b/test/test.gypi @@ -61,6 +61,7 @@ 'miscellaneous/style_parser.cpp', 'miscellaneous/text_conversions.cpp', 'miscellaneous/thread.cpp', + 'miscellaneous/thread_local.cpp', 'miscellaneous/tile.cpp', 'miscellaneous/timer.cpp', 'miscellaneous/token.cpp',