Exemple #1
0
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'
Exemple #2
0
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"
Exemple #3
0
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'
Exemple #4
0
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)
Exemple #5
0
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}
Exemple #6
0
def aiohttp_error(*args, **kwargs):
    raise aiohttp.ClientConnectorError(connection_key="foo",
                                       os_error=OSError())
Exemple #7
0
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"
Exemple #8
0
    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
Exemple #9
0
    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']