A Python port of the Invisible Internet Project (I2P)
1"""Tests for IRC server tunnel — TDD: tests before implementation."""
2
3import pytest
4
5from i2p_apps.i2ptunnel.config import TunnelDefinition, TunnelType
6from i2p_apps.i2ptunnel.irc_server import IRCServerTask
7
8
9class MockIRCServerSession:
10 def __init__(self):
11 self.destination = "IRCS" * 129
12
13 async def accept(self):
14 raise NotImplementedError
15
16 async def close(self):
17 pass
18
19
20def _make_ircserver_def(**kw):
21 defaults = dict(
22 name="irc-server",
23 type=TunnelType.IRCSERVER,
24 target_host="127.0.0.1",
25 target_port=6667,
26 )
27 defaults.update(kw)
28 return TunnelDefinition(**defaults)
29
30
31class TestIRCServerTask:
32 def test_creation(self):
33 task = IRCServerTask(_make_ircserver_def(), MockIRCServerSession())
34 assert task.tunnel_type == TunnelType.IRCSERVER
35
36 def test_mangle_user_command(self):
37 task = IRCServerTask(_make_ircserver_def(), MockIRCServerSession())
38 remote_dest = "A" * 516
39 mangled = task._mangle_user("USER oldname 0 * :Real Name", remote_dest)
40 assert "USER" in mangled
41 assert "oldname" not in mangled
42 # Should contain a hash-based cloak
43 assert ".b32.i2p" in mangled or len(mangled) > 0
44
45 def test_mangle_preserves_realname(self):
46 task = IRCServerTask(_make_ircserver_def(), MockIRCServerSession())
47 remote_dest = "B" * 516
48 mangled = task._mangle_user("USER bob 0 * :Bob Smith", remote_dest)
49 assert "Bob Smith" in mangled
50
51 def test_non_user_passes_through(self):
52 task = IRCServerTask(_make_ircserver_def(), MockIRCServerSession())
53 assert task._mangle_user("NICK bobby", "dest") == "NICK bobby"
54
55 def test_cloak_deterministic(self):
56 """Same destination should produce same cloak."""
57 task = IRCServerTask(_make_ircserver_def(), MockIRCServerSession())
58 dest = "C" * 516
59 c1 = task._compute_cloak(dest)
60 c2 = task._compute_cloak(dest)
61 assert c1 == c2
62
63 def test_cloak_different_for_different_dests(self):
64 task = IRCServerTask(_make_ircserver_def(), MockIRCServerSession())
65 c1 = task._compute_cloak("A" * 516)
66 c2 = task._compute_cloak("B" * 516)
67 assert c1 != c2