async def test_get_cat_image_url(response_mock): response_mock.get( 'http://thecatapi.com/api/images/get?format=xml&type=jpg,png', exception=aiohttp.client_exceptions.ServerDisconnectedError(), ) response_mock.get( 'http://thecatapi.com/api/images/get?format=xml&type=jpg,png', body=('<?xml version="1.0"?>' '<response><data><images><image>' '<url>http://cat.com/404.jpg</url>' '<id>cdu</id>' '<source_url>http://thecatapi.com/?id=cdu</source_url>' '</image></images></data></response>'), headers={'Content-Type': 'text/xml'}, ) response_mock.get( 'http://thecatapi.com/api/images/get?format=xml&type=jpg,png', body=('<?xml version="1.0"?>' '<response><data><images><image>' '<url>http://cannotresolve.com/200.jpg</url>' '<id>cdu</id>' '<source_url>http://thecatapi.com/?id=cdu</source_url>' '</image></images></data></response>'), headers={'Content-Type': 'text/xml'}, ) response_mock.get( 'http://thecatapi.com/api/images/get?format=xml&type=jpg,png', body=('<?xml version="1.0"?>' '<response><data><images><image>' '<url>http://timeout.com/200.jpg</url>' '<id>cdu</id>' '<source_url>http://thecatapi.com/?id=cdu</source_url>' '</image></images></data></response>'), headers={'Content-Type': 'text/xml'}, ) response_mock.get( 'http://thecatapi.com/api/images/get?format=xml&type=jpg,png', body=('<?xml version="1.0"?>' '<response><data><images><image>' '<url>http://cat.com/200.jpg</url>' '<id>cdu</id>' '<source_url>http://thecatapi.com/?id=cdu</source_url>' '</image></images></data></response>'), headers={'Content-Type': 'text/xml'}, ) response_mock.get( 'http://cannotresolve.com/200.jpg', exception=aiohttp.ClientConnectorError(None, OSError()), ) response_mock.get( 'http://timeout.com/200.jpg', exception=asyncio.TimeoutError(), ) response_mock.get('http://cat.com/404.jpg', status=404) response_mock.get('http://cat.com/200.jpg', status=200) url = await get_cat_image_url(0.001) assert url == 'http://cat.com/200.jpg'
async def test_get_dog_image_url(response_mock): response_mock.get( "https://dog.ceo/api/breeds/image/random", body="", status=500, ) response_mock.get( "https://dog.ceo/api/breeds/image/random", exception=aiohttp.client_exceptions.ServerDisconnectedError(), ) response_mock.get( "https://dog.ceo/api/breeds/image/random", body=json.dumps({ "status": "success", "message": "http://dog.com/404.jpg" }), headers={"Content-Type": "application/json"}, ) response_mock.get( "https://dog.ceo/api/breeds/image/random", body=json.dumps({ "status": "success", "message": "http://cannotresolve.com/200.jpg", }), headers={"Content-Type": "application/json"}, ) response_mock.get( "https://dog.ceo/api/breeds/image/random", body=json.dumps({ "status": "success", "message": "http://timeout.com/200.jpg" }), headers={"Content-Type": "application/json"}, ) response_mock.get( "https://dog.ceo/api/breeds/image/random", body=json.dumps({ "status": "success", "message": "http://dog.com/200.jpg" }), headers={"Content-Type": "application/json"}, ) response_mock.get( "http://cannotresolve.com/200.jpg", exception=aiohttp.ClientConnectorError(None, OSError()), ) response_mock.get( "http://timeout.com/200.jpg", exception=asyncio.TimeoutError(), ) response_mock.get("http://dog.com/404.jpg", status=404) response_mock.get("http://dog.com/200.jpg", status=200) with pytest.raises(APIServerError): await get_dog_image_url(0.001) url = await get_dog_image_url(0.001) assert url == "http://dog.com/200.jpg"
async def test_get_dog_image_url(response_mock): response_mock.get( 'https://dog.ceo/api/breeds/image/random', body='', status=500, ) response_mock.get( 'https://dog.ceo/api/breeds/image/random', exception=aiohttp.client_exceptions.ServerDisconnectedError(), ) response_mock.get( 'https://dog.ceo/api/breeds/image/random', body=json.dumps({ 'status': 'success', 'message': 'http://dog.com/404.jpg', }), headers={'Content-Type': 'application/json'}, ) response_mock.get( 'https://dog.ceo/api/breeds/image/random', body=json.dumps({ 'status': 'success', 'message': 'http://cannotresolve.com/200.jpg', }), headers={'Content-Type': 'application/json'}, ) response_mock.get( 'https://dog.ceo/api/breeds/image/random', body=json.dumps({ 'status': 'success', 'message': 'http://timeout.com/200.jpg', }), headers={'Content-Type': 'application/json'}, ) response_mock.get( 'https://dog.ceo/api/breeds/image/random', body=json.dumps({ 'status': 'success', 'message': 'http://dog.com/200.jpg', }), headers={'Content-Type': 'application/json'}, ) response_mock.get( 'http://cannotresolve.com/200.jpg', exception=aiohttp.ClientConnectorError(None, OSError()), ) response_mock.get( 'http://timeout.com/200.jpg', exception=asyncio.TimeoutError(), ) response_mock.get('http://dog.com/404.jpg', status=404) response_mock.get('http://dog.com/200.jpg', status=200) with pytest.raises(APIServerError): await get_dog_image_url(0.001) url = await get_dog_image_url(0.001) assert url == 'http://dog.com/200.jpg'
def test_rpc_call_with_conn_error(create_ethereum_client, loop, server): with mock.patch("aiohttp.client.ClientSession._request") as patched: patched.side_effect = aiohttp.ClientConnectorError('refused') client = yield from create_ethereum_client(server.http_address, loop=loop) with pytest.raises(ConnectionError) as excinfo: yield from client.rpc_call('test_method', id_='test') assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args)[0] == ('POST', server.http_address) assert 'refused' in str(excinfo)
async def test_get_release(error, mocker, spawn_client, resp_is): """ Test that the endpoint returns the latest HMM release. Check that error responses are sent in all expected situations. """ client = await spawn_client(authorize=True) m_fetch = make_mocked_coro(None if error == "404" else { "name": "v2.0.1", "newer": False }) mocker.patch("virtool.hmm.db.fetch_and_update_release", new=m_fetch) if error == "502_repo": m_fetch.side_effect = virtool.errors.GitHubError("404 Not found") if error == "502_github": m_fetch.side_effect = aiohttp.ClientConnectorError( "foo", OSError("Bar")) resp = await client.get("/api/hmms/status/release") m_fetch.assert_called_with(client.app) if error == "404": assert await resp_is.not_found(resp, "Release not found") return if error == "502_repo": assert await resp_is.bad_gateway(resp, "GitHub repository does not exist") return if error == "502_github": assert await resp_is.bad_gateway(resp, "Could not reach GitHub") return assert resp.status == 200 assert await resp.json() == {"name": "v2.0.1", "newer": False}
def aiohttp_error(*args, **kwargs): raise aiohttp.ClientConnectorError(connection_key="foo", os_error=OSError())
async def test_get_cat_image_url(response_mock): response_mock.get( "http://thecatapi.com/api/images/get?format=xml&type=jpg,png", body="", status=500, ) response_mock.get( "http://thecatapi.com/api/images/get?format=xml&type=jpg,png", exception=aiohttp.client_exceptions.ServerDisconnectedError(), ) response_mock.get( "http://thecatapi.com/api/images/get?format=xml&type=jpg,png", body=('<?xml version="1.0"?>' "<response><data><images><image>" "<url>http://cat.com/404.jpg</url>" "<id>cdu</id>" "<source_url>http://thecatapi.com/?id=cdu</source_url>" "</image></images></data></response>"), headers={"Content-Type": "text/xml"}, ) response_mock.get( "http://thecatapi.com/api/images/get?format=xml&type=jpg,png", body=('<?xml version="1.0"?>' "<response><data><images><image>" "<url>http://cannotresolve.com/200.jpg</url>" "<id>cdu</id>" "<source_url>http://thecatapi.com/?id=cdu</source_url>" "</image></images></data></response>"), headers={"Content-Type": "text/xml"}, ) response_mock.get( "http://thecatapi.com/api/images/get?format=xml&type=jpg,png", body=('<?xml version="1.0"?>' "<response><data><images><image>" "<url>http://timeout.com/200.jpg</url>" "<id>cdu</id>" "<source_url>http://thecatapi.com/?id=cdu</source_url>" "</image></images></data></response>"), headers={"Content-Type": "text/xml"}, ) response_mock.get( "http://thecatapi.com/api/images/get?format=xml&type=jpg,png", body=('<?xml version="1.0"?>' "<response><data><images><image>" "<url>http://cat.com/200.jpg</url>" "<id>cdu</id>" "<source_url>http://thecatapi.com/?id=cdu</source_url>" "</image></images></data></response>"), headers={"Content-Type": "text/xml"}, ) response_mock.get( "http://cannotresolve.com/200.jpg", exception=aiohttp.ClientConnectorError(None, OSError()), ) response_mock.get( "http://timeout.com/200.jpg", exception=asyncio.TimeoutError(), ) response_mock.get("http://cat.com/404.jpg", status=404) response_mock.get("http://cat.com/200.jpg", status=200) with pytest.raises(APIServerError): await get_cat_image_url(0.001) url = await get_cat_image_url(0.001) assert url == "http://cat.com/200.jpg"
async def _create_socks_connection(self, req): sslcontext = self._get_ssl_context(req) fingerprint, hashfunc = self._get_fingerprint_and_hashfunc(req) if not self._remote_resolve: try: dst_hosts = list(await self._resolve_host(req.host, req.port)) dst = dst_hosts[0]['host'], dst_hosts[0]['port'] except OSError as exc: raise aiohttp.ClientConnectorError(req.connection_key, exc) from exc else: dst = req.host, req.port try: proxy_hosts = await self._resolve_host(req.proxy.host, req.proxy.port) except OSError as exc: raise aiohttp.ClientConnectorError(req.connection_key, exc) from exc last_exc = None for hinfo in proxy_hosts: if req.proxy.scheme == 'socks4': proxy = Socks4Addr(hinfo['host'], hinfo['port']) else: proxy = Socks5Addr(hinfo['host'], hinfo['port']) try: transp, proto = await self._wrap_create_socks_connection( self._factory, proxy, req.proxy_auth, dst, loop=self._loop, remote_resolve=self._remote_resolve, ssl=sslcontext, family=hinfo['family'], proto=hinfo['proto'], flags=hinfo['flags'], local_addr=self._local_addr, req=req, server_hostname=req.host if sslcontext else None) except aiohttp.ClientConnectorError as exc: last_exc = exc continue has_cert = transp.get_extra_info('sslcontext') if has_cert and fingerprint: sock = transp.get_extra_info('socket') if not hasattr(sock, 'getpeercert'): # Workaround for asyncio 3.5.0 # Starting from 3.5.1 version # there is 'ssl_object' extra info in transport sock = transp._ssl_protocol._sslpipe.ssl_object # gives DER-encoded cert as a sequence of bytes (or None) cert = sock.getpeercert(binary_form=True) assert cert got = hashfunc(cert).digest() expected = fingerprint if got != expected: transp.close() if not self._cleanup_closed_disabled: self._cleanup_closed_transports.append(transp) last_exc = aiohttp.ServerFingerprintMismatch( expected, got, req.host, req.port) continue return transp, proto else: raise last_exc
async def _create_socks_connection(self, req): sslcontext = self._get_ssl_context(req) fingerprint = self._get_fingerprint(req) if not self._remote_resolve: try: dst_hosts = list(await self._resolve_host(req.host, req.port)) dst = dst_hosts[0]['host'], dst_hosts[0]['port'] except OSError as exc: raise aiohttp.ClientConnectorError(req.connection_key, exc) from exc else: dst = req.host, req.port try: proxy_hosts = await self._resolve_host(req.proxy.host, req.proxy.port) except OSError as exc: raise aiohttp.ClientConnectorError(req.connection_key, exc) from exc last_exc = None for hinfo in proxy_hosts: if req.proxy.scheme == 'socks4': proxy = Socks4Addr(hinfo['host'], hinfo['port']) else: proxy = Socks5Addr(hinfo['host'], hinfo['port']) try: transp, proto = await self._wrap_create_socks_connection( self._factory, proxy, req.proxy_auth, dst, loop=self._loop, remote_resolve=self._remote_resolve, ssl=sslcontext, family=hinfo['family'], proto=hinfo['proto'], flags=hinfo['flags'], local_addr=self._local_addr, req=req, server_hostname=req.host if sslcontext else None) except aiohttp.ClientConnectorError as exc: last_exc = exc continue if req.is_ssl() and fingerprint: try: fingerprint.check(transp) except ServerFingerprintMismatch as exc: transp.close() if not self._cleanup_closed_disabled: self._cleanup_closed_transports.append(transp) last_exc = exc continue return transp, proto else: raise last_exc
async def test_async_open_connecting_error(self, web_monitor_app, response_mock): response_mock.get( url_list['url'], exception=aiohttp.ClientConnectorError(None, OSError())) result = await web_monitor_app.async_open(url_list) assert 'Connection Error' == result['err_status']