fix: honor hardlinks across client mount topology
This commit is contained in:
+16
-1
@@ -1,7 +1,7 @@
|
||||
import os
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
from pathlib import Path, PurePosixPath
|
||||
from unittest.mock import patch
|
||||
|
||||
from archive_clients.config import ClientConfig, ConfigError, RootMapping
|
||||
@@ -63,6 +63,21 @@ class ConfigTests(unittest.TestCase):
|
||||
with self.assertRaises(ConfigError):
|
||||
mapping.api_to_local("/elsewhere/file")
|
||||
|
||||
def test_mapping_can_override_one_syncthing_folder_locally(self):
|
||||
mapping = RootMapping(
|
||||
PurePosixPath("/sync"),
|
||||
Path("/local/sync"),
|
||||
((PurePosixPath("/sync/DownloadsSync"), Path("/local/qb/Sync")),),
|
||||
)
|
||||
self.assertEqual(
|
||||
mapping.api_to_local("/sync/DownloadsSync/job/ready.json"),
|
||||
Path("/local/qb/Sync/job/ready.json"),
|
||||
)
|
||||
self.assertEqual(
|
||||
mapping.local_root_for_api("/sync/DownloadsSync"),
|
||||
Path("/local/qb/Sync"),
|
||||
)
|
||||
|
||||
def test_endpoint_scheme_and_job_keys_are_strict(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
root = Path(directory)
|
||||
|
||||
@@ -78,6 +78,25 @@ class ClientJobHappyPathTests(unittest.TestCase):
|
||||
content=b"x" * 4096,
|
||||
)
|
||||
|
||||
def test_mount_boundary_requires_copy_space_even_with_same_device(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
root = Path(directory)
|
||||
source_root = root / "source"
|
||||
destination_root = root / "destination"
|
||||
source_root.mkdir()
|
||||
destination_root.mkdir()
|
||||
(source_root / "fixture.bin").write_bytes(b"fixture")
|
||||
with patch(
|
||||
"archive_clients.jobs._mount_id",
|
||||
side_effect=("source-mount", "destination-mount"),
|
||||
):
|
||||
required = ClientJobExecutor._copy_required_bytes(
|
||||
source_root,
|
||||
destination_root,
|
||||
(("fixture.bin", 7),),
|
||||
)
|
||||
self.assertEqual(required, 7)
|
||||
|
||||
def _run_transfer(
|
||||
self,
|
||||
root: Path,
|
||||
|
||||
@@ -62,6 +62,32 @@ class RouteDiscoveryTests(unittest.TestCase):
|
||||
self.assertEqual(routes[0].local_relative_path, "DownloadsSync")
|
||||
self.assertEqual(routes[0].state, route_pb2.ROUTE_STATE_DISCOVERED)
|
||||
|
||||
def test_discovery_accepts_a_safe_local_folder_override(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
root = Path(directory)
|
||||
override = root / "qb/Sync"
|
||||
override.mkdir(parents=True)
|
||||
roots = RootMapping(
|
||||
PurePosixPath("/var/syncthing"),
|
||||
root / "sync",
|
||||
((PurePosixPath("/var/syncthing/DownloadsSync"), override),),
|
||||
)
|
||||
routes = discover_routes(
|
||||
{"folders": [{
|
||||
"id": "DownloadsSync",
|
||||
"path": "~/DownloadsSync",
|
||||
"type": "sendreceive",
|
||||
"devices": [
|
||||
{"deviceID": "LOCAL"},
|
||||
{"deviceID": "ARCHIVE"},
|
||||
],
|
||||
}]},
|
||||
"LOCAL",
|
||||
roots,
|
||||
True,
|
||||
)
|
||||
self.assertEqual([route.route_id for route in routes], ["DownloadsSync"])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user