test(sync): 验证四个并发大型 HTTP 上传
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
"""Real localhost HTTP harness; SQLite/DiskObjects, not production topology."""
|
||||
import asyncio
|
||||
import json
|
||||
import socket
|
||||
|
||||
import pytest
|
||||
import uvicorn
|
||||
|
||||
from sync_server.app import create_app
|
||||
from sync_server.database import Database
|
||||
from sync_server.storage import DiskObjects
|
||||
from tools.upload_benchmark import probe
|
||||
|
||||
|
||||
@pytest.mark.parametrize("size", [1048576 + 17, 100 * 1048576])
|
||||
def test_four_concurrent_uploads_over_real_http(tmp_path, size):
|
||||
database = Database("sqlite:///" + str(tmp_path / "sync.db"))
|
||||
app = create_app(database, DiskObjects(tmp_path / "objects"), tmp_path / "staging")
|
||||
credentials = [{"username": username, "password": "controlled-fixture-password"}
|
||||
for username in ("benchmark-one", "benchmark-two")]
|
||||
for account in credentials:
|
||||
database.add_user(**account)
|
||||
sock = socket.socket()
|
||||
sock.bind(("127.0.0.1", 0))
|
||||
sock.listen(128)
|
||||
server = uvicorn.Server(uvicorn.Config(app, log_config=None, access_log=False,
|
||||
timeout_graceful_shutdown=2))
|
||||
|
||||
async def run():
|
||||
task = asyncio.create_task(server.serve(sockets=[sock]))
|
||||
try:
|
||||
async def ready():
|
||||
while not server.started:
|
||||
if task.done():
|
||||
await task
|
||||
raise RuntimeError("SERVER_START_FAILED")
|
||||
await asyncio.sleep(.01)
|
||||
await asyncio.wait_for(ready(), 10)
|
||||
report = await asyncio.wait_for(probe(f"http://127.0.0.1:{sock.getsockname()[1]}",
|
||||
credentials, size=size), 180)
|
||||
assert report["result"] == "PASSED"
|
||||
assert report["service_rss_bytes"] is None
|
||||
assert report["acceptance"] == "NOT_ASSESSED"
|
||||
assert len(report["transfers"]) == 4
|
||||
assert len({item["sha256"] for item in report["transfers"]}) == 4
|
||||
assert all(item["verified_bytes"] == size for item in report["transfers"])
|
||||
print(json.dumps(report))
|
||||
finally:
|
||||
server.should_exit = True
|
||||
await asyncio.wait_for(task, 10)
|
||||
try:
|
||||
asyncio.run(run())
|
||||
finally:
|
||||
sock.close()
|
||||
database.engine.dispose()
|
||||
Reference in New Issue
Block a user