Skip to content

Commit

Permalink
q-dev: add more tests
Browse files Browse the repository at this point in the history
  • Loading branch information
piotrbartman committed Aug 28, 2024
1 parent 0168517 commit 2c86f03
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 31 deletions.
66 changes: 48 additions & 18 deletions qubesadmin/tests/tools/qvm_device.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,10 @@ def setUp(self):
b'test-vm3 class=AppVM state=Running\n')
self.expected_device_call(
'test-vm1', 'Available',
b"0\0dev1 device_id='dead:beef:babe:u0123456' "
b"0\0dev1 device_id='dead:beef:babe:u012345' "
b"port_id='dev1' devclass='testclass' vendor='itl' "
b"product='test-device' backend_domain='test-vm1'"
b"interfaces='u012345' product='test-device' "
b"backend_domain='test-vm1'"
)
self.vm1 = self.app.domains['test-vm1']
self.vm2 = self.app.domains['test-vm2']
Expand Down Expand Up @@ -76,7 +77,7 @@ def test_000_list_all(self):
['testclass', 'list'], app=self.app)
self.assertEqual(
[x.rstrip() for x in buf.getvalue().splitlines()],
['test-vm1:dev1 ?******: itl test-device',
['test-vm1:dev1 Multimedia: itl test-device',
'test-vm2:dev2 ?******: ? ` test-device']
)

Expand Down Expand Up @@ -150,7 +151,7 @@ def test_002_list_attach(self):
['testclass', 'list', 'test-vm3'], app=self.app)
self.assertEqual(
buf.getvalue(),
'test-vm1:dev1 ?******: itl test-device '
'test-vm1:dev1 Multimedia: itl test-device '
'test-vm3 (required)\n'
)

Expand All @@ -173,8 +174,8 @@ def test_010_attach(self):
""" Test attach action """
self.app.expected_calls[(
'test-vm2', 'admin.vm.device.testclass.Attach',
'test-vm1+dev1:dead:beef:babe:u0123456',
b"device_id='dead:beef:babe:u0123456' port_id='dev1' "
'test-vm1+dev1:dead:beef:babe:u012345',
b"device_id='dead:beef:babe:u012345' port_id='dev1' "
b"devclass='testclass' backend_domain='test-vm1' mode='manual' "
b"frontend_domain='test-vm2'")] = b'0\0'
qubesadmin.tools.qvm_device.main(
Expand All @@ -185,8 +186,8 @@ def test_011_attach_options(self):
""" Test `read-only` attach option """
self.app.expected_calls[(
'test-vm2', 'admin.vm.device.testclass.Attach',
'test-vm1+dev1:dead:beef:babe:u0123456',
b"device_id='dead:beef:babe:u0123456' port_id='dev1' "
'test-vm1+dev1:dead:beef:babe:u012345',
b"device_id='dead:beef:babe:u012345' port_id='dev1' "
b"devclass='testclass' backend_domain='test-vm1' mode='manual' "
b"frontend_domain='test-vm2' _read-only='yes'")] = b'0\0'
qubesadmin.tools.qvm_device.main(
Expand Down Expand Up @@ -266,8 +267,8 @@ def test_030_assign(self):
self.app.domains['test-vm2'].is_running = lambda: True
self.app.expected_calls[(
'test-vm2', 'admin.vm.device.testclass.Assign',
'test-vm1+dev1:dead:beef:babe:u0123456',
b"device_id='dead:beef:babe:u0123456' port_id='dev1' "
'test-vm1+dev1:dead:beef:babe:u012345',
b"device_id='dead:beef:babe:u012345' port_id='dev1' "
b"devclass='testclass' backend_domain='test-vm1' "
b"mode='auto-attach' frontend_domain='test-vm2'"
)] = b'0\0'
Expand All @@ -280,8 +281,8 @@ def test_031_assign_required(self):
self.app.domains['test-vm2'].is_running = lambda: True
self.app.expected_calls[(
'test-vm2', 'admin.vm.device.testclass.Assign',
'test-vm1+dev1:dead:beef:babe:u0123456',
b"device_id='dead:beef:babe:u0123456' port_id='dev1' "
'test-vm1+dev1:dead:beef:babe:u012345',
b"device_id='dead:beef:babe:u012345' port_id='dev1' "
b"devclass='testclass' backend_domain='test-vm1' mode='required' "
b"frontend_domain='test-vm2'"
)] = b'0\0'
Expand All @@ -294,8 +295,8 @@ def test_032_assign_ask_and_options(self):
self.app.domains['test-vm2'].is_running = lambda: True
self.app.expected_calls[(
'test-vm2', 'admin.vm.device.testclass.Assign',
'test-vm1+dev1:dead:beef:babe:u0123456',
b"device_id='dead:beef:babe:u0123456' port_id='dev1' "
'test-vm1+dev1:dead:beef:babe:u012345',
b"device_id='dead:beef:babe:u012345' port_id='dev1' "
b"devclass='testclass' backend_domain='test-vm1' "
b"mode='ask-to-attach' frontend_domain='test-vm2' _read-only='yes'"
)] = b'0\0'
Expand Down Expand Up @@ -375,8 +376,8 @@ def test_038_assign_device_from_port(self):
self.app.domains['test-vm2'].is_running = lambda: True
self.app.expected_calls[(
'test-vm2', 'admin.vm.device.testclass.Assign',
'test-vm1+*:dead:beef:babe:u0123456',
b"device_id='dead:beef:babe:u0123456' port_id='*' "
'test-vm1+*:dead:beef:babe:u012345',
b"device_id='dead:beef:babe:u012345' port_id='*' "
b"devclass='testclass' backend_domain='test-vm1' "
b"mode='auto-attach' frontend_domain='test-vm2'"
)] = b'0\0'
Expand Down Expand Up @@ -416,11 +417,30 @@ def test_040_assign_explicit_device_device_id(self):
app=self.app)
self.assertAllCalled()

@mock.patch("builtins.open", new_callable=mock.mock_open,
read_data="test-vm2 u012345, *543210")
def test_041_assign_denied_device(self, mock_deny_list):
""" Test user warning """
self.app.domains['test-vm2'].is_running = lambda: False
self.app.expected_calls[(
'test-vm2', 'admin.vm.device.testclass.Assign',
'test-vm1+dev1:dead:beef:babe:u012345',
b"device_id='dead:beef:babe:u012345' port_id='dev1' "
b"devclass='testclass' backend_domain='test-vm1' "
b"mode='ask-to-attach' frontend_domain='test-vm2'"
)] = b'0\0'
with qubesadmin.tests.tools.StdoutBuffer() as buf:
qubesadmin.tools.qvm_device.main(
['testclass', 'assign', '--ask', 'test-vm2', 'test-vm1:dev1'],
app=self.app)
self.assertIn('Attention:', buf.getvalue())
self.assertAllCalled()

def test_050_unassign(self):
""" Test unassign action """
self.app.expected_calls[
('test-vm2', 'admin.vm.device.testclass.Unassign',
'test-vm1+dev1:dead:beef:babe:u0123456', None)] = b'0\0'
'test-vm1+dev1:dead:beef:babe:u012345', None)] = b'0\0'
qubesadmin.tools.qvm_device.main(
['testclass', 'unassign', 'test-vm2', 'test-vm1:dev1'],
app=self.app)
Expand Down Expand Up @@ -450,7 +470,7 @@ def test_053_unassign_device_from_port(self):
""" Test unassign action """
self.app.expected_calls[
('test-vm2', 'admin.vm.device.testclass.Unassign',
'test-vm1+*:dead:beef:babe:u0123456', None)] = b'0\0'
'test-vm1+*:dead:beef:babe:u012345', None)] = b'0\0'
qubesadmin.tools.qvm_device.main(
['testclass', 'unassign', 'test-vm2', 'test-vm1:dev1', '--device'],
app=self.app)
Expand Down Expand Up @@ -501,3 +521,13 @@ def test_057_unassign_all(self):
qubesadmin.tools.qvm_device.main(
['testclass', 'unassign', 'test-vm2'], app=self.app)
self.assertAllCalled()

