16
16
import time
17
17
import unittest
18
18
from test .utils_shared import CMAPListener
19
- from typing import Optional
19
+ from typing import Any , Optional
20
20
21
21
import pytest
22
22
@@ -43,32 +43,24 @@ class TestClientMetadataProse(unittest.TestCase):
43
43
def setUp (self ):
44
44
self .server = MockupDB ()
45
45
# there are two handshake requests, i believe one is from the monitor, and the other is from the client
46
- self .monitor_handshake = False
47
46
self .handshake_req : Optional [dict ] = None
48
47
49
48
def respond (r ):
50
- # Only save the very first request from the driver.
51
- if self .handshake_req is None :
52
- if not self .monitor_handshake :
53
- self .monitor_handshake = True
54
- else :
55
- self .handshake_req = r
49
+ if "ismaster" in r :
50
+ # then this is a handshake request
51
+ self .handshake_req = r
56
52
return r .reply (OpMsgReply (minWireVersion = 0 , maxWireVersion = 13 ))
57
53
58
54
self .server .autoresponds (respond )
59
55
self .server .run ()
60
56
self .addCleanup (self .server .stop )
61
57
62
- def check_metadata_added (
63
- self , add_name : str , add_version : Optional [str ], add_platform : Optional [str ]
64
- ) -> None :
65
- client = MongoClient (
66
- "mongodb://" + self .server .address_string ,
67
- maxIdleTimeMS = 1 ,
68
- driver = DriverInfo ("library" , "1.2" , "Library Platform" ),
69
- )
70
-
71
- # send initial metadata
58
+ def send_ping_and_get_metadata (
59
+ self , client : MongoClient , is_handshake : bool
60
+ ) -> tuple [str , Optional [str ], Optional [str ], dict [str , Any ]]:
61
+ # reset
62
+ if is_handshake :
63
+ self .handshake_req : Optional [dict ] = None
72
64
client .admin .command ("ping" )
73
65
metadata = _get_handshake_driver_info (self .handshake_req )
74
66
driver_metadata = metadata ["driver" ]
@@ -77,25 +69,36 @@ def check_metadata_added(
77
69
driver_metadata ["version" ],
78
70
metadata ["platform" ],
79
71
)
72
+ return name , version , platform , metadata
73
+
74
+ def check_metadata_added (
75
+ self ,
76
+ client : MongoClient ,
77
+ add_name : str ,
78
+ add_version : Optional [str ],
79
+ add_platform : Optional [str ],
80
+ ) -> None :
81
+ # send initial metadata
82
+ name , version , platform , metadata = self .send_ping_and_get_metadata (client , True )
80
83
time .sleep (0.005 )
81
84
82
- # add data
85
+ # add new metadata
83
86
client ._append_metadata (DriverInfo (add_name , add_version , add_platform ))
84
- # make sure new metadata is being sent
85
- self .handshake_req = None
86
- client .admin .command ("ping" )
87
- assert self .handshake_req is not None
88
- new_metadata = _get_handshake_driver_info (self .handshake_req )
89
-
90
- self .assertEqual (
91
- new_metadata ["driver" ]["name" ], f"{ name } |{ add_name } " if add_name is not None else name
87
+ new_name , new_version , new_platform , new_metadata = self .send_ping_and_get_metadata (
88
+ client , True
92
89
)
90
+ print ("IN SEND PING AND GET METADATA" )
91
+ print (name , version , platform )
92
+ print (metadata )
93
+ print (new_name , new_version , new_platform )
94
+ print (new_metadata )
95
+ self .assertEqual (new_name , f"{ name } |{ add_name } " if add_name is not None else name )
93
96
self .assertEqual (
94
- new_metadata [ "driver" ][ "version" ] ,
97
+ new_version ,
95
98
f"{ version } |{ add_version } " if add_version is not None else version ,
96
99
)
97
100
self .assertEqual (
98
- new_metadata [ "platform" ] ,
101
+ new_platform ,
99
102
f"{ platform } |{ add_platform } " if add_platform is not None else platform ,
100
103
)
101
104
@@ -105,126 +108,100 @@ def check_metadata_added(
105
108
new_metadata .pop ("platform" )
106
109
self .assertEqual (metadata , new_metadata )
107
110
108
- client .close ()
109
-
110
111
def test_append_metadata (self ):
111
- self .check_metadata_added ("framework" , "2.0" , "Framework Platform" )
112
+ client = MongoClient (
113
+ "mongodb://" + self .server .address_string ,
114
+ maxIdleTimeMS = 1 ,
115
+ driver = DriverInfo ("library" , "1.2" , "Library Platform" ),
116
+ )
117
+ self .check_metadata_added (client , "framework" , "2.0" , "Framework Platform" )
118
+ client .close ()
112
119
113
120
def test_append_metadata_platform_none (self ):
114
- self .check_metadata_added ("framework" , "2.0" , None )
121
+ client = MongoClient (
122
+ "mongodb://" + self .server .address_string ,
123
+ maxIdleTimeMS = 1 ,
124
+ driver = DriverInfo ("library" , "1.2" , "Library Platform" ),
125
+ )
126
+ self .check_metadata_added (client , "framework" , "2.0" , None )
127
+ client .close ()
115
128
116
129
def test_append_metadata_version_none (self ):
117
- self .check_metadata_added ("framework" , None , "Framework Platform" )
118
-
119
- def test_append_platform_version_none (self ):
120
- self .check_metadata_added ("framework" , None , None )
130
+ client = MongoClient (
131
+ "mongodb://" + self .server .address_string ,
132
+ maxIdleTimeMS = 1 ,
133
+ driver = DriverInfo ("library" , "1.2" , "Library Platform" ),
134
+ )
135
+ self .check_metadata_added (client , "framework" , None , "Framework Platform" )
136
+ client .close ()
121
137
122
- def test_doesnt_update_established_connections (self ):
123
- listener = CMAPListener ()
138
+ def test_append_metadata_platform_version_none (self ):
124
139
client = MongoClient (
125
140
"mongodb://" + self .server .address_string ,
126
141
maxIdleTimeMS = 1 ,
127
142
driver = DriverInfo ("library" , "1.2" , "Library Platform" ),
128
- event_listeners = [listener ],
129
143
)
144
+ self .check_metadata_added (client , "framework" , None , None )
145
+ client .close ()
130
146
131
- # send initial metadata
132
- client .admin .command ("ping" )
133
- metadata = _get_handshake_driver_info (self .handshake_req )
134
- driver_metadata = metadata ["driver" ]
135
- name , version , platform = (
136
- driver_metadata ["name" ],
137
- driver_metadata ["version" ],
138
- metadata ["platform" ],
147
+ def test_multiple_successive_metadata_updates (self ):
148
+ client = MongoClient (
149
+ "mongodb://" + self .server .address_string , maxIdleTimeMS = 1 , connect = False
139
150
)
140
- self . assertIsNotNone ( name )
141
- self .assertIsNotNone ( version )
142
- self . assertIsNotNone ( platform )
151
+ client . _append_metadata ( DriverInfo ( "library" , "1.2" , "Library Platform" ) )
152
+ self .check_metadata_added ( client , "framework" , "2.0" , "Framework Platform" )
153
+ client . close ( )
143
154
144
- # add data
145
- add_name , add_version , add_platform = "framework" , "2.0" , "Framework Platform"
146
- client ._append_metadata (DriverInfo (add_name , add_version , add_platform ))
147
- # check new data isn't sent
148
- self .handshake_req : Optional [dict ] = None
149
- client .admin .command ("ping" )
150
- self .assertIsNotNone (self .handshake_req )
151
- assert self .handshake_req is not None # so mypy knows that it's not None
152
- self .assertNotIn ("client" , self .handshake_req )
153
- self .assertEqual (listener .event_count (ConnectionClosedEvent ), 0 )
155
+ def test_multiple_successive_metadata_updates_platform_none (self ):
156
+ client = MongoClient (
157
+ "mongodb://" + self .server .address_string ,
158
+ maxIdleTimeMS = 1 ,
159
+ )
160
+ client ._append_metadata (DriverInfo ("library" , "1.2" , "Library Platform" ))
161
+ self .check_metadata_added (client , "framework" , "2.0" , None )
162
+ client .close ()
154
163
164
+ def test_multiple_successive_metadata_updates_version_none (self ):
165
+ client = MongoClient (
166
+ "mongodb://" + self .server .address_string ,
167
+ maxIdleTimeMS = 1 ,
168
+ )
169
+ client ._append_metadata (DriverInfo ("library" , "1.2" , "Library Platform" ))
170
+ self .check_metadata_added (client , "framework" , None , "Framework Platform" )
171
+ client .close ()
172
+
173
+ def test_multiple_successive_metadata_updates_platform_version_none (self ):
174
+ client = MongoClient (
175
+ "mongodb://" + self .server .address_string ,
176
+ maxIdleTimeMS = 1 ,
177
+ )
178
+ client ._append_metadata (DriverInfo ("library" , "1.2" , "Library Platform" ))
179
+ self .check_metadata_added (client , "framework" , None , None )
155
180
client .close ()
156
181
157
- def test_append_metadata_multiple_times (self ):
182
+ def test_doesnt_update_established_connections (self ):
183
+ listener = CMAPListener ()
158
184
client = MongoClient (
159
185
"mongodb://" + self .server .address_string ,
160
186
maxIdleTimeMS = 1 ,
161
187
driver = DriverInfo ("library" , "1.2" , "Library Platform" ),
188
+ event_listeners = [listener ],
162
189
)
163
190
164
191
# send initial metadata
165
- client .admin .command ("ping" )
166
- metadata = _get_handshake_driver_info (self .handshake_req )
167
- driver_metadata = metadata ["driver" ]
168
- name , version , platform = (
169
- driver_metadata ["name" ],
170
- driver_metadata ["version" ],
171
- metadata ["platform" ],
172
- )
173
- time .sleep (0.005 )
192
+ name , version , platform , metadata = self .send_ping_and_get_metadata (client , True )
193
+ self .assertIsNotNone (name )
194
+ self .assertIsNotNone (version )
195
+ self .assertIsNotNone (platform )
174
196
175
197
# add data
176
198
add_name , add_version , add_platform = "framework" , "2.0" , "Framework Platform"
177
199
client ._append_metadata (DriverInfo (add_name , add_version , add_platform ))
178
- # make sure new metadata is being sent
179
- self .handshake_req = None
180
- client .admin .command ("ping" )
181
- assert self .handshake_req is not None
182
- new_metadata = _get_handshake_driver_info (self .handshake_req )
183
-
184
- self .assertEqual (
185
- new_metadata ["driver" ]["name" ], f"{ name } |{ add_name } " if add_name is not None else name
186
- )
187
- self .assertEqual (
188
- new_metadata ["driver" ]["version" ],
189
- f"{ version } |{ add_version } " if add_version is not None else version ,
190
- )
191
- self .assertEqual (
192
- new_metadata ["platform" ],
193
- f"{ platform } |{ add_platform } " if add_platform is not None else platform ,
194
- )
195
-
196
- metadata .pop ("driver" )
197
- metadata .pop ("platform" )
198
- new_metadata .pop ("driver" )
199
- new_metadata .pop ("platform" )
200
- self .assertEqual (metadata , new_metadata )
201
- time .sleep (0.005 )
202
-
203
- # add data again
204
- add_name2 , add_version2 , add_platform2 = "framework2" , "3.0" , "Framework Platform2"
205
- client ._append_metadata (DriverInfo (add_name2 , add_version2 , add_platform2 ))
206
- # make sure new metadata is being sent
207
- self .handshake_req = None
200
+ # check new data isn't sent
201
+ self .handshake_req : Optional [dict ] = None
208
202
client .admin .command ("ping" )
209
- assert self .handshake_req is not None
210
- new_metadata2 = _get_handshake_driver_info (self .handshake_req )
211
-
212
- self .assertEqual (
213
- new_metadata2 ["driver" ]["name" ],
214
- f"{ name } |{ add_name } |{ add_name2 } " if add_name2 is not None else name ,
215
- )
216
- self .assertEqual (
217
- new_metadata2 ["driver" ]["version" ],
218
- f"{ version } |{ add_version } |{ add_version2 } " if add_version2 is not None else version ,
219
- )
220
- self .assertEqual (
221
- new_metadata2 ["platform" ],
222
- f"{ platform } |{ add_platform } |{ add_platform2 } " if add_platform2 is not None else platform ,
223
- )
224
-
225
- new_metadata2 .pop ("driver" )
226
- new_metadata2 .pop ("platform" )
227
- self .assertEqual (metadata , new_metadata2 )
203
+ self .assertIsNone (self .handshake_req )
204
+ self .assertEqual (listener .event_count (ConnectionClosedEvent ), 0 )
228
205
229
206
client .close ()
230
207
0 commit comments