test: add local 2x2 route topology
This commit is contained in:
@@ -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
@@ -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)
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user