test: add local 2x2 route topology

This commit is contained in:
2026-07-23 03:14:16 +00:00
parent 10e803eaee
commit a66269cb69
27 changed files with 775 additions and 7 deletions
+26 -2
View File
@@ -13,8 +13,9 @@ from archive_clients.qbittorrent import QBittorrentReader
class _Response:
def __init__(self, value: bytes):
def __init__(self, value: bytes, status: int = 200):
self.value = io.BytesIO(value)
self.status = status
def read(self, size=-1):
return self.value.read(size)
@@ -33,7 +34,10 @@ class _Opener:
def open(self, call, timeout):
self.calls.append(call)
return _Response(next(self.values))
response = next(self.values)
if isinstance(response, tuple):
return _Response(*response)
return _Response(response)
class QBittorrentReaderTests(unittest.TestCase):
@@ -71,6 +75,26 @@ class QBittorrentReaderTests(unittest.TestCase):
self.assertEqual(resource.summary.resource_id.info_hash_v1_hex, torrent_hash)
self.assertIn("hashes=", opener.calls[1])
def test_current_empty_204_login_is_accepted(self):
responses = [(b"", 204), b"[]"]
with tempfile.TemporaryDirectory() as directory:
root = Path(directory)
password = root / "password"
password.write_text("secret", encoding="utf-8")
os.chmod(password, 0o600)
config = ServiceConfig(
"http://qb", PurePosixPath("/downloads"), root,
username="admin", password_file=password,
)
opener = _Opener(responses)
with patch(
"archive_clients.qbittorrent.request.build_opener",
return_value=opener,
):
resources = QBittorrentReader(config).list_resources()
self.assertEqual(resources, [])
self.assertEqual(len(opener.calls), 2)
if __name__ == "__main__":
unittest.main()
+26 -2
View File
@@ -11,8 +11,9 @@ from archive_control.v1 import common_pb2
class _Response:
def __init__(self, value: str):
def __init__(self, value: str, status: int = 200):
self._source = io.BytesIO(value.encode("utf-8"))
self.status = status
def read(self, size: int = -1) -> bytes:
return self._source.read(size)
@@ -31,7 +32,10 @@ class _Opener:
def open(self, call, timeout):
self.requests.append((call, timeout))
return _Response(next(self.responses))
response = next(self.responses)
if isinstance(response, tuple):
return _Response(*response)
return _Response(response)
class ServiceProbeTests(unittest.TestCase):
@@ -57,6 +61,26 @@ class ServiceProbeTests(unittest.TestCase):
self.assertEqual(result.libtorrent_version, "2.0.11")
self.assertIn(b"password=private", opener.requests[0][0].data)
def test_qbittorrent_accepts_current_empty_204_login(self):
with tempfile.TemporaryDirectory() as directory:
root = Path(directory)
password = self._secret(root, "password", "private")
config = ServiceConfig(
"http://qb:8080", PurePosixPath("/downloads"), root,
username="admin", password_file=password,
)
opener = _Opener([
("", 204), "v5.2.3", "2.11.4",
'{"libtorrent":"2.0.13"}',
])
with patch(
"archive_clients.services.request.build_opener",
return_value=opener,
):
result = probe_qbittorrent(config)
self.assertEqual(result.state, common_pb2.HEALTH_STATE_HEALTHY)
self.assertEqual(result.version, "v5.2.3")
def test_syncthing_identity_is_normalized(self):
with tempfile.TemporaryDirectory() as directory:
root = Path(directory)
+18
View File
@@ -134,6 +134,24 @@ class SyncthingRouteManagerTests(unittest.TestCase):
)
self.assertEqual(json.loads(peer_ack.read_text())["nonce"], "peer-nonce")
local_nonce = configured.local_path / (
".archive-control-route-nonce.cache-1"
)
before = (local_nonce.stat(), peer_ack.stat())
repeated = self.manager.verify(
configured,
self.spec,
"cache-1",
"local-nonce",
time.monotonic() + 1,
)
after = (local_nonce.stat(), peer_ack.stat())
self.assertEqual(repeated, (True, True))
self.assertEqual(
[(item.st_ino, item.st_mtime_ns) for item in before],
[(item.st_ino, item.st_mtime_ns) for item in after],
)
def test_verification_times_out_without_peer_evidence(self):
configured = self.manager.configure(self.spec, time.monotonic() + 1)
with self.assertRaises(RouteSetupTimeout):