// // Created by Anthony Thibault on May 9th 2019 // Copyright 2013-2019 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // #include "DependencyManagerTests.h" #include #include #include #include #include // x macro #define LIST_OF_CLASSES \ CLASS(A) \ CLASS(B) \ CLASS(C) \ CLASS(D) \ CLASS(E) \ CLASS(F) \ CLASS(G) \ CLASS(H) \ CLASS(I) \ CLASS(J) \ CLASS(K) \ CLASS(L) \ CLASS(M) \ CLASS(N) \ CLASS(O) \ CLASS(P) \ CLASS(Q) \ CLASS(R) \ CLASS(S) \ CLASS(T) \ CLASS(U) \ CLASS(V) \ CLASS(W) \ CLASS(X) \ CLASS(Y) \ CLASS(Z) \ CLASS(AA) \ CLASS(AB) \ CLASS(AC) \ CLASS(AD) \ CLASS(AE) \ CLASS(AF) \ CLASS(AG) \ CLASS(AH) \ CLASS(AI) \ CLASS(AJ) \ CLASS(AK) \ CLASS(AL) \ CLASS(AM) \ CLASS(AN) \ CLASS(AO) \ CLASS(AP) \ CLASS(AQ) \ CLASS(AR) \ CLASS(AS) \ CLASS(AT) \ CLASS(AU) \ CLASS(AV) \ CLASS(AW) \ CLASS(AX) \ CLASS(AY) \ CLASS(AZ) \ CLASS(BA) \ CLASS(BB) \ CLASS(BC) \ CLASS(BD) \ CLASS(BE) \ CLASS(BF) \ CLASS(BG) \ CLASS(BH) \ CLASS(BI) \ CLASS(BJ) \ CLASS(BK) \ CLASS(BL) \ CLASS(BM) \ CLASS(BN) \ CLASS(BO) \ CLASS(BP) \ CLASS(BQ) \ CLASS(BR) \ CLASS(BS) \ CLASS(BT) \ CLASS(BU) \ CLASS(BV) \ CLASS(BW) \ CLASS(BX) \ CLASS(BY) \ CLASS(BZ) \ CLASS(CA) \ CLASS(CB) \ CLASS(CC) \ CLASS(CD) \ CLASS(CE) \ CLASS(CF) \ CLASS(CG) \ CLASS(CH) \ CLASS(CI) \ CLASS(CJ) \ CLASS(CK) \ CLASS(CL) \ CLASS(CM) \ CLASS(CN) \ CLASS(CO) \ CLASS(CP) \ CLASS(CQ) \ CLASS(CR) \ CLASS(CS) \ CLASS(CT) \ CLASS(CU) \ CLASS(CV) \ CLASS(CW) \ CLASS(CX) \ CLASS(CY) \ CLASS(CZ) \ CLASS(DA) \ CLASS(DB) \ CLASS(DC) \ CLASS(DD) \ CLASS(DE) \ CLASS(DF) \ CLASS(DG) \ CLASS(DH) \ CLASS(DI) \ CLASS(DJ) \ CLASS(DK) \ CLASS(DL) \ CLASS(DM) \ CLASS(DN) \ CLASS(DO) \ CLASS(DP) \ CLASS(DQ) \ CLASS(DR) \ CLASS(DS) \ CLASS(DT) \ CLASS(DU) \ CLASS(DV) \ CLASS(DW) \ CLASS(DX) \ CLASS(DY) \ CLASS(DZ) QTEST_MAIN(DependencyManagerTests) #define CLASS(NAME) class NAME : public Dependency {}; LIST_OF_CLASSES #undef CLASS void DependencyManagerTests::testDependencyManager() { QCOMPARE(DependencyManager::isSet(), false); DependencyManager::set(); QCOMPARE(DependencyManager::isSet(), true); DependencyManager::destroy(); QCOMPARE(DependencyManager::isSet(), false); } static void addDeps() { #define CLASS(NAME) DependencyManager::set(); LIST_OF_CLASSES #undef CLASS } static void removeDeps() { #define CLASS(NAME) DependencyManager::destroy(); LIST_OF_CLASSES #undef CLASS } static void spamIsSet() { for (int i = 0; i < 1000; i++) { #define CLASS(NAME) DependencyManager::isSet(); LIST_OF_CLASSES #undef CLASS } } static void spamGet() { for (int i = 0; i < 10; i++) { #define CLASS(NAME) DependencyManager::get(); LIST_OF_CLASSES #undef CLASS } } void assertDeps(bool value) { #define CLASS(NAME) QCOMPARE(DependencyManager::isSet(), value); LIST_OF_CLASSES #undef CLASS } void DependencyManagerTests::testDependencyManagerMultiThreaded() { std::thread isSetThread1(spamIsSet); // spawn new thread that checks of dpendencies are present by calling isSet() std::thread getThread1(spamGet); // spawn new thread that checks of dpendencies are present by calling get() addDeps(); isSetThread1.join(); getThread1.join(); assertDeps(true); std::thread isSetThread2(spamIsSet); // spawn new thread that checks of dpendencies are present by calling isSet() std::thread getThread2(spamGet); // spawn new thread that checks of dpendencies are present by calling get() removeDeps(); isSetThread2.join(); getThread2.join(); assertDeps(false); }