diff options
author | 2022-11-22 23:49:06 -0500 | |
---|---|---|
committer | 2022-11-22 23:49:06 -0500 | |
commit | b74b813ae6ac2ebf374cc12bb0e9689f49776f2e (patch) | |
tree | 6a83bd9e498bcc42397b591e743d39660d596309 | |
parent | Refactor MemFS set and semaphore to rely on fid lock (diff) |
Add memfs unit tests
-rw-r--r-- | tests/test_memfs.py | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/tests/test_memfs.py b/tests/test_memfs.py new file mode 100644 index 0000000..128530a --- /dev/null +++ b/tests/test_memfs.py @@ -0,0 +1,39 @@ +import logging +from concurrent.futures import ThreadPoolExecutor +from unittest import TestCase, mock +from uuid import uuid4 + +from snekbox.memfs import MemFS + +UUID_TEST = uuid4() + + +def get_memfs_with_context(): + return MemFS(10).__enter__() + + +class NsJailTests(TestCase): + def setUp(self): + super().setUp() + self.logger = logging.getLogger("snekbox.memfs") + self.logger.setLevel(logging.WARNING) + + @mock.patch("snekbox.memfs.uuid4", lambda: UUID_TEST) + def test_assignment_thread_safe(self): + """Test concurrent mounting works in multi-thread environments.""" + # Concurrently create MemFS in threads, check only 1 can be created + # Others should result in RuntimeError + with ThreadPoolExecutor() as pool: + memfs: MemFS | None = None + futures = [pool.submit(get_memfs_with_context) for _ in range(8)] + for future in futures: + # We should have exactly one result and all others RuntimeErrors + if err := future.exception(): + self.assertIsInstance(err, RuntimeError) + else: + self.assertIsNone(memfs) + memfs = future.result() + + # Original memfs should still exist afterwards + self.assertIsInstance(memfs, MemFS) + self.assertTrue(memfs.path.exists()) |