Skip to content

Commit 17d62da

Browse files
committed
Use ProcessPoolExecutor in tests instead of multiprocessing
Makes it easier to run functions in a separate processes because `.result` returns the values directly instead of using Pipes.
1 parent 934c4c0 commit 17d62da

File tree

2 files changed

+40
-47
lines changed

2 files changed

+40
-47
lines changed

test/test_namespaces.py

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,46 +2,44 @@
22
# SPDX-FileCopyrightText: 2024 igo95862
33
from __future__ import annotations
44

5-
from multiprocessing import Pipe
5+
from concurrent.futures import ProcessPoolExecutor
66
from os import getuid
77
from unittest import TestCase
88

99
from lxns.namespaces import UserNamespace, unshare_namespaces
1010

11-
from .test_os import run_in_subprocess
12-
1311

1412
class TestNamespaces(TestCase):
13+
@staticmethod
14+
def unshare_namespaces_test() -> tuple[int, int]:
15+
user_namespace_id_before = UserNamespace.get_current_ns_id()
16+
unshare_namespaces(user=True)
17+
return user_namespace_id_before, UserNamespace.get_current_ns_id()
18+
1519
def test_unshare_namespaces(self) -> None:
1620
current_user_ns_id = UserNamespace.get_current_ns_id()
1721

18-
read_pipe, write_pipe = Pipe()
19-
20-
def unshare_test() -> None:
21-
write_pipe.send(UserNamespace.get_current_ns_id())
22-
unshare_namespaces(user=True)
23-
write_pipe.send(UserNamespace.get_current_ns_id())
22+
with ProcessPoolExecutor() as executor:
23+
u_ns_id_before, u_ns_id_after = executor.submit(
24+
self.unshare_namespaces_test
25+
).result(3)
2426

25-
run_in_subprocess(unshare_test)
26-
write_pipe.close()
27-
28-
current_user_ns_id = UserNamespace.get_current_ns_id()
27+
self.assertEqual(current_user_ns_id, u_ns_id_before)
28+
self.assertNotEqual(current_user_ns_id, u_ns_id_after)
2929

30-
self.assertEqual(current_user_ns_id, read_pipe.recv())
31-
self.assertNotEqual(current_user_ns_id, read_pipe.recv())
32-
33-
def test_unshare_from_class(self) -> None:
30+
@staticmethod
31+
def unshare_from_class_test() -> tuple[int, int]:
3432
uid_before = getuid()
33+
UserNamespace.unshare()
34+
return uid_before, getuid()
3535

36-
read_pipe, write_pipe = Pipe()
37-
38-
def unshare_test() -> None:
39-
write_pipe.send(getuid())
40-
UserNamespace.unshare()
41-
write_pipe.send(getuid())
36+
def test_unshare_from_class(self) -> None:
37+
uid_now = getuid()
4238

43-
run_in_subprocess(unshare_test)
44-
write_pipe.close()
39+
with ProcessPoolExecutor() as executor:
40+
uid_before, uid_after = executor.submit(
41+
self.unshare_from_class_test
42+
).result(3)
4543

46-
self.assertEqual(uid_before, read_pipe.recv())
47-
self.assertNotEqual(uid_before, read_pipe.recv())
44+
self.assertEqual(uid_now, uid_before)
45+
self.assertNotEqual(uid_now, uid_after)

test/test_os.py

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,31 @@
22
# SPDX-FileCopyrightText: 2024 igo95862
33
from __future__ import annotations
44

5-
from multiprocessing import Pipe, Process
5+
from concurrent.futures import ProcessPoolExecutor
66
from os import getuid
7-
from typing import TYPE_CHECKING
87
from unittest import TestCase
98

109
from lxns.os import CLONE_NEWUSER, unshare
1110

12-
if TYPE_CHECKING:
13-
from collections.abc import Callable
1411

12+
class TestLxnsOs(TestCase):
1513

16-
def run_in_subprocess(func: Callable[[], None]) -> None:
17-
subproc = Process(target=func)
18-
subproc.start()
19-
subproc.join(3)
14+
@staticmethod
15+
def unshare_test() -> tuple[int, int]:
16+
uid_before_unshare = getuid()
17+
unshare(CLONE_NEWUSER)
18+
uid_after_unshare = getuid()
2019

20+
return uid_before_unshare, uid_after_unshare
2121

22-
class TestLxnsOs(TestCase):
2322
def test_unshare_user_namespace(self) -> None:
24-
uid_before = getuid()
25-
26-
read_pipe, write_pipe = Pipe()
23+
uid_before_test = getuid()
2724

28-
def unshare_test() -> None:
29-
write_pipe.send(getuid())
30-
unshare(CLONE_NEWUSER)
31-
write_pipe.send(getuid())
25+
with ProcessPoolExecutor() as executor:
26+
uid_before, uid_after = executor.submit(self.unshare_test).result(3)
3227

33-
run_in_subprocess(unshare_test)
34-
write_pipe.close()
28+
# Unit test process should not unshare
29+
self.assertEqual(uid_before_test, getuid())
3530

36-
self.assertEqual(uid_before, read_pipe.recv())
37-
self.assertNotEqual(uid_before, read_pipe.recv())
31+
self.assertEqual(uid_before_test, uid_before)
32+
self.assertNotEqual(uid_before_test, uid_after)

0 commit comments

Comments
 (0)