From a575bc34224ba5f7b0f4f32e2a7beb05ce79e634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Wed, 8 Mar 2017 23:41:39 +0100 Subject: [PATCH] tools: allow supplying app object to main function This is mostly for tests, which use dummy app instance. --- qubesmgmt/tests/tools/qvm_prefs.py | 86 ++++++++++++++++++++++++++++++ qubesmgmt/tools/__init__.py | 10 ++-- qubesmgmt/tools/qubes_prefs.py | 6 +-- qubesmgmt/tools/qvm_kill.py | 4 +- qubesmgmt/tools/qvm_pause.py | 4 +- qubesmgmt/tools/qvm_prefs.py | 4 +- qubesmgmt/tools/qvm_shutdown.py | 4 +- qubesmgmt/tools/qvm_unpause.py | 4 +- 8 files changed, 105 insertions(+), 17 deletions(-) create mode 100644 qubesmgmt/tests/tools/qvm_prefs.py diff --git a/qubesmgmt/tests/tools/qvm_prefs.py b/qubesmgmt/tests/tools/qvm_prefs.py new file mode 100644 index 0000000..e1dc3a4 --- /dev/null +++ b/qubesmgmt/tests/tools/qvm_prefs.py @@ -0,0 +1,86 @@ +# -*- encoding: utf8 -*- +# +# The Qubes OS Project, http://www.qubes-os.org +# +# Copyright (C) 2017 Marek Marczykowski-Górecki +# +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with this program; if not, see . + +import qubesmgmt.tests +import qubesmgmt.tests.tools +import qubesmgmt.tools.qvm_prefs + + +class TC_00_qvm_prefs(qubesmgmt.tests.QubesTestCase): + def test_000_list(self): + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00dom0 class=AdminVM state=Running\n' + self.app.expected_calls[ + ('dom0', 'mgmt.vm.property.List', None, None)] = \ + b'0\x00prop1\nprop2\n' + self.app.expected_calls[ + ('dom0', 'mgmt.vm.property.Get', 'prop1', None)] = \ + b'0\x00default=True \'value1\'' + self.app.expected_calls[ + ('dom0', 'mgmt.vm.property.Get', 'prop2', None)] = \ + b'0\x00default=False \'value2\'' + with qubesmgmt.tests.tools.StdoutBuffer() as stdout: + self.assertEqual(0, qubesmgmt.tools.qvm_prefs.main([ + 'dom0'], app=self.app)) + self.assertEqual(stdout.getvalue(), + 'prop1 D value1\n' + 'prop2 - value2\n') + self.assertAllCalled() + + def test_001_no_vm(self): + with self.assertRaises(SystemExit): + qubesmgmt.tools.qvm_prefs.main([], app=self.app) + self.assertAllCalled() + + def test_002_set_property(self): + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00dom0 class=AdminVM state=Running\n' + self.app.expected_calls[ + ('dom0', 'mgmt.vm.property.Set', 'default_user', b'testuser')] = \ + b'0\x00' + self.assertEqual(0, qubesmgmt.tools.qvm_prefs.main([ + 'dom0', 'default_user', 'testuser'], app=self.app)) + self.assertAllCalled() + + def test_003_invalid_property(self): + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00dom0 class=AdminVM state=Running\n' + self.app.expected_calls[ + ('dom0', 'mgmt.vm.property.Get', 'no_such_property', None)] = \ + b'2\x00AttributeError\x00\x00no_such_property\x00' + with self.assertRaises(SystemExit): + qubesmgmt.tools.qvm_prefs.main([ + 'dom0', 'no_such_property'], app=self.app) + self.assertAllCalled() + + def test_004_set_invalid_property(self): + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00dom0 class=AdminVM state=Running\n' + self.app.expected_calls[ + ('dom0', 'mgmt.vm.property.Set', 'no_such_property', b'value')] = \ + b'2\x00AttributeError\x00\x00no_such_property\x00' + with self.assertRaises(SystemExit): + qubesmgmt.tools.qvm_prefs.main([ + 'dom0', 'no_such_property', 'value'], app=self.app) + self.assertAllCalled() diff --git a/qubesmgmt/tools/__init__.py b/qubesmgmt/tools/__init__.py index 093de25..8a3be8f 100644 --- a/qubesmgmt/tools/__init__.py +++ b/qubesmgmt/tools/__init__.py @@ -350,14 +350,16 @@ class QubesArgumentParser(argparse.ArgumentParser): self.set_defaults(verbose=1, quiet=0) def parse_args(self, *args, **kwargs): + # hack for tests + app = kwargs.pop('app', None) namespace = super(QubesArgumentParser, self).parse_args(*args, **kwargs) if self._want_app and not self._want_app_no_instance: self.set_qubes_verbosity(namespace) - namespace.app = qubesmgmt.Qubes() - - if self._want_force_root: - self.dont_run_as_root(namespace) + if app is not None: + namespace.app = app + else: + namespace.app = qubesmgmt.Qubes() for action in self._actions: # pylint: disable=protected-access diff --git a/qubesmgmt/tools/qubes_prefs.py b/qubesmgmt/tools/qubes_prefs.py index a6dc451..4363a5d 100644 --- a/qubesmgmt/tools/qubes_prefs.py +++ b/qubesmgmt/tools/qubes_prefs.py @@ -31,9 +31,9 @@ import qubesmgmt import qubesmgmt.tools.qvm_prefs -def main(args=None): # pylint: disable=missing-docstring - parser = qubesmgmt.tools.qvm_prefs.get_parser(0) - args = parser.parse_args(args) +def main(args=None, app=None): # pylint: disable=missing-docstring + parser = qubesmgmt.tools.qvm_prefs.get_parser(None) + args = parser.parse_args(args, app=app) target = args.app return qubesmgmt.tools.qvm_prefs.process_actions(parser, args, target) diff --git a/qubesmgmt/tools/qvm_kill.py b/qubesmgmt/tools/qvm_kill.py index e15f745..7a8d895 100644 --- a/qubesmgmt/tools/qvm_kill.py +++ b/qubesmgmt/tools/qvm_kill.py @@ -29,14 +29,14 @@ parser = qubesmgmt.tools.QubesArgumentParser( description='forceful shutdown of a domain', vmname_nargs='+') -def main(args=None): +def main(args=None, app=None): '''Main routine of :program:`qvm-kill`. :param list args: Optional arguments to override those delivered from \ command line. ''' - args = parser.parse_args(args) + args = parser.parse_args(args, app=app) exit_code = 0 for domain in args.domains: diff --git a/qubesmgmt/tools/qvm_pause.py b/qubesmgmt/tools/qvm_pause.py index 4d39edd..6180b80 100644 --- a/qubesmgmt/tools/qvm_pause.py +++ b/qubesmgmt/tools/qvm_pause.py @@ -28,14 +28,14 @@ parser = qubesmgmt.tools.QubesArgumentParser(vmname_nargs='+', description='pause a domain') -def main(args=None): +def main(args=None, app=None): '''Main routine of :program:`qvm-pause`. :param list args: Optional arguments to override those delivered from \ command line. ''' - args = parser.parse_args(args) + args = parser.parse_args(args, app=app) for domain in args.domains: domain.pause() diff --git a/qubesmgmt/tools/qvm_prefs.py b/qubesmgmt/tools/qvm_prefs.py index b71891e..042847f 100644 --- a/qubesmgmt/tools/qvm_prefs.py +++ b/qubesmgmt/tools/qvm_prefs.py @@ -117,9 +117,9 @@ def process_actions(parser, args, target): return 0 -def main(args=None): # pylint: disable=missing-docstring +def main(args=None, app=None): # pylint: disable=missing-docstring parser = get_parser(1) - args = parser.parse_args(args) + args = parser.parse_args(args, app=app) target = args.domains.pop() return process_actions(parser, args, target) diff --git a/qubesmgmt/tools/qvm_shutdown.py b/qubesmgmt/tools/qvm_shutdown.py index f8ca092..3cbc96c 100644 --- a/qubesmgmt/tools/qvm_shutdown.py +++ b/qubesmgmt/tools/qvm_shutdown.py @@ -48,8 +48,8 @@ parser.add_argument('--timeout', ' (default: %d)') -def main(args=None): # pylint: disable=missing-docstring - args = parser.parse_args(args) +def main(args=None, app=None): # pylint: disable=missing-docstring + args = parser.parse_args(args, app=app) for vm in args.domains: if not vm.is_halted(): diff --git a/qubesmgmt/tools/qvm_unpause.py b/qubesmgmt/tools/qvm_unpause.py index e6bb778..ccea83a 100644 --- a/qubesmgmt/tools/qvm_unpause.py +++ b/qubesmgmt/tools/qvm_unpause.py @@ -29,14 +29,14 @@ parser = qubesmgmt.tools.QubesArgumentParser( description='unpause a domain') -def main(args=None): +def main(args=None, app=None): '''Main routine of :program:`qvm-unpause`. :param list args: Optional arguments to override those delivered from \ command line. ''' - args = parser.parse_args(args) + args = parser.parse_args(args, app=app) for domain in args.domains: domain.unpause()