summaryrefslogtreecommitdiff
path: root/tests/integration
diff options
context:
space:
mode:
Diffstat (limited to 'tests/integration')
-rw-r--r--tests/integration/test_concurrency.py2
-rw-r--r--tests/integration/test_stats.py47
2 files changed, 2 insertions, 47 deletions
diff --git a/tests/integration/test_concurrency.py b/tests/integration/test_concurrency.py
index 1374852..528992d 100644
--- a/tests/integration/test_concurrency.py
+++ b/tests/integration/test_concurrency.py
@@ -148,7 +148,7 @@ class ConcurrentWorkerTasks(TrackerTestCase):
148 148
149 def poll(index): 149 def poll(index):
150 for _ in range(10): 150 for _ in range(10):
151 for mode in ("everything", "top100", "peer", "torr", "s24s"): 151 for mode in ("everything", "top100", "peer", "torr"):
152 self.tracker.stats(mode) 152 self.tracker.stats(mode)
153 153
154 threads = [threading.Thread(target=announce, args=(i,)) for i in range(THREADS // 2)] 154 threads = [threading.Thread(target=announce, args=(i,)) for i in range(THREADS // 2)]
diff --git a/tests/integration/test_stats.py b/tests/integration/test_stats.py
index c4ac95a..46ca39b 100644
--- a/tests/integration/test_stats.py
+++ b/tests/integration/test_stats.py
@@ -5,9 +5,7 @@ every one of them and, where the number means something, that it moves when
5the thing it counts happens. 5the thing it counts happens.
6""" 6"""
7 7
8import ipaddress
9import re 8import re
10import socket
11import unittest 9import unittest
12import urllib.error 10import urllib.error
13import xml.etree.ElementTree 11import xml.etree.ElementTree
@@ -18,7 +16,7 @@ from harness import TrackerTestCase
18# and belong to test_fullscrape; "woodpeckers" sits behind a 16# and belong to test_fullscrape; "woodpeckers" sits behind a
19# feature flag this build does not set. 17# feature flag this build does not set.
20MRTG_MODES = ["peer", "conn", "scrp", "udp4", "tcp4", "torr", "fscr", "completed", "syncs"] 18MRTG_MODES = ["peer", "conn", "scrp", "udp4", "tcp4", "torr", "fscr", "completed", "syncs"]
21TEXT_MODES = ["herr", "s24s", "top10", "top100", "renew"] 19TEXT_MODES = ["herr", "top10", "top100", "renew"]
22 20
23 21
24class StatsShape(TrackerTestCase): 22class StatsShape(TrackerTestCase):
@@ -144,48 +142,5 @@ class StatsTop(TrackerTestCase):
144 self.assertIn(heading, body) 142 self.assertIn(heading, body)
145 143
146 144
147class StatsNetworks(TrackerTestCase):
148 def source_address(self):
149 """Which address the tracker sees us from is not ours to choose: a
150 FreeBSD jail relocates a loopback connection to the jail's own
151 address, so ask the socket rather than assume 127.0.0.1."""
152 probe = socket.create_connection(("127.0.0.1", self.tracker.port), timeout=5)
153 try:
154 return probe.getsockname()[0]
155 finally:
156 probe.close()
157
158 def test_the_slash24_report_names_the_announcing_network(self):
159 source = self.source_address()
160 self.tracker.announce(self.hash_for("s24"), port=6001, left=0)
161 body = self.tracker.stats("s24s")
162 self.assertIn(b"Networks, limit /28:", body)
163 self.assertIn(b"Networks, limit /24:", body)
164
165 # The prefix is the first three address bytes of a v4 peer, left
166 # aligned in a sixteen byte buffer and then printed by the v6
167 # formatter, so 127.0.0.0/24 reads as "7f00::" rather than as the
168 # network an operator asked about. Pinned as it is, not blessed.
169 prefix = socket.inet_aton(source)[:3] + b"\0" * 13
170 self.assertIn(str(ipaddress.IPv6Address(prefix)).encode(), body)
171
172 def test_the_report_counts_one_network_per_announcing_address(self):
173 for port in (6001, 6002, 6003):
174 self.tracker.announce(self.hash_for("s24count"), port=port, left=0)
175 lines = [line for line in self.tracker.stats("s24s").splitlines() if b":" in line and b"limit" not in line]
176 self.assertEqual(len(lines), 2, "one line under each of the two limits")
177 for line in lines:
178 self.assertEqual(int(line.split(b":")[0]), 3, "three peers from the one network")
179
180 def test_the_report_survives_a_torrent_with_no_v4_peers(self):
181 # A torrent whose only peer is v6 has no v4 peer list once the lists
182 # are allocated on demand. The s24 report walks the v4 list of every
183 # torrent, so it has to skip the absent one rather than follow a null
184 # pointer. Needs WANT_IP_FROM_QUERY_STRING to force the family; without
185 # it the peer is loopback v4 and the walk is never asked to skip.
186 self.tracker.announce(self.hash_for("s24v6only"), ip="2001:db8::1", port=6001, left=0)
187 self.assertIn(b"Networks, limit /24:", self.tracker.stats("s24s"))
188
189
190if __name__ == "__main__": 145if __name__ == "__main__":
191 unittest.main() 146 unittest.main()