def test_060_device_info(self):
""" Test printing info about device """
with qubesadmin.tests.tools.StdoutBuffer() as buf:
qubesadmin.tools.qvm_device.main(
['testclass', 'info', 'test-vm1:dev1'],
app=self.app)
self.assertIn('dead:beef:babe:u012345: Multimedia: itl test-device',
buf.getvalue())
self.assertAllCalled()
18 changes: 5 additions & 13 deletions qubesadmin/tools/qvm_device.py
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,8 @@ def assign_device(args):
print("Attention: The assigned device is on the denied list: "
f"{DEVICE_DENY_LIST}\n Auto-attach will work, "
f"but make sure that the assignment is correct.")
if vm.is_running() and not assignment.attached and not args.quiet:
if (vm.is_running() and not assignment.attached
and assignment.port_id != '*' and not args.quiet):
print("Assigned. To attach you can now restart domain or run: \n"
f"\tqvm-{assignment.devclass} attach {vm} "
f"{assignment.backend_domain}:{assignment.port_id}")
Expand Down Expand Up @@ -331,18 +332,11 @@ def info_device(args):
""" Called by the parser to execute the :program:`qvm-devices info`
subcommand.
"""
vm = args.domains[0]
if args.device:
device = args.device
print("description:", device.description)
print("data:", device.data)
else:
for assignment in (vm.devices[args.devclass].get_dedicated_devices()):
print("device_assignment:", assignment)
if len(assignment.devices) == 1:
device = assignment.devices[0]
print("description:", device.description)
print("data:", device.data)
print(f'{device.device_id}:', device.description)
if device.data:
print("additional data:", device.data)

Check warning on line 339 in qubesadmin/tools/qvm_device.py

View check run for this annotation

Codecov / codecov/patch

qubesadmin/tools/qvm_device.py#L339

Added line #L339 was not covered by tests


def init_list_parser(sub_parsers):
Expand Down Expand Up @@ -455,8 +449,6 @@ def get_parser(device_class=None):
action=qubesadmin.tools.VmNameAction)
unassign_parser.add_argument('VMNAME', nargs=1,
action=qubesadmin.tools.VmNameAction)
info_parser.add_argument('VMNAME', nargs=1,
action=qubesadmin.tools.VmNameAction)

attach_parser.add_argument(metavar='BACKEND:DEVICE_ID',
dest='device',
Expand Down

0 comments on commit 2c86f03

Please sign in to comment.