diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index eb08360..d8ce5c2 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -42,6 +42,12 @@ target_compile_options(gsl_tests_config INTERFACE > ) +target_link_libraries(gsl_tests_config INTERFACE + $<$>: + -pthread + > +) + # set test to include the unittest-cpp headers # this shiuld be removed when UnitTest++ has the proper headers target_include_directories(gsl_tests_config INTERFACE @@ -80,3 +86,4 @@ add_gsl_test(utils_tests) add_gsl_test(owner_tests) add_gsl_test(byte_tests) add_gsl_test(algorithm_tests) +add_gsl_test(thread_tests) diff --git a/tests/thread_tests.cpp b/tests/thread_tests.cpp new file mode 100644 index 0000000..4e9dc24 --- /dev/null +++ b/tests/thread_tests.cpp @@ -0,0 +1,140 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2017 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +/////////////////////////////////////////////////////////////////////////////// + +#include + +#include +#include +#include + +#include +#include + +using std::chrono::steady_clock; +using std::this_thread::sleep_for; + +const auto t_100ms = std::chrono::milliseconds(100); + +SUITE(raii_thread_tests) +{ + TEST(raii_thread_same_scope_clock_test) + { + auto start_time = steady_clock::now(); + + gsl::raii_thread t{[&]{ sleep_for(t_100ms); }}; + + auto end_time = steady_clock::now(); + + CHECK(end_time - start_time < t_100ms); + } + + TEST(raii_thread_different_scope_clock_test) + { + auto start_time = steady_clock::now(); + + { + gsl::raii_thread t{[&]{ sleep_for(t_100ms); }}; + } + + auto end_time = steady_clock::now(); + + CHECK(end_time - start_time >= t_100ms); + } + + TEST(raii_thread_ctor_test) + { + auto start_time = steady_clock::now(); + + gsl::raii_thread t1{[&]{ sleep_for(t_100ms); }}; + + { + gsl::raii_thread t2{std::move(t1)}; + } + + auto end_time = steady_clock::now(); + + CHECK(end_time - start_time >= t_100ms); + } + + TEST(raii_thread_assign_test) + { + auto start_time = steady_clock::now(); + + gsl::raii_thread t1{[&]{ sleep_for(t_100ms); }}; + + { + gsl::raii_thread t2; + t2 = std::move(t1); + } + + auto end_time = steady_clock::now(); + + CHECK(end_time - start_time >= t_100ms); + } + + TEST(raii_thread_std_thread_ctor_test) + { + auto start_time = steady_clock::now(); + + std::thread t1{[&]{ sleep_for(t_100ms); }}; + + { + gsl::raii_thread t2{std::move(t1)}; + } + + auto end_time = steady_clock::now(); + + CHECK(end_time - start_time >= t_100ms); + } + + TEST(raii_thread_std_thread_assign_test) + { + auto start_time = steady_clock::now(); + + std::thread t1{[&]{ sleep_for(t_100ms); }}; + + { + gsl::raii_thread t2; + t2 = std::move(t1); + } + + auto end_time = steady_clock::now(); + + CHECK(end_time - start_time >= t_100ms); + } + + TEST(raii_thread_swap_test) + { + gsl::raii_thread t1{[&]{ sleep_for(t_100ms); }}; + gsl::raii_thread t2{[&]{ sleep_for(t_100ms); }}; + + auto id1 = t1.get_id(); + auto id2 = t2.get_id(); + + std::swap(t1, t2); + + CHECK(t1.get_id() == id2); + CHECK(t2.get_id() == id1); + + t1.swap(t2); + + CHECK(t1.get_id() == id1); + CHECK(t2.get_id() == id2); + } +} + +int main() { return UnitTest::RunAllTests(); } +