// Copyright Sebastian Jeckel 2017. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include "gtest/gtest.h" #include "react/common/syncpoint.h" #include #include #include using namespace react; /////////////////////////////////////////////////////////////////////////////////////////////////// TEST(SyncPointTest, DependencyCreation) { SyncPoint sp; { SyncPoint::Dependency dep1(sp); SyncPoint::Dependency dep2(sp); SyncPoint::Dependency dep3(sp); std::vector deps1 = { dep1, dep2, dep3 }; std::vector deps2 = { dep1 }; SyncPoint::Dependency dep4( begin(deps1), end(deps1) ); SyncPoint::Dependency dep5; dep5 = std::move(dep4); SyncPoint::Dependency dep6; dep6 = dep5; SyncPoint::Dependency dep7( dep6 ); SyncPoint::Dependency dep8( begin(deps2), end(deps2) ); } bool done = sp.WaitFor(std::chrono::milliseconds(1)); EXPECT_EQ(true, done); } TEST(SyncPointTest, SingleWait) { SyncPoint sp; SyncPoint::Dependency dep(sp); int output = 0; std::thread t1([storedDep = std::move(dep), &output] () { std::this_thread::sleep_for(std::chrono::seconds(1)); output = 1; }); sp.Wait(); EXPECT_EQ(1, output); t1.join(); } TEST(SyncPointTest, MultiWait) { SyncPoint sp; SyncPoint::Dependency dep1(sp); SyncPoint::Dependency dep2(sp); SyncPoint::Dependency dep3(sp); int output1 = 0; int output2 = 0; int output3 = 0; std::thread t1([storedDep = std::move(dep1), &output1] () { std::this_thread::sleep_for(std::chrono::seconds(1)); output1 = 1; }); std::thread t2([storedDep = std::move(dep2), &output2] () { std::this_thread::sleep_for(std::chrono::seconds(1)); output2 = 2; }); std::thread t3([storedDep = std::move(dep3), &output3] () { std::this_thread::sleep_for(std::chrono::seconds(1)); output3 = 3; }); sp.Wait(); EXPECT_EQ(1, output1); EXPECT_EQ(2, output2); EXPECT_EQ(3, output3); t1.join(); t2.join(); t3.join(); } TEST(SyncPointTest, MultiWaitFor) { SyncPoint sp; SyncPoint::Dependency dep1(sp); SyncPoint::Dependency dep2(sp); SyncPoint::Dependency dep3(sp); int output1 = 0; int output2 = 0; int output3 = 0; std::thread t1([storedDep = std::move(dep1), &output1] () { std::this_thread::sleep_for(std::chrono::seconds(3)); output1 = 1; }); std::thread t2([storedDep = std::move(dep2), &output2] () { std::this_thread::sleep_for(std::chrono::seconds(3)); output2 = 2; }); std::thread t3([storedDep = std::move(dep3), &output3] () { std::this_thread::sleep_for(std::chrono::seconds(3)); output3 = 3; }); bool done = sp.WaitFor(std::chrono::milliseconds(1)); EXPECT_FALSE(done); EXPECT_EQ(0, output1); EXPECT_EQ(0, output2); EXPECT_EQ(0, output3); done = sp.WaitFor(std::chrono::seconds(10)); EXPECT_TRUE(done); EXPECT_EQ(1, output1); EXPECT_EQ(2, output2); EXPECT_EQ(3, output3); t1.join(); t2.join(); t3.join(); }