1616import time
1717import unittest
1818from test .utils_shared import CMAPListener
19- from typing import Optional
19+ from typing import Any , Optional
2020
2121import pytest
2222
@@ -43,32 +43,24 @@ class TestClientMetadataProse(unittest.TestCase):
4343 def setUp (self ):
4444 self .server = MockupDB ()
4545 # there are two handshake requests, i believe one is from the monitor, and the other is from the client
46- self .monitor_handshake = False
4746 self .handshake_req : Optional [dict ] = None
4847
4948 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
5652 return r .reply (OpMsgReply (minWireVersion = 0 , maxWireVersion = 13 ))
5753
5854 self .server .autoresponds (respond )
5955 self .server .run ()
6056 self .addCleanup (self .server .stop )
6157
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
7264 client .admin .command ("ping" )
7365 metadata = _get_handshake_driver_info (self .handshake_req )
7466 driver_metadata = metadata ["driver" ]
@@ -77,25 +69,36 @@ def check_metadata_added(
7769 driver_metadata ["version" ],
7870 metadata ["platform" ],
7971 )
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 )
8083 time .sleep (0.005 )
8184
82- # add data
85+ # add new metadata
8386 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
9289 )
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 )
9396 self .assertEqual (
94- new_metadata [ "driver" ][ "version" ] ,
97+ new_version ,
9598 f"{ version } |{ add_version } " if add_version is not None else version ,
9699 )
97100 self .assertEqual (
98- new_metadata [ "platform" ] ,
101+ new_platform ,
99102 f"{ platform } |{ add_platform } " if add_platform is not None else platform ,
100103 )
101104
@@ -105,126 +108,100 @@ def check_metadata_added(
105108 new_metadata .pop ("platform" )
106109 self .assertEqual (metadata , new_metadata )
107110
108- client .close ()
109-
110111 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 ()
112119
113120 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 ()
115128
116129 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 ()
121137
122- def test_doesnt_update_established_connections (self ):
123- listener = CMAPListener ()
138+ def test_append_metadata_platform_version_none (self ):
124139 client = MongoClient (
125140 "mongodb://" + self .server .address_string ,
126141 maxIdleTimeMS = 1 ,
127142 driver = DriverInfo ("library" , "1.2" , "Library Platform" ),
128- event_listeners = [listener ],
129143 )
144+ self .check_metadata_added (client , "framework" , None , None )
145+ client .close ()
130146
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
139150 )
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 ( )
143154
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 ()
154163
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 )
155180 client .close ()
156181
157- def test_append_metadata_multiple_times (self ):
182+ def test_doesnt_update_established_connections (self ):
183+ listener = CMAPListener ()
158184 client = MongoClient (
159185 "mongodb://" + self .server .address_string ,
160186 maxIdleTimeMS = 1 ,
161187 driver = DriverInfo ("library" , "1.2" , "Library Platform" ),
188+ event_listeners = [listener ],
162189 )
163190
164191 # 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 )
174196
175197 # add data
176198 add_name , add_version , add_platform = "framework" , "2.0" , "Framework Platform"
177199 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
208202 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 )
228205
229206 client .close ()
230207
0 commit comments