diff options
Diffstat (limited to 'tests/integration/harness.py')
| -rw-r--r-- | tests/integration/harness.py | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/tests/integration/harness.py b/tests/integration/harness.py index b98ce83..10aa6de 100644 --- a/tests/integration/harness.py +++ b/tests/integration/harness.py | |||
| @@ -20,6 +20,9 @@ import urllib.error | |||
| 20 | import urllib.parse | 20 | import urllib.parse |
| 21 | import urllib.request | 21 | import urllib.request |
| 22 | 22 | ||
| 23 | # groupip_1 in src/ot_livesync.c | ||
| 24 | LIVESYNC_GROUP = "224.0.23.5" | ||
| 25 | |||
| 23 | TRACKER = os.environ.get("OPENTRACKER", os.path.join(os.path.dirname(__file__), "..", "..", "opentracker.debug")) | 26 | TRACKER = os.environ.get("OPENTRACKER", os.path.join(os.path.dirname(__file__), "..", "..", "opentracker.debug")) |
| 24 | 27 | ||
| 25 | 28 | ||
| @@ -76,6 +79,9 @@ class Tracker: | |||
| 76 | 79 | ||
| 77 | def __init__(self, extra_config="", files=None): | 80 | def __init__(self, extra_config="", files=None): |
| 78 | self.port = free_port() | 81 | self.port = free_port() |
| 82 | # Only used by a config that asks for live sync, but allocated either | ||
| 83 | # way so {livesync_port} always resolves. | ||
| 84 | self.livesync_port = free_port() | ||
| 79 | self.dir = tempfile.mkdtemp(prefix="ot-integration-") | 85 | self.dir = tempfile.mkdtemp(prefix="ot-integration-") |
| 80 | self.log = None | 86 | self.log = None |
| 81 | self.process = None | 87 | self.process = None |
| @@ -87,7 +93,7 @@ class Tracker: | |||
| 87 | with open(self.config, "w") as handle: | 93 | with open(self.config, "w") as handle: |
| 88 | handle.write("listen.tcp 127.0.0.1:%d\n" % self.port) | 94 | handle.write("listen.tcp 127.0.0.1:%d\n" % self.port) |
| 89 | handle.write("listen.udp 127.0.0.1:%d\n" % self.port) | 95 | handle.write("listen.udp 127.0.0.1:%d\n" % self.port) |
| 90 | handle.write(extra_config.replace("{dir}", self.dir)) | 96 | handle.write(extra_config.replace("{dir}", self.dir).replace("{livesync_port}", str(self.livesync_port))) |
| 91 | self.log = open(os.path.join(self.dir, "tracker.log"), "w+b") | 97 | self.log = open(os.path.join(self.dir, "tracker.log"), "w+b") |
| 92 | # Leak detection is left at the sanitizer's own default, which is on | 98 | # Leak detection is left at the sanitizer's own default, which is on |
| 93 | # where LeakSanitizer exists and off where it does not. Asking for it | 99 | # where LeakSanitizer exists and off where it does not. Asking for it |
| @@ -186,6 +192,32 @@ class Tracker: | |||
| 186 | def torrent_count(self): | 192 | def torrent_count(self): |
| 187 | return int(self.stats("torr").split()[0]) | 193 | return int(self.stats("torr").split()[0]) |
| 188 | 194 | ||
| 195 | def livesync_send(self, payload, group=LIVESYNC_GROUP): | ||
| 196 | """Put a packet on the live sync group. | ||
| 197 | |||
| 198 | It has to go to the group rather than straight at the port: the | ||
| 199 | tracker binds two sockets there, the reader on the wildcard address | ||
| 200 | and the writer on the configured one, and the kernel gives a unicast | ||
| 201 | datagram to the more specific of the two, which nobody reads.""" | ||
| 202 | sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | ||
| 203 | try: | ||
| 204 | sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton("127.0.0.1")) | ||
| 205 | sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 1) | ||
| 206 | sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 1) | ||
| 207 | sock.sendto(payload, (group, self.livesync_port)) | ||
| 208 | finally: | ||
| 209 | sock.close() | ||
| 210 | |||
| 211 | def wait_until(self, predicate, timeout=5): | ||
| 212 | """A live sync packet is handled by another thread, so an effect of | ||
| 213 | one arrives some time after the send.""" | ||
| 214 | deadline = time.time() + timeout | ||
| 215 | while time.time() < deadline: | ||
| 216 | if predicate(): | ||
| 217 | return True | ||
| 218 | time.sleep(0.02) | ||
| 219 | return predicate() | ||
| 220 | |||
| 189 | # ------------------------------------------------------------ over udp | 221 | # ------------------------------------------------------------ over udp |
| 190 | 222 | ||
| 191 | def udp_connect(self): | 223 | def udp_connect(self): |
