Skip to content

Commit 2080749

Browse files
committed
Test service configuration better
The TOML parser had bad coverage in tests. Further improvements will need to wait until an invalid configuration does not result in a hang.
1 parent a893050 commit 2080749

File tree

1 file changed

+56
-9
lines changed

1 file changed

+56
-9
lines changed

qrexec/tests/socket/agent.py

+56-9
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,16 @@ def execute_qubesrpc(self, service: str, src_domain_name: str):
304304

305305
target = self.connect_target()
306306
target.handshake()
307-
return target
307+
return target, dom0
308+
309+
def check_dom0(self, dom0):
310+
self.assertEqual(
311+
dom0.recv_message(),
312+
(
313+
qrexec.MSG_CONNECTION_TERMINATED,
314+
struct.pack("<LL", self.target_domain, self.target_port),
315+
),
316+
)
308317

309318
def make_executable_service(self, *args):
310319
util.make_executable_service(self.tempdir, *args)
@@ -319,7 +328,36 @@ def test_exec_service(self):
319328
echo "arg: $1, remote domain: $QREXEC_REMOTE_DOMAIN"
320329
""",
321330
)
322-
target = self.execute_qubesrpc("qubes.Service+arg", "domX")
331+
target, _ = self.execute_qubesrpc("qubes.Service+arg", "domX")
332+
target.send_message(qrexec.MSG_DATA_STDIN, b"")
333+
messages = target.recv_all_messages()
334+
self.assertListEqual(
335+
util.sort_messages(messages),
336+
[
337+
(qrexec.MSG_DATA_STDOUT, b"arg: arg, remote domain: domX\n"),
338+
(qrexec.MSG_DATA_STDOUT, b""),
339+
(qrexec.MSG_DATA_STDERR, b""),
340+
(qrexec.MSG_DATA_EXIT_CODE, b"\0\0\0\0"),
341+
],
342+
)
343+
344+
def test_exec_service_with_config(self):
345+
util.make_executable_service(
346+
self.tempdir,
347+
"rpc",
348+
"qubes.Service",
349+
"""\
350+
#!/bin/sh
351+
echo "arg: $1, remote domain: $QREXEC_REMOTE_DOMAIN"
352+
""",
353+
)
354+
with open(
355+
os.path.join(self.tempdir, "rpc-config", "qubes.Service+arg"), "w"
356+
) as f:
357+
f.write("""\
358+
wait-for-session = 0
359+
""")
360+
target, dom0 = self.execute_qubesrpc("qubes.Service+arg", "domX")
323361
target.send_message(qrexec.MSG_DATA_STDIN, b"")
324362
messages = target.recv_all_messages()
325363
self.assertListEqual(
@@ -331,6 +369,7 @@ def test_exec_service(self):
331369
(qrexec.MSG_DATA_EXIT_CODE, b"\0\0\0\0"),
332370
],
333371
)
372+
self.check_dom0(dom0)
334373

335374
def test_wait_for_session(self):
336375
log = os.path.join(self.tempdir, "wait-for-session.log")
@@ -359,17 +398,20 @@ def test_wait_for_session(self):
359398
log
360399
),
361400
)
401+
user = getpass.getuser()
402+
assert "'" not in user
403+
assert "\n" not in user
362404
with open(
363405
os.path.join(self.tempdir, "rpc-config", "qubes.Service+arg"), "w"
364406
) as f:
365-
f.write("""\
407+
f.write(f"""\
366408
367409
# Test TOML file
410+
force-user = '{user}'
368411
wait-for-session = 1 # line comment
369412
""")
370-
user = getpass.getuser()
371413

372-
target = self.execute_qubesrpc("qubes.Service+arg", "domX")
414+
target, dom0 = self.execute_qubesrpc("qubes.Service+arg", "domX")
373415
self.assertEqual(target.recv_message(), (
374416
qrexec.MSG_DATA_STDOUT,
375417
(
@@ -395,9 +437,10 @@ def test_wait_for_session(self):
395437
(qrexec.MSG_DATA_EXIT_CODE, b"\0\0\0\0"),
396438
],
397439
)
440+
self.check_dom0(dom0)
398441

399442
def test_exec_service_fail(self):
400-
target = self.execute_qubesrpc("qubes.Service+arg", "domX")
443+
target, dom0 = self.execute_qubesrpc("qubes.Service+arg", "domX")
401444
target.send_message(qrexec.MSG_DATA_STDIN, b"")
402445
messages = target.recv_all_messages()
403446
self.assertListEqual(
@@ -408,6 +451,7 @@ def test_exec_service_fail(self):
408451
(qrexec.MSG_DATA_EXIT_CODE, b"\177\0\0\0"),
409452
],
410453
)
454+
self.check_dom0(dom0)
411455

412456
def test_exec_service_with_arg(self):
413457
self.make_executable_service(
@@ -426,7 +470,7 @@ def test_exec_service_with_arg(self):
426470
echo "general service"
427471
""",
428472
)
429-
target = self.execute_qubesrpc("qubes.Service+arg", "domX")
473+
target, dom0 = self.execute_qubesrpc("qubes.Service+arg", "domX")
430474
target.send_message(qrexec.MSG_DATA_STDIN, b"")
431475
messages = target.recv_all_messages()
432476
self.assertListEqual(
@@ -438,6 +482,7 @@ def test_exec_service_with_arg(self):
438482
(qrexec.MSG_DATA_EXIT_CODE, b"\0\0\0\0"),
439483
],
440484
)
485+
self.check_dom0(dom0)
441486

442487
def test_connect_socket(self):
443488
socket_path = os.path.join(
@@ -446,7 +491,7 @@ def test_connect_socket(self):
446491
server = qrexec.socket_server(socket_path)
447492
self.addCleanup(server.close)
448493

449-
target = self.execute_qubesrpc("qubes.SocketService+arg", "domX")
494+
target, dom0 = self.execute_qubesrpc("qubes.SocketService+arg", "domX")
450495

451496
server.accept()
452497
expected = b"qubes.SocketService+arg domX\0"
@@ -469,6 +514,7 @@ def test_connect_socket(self):
469514
(qrexec.MSG_DATA_EXIT_CODE, b"\0\0\0\0"),
470515
],
471516
)
517+
self.check_dom0(dom0)
472518

473519
def test_service_close_stdout_stderr_early(self):
474520
self.make_executable_service(
@@ -486,7 +532,7 @@ def test_service_close_stdout_stderr_early(self):
486532
exit $code
487533
""",
488534
)
489-
target = self.execute_qubesrpc("qubes.Service", "domX")
535+
target, dom0 = self.execute_qubesrpc("qubes.Service", "domX")
490536

491537
target.send_message(qrexec.MSG_DATA_STDIN, b"\n")
492538

@@ -508,6 +554,7 @@ def test_service_close_stdout_stderr_early(self):
508554
target.recv_message(),
509555
(qrexec.MSG_DATA_EXIT_CODE, struct.pack("<L", 42)),
510556
)
557+
self.check_dom0(dom0)
511558

512559

513560
@unittest.skipIf(os.environ.get("SKIP_SOCKET_TESTS"), "socket tests not set up")

0 commit comments

Comments
 (0)