|
40 | 40 | OperationFailure, |
41 | 41 | NetworkTimeout, |
42 | 42 | InvalidURI) |
43 | | -from pymongo.monitoring import ServerHeartbeatStartedEvent |
| 43 | +from pymongo.monitoring import (ServerHeartbeatListener, |
| 44 | + ServerHeartbeatStartedEvent) |
44 | 45 | from pymongo.mongo_client import MongoClient |
45 | 46 | from pymongo.pool import SocketInfo |
46 | 47 | from pymongo.read_preferences import ReadPreference |
@@ -903,16 +904,43 @@ def test_stale_getmore(self): |
903 | 904 | address=('not-a-member', 27017)) |
904 | 905 |
|
905 | 906 | 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 |
916 | 944 |
|
917 | 945 | def test_small_heartbeat_frequency_ms(self): |
918 | 946 | uri = "mongodb://example/?heartbeatFrequencyMS=499" |
|
0 commit comments