Skip to content

Commit 9ab7036

Browse files
committed
PYTHON-1105 More reliable heartbeatFrequencyMS test.
1 parent a04d391 commit 9ab7036

File tree

1 file changed

+39
-11
lines changed

1 file changed

+39
-11
lines changed

test/test_client.py

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
OperationFailure,
4141
NetworkTimeout,
4242
InvalidURI)
43-
from pymongo.monitoring import ServerHeartbeatStartedEvent
43+
from pymongo.monitoring import (ServerHeartbeatListener,
44+
ServerHeartbeatStartedEvent)
4445
from pymongo.mongo_client import MongoClient
4546
from pymongo.pool import SocketInfo
4647
from pymongo.read_preferences import ReadPreference
@@ -903,16 +904,43 @@ def test_stale_getmore(self):
903904
address=('not-a-member', 27017))
904905

905906
def test_heartbeat_frequency_ms(self):
906-
listener = HeartbeatEventListener()
907-
uri = "mongodb://%s:%d/?heartbeatFrequencyMS=500" % (host, port)
908-
client = single_client(uri, event_listeners=[listener])
909-
time.sleep(3)
910-
started_events = [r for r in listener.results
911-
if isinstance(r, ServerHeartbeatStartedEvent)]
912-
913-
# Frequency is 500ms, expect 5 or 6 events in 3 sec, but be forgiving.
914-
self.assertGreaterEqual(len(started_events), 4)
915-
client.close()
907+
class HeartbeatStartedListener(ServerHeartbeatListener):
908+
def __init__(self):
909+
self.results = []
910+
911+
def started(self, event):
912+
self.results.append(event)
913+
914+
def succeeded(self, event):
915+
pass
916+
917+
def failed(self, event):
918+
pass
919+
920+
old_init = ServerHeartbeatStartedEvent.__init__
921+
922+
def init(self, *args):
923+
old_init(self, *args)
924+
self.time = time.time()
925+
926+
try:
927+
ServerHeartbeatStartedEvent.__init__ = init
928+
listener = HeartbeatStartedListener()
929+
uri = "mongodb://%s:%d/?heartbeatFrequencyMS=500" % (host, port)
930+
client = single_client(uri, event_listeners=[listener])
931+
wait_until(lambda: len(listener.results) >= 2,
932+
"record two ServerHeartbeatStartedEvents")
933+
934+
events = listener.results
935+
936+
# Default heartbeatFrequencyMS is 10 sec. Check the interval was
937+
# closer to 0.5 sec with heartbeatFrequencyMS configured.
938+
self.assertAlmostEqual(
939+
events[1].time - events[0].time, 0.5, delta=2)
940+
941+
client.close()
942+
finally:
943+
ServerHeartbeatStartedEvent.__init__ = old_init
916944

917945
def test_small_heartbeat_frequency_ms(self):
918946
uri = "mongodb://example/?heartbeatFrequencyMS=499"

0 commit comments

Comments
 (0)