Task* getNextTask() { std::unique_lock<std::mutex> counterLock(m_threadCounterMutex); m_threadsDoneCount++; if (m_threadsDoneCount >= m_totalThreads) { while (!m_queueSemaphore.wait_for(std::chrono::milliseconds(100))) { if (m_closeRequested) { m_closing = true; m_barrier.notify_all(); return nullptr; } } m_threadsDoneCount = 0; m_currentProblem = m_tasks.front().problemSpace().begin(); } counterLock.unlock(); m_barrier.wait_until_condition([this]() { return m_closing.load(); }); if (m_closing) { return nullptr; } return &m_tasks.front(); }
bool perform2(size_t blocksCount = 10) { using namespace Tests::Common; launchTestnet(3, Line); std::this_thread::sleep_for(std::chrono::milliseconds(10000)); LOG_TRACE("STEP 1 PASSED"); mineBlock(); mineBlock(); LOG_TRACE("STEP 2 PASSED"); std::unique_ptr<CryptoNote::INode> localNode; std::unique_ptr<CryptoNote::INode> remoteNode; nodeDaemons.front()->makeINode(localNode); nodeDaemons.back()->makeINode(remoteNode); std::unique_ptr<CryptoNote::IWalletLegacy> wallet; makeWallet(wallet, localNode); LOG_TRACE("STEP 3 PASSED"); Semaphore blockMined; Semaphore blockArrivedToRemote; WaitForBlockchainHeightChangeObserver localHCO(blockMined); WaitForBlockchainHeightChangeObserver remoteHCO(blockArrivedToRemote); localNode->addObserver(&localHCO); remoteNode->addObserver(&remoteHCO); for (size_t blockNumber = 0; blockNumber < blocksCount; ++blockNumber) { nodeDaemons.front()->startMining(1, wallet->getAddress()); blockMined.wait(); CHECK_AND_ASSERT_MES(blockArrivedToRemote.wait_for(std::chrono::milliseconds(5000)), false, "block propagation too slow >5000ms."); nodeDaemons.front()->stopMining(); LOG_TRACE("STEP 4 STAGE " + TO_STRING(blockNumber+1) + " of " + TO_STRING(blocksCount)+" PASSED"); } return true; }
bool perform4() { using namespace CryptoNote; using namespace Tests::Common; launchTestnet(3, Star); LOG_TRACE("STEP 1 PASSED"); std::unique_ptr<CryptoNote::INode> hopNode; std::unique_ptr<CryptoNote::INode> localNode; std::unique_ptr<CryptoNote::INode> remoteNode; nodeDaemons[0]->makeINode(hopNode); nodeDaemons[1]->makeINode(localNode); nodeDaemons[2]->makeINode(remoteNode); LOG_TRACE("STEP 2 PASSED"); std::string test_block1_hex = "0101b392d79f05a742885cb01d11b7b36fb8bf14616d42cd3d8c1429a224df41afa81b86b8a3a84e" "d8c33f010b01ff0108c0a62d02cc353782cbe4c6067bd30510f11d1f2993f2c7fed37239f299ffe3" "f96f135675c096b102023e8d4b2c22d73f91d0d9f8e0e12c8df24e5917f00d0b2dd99786c5bb0e5b" "300580bbb021022764ae61c084db07e7cd83c55e9c833f42b1d422e1008220fdb4acc726b94ea980" "88debe01023330c2b7dc4840f478066370ae48b148ce8dd010c59f6ecc08598682d32f07d080a0d9" "e61d02bcf35dc40ead54a614174774e60d8f5d0e46272c70bc7e70f205f7ccef25c34980b09dc2df" "01026ddcf1aed901f018453fd9352a01d5a44067d271ca403b4cd799d9832076daa280f092cbdd08" "021f613eab32b76ed03f6a796de7a5c92009ea9f9b9e3299ec91df7657cd694e5580c089a9a2f50f" "02f545046885a297ba63a2c7b305a74fdb741129cc367330661c1363e0bb0f0d0b2101acf052dcbe" "407bc34df1b7fffc17f0bfb0ffc23002e2b6de48a210df6f78bf1400"; std::string test_block2_hex = "0101b492d79f05456231a956ed3a8c1ac0bfe8efc1bb5d522d8474e566b051919ddea0ceab478a74" "e35210010c01ff0207c0e41202b2d7e697c6e2e894f9e98262c278235720b39f3a149774cb58cb52" "e5dde21601c09fab0302abffefad3afab42ca1ce2f7dccfa6942256f31387b307becd43571cfe22a" "10688084af5f02e2ab32d9b8fb8ced4bf4a81de0f48c23dc575076e8d233a3532d28f36e79035380" "a0d9e61d020c10664fe1ca35418733fa32ae2deadd4bf7ed982bb5d11ba98a7940a73e161580b09d" "c2df010266c3bfa27436b480a217a2fe06df714f4d2094ec1a0ced3bac2d96881972e28a80f092cb" "dd0802f31e9ac25fb8afd1d9d964331242a94f023c3188db5e532b5a9c800a843a3ebc80c089a9a2" "f50f0206244fcc73941c3da62ea6d62d679bedb311fc530d149099bdfd04c59cd507a121019d4b74" "f09454ccfdd6ca44b8c5f73c6805ea08dbe6a71769b058e158b2d4df5100"; std::string test_block3_hex = "0101b492d79f051f6fe6d9f7c14c0d5e16ba82d9ea68e4e6d6f30726854d45330aeb2fae5c1cd3fb" "7f4352010d01ff0308ffae350220f4c1c7631ecf4247688c376665df2b9dd935af6e4c027c9cddcb" "400fefec7380a4e803029e05ef9b3295e178d0f3199fca420f909f04fdab09b97c14290c8a913e42" "19c68087a70e02693641fefb1a6da81c2308370f349ef5e4adab792ae06b5da989ae3f1b7a13ca80" "d293ad0302c14d721ed8da5c98f108ef17c326737765857ddfa0b705fd4483cfa7ffeaad51808cee" "891a02f5a8e2ac24d6a9f789e5514de520c3ac28387788e130e22c4250b7d1be47460380b09dc2df" "0102cc3b2f894b416f3e09afae0395fc01cc2ec9763dff72839944e60055049ea37d80f092cbdd08" "02772df06a2cd92c174815ae1572799430ea01e903796f6a763648c7b350151ce580c089a9a2f50f" "0211c7bea98edba4fad6d3f19b330a676b8fb0391f7a99f45542e7cf52d39d6c632101e0370c5c79" "e99d772b41e0569bc41e1ebde2e563cdb7f5bdd23984899fad103200"; std::string test_block4_hex = "0101b492d79f0537da79424e1cc69d16aadf174dcf443947f8027695a5d1e30b2be4f5aa71904194" "47fe54010e01ff0407fffc1a0278eb82c9ea2f1e998906cec55caf26e347224c3391fb0aa2213bc1" "5eec4dacc580bbb021024ce32a63614269f43f698644c98fd9b7a11694dc69fd5126f6f6735ba6c5" "98dd808c8d9e0202d539ead46faf6d786964dd5106004612eb8d64778ad4fe8befa8c63e4d666f92" "808cee891a021a6c6669298dcc1c86af887804f128123d95a6d96b5884db97cfc96fa9ad018e80b0" "9dc2df0102dd3b9bbfef1eddeef8c406de9c0c4fc469c8069c910541252491df5a482fd5e380f092" "cbdd0802176a4cb411309761b7f50b0f495e99cc55cbaae70011d3c901e409a8a938f1b680c089a9" "a2f50f02bb232a77911350a1315de0b3de447142390f97e5ef25ecc1bf5837a8972b4b5e2101ef54" "5c318e38cfdd92362340fab6ec6630e4134b93cfd01db4d9a42fa945fdef00"; Semaphore blockArrivedToRemote; WaitForBlockchainHeightChangeObserver remoteHCO(blockArrivedToRemote); std::chrono::steady_clock::time_point localAdded; std::chrono::steady_clock::time_point hoplAdded; std::chrono::steady_clock::time_point remoteAdded; std::chrono::steady_clock::time_point submitInvokingStart; std::chrono::steady_clock::time_point submitInvoked; //auto height = localNode->getLastKnownBlockHeight(); CallbackHeightChangeObserver CHCOLocal([&localAdded](uint64_t new_height){localAdded = std::chrono::steady_clock::now(); }); CallbackHeightChangeObserver CHCOHop([&hoplAdded](uint64_t new_height){hoplAdded = std::chrono::steady_clock::now(); }); CallbackHeightChangeObserver CHCORemote([&remoteAdded](uint64_t new_height){remoteAdded = std::chrono::steady_clock::now(); }); localNode->addObserver(&CHCOLocal); hopNode->addObserver(&CHCOHop); remoteNode->addObserver(&CHCORemote); remoteNode->addObserver(&remoteHCO); LOG_TRACE("test_block1"); submitInvokingStart = std::chrono::steady_clock::now(); if (!nodeDaemons[1]->submitBlock(test_block1_hex)) return false; submitInvoked = std::chrono::steady_clock::now(); CHECK_AND_ASSERT_MES(blockArrivedToRemote.wait_for(std::chrono::milliseconds(10000)), false, "block 1 propagation too slow >10000ms."); LOG_TRACE("submitBlock() invocation takes: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(submitInvoked - submitInvokingStart).count()) + " ms"); LOG_TRACE("HeightChangedCallback() since submit : " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(localAdded - submitInvoked).count()) + " ms"); LOG_TRACE("Local -> HopNode: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(hoplAdded - localAdded).count()) + " ms"); LOG_TRACE("HopNode -> Remote: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(remoteAdded - hoplAdded).count()) + " ms"); LOG_TRACE("Local -> Remote: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(remoteAdded - localAdded).count()) + " ms"); LOG_TRACE("test_block2"); submitInvokingStart = std::chrono::steady_clock::now(); if (!nodeDaemons[1]->submitBlock(test_block2_hex)) return false; submitInvoked = std::chrono::steady_clock::now(); CHECK_AND_ASSERT_MES(blockArrivedToRemote.wait_for(std::chrono::milliseconds(10000)), false, "block 2 propagation too slow >10000ms."); LOG_TRACE("submitBlock() invocation takes: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(submitInvoked - submitInvokingStart).count()) + " ms"); LOG_TRACE("HeightChangedCallback() since submit : " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(localAdded - submitInvoked).count()) + " ms"); LOG_TRACE("Local -> HopNode: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(hoplAdded - localAdded).count()) + " ms"); LOG_TRACE("HopNode -> Remote: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(remoteAdded - hoplAdded).count()) + " ms"); LOG_TRACE("Local -> Remote: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(remoteAdded - localAdded).count()) + " ms"); LOG_TRACE("test_block3"); submitInvokingStart = std::chrono::steady_clock::now(); if (!nodeDaemons[1]->submitBlock(test_block3_hex)) return false; submitInvoked = std::chrono::steady_clock::now(); CHECK_AND_ASSERT_MES(blockArrivedToRemote.wait_for(std::chrono::milliseconds(10000)), false, "block 3 propagation too slow >10000ms."); LOG_TRACE("submitBlock() invocation takes: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(submitInvoked - submitInvokingStart).count()) + " ms"); LOG_TRACE("HeightChangedCallback() since submit : " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(localAdded - submitInvoked).count()) + " ms"); LOG_TRACE("Local -> HopNode: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(hoplAdded - localAdded).count()) + " ms"); LOG_TRACE("HopNode -> Remote: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(remoteAdded - hoplAdded).count()) + " ms"); LOG_TRACE("Local -> Remote: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(remoteAdded - localAdded).count()) + " ms"); LOG_TRACE("test_block4"); submitInvokingStart = std::chrono::steady_clock::now(); if (!nodeDaemons[1]->submitBlock(test_block4_hex)) return false; submitInvoked = std::chrono::steady_clock::now(); CHECK_AND_ASSERT_MES(blockArrivedToRemote.wait_for(std::chrono::milliseconds(10000)), false, "block 4 propagation too slow >10000ms."); LOG_TRACE("submitBlock() invocation takes: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(submitInvoked - submitInvokingStart).count()) + " ms"); LOG_TRACE("HeightChangedCallback() since submit : " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(localAdded - submitInvoked).count()) + " ms"); LOG_TRACE("Local -> HopNode: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(hoplAdded - localAdded).count()) + " ms"); LOG_TRACE("HopNode -> Remote: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(remoteAdded - hoplAdded).count()) + " ms"); LOG_TRACE("Local -> Remote: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(remoteAdded - localAdded).count()) + " ms"); localNode.release(); remoteNode.release(); hopNode.release(); std::this_thread::sleep_for(std::chrono::milliseconds(5000)); return true; }