|
| 1 | +import multiprocessing |
| 2 | +import os |
| 3 | +import shutil |
| 4 | +import tempfile |
| 5 | + |
| 6 | +import pytest |
| 7 | + |
| 8 | +from cache_file_generator import _acquire_lock_and_write_to_cache |
| 9 | + |
| 10 | + |
| 11 | +@pytest.fixture |
| 12 | +def temp_location(): |
| 13 | + test_folder = tempfile.mkdtemp(prefix="test_persistence_roundtrip") |
| 14 | + yield os.path.join(test_folder, 'persistence.bin') |
| 15 | + shutil.rmtree(test_folder, ignore_errors=True) |
| 16 | + |
| 17 | + |
| 18 | +def _validate_result_in_cache(cache_location): |
| 19 | + with open(cache_location) as handle: |
| 20 | + data = handle.read() |
| 21 | + prev_process_id = None |
| 22 | + count = 0 |
| 23 | + for line in data.split("\n"): |
| 24 | + if line: |
| 25 | + count += 1 |
| 26 | + tag, process_id = line.split(" ") |
| 27 | + if prev_process_id is not None: |
| 28 | + assert process_id == prev_process_id, "Process overlap found" |
| 29 | + assert tag == '>', "Process overlap_found" |
| 30 | + prev_process_id = None |
| 31 | + else: |
| 32 | + assert tag == '<', "Opening bracket not found" |
| 33 | + prev_process_id = process_id |
| 34 | + return count |
| 35 | + |
| 36 | + |
| 37 | +def _run_multiple_processes(no_of_processes, cache_location, sleep_interval): |
| 38 | + open(cache_location, "w+") |
| 39 | + processes = [] |
| 40 | + for i in range(no_of_processes): |
| 41 | + process = multiprocessing.Process( |
| 42 | + target=_acquire_lock_and_write_to_cache, |
| 43 | + args=(cache_location, sleep_interval)) |
| 44 | + processes.append(process) |
| 45 | + |
| 46 | + for process in processes: |
| 47 | + process.start() |
| 48 | + |
| 49 | + for process in processes: |
| 50 | + process.join() |
| 51 | + |
| 52 | + |
| 53 | +def test_lock_for_normal_workload(temp_location): |
| 54 | + num_of_processes = 4 |
| 55 | + sleep_interval = 0.1 |
| 56 | + _run_multiple_processes(num_of_processes, temp_location, sleep_interval) |
| 57 | + count = _validate_result_in_cache(temp_location) |
| 58 | + assert count == num_of_processes * 2, "Should not observe starvation" |
| 59 | + |
| 60 | + |
| 61 | +def test_lock_for_high_workload(temp_location): |
| 62 | + num_of_processes = 80 |
| 63 | + sleep_interval = 0 |
| 64 | + _run_multiple_processes(num_of_processes, temp_location, sleep_interval) |
| 65 | + count = _validate_result_in_cache(temp_location) |
| 66 | + assert count <= num_of_processes * 2, "Starvation or not, we should not observe garbled payload" |
| 67 | + |
| 68 | + |
| 69 | +def test_lock_for_timeout(temp_location): |
| 70 | + num_of_processes = 10 |
| 71 | + sleep_interval = 1 |
| 72 | + _run_multiple_processes(num_of_processes, temp_location, sleep_interval) |
| 73 | + count = _validate_result_in_cache(temp_location) |
| 74 | + assert count < num_of_processes * 2, "Should observe starvation" |
| 75 | + |
0 commit comments