From 99c77b82d9362eb5760a38c3f0220f42a0c05116 Mon Sep 17 00:00:00 2001 From: Mika Date: Wed, 25 Mar 2026 11:11:50 +0000 Subject: [PATCH] Add queue_separation/tests/test_main.py --- queue_separation/tests/test_main.py | 69 +++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 queue_separation/tests/test_main.py diff --git a/queue_separation/tests/test_main.py b/queue_separation/tests/test_main.py new file mode 100644 index 0000000..abc9e71 --- /dev/null +++ b/queue_separation/tests/test_main.py @@ -0,0 +1,69 @@ +import pytest +import statistics +from queue_separation import main + +@pytest.fixture +def sample_jobs(): + # Mix aus regulären und Hotspot-Jobs + jobs = [ + {"id": i, "runtime": 1.0 + i * 0.1, "queue": "main" if i % 3 else "hotspot"} + for i in range(1, 31) + ] + return jobs + + +def test_simulate_queue_separation_structure(sample_jobs): + main_queue = [j for j in sample_jobs if j["queue"] == "main"] + hotspot_queue = [j for j in sample_jobs if j["queue"] == "hotspot"] + + result = main.simulate_queue_separation( + jobs=sample_jobs, hotspot_queue=hotspot_queue, main_queue=main_queue + ) + + # Strukturvalidierung + assert isinstance(result, dict), "Simulationsergebnis muss ein Dict sein" + for field in ("retry_tail_p99", "bandwidth", "hotspot_percentage"): + assert field in result, f"Fehlendes Feld {field} in PerformanceMetrics" + assert isinstance(result[field], (float, int)), f"{field} muss numerisch sein" + + +def test_simulation_value_ranges(sample_jobs): + main_queue = [j for j in sample_jobs if j["queue"] == "main"] + hotspot_queue = [j for j in sample_jobs if j["queue"] == "hotspot"] + + result = main.simulate_queue_separation( + jobs=sample_jobs, hotspot_queue=hotspot_queue, main_queue=main_queue + ) + + # Werte sollen in plausiblen Bereichen liegen + assert 0.0 <= result["retry_tail_p99"] <= 100.0, "retry_tail_p99 außerhalb des Bereichs" + assert result["bandwidth"] > 0, "Bandbreite sollte positiv sein" + assert 0.0 <= result["hotspot_percentage"] <= 1.0, "Hotspot-Prozentsatz außerhalb des Bereichs" + + +def test_tail_latency_increases_with_hotspots(sample_jobs): + # Weniger Hotspots -> bessere Performance erwartet + main_queue = [j for j in sample_jobs if j["queue"] == "main"] + hotspot_queue = [j for j in sample_jobs if j["queue"] == "hotspot"] + + results_low_hotspot = main.simulate_queue_separation( + jobs=sample_jobs[:10], hotspot_queue=hotspot_queue[:1], main_queue=main_queue[:9] + ) + + results_high_hotspot = main.simulate_queue_separation( + jobs=sample_jobs, hotspot_queue=hotspot_queue + main_queue[:5], main_queue=main_queue[5:] + ) + + assert ( + results_high_hotspot["retry_tail_p99"] >= results_low_hotspot["retry_tail_p99"] + ), "Mehr Hotspots sollten höhere Tail-Latenz erzeugen" + assert results_high_hotspot["bandwidth"] >= 0 and results_low_hotspot["bandwidth"] >= 0 + + +def test_invalid_input_handling(): + # Ungültiger Input sollte Exception oder Validation Error werfen + invalid_jobs = [{"runtime": "fast", "queue": 123}] # Typfehler + with pytest.raises((AssertionError, TypeError, ValueError)): + main.simulate_queue_separation( + jobs=invalid_jobs, hotspot_queue=[], main_queue=[] + ) \ No newline at end of file