File: test_listener_peer.py

package info (click to toggle)
python-snitun 0.45.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 632 kB
  • sloc: python: 6,646; sh: 5; makefile: 3
file content (170 lines) | stat: -rw-r--r-- 5,136 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
"""Tests for peer listener & manager."""

import asyncio
from datetime import UTC, datetime, timedelta
import hashlib
import os

import pytest

from snitun.multiplexer.crypto import CryptoTransport
from snitun.server.listener_peer import PeerListener
from snitun.server.peer_manager import PeerManager

from ..conftest import Client
from .const_fernet import create_peer_config


async def test_init_listener(peer_manager: PeerManager) -> None:
    """Create a PeerListener instance and start/stop it."""
    listener = PeerListener(peer_manager, "127.0.0.1", "8893")
    await listener.start()

    await asyncio.sleep(0.1)

    await listener.stop()


async def test_peer_listener(
    peer_manager: PeerManager,
    peer_listener: PeerListener,
    test_client_peer: Client,
) -> None:
    """Run a full flow of with a peer."""
    valid = datetime.now(tz=UTC) + timedelta(days=1)
    aes_key = os.urandom(32)
    aes_iv = os.urandom(16)
    hostname = "localhost"
    fernet_token = create_peer_config(valid.timestamp(), hostname, aes_key, aes_iv)

    crypto = CryptoTransport(aes_key, aes_iv)

    test_client_peer.writer.write(fernet_token)
    await test_client_peer.writer.drain()

    token = await test_client_peer.reader.readexactly(32)
    token = hashlib.sha256(crypto.decrypt(token)).digest()
    test_client_peer.writer.write(crypto.encrypt(token))

    await test_client_peer.writer.drain()
    await asyncio.sleep(0.1)

    assert peer_manager.peer_available(hostname)


async def test_peer_listener_invalid(
    peer_manager: PeerManager,
    peer_listener: PeerListener,
    test_client_peer: Client,
) -> None:
    """Run a full flow of with a peer."""
    valid = datetime.now(tz=UTC) - timedelta(days=1)
    aes_key = os.urandom(32)
    aes_iv = os.urandom(16)
    hostname = "localhost"
    fernet_token = create_peer_config(valid.timestamp(), hostname, aes_key, aes_iv)

    crypto = CryptoTransport(aes_key, aes_iv)

    test_client_peer.writer.write(fernet_token)
    await test_client_peer.writer.drain()

    with pytest.raises(asyncio.IncompleteReadError):
        token = await test_client_peer.reader.readexactly(32)


async def test_peer_listener_disconnect(
    peer_manager: PeerManager,
    peer_listener: PeerListener,
    test_client_peer: Client,
) -> None:
    """Run a full flow of with a peer after that disconnect."""
    valid = datetime.now(tz=UTC) + timedelta(days=1)
    aes_key = os.urandom(32)
    aes_iv = os.urandom(16)
    hostname = "localhost"
    fernet_token = create_peer_config(valid.timestamp(), hostname, aes_key, aes_iv)

    crypto = CryptoTransport(aes_key, aes_iv)

    test_client_peer.writer.write(fernet_token)
    await test_client_peer.writer.drain()

    token = await test_client_peer.reader.readexactly(32)
    token = hashlib.sha256(crypto.decrypt(token)).digest()
    test_client_peer.writer.write(crypto.encrypt(token))

    await test_client_peer.writer.drain()
    await asyncio.sleep(0.1)

    assert peer_manager.peer_available(hostname)

    test_client_peer.writer.close()
    await asyncio.sleep(0.1)

    assert not peer_manager.peer_available(hostname)


async def test_peer_listener_timeout(
    raise_timeout: None,
    peer_manager: PeerManager,
    peer_listener: PeerListener,
    test_client_peer: Client,
) -> None:
    """Run a full flow of with a peer."""
    valid = datetime.now(tz=UTC) + timedelta(days=1)
    aes_key = os.urandom(32)
    aes_iv = os.urandom(16)
    hostname = "localhost"
    fernet_token = create_peer_config(valid.timestamp(), hostname, aes_key, aes_iv)

    crypto = CryptoTransport(aes_key, aes_iv)

    test_client_peer.writer.write(fernet_token)
    await test_client_peer.writer.drain()

    with pytest.raises(asyncio.IncompleteReadError):
        token = await test_client_peer.reader.readexactly(32)
        token = hashlib.sha256(crypto.decrypt(token)).digest()
        test_client_peer.writer.write(crypto.encrypt(token))

        await test_client_peer.writer.drain()
        await asyncio.sleep(0.1)

    assert not peer_manager.peer_available(hostname)


async def test_peer_listener_expire(
    peer_manager: PeerManager,
    peer_listener: PeerListener,
    test_client_peer: Client,
) -> None:
    """Run a full flow of with a peer."""
    from snitun.server import listener_peer

    listener_peer.CHECK_VALID_EXPIRE = 0.1

    valid = datetime.now() + timedelta(seconds=1)
    aes_key = os.urandom(32)
    aes_iv = os.urandom(16)
    hostname = "localhost"
    fernet_token = create_peer_config(valid.timestamp(), hostname, aes_key, aes_iv)

    crypto = CryptoTransport(aes_key, aes_iv)

    test_client_peer.writer.write(fernet_token)
    await test_client_peer.writer.drain()

    token = await test_client_peer.reader.readexactly(32)
    token = hashlib.sha256(crypto.decrypt(token)).digest()
    test_client_peer.writer.write(crypto.encrypt(token))

    await test_client_peer.writer.drain()
    await asyncio.sleep(0.1)

    assert peer_manager.peer_available(hostname)

    await asyncio.sleep(1)
    assert not peer_manager.peer_available(hostname)

    listener_peer.CHECK_VALID_EXPIRE = 3600