tests: fix Face/TestTcpTransport/PermanentReconnectWithExponentialBackoff
Change-Id: I9728c8e4f350589fd2f5af03fc82fcdb0f8bfe24
Refs: #4301
diff --git a/tests/daemon/face/tcp-transport.t.cpp b/tests/daemon/face/tcp-transport.t.cpp
index 5ebcc76..2f4171b 100644
--- a/tests/daemon/face/tcp-transport.t.cpp
+++ b/tests/daemon/face/tcp-transport.t.cpp
@@ -135,7 +135,12 @@
handleReconnect(const boost::system::error_code& error) final
{
TcpTransport::handleReconnect(error);
- m_io.afterOp();
+
+ // don't count this invocation as an "op" if the reconnection attempt failed,
+ // because in that case we will instead count the handleReconnectTimeout()
+ // that will eventually be called as well
+ if (getState() == TransportState::UP)
+ m_io.afterOp();
}
void
@@ -179,30 +184,34 @@
this->remoteSocket.close();
// measure retry intervals
- BOOST_REQUIRE_EQUAL(this->limitedIo.run(2, time::seconds(5)), LimitedIo::EXCEED_OPS);
auto retryTime1 = time::steady_clock::now();
- BOOST_CHECK_EQUAL(transportObserver->getState(), TransportState::DOWN);
- BOOST_REQUIRE_EQUAL(this->limitedIo.run(2, time::seconds(5)), LimitedIo::EXCEED_OPS);
+ auto expectedWait1 = TcpTransport::s_initialReconnectWait;
+ BOOST_REQUIRE_EQUAL(this->limitedIo.run(2, expectedWait1 + time::seconds(1)), // add some slack
+ LimitedIo::EXCEED_OPS);
auto retryTime2 = time::steady_clock::now();
BOOST_CHECK_EQUAL(transportObserver->getState(), TransportState::DOWN);
- BOOST_REQUIRE_EQUAL(this->limitedIo.run(2, time::seconds(5)), LimitedIo::EXCEED_OPS);
+ auto expectedWait2 = time::duration_cast<time::nanoseconds>(expectedWait1 *
+ TcpTransport::s_reconnectWaitMultiplier);
+ BOOST_REQUIRE_EQUAL(this->limitedIo.run(2, expectedWait2 + time::seconds(1)), // add some slack
+ LimitedIo::EXCEED_OPS);
auto retryTime3 = time::steady_clock::now();
BOOST_CHECK_EQUAL(transportObserver->getState(), TransportState::DOWN);
// check that the backoff algorithm works
BOOST_CHECK_CLOSE(asFloatMilliseconds(retryTime2 - retryTime1),
- asFloatMilliseconds(TcpTransport::s_initialReconnectWait),
- 10.0);
+ asFloatMilliseconds(expectedWait1), 10.0);
BOOST_CHECK_CLOSE(asFloatMilliseconds(retryTime3 - retryTime2),
- asFloatMilliseconds(TcpTransport::s_initialReconnectWait) * TcpTransport::s_reconnectWaitMultiplier,
- 10.0);
+ asFloatMilliseconds(expectedWait2), 10.0);
// reestablish the TCP connection
this->startAccept(remoteEp);
- BOOST_REQUIRE_EQUAL(this->limitedIo.run(3, time::seconds(10)), LimitedIo::EXCEED_OPS);
+ auto expectedWait3 = time::duration_cast<time::nanoseconds>(expectedWait2 *
+ TcpTransport::s_reconnectWaitMultiplier);
+ BOOST_REQUIRE_EQUAL(this->limitedIo.run(3, // reconnect, handleReconnect, async_accept
+ expectedWait3 + time::seconds(1)), LimitedIo::EXCEED_OPS);
BOOST_CHECK_EQUAL(transportObserver->getState(), TransportState::UP);
// break the TCP connection again
@@ -210,18 +219,15 @@
this->remoteSocket.close();
// measure retry intervals
- BOOST_REQUIRE_EQUAL(this->limitedIo.run(2, time::seconds(5)), LimitedIo::EXCEED_OPS);
auto retryTime4 = time::steady_clock::now();
- BOOST_CHECK_EQUAL(transportObserver->getState(), TransportState::DOWN);
-
- BOOST_REQUIRE_EQUAL(this->limitedIo.run(2, time::seconds(5)), LimitedIo::EXCEED_OPS);
+ BOOST_REQUIRE_EQUAL(this->limitedIo.run(2, expectedWait1 + time::seconds(1)), // add some slack
+ LimitedIo::EXCEED_OPS);
auto retryTime5 = time::steady_clock::now();
BOOST_CHECK_EQUAL(transportObserver->getState(), TransportState::DOWN);
// check that the timeout restarts from the initial value after a successful reconnection
BOOST_CHECK_CLOSE(asFloatMilliseconds(retryTime5 - retryTime4),
- asFloatMilliseconds(TcpTransport::s_initialReconnectWait),
- 10.0);
+ asFloatMilliseconds(expectedWait1), 10.0);
}
BOOST_AUTO_TEST_SUITE_END() // TestTcpTransport