void ConnectionManagerTest::testAddDuringCloseWhenIdle(bool deactivate) { auto extraConn = MockConnection::makeUnique(this); InSequence enforceOrder; // All conns will get closeWhenIdle for (const auto& conn: conns_) { conn->setIdle(true); EXPECT_CALL(*conn, closeWhenIdle()); } cm_->initiateGracefulShutdown(std::chrono::milliseconds(0)); // Add the extra conn in this state extraConn->setIdle(true); conns_.insert(conns_.begin(), std::move(extraConn)); cm_->addConnection(conns_.front().get()); // Shouldn't be deleted yet, call is delayed ASSERT_TRUE(conns_.front().get() != nullptr); // Mark the connection as active conns_.front()->setIdle(false); if (deactivate) { // mark it idle and move to the end of the list. The regular // drainAllConnections code will find it and call closeWhenIdle. The // second loop callback won't find the conn and be a no-op cm_->onDeactivated(*conns_.front()); conns_.front()->setIdle(true); } EXPECT_CALL(*conns_.front(), closeWhenIdle()); eventBase_.loop(); if (!deactivate) { // drainAllConnections didn't find it, closeWhenIdle was invoked by the // second loop callback. cm_->onDeactivated(*conns_.front()); conns_.front()->setIdle(true); } ASSERT_TRUE(conns_.front().get() == nullptr); }
void serverLoop(size_t threadId, folly::EventBase& evb, AsyncMcServerWorker& worker) { worker.setOnRequest(MockMcOnRequest()); evb.loop(); }