Ejemplo n.º 1
0
def test_good_login():
    mux, server, client = test_new_user()
    client.close()
    run_servers(mux, server)

    client = mux._make_client_socket('0.0.0.0',
                                     1000,
                                     record=True,
                                     send_str=True)
    run_servers(mux, server)
    assert 'Enter your username,'.split() == client.text[0].split()[:3]

    clear_client_history(client)
    client.send('foo\r\n')
    run_servers(mux, server)
    assert ['Enter password:'******'bar\r\n')
    run_servers(mux, server)
    assert ['Welcome, foo', 'foo has joined'] == client.text

    clear_client_history(client)
    client.send('hello, world\r\n')
    run_servers(mux, server)
    assert ['foo: hello, world'] == client.text
Ejemplo n.º 2
0
def test_new_user():
    mux, [server], [client] = construct_network(1, factory=talker.auth_server)

    run_servers(mux, server)
    assert 'Enter your username,'.split() == client.text[0].split()[:3]

    clear_client_history(client)
    client.send('foo\r\n')
    run_servers(mux, server)
    assert ['A new user! Enter your password:'******'bar\r\n')
    run_servers(mux, server)
    assert ['Confirm your password:'******'bar\r\n')
    run_servers(mux, server)
    assert ['Welcome, foo', 'foo has joined'] == client.text

    clear_client_history(client)
    client.send('hello, world\r\n')
    run_servers(mux, server)
    assert ['foo: hello, world'] == client.text

    # We might build on this test
    return mux, server, client
Ejemplo n.º 3
0
def test_network_1():
    mux, servers, clients = construct_network(2)
    name_clients(mux, servers, clients)

    clear_client_history(*clients)
    clients[1].send('/peer-connect 0.0.0.0 2000\r\n')
    run_servers(mux, servers[1])  # This'll error out
    clients[1].send('/peers\r\n')
    run_servers(mux, servers[1])  # No peers
    assert ['There are 0 peers directly connected'] == clients[1].text

    peer_listen(mux, servers, clients)

    clients[1].send('/peer-connect 0.0.0.0 2000\r\n')
    run_servers_randomly(mux, *servers)

    clear_client_history(*clients)
    clients[0].send('/peers\r\n')
    clients[1].send('/peers\r\n')
    run_servers_randomly(mux, *servers)  # Should have a pair of peers

    assert ['There are 1 peers directly connected'] == clients[0].text[-2:-1]
    assert [
        'There are 1 peers directly connected', "PeerClient('0.0.0.0', 2000)"
    ] == clients[1].text[-2:]

    clear_client_history(*clients)
    clients[0].send('/who\r\n')
    clients[1].send('/who\r\n')
    run_servers(mux, *servers)  # Should result in a few broadcasts

    for client in clients:
        assert [
            'There are 2 users online on 2 servers:',
            '  Server: s0',
            '    client0',
            '  Server: s1',
            '    client1',
        ] == client.text
Ejemplo n.º 4
0
def test_random_network():
    NUM_SERVERS = 15

    mux, servers, clients = construct_network(NUM_SERVERS)
    name_clients(mux, servers, clients)
    peer_listen(mux, servers, clients)

    connected = {i: {i} for i in range(NUM_SERVERS)}

    for i, c in enumerate(clients):
        peer = random.randrange(NUM_SERVERS)
        print(i, '/peer-connect 0.0.0.0', 2000 + peer)
        c.send('/peer-connect 0.0.0.0 {}\r\n', 2000 + peer)
        # We can multi-peer with a single server:
        # eg, 0 peer-connects to 1, 1 peer-connects to 0.
        # We don't care about that as far as /who is concerned -
        # just the total number of attached servers

        # Merge set items
        connected[i].update(connected[peer])
        for p in connected[peer]:
            connected[p] = connected[i]

    run_servers_randomly(mux, *servers)

    # At this point the algorithm will have stabilised, so we can run all
    # server messages together again.

    # Count the number of peers. Should be 2*NUM_SERVERS
    clear_client_history(*clients)
    for c in clients:
        c.send('/peers\r\n')
    run_servers(mux, *servers)

    peers = 0
    for c in clients:
        # There are .* peers directly connected
        words = c.text[0].split()
        assert ['There', 'are'] == words[:2]
        assert ['peers', 'directly', 'connected'] == words[3:]
        peers += int(words[2])

    assert 2 * NUM_SERVERS == peers

    clear_client_history(*clients)
    for c in clients:
        c.send('/who\r\n')
    run_servers(mux, *servers)

    for i, c in enumerate(clients):
        # 'There are \d+ users online on \d+ servers:'
        print(c.text)
        words = c.text[0].split()
        assert 'There are'.split() == words[:2]
        assert 'users online on'.split() == words[3:6]
        assert 'servers:'.split() == words[7:]
        u = int(words[2])
        s = int(words[6])
        # Each server has a single client logged onto it
        assert u == s
        # The number of servers reachable from #i is as expected
        assert len(connected[i]) == s

        s_name = None
        for line in c.text[1:]:
            if line.startswith('  Server:'):
                s_name = line.split()[-1].partition('s')[2]
                s -= 1
                # This server is expected to be reachable
                assert int(s_name) in connected[i]
            elif line.startswith('    '):
                u_name = line.split()[-1].partition('client')[2]
                u -= 1
                # Each user is on their corresponding server
                assert u_name == s_name
            else:
                assert False
        # We've accounted for all users and servers
        assert 0 == u
        assert 0 == s
Ejemplo n.º 5
0
def peer_listen(mux, servers, clients):
    run_servers(mux, *servers)
    for i, (s, c) in enumerate(zip(servers, clients)):
        c.send('/peer-listen 0.0.0.0 {}\r\n', 2000 + i)
    run_servers(mux, *servers)
Ejemplo n.º 6
0
def name_clients(mux, servers, clients):
    run_servers(mux, *servers)
    for i, (s, c) in enumerate(zip(servers, clients)):
        c.send('/nick client{}\r\n', i)
    run_servers(mux, *servers)