async def test_responder_with_custom_socket(event_loop, responder, params):
    (request, response), bufsize = params
    resp, host, port = responder
    sock = await utils.create_custom_socket(host,
                                            0,
                                            flags=0,
                                            options=[(socket.SOL_SOCKET,
                                                      socket.SO_REUSEADDR, 1)])
    stream_reader = netstring.StreamReader()
    string_reader = stream_reader.next_string()
    await event_loop.run_in_executor(None, sock.connect, (host, port))
    reader, writer = await asyncio.open_connection(sock=sock)
    try:
        writer.write(netstring.encode(request))
        res = b''
        while True:
            try:
                part = string_reader.read()
            except netstring.WantRead:
                data = await reader.read(bufsize)
                assert data
                stream_reader.feed(data)
            else:
                if not part:
                    break
                res += part
        assert res == response
    finally:
        writer.close()
async def test_cached(responder):
    resp, host, port = responder
    reader, writer = await asyncio.open_connection(host, port)
    stream_reader = netstring.StreamReader()
    writer.write(netstring.encode(b'test good.loc'))
    writer.write(netstring.encode(b'test good.loc'))
    answers = []
    try:
        for _ in range(2):
            string_reader = stream_reader.next_string()
            res = b''
            while True:
                try:
                    part = string_reader.read()
                except netstring.WantRead:
                    data = await reader.read(4096)
                    assert data
                    stream_reader.feed(data)
                else:
                    if not part:
                        break
                    res += part
            answers.append(res)
        assert answers[0] == answers[1]
    finally:
        writer.close()
async def test_fast_expire(responder):
    resp, host, port = responder
    reader, writer = await asyncio.open_connection(host, port)
    stream_reader = netstring.StreamReader()

    async def answer():
        string_reader = stream_reader.next_string()
        res = b''
        while True:
            try:
                part = string_reader.read()
            except netstring.WantRead:
                data = await reader.read(4096)
                assert data
                stream_reader.feed(data)
            else:
                if not part:
                    break
                res += part
        return res

    try:
        writer.write(netstring.encode(b'test fast-expire.loc'))
        answer_a = await answer()
        await asyncio.sleep(2)
        writer.write(netstring.encode(b'test fast-expire.loc'))
        answer_b = await answer()
        assert answer_a == answer_b == b'OK secure match=mail.loc'
    finally:
        writer.close()
def test_stream_portions():
    stream_reader = netstring.StreamReader()
    string_reader = stream_reader.next_string()
    with pytest.raises(netstring.WantRead):
        string_reader.read()
    stream_reader.feed(b'1:')
    with pytest.raises(netstring.WantRead):
        string_reader.read()
    stream_reader.feed(b'X,9:123')
    assert string_reader.read() == b'X'
    assert string_reader.read() == b''
    string_reader = stream_reader.next_string()
    assert string_reader.read() == b'123'
    stream_reader.feed(b'456')
    assert string_reader.read() == b'456'
    stream_reader.feed(b'789')
    assert string_reader.read() == b'789'
    with pytest.raises(netstring.WantRead):
        string_reader.read()
    stream_reader.feed(b',2:')
    assert string_reader.read() == b''
    string_reader = stream_reader.next_string()
    with pytest.raises(netstring.WantRead):
        string_reader.read()
    stream_reader.feed(b'ok,')
    assert string_reader.read() == b'ok'
    assert string_reader.read() == b''
    string_reader = stream_reader.next_string()
    with pytest.raises(netstring.WantRead):
        string_reader.read()
def test_stream_reader(reference, sequence):
    incoming = sequence[::-1]
    results = []
    stream_reader = netstring.StreamReader()
    while incoming:
        string_reader = stream_reader.next_string()
        res = b''
        while True:
            try:
                buf = string_reader.read()
            except netstring.WantRead:
                if incoming:
                    stream_reader.feed(incoming.pop())
                else:
                    break
            else:
                if not buf:
                    break
                res += buf
        results.append(res)
    assert results == reference
Esempio n. 6
0
 async def query(host, port, domain):
     reader, writer = await asyncio.open_connection(host, port)
     stream_reader = netstring.StreamReader()
     string_reader = stream_reader.next_string()
     writer.write(netstring.encode(b'test ' + domain.encode('ascii')))
     try:
         res = b''
         while True:
             try:
                 part = string_reader.read()
             except netstring.WantRead:
                 data = await reader.read(4096)
                 assert data
                 stream_reader.feed(data)
             else:
                 if not part:
                     break
                 res += part
         return res
     finally:
         writer.close()
async def test_responder(responder, params):
    (request, response), bufsize = params
    resp, host, port = responder
    stream_reader = netstring.StreamReader()
    string_reader = stream_reader.next_string()
    reader, writer = await asyncio.open_connection(host, port)
    try:
        writer.write(netstring.encode(request))
        res = b''
        while True:
            try:
                part = string_reader.read()
            except netstring.WantRead:
                buf = await reader.read(bufsize)
                assert buf
                stream_reader.feed(buf)
            else:
                if not part:
                    break
                res += part
        assert res == response
    finally:
        writer.close()
async def test_unix_responder(unix_responder, params):
    (request, response), bufsize = params
    resp, path = unix_responder
    stream_reader = netstring.StreamReader()
    string_reader = stream_reader.next_string()
    assert os.stat(path).st_mode & 0o777 == 0o666
    reader, writer = await asyncio.open_unix_connection(path)
    try:
        writer.write(netstring.encode(request))
        res = b''
        while True:
            try:
                part = string_reader.read()
            except netstring.WantRead:
                data = await reader.read(bufsize)
                assert data
                stream_reader.feed(data)
            else:
                if not part:
                    break
                res += part
        assert res == response
    finally:
        writer.close()
def test_abandoned_string_reader_handles():
    stream_reader = netstring.StreamReader()
    stream_reader.feed(b'0:,')
    string_reader = stream_reader.next_string()
    with pytest.raises(netstring.InappropriateParserState):
        string_reader = stream_reader.next_string()
def test_limit(limit, sample):
    stream_reader = netstring.StreamReader(limit)
    stream_reader.feed(sample)
    string_reader = stream_reader.next_string()
    with pytest.raises(netstring.TooLong):
        string_reader.read()