From 6dd6d9e2541a2cc984c1029bd93b29e6ff04c1e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Thu, 9 Mar 2017 02:27:39 +0100 Subject: [PATCH] tests: add tests for simple tools QubesOS/qubes-issues#853 --- qubesmgmt/tests/tools/qvm_kill.py | 61 +++++++++++++++++++++ qubesmgmt/tests/tools/qvm_pause.py | 77 +++++++++++++++++++++++++++ qubesmgmt/tests/tools/qvm_shutdown.py | 76 ++++++++++++++++++++++++++ qubesmgmt/tests/tools/qvm_unpause.py | 77 +++++++++++++++++++++++++++ 4 files changed, 291 insertions(+) create mode 100644 qubesmgmt/tests/tools/qvm_kill.py create mode 100644 qubesmgmt/tests/tools/qvm_pause.py create mode 100644 qubesmgmt/tests/tools/qvm_shutdown.py create mode 100644 qubesmgmt/tests/tools/qvm_unpause.py diff --git a/qubesmgmt/tests/tools/qvm_kill.py b/qubesmgmt/tests/tools/qvm_kill.py new file mode 100644 index 0000000..8a16b89 --- /dev/null +++ b/qubesmgmt/tests/tools/qvm_kill.py @@ -0,0 +1,61 @@ +# -*- 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.tools.qvm_kill + + +class TC_00_qvm_kill(qubesmgmt.tests.QubesTestCase): + def test_000_with_vm(self): + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Running\n' + self.app.expected_calls[ + ('some-vm', 'mgmt.vm.Kill', None, None)] = b'0\x00' + qubesmgmt.tools.qvm_kill.main(['some-vm'], app=self.app) + self.assertAllCalled() + + def test_001_missing_vm(self): + with self.assertRaises(SystemExit): + qubesmgmt.tools.qvm_kill.main([], app=self.app) + self.assertAllCalled() + + def test_002_invalid_vm(self): + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Running\n' + with self.assertRaises(SystemExit): + qubesmgmt.tools.qvm_kill.main(['no-such-vm'], app=self.app) + self.assertAllCalled() + + def test_003_not_running(self): + # TODO: some option to ignore this error? + self.app.expected_calls[ + ('some-vm', 'mgmt.vm.Kill', None, None)] = \ + b'2\x00QubesVMNotStartedError\x00\x00Domain is powered off: ' \ + b'some-vm\x00' + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Halted\n' + self.assertEqual( + qubesmgmt.tools.qvm_kill.main(['some-vm'], app=self.app), + 1) + self.assertAllCalled() + diff --git a/qubesmgmt/tests/tools/qvm_pause.py b/qubesmgmt/tests/tools/qvm_pause.py new file mode 100644 index 0000000..6b8f505 --- /dev/null +++ b/qubesmgmt/tests/tools/qvm_pause.py @@ -0,0 +1,77 @@ +# -*- 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.tools.qvm_pause + + +class TC_00_qvm_pause(qubesmgmt.tests.QubesTestCase): + def test_000_with_vm(self): + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Running\n' + self.app.expected_calls[ + ('some-vm', 'mgmt.vm.Pause', None, None)] = b'0\x00' + qubesmgmt.tools.qvm_pause.main(['some-vm'], app=self.app) + self.assertAllCalled() + + def test_001_missing_vm(self): + with self.assertRaises(SystemExit): + qubesmgmt.tools.qvm_pause.main([], app=self.app) + self.assertAllCalled() + + def test_002_invalid_vm(self): + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Running\n' + with self.assertRaises(SystemExit): + qubesmgmt.tools.qvm_pause.main(['no-such-vm'], app=self.app) + self.assertAllCalled() + + def test_003_not_running(self): + # TODO: some option to ignore this error? + self.app.expected_calls[ + ('some-vm', 'mgmt.vm.Pause', None, None)] = \ + b'2\x00QubesVMNotStartedError\x00\x00Domain is powered off: ' \ + b'some-vm\x00' + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Halted\n' + self.assertEqual( + qubesmgmt.tools.qvm_pause.main(['some-vm'], app=self.app), + 1) + self.assertAllCalled() + + def test_004_multiple_vms(self): + self.app.expected_calls[ + ('some-vm', 'mgmt.vm.Pause', None, None)] = \ + b'0\x00' + self.app.expected_calls[ + ('other-vm', 'mgmt.vm.Pause', None, None)] = \ + b'0\x00' + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Running\n' \ + b'other-vm class=AppVM state=Running\n' + self.assertEqual( + qubesmgmt.tools.qvm_pause.main(['some-vm', 'other-vm'], + app=self.app), + 0) + self.assertAllCalled() diff --git a/qubesmgmt/tests/tools/qvm_shutdown.py b/qubesmgmt/tests/tools/qvm_shutdown.py new file mode 100644 index 0000000..2bd4212 --- /dev/null +++ b/qubesmgmt/tests/tools/qvm_shutdown.py @@ -0,0 +1,76 @@ +# -*- 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.tools.qvm_shutdown + + +class TC_00_qvm_shutdown(qubesmgmt.tests.QubesTestCase): + def test_000_with_vm(self): + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Running\n' + self.app.expected_calls[ + ('some-vm', 'mgmt.vm.Shutdown', None, None)] = b'0\x00' + qubesmgmt.tools.qvm_shutdown.main(['some-vm'], app=self.app) + self.assertAllCalled() + + def test_001_missing_vm(self): + with self.assertRaises(SystemExit): + qubesmgmt.tools.qvm_shutdown.main([], app=self.app) + self.assertAllCalled() + + def test_002_invalid_vm(self): + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Running\n' + with self.assertRaises(SystemExit): + qubesmgmt.tools.qvm_shutdown.main(['no-such-vm'], app=self.app) + self.assertAllCalled() + + def test_003_not_running(self): + # TODO: some option to ignore this error? + self.app.expected_calls[ + ('some-vm', 'mgmt.vm.Shutdown', None, None)] = \ + b'2\x00QubesVMNotStartedError\x00\x00Domain is powered off: ' \ + b'some-vm\x00' + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Halted\n' + qubesmgmt.tools.qvm_shutdown.main(['some-vm'], app=self.app) + self.assertAllCalled() + + def test_004_multiple_vms(self): + self.app.expected_calls[ + ('some-vm', 'mgmt.vm.Shutdown', None, None)] = \ + b'0\x00' + self.app.expected_calls[ + ('other-vm', 'mgmt.vm.Shutdown', None, None)] = \ + b'0\x00' + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Running\n' \ + b'other-vm class=AppVM state=Running\n' + qubesmgmt.tools.qvm_shutdown.main(['some-vm', 'other-vm'], app=self.app), + self.assertAllCalled() + + def test_010_wait(self): + '''test --wait option''' + self.skipTest('test not implemented') \ No newline at end of file diff --git a/qubesmgmt/tests/tools/qvm_unpause.py b/qubesmgmt/tests/tools/qvm_unpause.py new file mode 100644 index 0000000..da80f3d --- /dev/null +++ b/qubesmgmt/tests/tools/qvm_unpause.py @@ -0,0 +1,77 @@ +# -*- 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.tools.qvm_unpause + + +class TC_00_qvm_unpause(qubesmgmt.tests.QubesTestCase): + def test_000_with_vm(self): + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Running\n' + self.app.expected_calls[ + ('some-vm', 'mgmt.vm.Unpause', None, None)] = b'0\x00' + qubesmgmt.tools.qvm_unpause.main(['some-vm'], app=self.app) + self.assertAllCalled() + + def test_001_missing_vm(self): + with self.assertRaises(SystemExit): + qubesmgmt.tools.qvm_unpause.main([], app=self.app) + self.assertAllCalled() + + def test_002_invalid_vm(self): + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Running\n' + with self.assertRaises(SystemExit): + qubesmgmt.tools.qvm_unpause.main(['no-such-vm'], app=self.app) + self.assertAllCalled() + + def test_003_not_running(self): + # TODO: some option to ignore this error? + self.app.expected_calls[ + ('some-vm', 'mgmt.vm.Unpause', None, None)] = \ + b'2\x00QubesVMNotStartedError\x00\x00Domain is powered off: ' \ + b'some-vm\x00' + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Halted\n' + self.assertEqual( + qubesmgmt.tools.qvm_unpause.main(['some-vm'], app=self.app), + 1) + self.assertAllCalled() + + def test_004_multiple_vms(self): + self.app.expected_calls[ + ('some-vm', 'mgmt.vm.Unpause', None, None)] = \ + b'0\x00' + self.app.expected_calls[ + ('other-vm', 'mgmt.vm.Unpause', None, None)] = \ + b'0\x00' + self.app.expected_calls[ + ('dom0', 'mgmt.vm.List', None, None)] = \ + b'0\x00some-vm class=AppVM state=Running\n' \ + b'other-vm class=AppVM state=Running\n' + self.assertEqual( + qubesmgmt.tools.qvm_unpause.main(['some-vm', 'other-vm'], + app=self.app), + 0) + self.assertAllCalled()