def test_max_pool_size_with_connection_failure(self):
        # The pool acquires its semaphore before attempting to connect; ensure
        # it releases the semaphore on connection failure.
        test_pool = Pool(
            ('somedomainthatdoesntexist.org', 27017),
            PoolOptions(
                max_pool_size=1,
                connect_timeout=1,
                socket_timeout=1,
                wait_queue_timeout=1))
        test_pool.ready()

        # First call to get_socket fails; if pool doesn't release its semaphore
        # then the second call raises "ConnectionFailure: Timed out waiting for
        # socket from pool" instead of AutoReconnect.
        for i in range(2):
            with self.assertRaises(AutoReconnect) as context:
                with test_pool.get_socket({}):
                    pass

            # Testing for AutoReconnect instead of ConnectionFailure, above,
            # is sufficient right *now* to catch a semaphore leak. But that
            # seems error-prone, so check the message too.
            self.assertNotIn('waiting for socket from pool',
                             str(context.exception))
 def create_pool(self,
                 pair=(client_context.host, client_context.port),
                 *args,
                 **kwargs):
     # Start the pool with the correct ssl options.
     pool_options = client_context.client._topology_settings.pool_options
     kwargs['ssl_context'] = pool_options.ssl_context
     kwargs['ssl_match_hostname'] = pool_options.ssl_match_hostname
     kwargs['server_api'] = pool_options.server_api
     pool = Pool(pair, PoolOptions(*args, **kwargs))
     pool.ready()
     return pool