|
| 1 | +#include <gtest/gtest.h> |
| 2 | +#include <thread> |
| 3 | + |
| 4 | +#include "../Helpers/Classes/Basic.hpp" |
| 5 | +#include "../Helpers/Classes/CirularDependency.hpp" |
| 6 | +#include "../Helpers/Classes/Complex.hpp" |
| 7 | +#include <SevenBit/DI/Exceptions.hpp> |
| 8 | +#include <SevenBit/DI/ServiceCollection.hpp> |
| 9 | + |
| 10 | +class ThreadSafeTest : public testing::Test |
| 11 | +{ |
| 12 | + protected: |
| 13 | + static void SetUpTestSuite() {} |
| 14 | + |
| 15 | + ThreadSafeTest() {} |
| 16 | + |
| 17 | + void SetUp() override {} |
| 18 | + |
| 19 | + void TearDown() override {} |
| 20 | + |
| 21 | + ~ThreadSafeTest() override = default; |
| 22 | + |
| 23 | + static void TearDownTestSuite() {} |
| 24 | +}; |
| 25 | + |
| 26 | +void getSafeServices(sb::di::ServiceProvider &provider) |
| 27 | +{ |
| 28 | + auto &service1 = provider.getService<ITestComplexClass1>(); |
| 29 | + auto &service2 = provider.getService<ITestComplexClass2>(); |
| 30 | + auto service3 = provider.createService<ITestComplexClass3>(); |
| 31 | + auto &service4 = provider.getService<ITestComplexClass4>(); |
| 32 | + auto &service5 = provider.getService<ITestComplexClass5>(); |
| 33 | + auto &service6 = provider.getService<ITestComplexClass6>(); |
| 34 | + |
| 35 | + EXPECT_EQ(service1.number(), 1); |
| 36 | + EXPECT_EQ(service2.number(), 2); |
| 37 | + EXPECT_EQ(service3->number(), 3); |
| 38 | + EXPECT_EQ(service4.number(), 4); |
| 39 | + EXPECT_EQ(service5.number(), 5); |
| 40 | + EXPECT_EQ(service6.number(), 6); |
| 41 | + EXPECT_EQ(service2.getOne(), &service1); |
| 42 | + EXPECT_EQ(service3->getOne(), &service1); |
| 43 | + EXPECT_EQ(service3->getTwo(), &service2); |
| 44 | + EXPECT_EQ(service4.getOne(), &service1); |
| 45 | + EXPECT_EQ(service4.getTwo(), &service2); |
| 46 | + EXPECT_NE(service4.getThree().get(), service3.get()); |
| 47 | + EXPECT_EQ(service5.getOne(), &service1); |
| 48 | + EXPECT_EQ(service5.getTwo(), &service2); |
| 49 | + EXPECT_NE(service5.makeThree(), service3); |
| 50 | + EXPECT_EQ(&service6.getOne(), &service1); |
| 51 | + EXPECT_EQ(&service6.getTwo(), &service2); |
| 52 | + EXPECT_FALSE(service6.getNonExisting()); |
| 53 | + EXPECT_NE(service6.makeThree(), service3); |
| 54 | +} |
| 55 | + |
| 56 | +TEST_F(ThreadSafeTest, ShouldGetSafeServices) |
| 57 | +{ |
| 58 | + sb::di::ServiceProviderOptions options; |
| 59 | + options.threadSafe = true; |
| 60 | + |
| 61 | + auto provider = sb::di::ServiceCollection{} |
| 62 | + .addSingleton<ITestComplexClass1, TestComplexClass1>() |
| 63 | + .addSingleton<ITestComplexClass2, TestComplexClass2>() |
| 64 | + .addTransient<ITestComplexClass3, TestComplexClass3>() |
| 65 | + .addScoped<ITestComplexClass4, TestComplexClass4>() |
| 66 | + .addScoped<ITestComplexClass5, TestComplexClass5>() |
| 67 | + .addScoped<ITestComplexClass6, TestComplexClass6>() |
| 68 | + .buildServiceProvider(options); |
| 69 | + |
| 70 | + std::vector<std::thread> threads; |
| 71 | + constexpr size_t maxThreads = 50; |
| 72 | + for (size_t i = 0; i < maxThreads; ++i) |
| 73 | + { |
| 74 | + threads.emplace_back(getSafeServices, std::ref(provider)); |
| 75 | + } |
| 76 | + for (auto &th : threads) |
| 77 | + { |
| 78 | + th.join(); |
| 79 | + } |
| 80 | +} |
0 commit comments