diff --git a/pymongo/pool_options.py b/pymongo/pool_options.py index 5c24709b16..b6c1071f62 100644 --- a/pymongo/pool_options.py +++ b/pymongo/pool_options.py @@ -386,20 +386,26 @@ def __init__( def _update_metadata(self, driver: DriverInfo) -> None: """Updates the client's metadata""" + if driver.name and driver.name.lower() in self.__metadata["driver"]["name"].lower().split( + "|" + ): + return metadata = copy.deepcopy(self.__metadata) - if driver.name: - metadata["driver"]["name"] = "{}|{}".format( - metadata["driver"]["name"], - driver.name, - ) - if driver.version: - metadata["driver"]["version"] = "{}|{}".format( - metadata["driver"]["version"], - driver.version, - ) - if driver.platform: - metadata["platform"] = "{}|{}".format(metadata["platform"], driver.platform) + + name = driver.name or "" + version = driver.version or "" + platform = driver.platform or "" + + metadata["driver"]["name"] = "{}|{}".format( + metadata["driver"]["name"], + name, + ) + metadata["driver"]["version"] = "{}|{}".format( + metadata["driver"]["version"], + version, + ) + metadata["platform"] = "{}|{}".format(metadata["platform"], platform) self.__metadata = metadata diff --git a/test/asynchronous/test_client.py b/test/asynchronous/test_client.py index 52f16e0bcc..3a4c804220 100644 --- a/test/asynchronous/test_client.py +++ b/test/asynchronous/test_client.py @@ -372,6 +372,7 @@ async def test_metadata(self): else: metadata["driver"]["name"] = "PyMongo|async|FooDriver" metadata["driver"]["version"] = "{}|1.2.3".format(_METADATA["driver"]["version"]) + metadata["platform"] = "{}|".format(_METADATA["platform"]) client = self.simple_client( "foo", 27017, diff --git a/test/asynchronous/test_client_metadata.py b/test/asynchronous/test_client_metadata.py index cfecb49748..18eb72b5bb 100644 --- a/test/asynchronous/test_client_metadata.py +++ b/test/asynchronous/test_client_metadata.py @@ -107,15 +107,20 @@ async def check_metadata_added( new_name, new_version, new_platform, new_metadata = await self.send_ping_and_get_metadata( client, True ) - self.assertEqual(new_name, f"{name}|{add_name}" if add_name is not None else name) - self.assertEqual( - new_version, - f"{version}|{add_version}" if add_version is not None else version, - ) - self.assertEqual( - new_platform, - f"{platform}|{add_platform}" if add_platform is not None else platform, - ) + if add_name is not None and add_name.lower() in name.lower().split("|"): + self.assertEqual(name, new_name) + self.assertEqual(version, new_version) + self.assertEqual(platform, new_platform) + else: + self.assertEqual(new_name, f"{name}|{add_name}" if add_name is not None else f"{name}|") + self.assertEqual( + new_version, + f"{version}|{add_version}" if add_version is not None else f"{version}|", + ) + self.assertEqual( + new_platform, + f"{platform}|{add_platform}" if add_platform is not None else f"{platform}|", + ) metadata.pop("driver") metadata.pop("platform") @@ -210,6 +215,18 @@ async def test_doesnt_update_established_connections(self): self.assertIsNone(self.handshake_req) self.assertEqual(listener.event_count(ConnectionClosedEvent), 0) + async def test_duplicate_driver_name_no_op(self): + client = await self.async_rs_or_single_client( + "mongodb://" + self.server.address_string, + maxIdleTimeMS=1, + ) + client.append_metadata(DriverInfo("library", "1.2", "Library Platform")) + await self.check_metadata_added(client, "framework", None, None) + # wait for connection to become idle + await asyncio.sleep(0.005) + # add same metadata again + await self.check_metadata_added(client, "Framework", None, None) + if __name__ == "__main__": unittest.main() diff --git a/test/test_client.py b/test/test_client.py index dd1bf94cf1..1c2ebcf13c 100644 --- a/test/test_client.py +++ b/test/test_client.py @@ -365,6 +365,7 @@ def test_metadata(self): else: metadata["driver"]["name"] = "PyMongo|FooDriver" metadata["driver"]["version"] = "{}|1.2.3".format(_METADATA["driver"]["version"]) + metadata["platform"] = "{}|".format(_METADATA["platform"]) client = self.simple_client( "foo", 27017, diff --git a/test/test_client_metadata.py b/test/test_client_metadata.py index 32cb9b8009..5e1822d755 100644 --- a/test/test_client_metadata.py +++ b/test/test_client_metadata.py @@ -107,15 +107,20 @@ def check_metadata_added( new_name, new_version, new_platform, new_metadata = self.send_ping_and_get_metadata( client, True ) - self.assertEqual(new_name, f"{name}|{add_name}" if add_name is not None else name) - self.assertEqual( - new_version, - f"{version}|{add_version}" if add_version is not None else version, - ) - self.assertEqual( - new_platform, - f"{platform}|{add_platform}" if add_platform is not None else platform, - ) + if add_name is not None and add_name.lower() in name.lower().split("|"): + self.assertEqual(name, new_name) + self.assertEqual(version, new_version) + self.assertEqual(platform, new_platform) + else: + self.assertEqual(new_name, f"{name}|{add_name}" if add_name is not None else f"{name}|") + self.assertEqual( + new_version, + f"{version}|{add_version}" if add_version is not None else f"{version}|", + ) + self.assertEqual( + new_platform, + f"{platform}|{add_platform}" if add_platform is not None else f"{platform}|", + ) metadata.pop("driver") metadata.pop("platform") @@ -210,6 +215,18 @@ def test_doesnt_update_established_connections(self): self.assertIsNone(self.handshake_req) self.assertEqual(listener.event_count(ConnectionClosedEvent), 0) + def test_duplicate_driver_name_no_op(self): + client = self.rs_or_single_client( + "mongodb://" + self.server.address_string, + maxIdleTimeMS=1, + ) + client.append_metadata(DriverInfo("library", "1.2", "Library Platform")) + self.check_metadata_added(client, "framework", None, None) + # wait for connection to become idle + time.sleep(0.005) + # add same metadata again + self.check_metadata_added(client, "Framework", None, None) + if __name__ == "__main__": unittest.main()