Files
FastSync/tests/integration/test_tcp.py
T
TapTap 79d965ac11
CI / lint (pull_request) Failing after 0s
CI / build-and-test (pull_request) Skipped
CI / sanitizers (address) (pull_request) Skipped
CI / sanitizers (undefined) (pull_request) Skipped
CI / fuzz-build (pull_request) Skipped
CI / coverage (pull_request) Skipped
CI / valgrind (pull_request) Skipped
ci: parallelize integration suite with pytest-xdist; fast PR gate + full coverage on merge
- Add pytest-xdist to the CI Dockerfile (image -> v10).
- Worker-isolate TEST_DATA_DIR (PYTEST_XDIST_WORKER) so concurrent xdist
  workers never collide on shared-filesystem fixtures.
- Register a 'ci' marker and tag a fast representative subset of integration
  tests (basic TCP, incremental, compression, delete, basis, append).
- ci.yaml: lint + build + unit + the marked subset (-n4) on every PR; the
  full integration suite plus sanitizer/fuzz/coverage/valgrind run only on
  push to dev/main.
- Integration step runtime drops from ~860s (serial) to ~230s (-n4); the PR
  gate lands well under ~3 minutes.
2026-09-08 16:53:54 +02:00

120 lines
4.7 KiB
Python

"""TCP transport correctness tests."""
import os
import shutil
import sys
import pytest
sys.path.insert(0, os.path.dirname(__file__))
from common import (
PROJECT_ROOT, BUILD_DIR, TEST_DATA_DIR,
run_client, run_client_posix,
generate_test_files, verify_transfer, clean_dir, make_result,
get_dest_received_dir, CLIENT_CMD,
)
SOURCE_DIR = os.path.join(TEST_DATA_DIR, "tcp_source")
DEST_DIR = os.path.join(TEST_DATA_DIR, "tcp_dest")
@pytest.fixture(scope="module", autouse=True)
def setup_test_data():
generate_test_files(SOURCE_DIR, full=False)
clean_dir(DEST_DIR)
yield
shutil.rmtree(TEST_DATA_DIR, ignore_errors=True)
def _run_tcp_test(name, port, flags, use_metadata=True, posix=False):
"""Run a single TCP test case against a shared server."""
clean_dir(DEST_DIR)
if posix:
result, dur = run_client_posix(SOURCE_DIR, DEST_DIR,
flags=(["-M"] if use_metadata else []) + flags,
port=port)
else:
result, dur = run_client(SOURCE_DIR, DEST_DIR,
flags=(["-M"] if use_metadata else []) + flags,
port=port)
if result.returncode != 0:
return make_result(name, False, dur, f"Exit {result.returncode}: {(result.stderr or result.stdout)[:100]}")
received = get_dest_received_dir(DEST_DIR, SOURCE_DIR)
mismatches, missing = verify_transfer(SOURCE_DIR, received)
if missing:
return make_result(name, False, dur, f"Missing: {', '.join(missing[:5])}")
if mismatches:
return make_result(name, False, dur, f"Mismatch: {', '.join(mismatches[:3])}")
return make_result(name, True, dur)
class TestTCPStandard:
@pytest.mark.ci
def test_standard(self, shared_server):
r = _run_tcp_test("Standard", shared_server.port, [])
assert r["status"] == "Success", r["error"]
@pytest.mark.ci
def test_posix_args(self, shared_server):
r = _run_tcp_test("Posix Args", shared_server.port, [], posix=True)
assert r["status"] == "Success", r["error"]
def test_no_metadata(self, shared_server):
r = _run_tcp_test("Standard (no metadata)", shared_server.port, [], use_metadata=False)
assert r["status"] == "Success", r["error"]
class TestTCPFlags:
@pytest.mark.ci
def test_multithreading(self, shared_server):
r = _run_tcp_test("Multithreading (-m)", shared_server.port, ["-m"])
assert r["status"] == "Success", r["error"]
@pytest.mark.ci
def test_compression(self, shared_server):
r = _run_tcp_test("Compression (-c)", shared_server.port, ["-c"])
assert r["status"] == "Success", r["error"]
def test_compression_threads(self, shared_server):
r = _run_tcp_test("Compression threads (-c --compress-threads=2)", shared_server.port,
["-c", "--compress-threads=2"])
assert r["status"] == "Success", r["error"]
def test_chunk_serialization(self, shared_server):
r = _run_tcp_test("Chunk Serialization (-s)", shared_server.port, ["-s"])
assert r["status"] == "Success", r["error"]
def test_compression_chunk(self, shared_server):
r = _run_tcp_test("Compression + Chunk (-c -s)", shared_server.port, ["-c", "-s"])
assert r["status"] == "Success", r["error"]
def test_multithread_compression(self, shared_server):
r = _run_tcp_test("Multithreading + Compression (-m -c)", shared_server.port, ["-m", "-c"])
assert r["status"] == "Success", r["error"]
def test_multithread_chunk(self, shared_server):
r = _run_tcp_test("Multithreading + Chunk (-m -s)", shared_server.port, ["-m", "-s"])
assert r["status"] == "Success", r["error"]
def test_all_flags(self, shared_server):
r = _run_tcp_test("Multithread + Compression + Chunk (-m -c -s)", shared_server.port, ["-m", "-c", "-s"])
assert r["status"] == "Success", r["error"]
def test_sendfile(self, shared_server):
r = _run_tcp_test("Sendfile (-f)", shared_server.port, ["-f"])
assert r["status"] == "Success", r["error"]
def test_sendfile_multithread(self, shared_server):
r = _run_tcp_test("Sendfile + Multithreading (-f -m)", shared_server.port, ["-f", "-m"])
assert r["status"] == "Success", r["error"]
class TestTCPChunkSize:
def test_custom_chunk_size(self, shared_server):
r = _run_tcp_test("Chunk size 5MB", shared_server.port, ["--chunk-size", "5242880"])
assert r["status"] == "Success", r["error"]
def test_small_chunk_size(self, shared_server):
r = _run_tcp_test("Chunk size 1KB", shared_server.port, ["--chunk-size", "1024"])
assert r["status"] == "Success", r["error"]