bool BaseFunctionalTests::waitForPeerCount(CryptoNote::INode& node, size_t expectedPeerCount) { PeerCountWaiter peerCountWaiter(m_dispatcher); node.addObserver(&peerCountWaiter); if (node.getPeerCount() != expectedPeerCount) { peerCountWaiter.wait(expectedPeerCount); } node.removeObserver(&peerCountWaiter); // TODO workaround: make sure ObserverManager doesn't have local pointers to peerCountWaiter, so it can be destroyed std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Run all spawned handlers from PeerCountWaiter::peerCountUpdated m_dispatcher.yield(); return !peerCountWaiter.m_timedout; }
bool BaseFunctionalTests::waitForPoolSize(size_t nodeIndex, CryptoNote::INode& node, size_t expectedPoolSize, std::vector<std::unique_ptr<CryptoNote::ITransactionReader>>& txPool) { System::Event event(m_dispatcher); PoolUpdateWaiter poolUpdateWaiter(m_dispatcher, event); node.addObserver(&poolUpdateWaiter); bool ok; for (size_t i = 0; ; ++i) { ok = getNodeTransactionPool(nodeIndex, node, txPool); if (!ok) { break; } if (txPool.size() == expectedPoolSize) { break; } // TODO NodeRpcProxy doesn't send poolChanged() notification!!! //event.wait(); //event.clear(); // WORKAROUND if (i < 3 * P2P_DEFAULT_HANDSHAKE_INTERVAL) { std::this_thread::sleep_for(std::chrono::seconds(1)); } else { ok = false; break; } } node.removeObserver(&poolUpdateWaiter); // TODO workaround: make sure ObserverManager doesn't have local pointers to poolUpdateWaiter, so it can be destroyed std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Run all spawned handlers from PoolUpdateWaiter::poolChanged m_dispatcher.yield(); return ok; }