From 37029766cb60f4caef6d62d2564063cc14636727 Mon Sep 17 00:00:00 2001 From: robot-piglet <robot-piglet@yandex-team.com> Date: Sun, 27 Aug 2023 17:24:46 +0300 Subject: Intermediate changes --- library/python/filelock/ut/test_filelock.py | 83 +++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 library/python/filelock/ut/test_filelock.py (limited to 'library/python/filelock/ut/test_filelock.py') diff --git a/library/python/filelock/ut/test_filelock.py b/library/python/filelock/ut/test_filelock.py new file mode 100644 index 0000000000..60a3722390 --- /dev/null +++ b/library/python/filelock/ut/test_filelock.py @@ -0,0 +1,83 @@ +import os +import time +import logging +import multiprocessing +import tempfile +import threading + +import library.python.filelock + + +def _acquire_lock(lock_path, out_file_path): + with library.python.filelock.FileLock(lock_path): + with open(out_file_path, "a") as out: + out.write("{}:{}\n".format(os.getpid(), time.time())) + time.sleep(2) + + +def test_filelock(): + temp_dir = tempfile.mkdtemp() + lock_path = os.path.join(temp_dir, "file.lock") + out_file_path = os.path.join(temp_dir, "out.txt") + + process_count = 5 + processes = [] + for i in range(process_count): + process = multiprocessing.Process(target=_acquire_lock, args=(lock_path, out_file_path)) + process.start() + processes.append(process) + + for process in processes: + process.join() + + pids = [] + times = [] + with open(out_file_path) as out: + content = out.read() + logging.info("Times:\n%s", content) + for line in content.strip().split("\n"): + pid, time_val = line.split(":") + pids.append(pid) + times.append(float(time_val)) + + assert len(set(pids)) == process_count + time1 = times.pop() + while times: + time2 = times.pop() + assert int(time1) - int(time2) >= 2 + time1 = time2 + + +def test_filelock_init_acquired(): + temp_dir = tempfile.mkdtemp() + lock_path = os.path.join(temp_dir, "file.lock") + + with library.python.filelock.FileLock(lock_path): + sublock = library.python.filelock.FileLock(lock_path) + del sublock + + +def test_concurrent_lock(): + filename = 'con.lock' + + def lock(): + lock = library.python.filelock.FileLock(filename) + time.sleep(1) + lock.acquire() + lock.release() + try: + os.unlink(filename) + except OSError: + pass + + threads = [] + for i in range(100): + t = threading.Thread(target=lock) + t.daemon = True + threads.append(t) + + for t in threads: + t.start() + + for t in threads: + t.join() -- cgit v1.2.3