tests: add some basic tests for running VM, qrexec, GUI
This commit is contained in:
		
							parent
							
								
									bf2173073b
								
							
						
					
					
						commit
						d5817eb6c5
					
				
							
								
								
									
										137
									
								
								tests/vm_qrexec_gui.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								tests/vm_qrexec_gui.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,137 @@ | ||||
| #!/usr/bin/python | ||||
| # -*- coding: utf-8 -*- | ||||
| # | ||||
| # The Qubes OS Project, http://www.qubes-os.org | ||||
| # | ||||
| # Copyright (C) 2014 Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> | ||||
| # | ||||
| # This program is free software; you can redistribute it and/or | ||||
| # modify it under the terms of the GNU General Public License | ||||
| # as published by the Free Software Foundation; either version 2 | ||||
| # 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 General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with this program; if not, write to the Free Software | ||||
| # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. | ||||
| # | ||||
| import os | ||||
| import subprocess | ||||
| import unittest | ||||
| import time | ||||
| from qubes.qubes import QubesVmCollection, defaults | ||||
| 
 | ||||
| VM_PREFIX = "test-" | ||||
| 
 | ||||
| class VmRunningTests(unittest.TestCase): | ||||
|     def setUp(self): | ||||
|         self.qc = QubesVmCollection() | ||||
|         self.qc.lock_db_for_writing() | ||||
|         self.qc.load() | ||||
|         self.testvm = self.qc.add_new_vm("QubesAppVm", | ||||
|                                          name="%stestvm" % VM_PREFIX, | ||||
|                                          template=self.qc.get_default_template()) | ||||
|         self.testvm.create_on_disk(verbose=False) | ||||
|         self.qc.save() | ||||
|         self.qc.unlock_db() | ||||
| 
 | ||||
|     def remove_vms(self, vms): | ||||
|         self.qc.lock_db_for_writing() | ||||
|         self.qc.load() | ||||
| 
 | ||||
|         for vm in vms: | ||||
|             if isinstance(vm, str): | ||||
|                 vm = self.qc.get_vm_by_name(vm) | ||||
|             else: | ||||
|                 vm = self.qc[vm.qid] | ||||
|             if vm.is_running(): | ||||
|                 try: | ||||
|                     vm.force_shutdown() | ||||
|                 except: | ||||
|                     pass | ||||
|             try: | ||||
|                 vm.remove_from_disk() | ||||
|             except OSError: | ||||
|                 pass | ||||
|             self.qc.pop(vm.qid) | ||||
|         self.qc.save() | ||||
|         self.qc.unlock_db() | ||||
| 
 | ||||
|     def tearDown(self): | ||||
|         vmlist = [vm for vm in self.qc.values() if vm.name.startswith( | ||||
|             VM_PREFIX)] | ||||
|         self.remove_vms(vmlist) | ||||
| 
 | ||||
|     def test_000_start_shutdown(self): | ||||
|         self.testvm.start() | ||||
|         self.assertEquals(self.testvm.get_power_state(), "Running") | ||||
|         self.testvm.shutdown() | ||||
| 
 | ||||
|         shutdown_counter = 0 | ||||
|         while self.testvm.is_running(): | ||||
|             if shutdown_counter > defaults["shutdown_counter_max"]: | ||||
|                 self.fail("VM hanged during shutdown") | ||||
|             shutdown_counter += 1 | ||||
|             time.sleep(1) | ||||
|         time.sleep(1) | ||||
|         self.assertEquals(self.testvm.get_power_state(), "Halted") | ||||
| 
 | ||||
|     def test_010_run_gui_app(self): | ||||
|         self.testvm.start() | ||||
|         self.assertEquals(self.testvm.get_power_state(), "Running") | ||||
|         self.testvm.run("gnome-terminal") | ||||
|         wait_count = 0 | ||||
|         while subprocess.call(['xdotool', 'search', '--name', 'user@%s' % | ||||
|                 self.testvm.name]) > 0: | ||||
|             wait_count += 1 | ||||
|             if wait_count > 100: | ||||
|                 self.fail("Timeout while waiting for gnome-terminal window") | ||||
|             time.sleep(0.1) | ||||
| 
 | ||||
|         subprocess.check_call(['xdotool', 'search', '--name', 'user@%s' % | ||||
|                 self.testvm.name, 'windowactivate', 'type', 'exit\n']) | ||||
| 
 | ||||
|         wait_count = 0 | ||||
|         while subprocess.call(['xdotool', 'search', '--name', 'user@%s' % | ||||
|                 self.testvm.name], stdout=open(os.path.devnull, 'w'), | ||||
|                               stderr=subprocess.STDOUT) == 0: | ||||
|             wait_count += 1 | ||||
|             if wait_count > 100: | ||||
|                 self.fail("Timeout while waiting for gnome-terminal " | ||||
|                           "termination") | ||||
|             time.sleep(0.1) | ||||
| 
 | ||||
|     def test_100_qrexec_filecopy(self): | ||||
|         self.testvm.start() | ||||
|         p = self.testvm.run("qvm-copy-to-vm %s /etc/passwd" % | ||||
|                             self.testvm.name, passio_popen=True, | ||||
|                             passio_stderr=True) | ||||
|         # Confirm transfer | ||||
|         subprocess.check_call(['xdotool', 'search', '--sync', '--name', 'Question', | ||||
|                              'key', 'y']) | ||||
|         p.wait() | ||||
|         self.assertEqual(p.returncode, 0, "qvm-copy-to-vm failed: %s" % | ||||
|                          p.stderr.read()) | ||||
|         retcode = self.testvm.run("diff /etc/passwd " | ||||
|                          "/home/user/QubesIncoming/%s/passwd" % self.testvm.name, wait=True) | ||||
|         self.assertEqual(retcode, 0, "file differs") | ||||
| 
 | ||||
|     def test_110_qrexec_filecopy_deny(self): | ||||
|         self.testvm.start() | ||||
|         p = self.testvm.run("qvm-copy-to-vm %s /etc/passwd" % | ||||
|                             self.testvm.name, passio_popen=True) | ||||
|         # Deny transfer | ||||
|         subprocess.check_call(['xdotool', 'search', '--sync', '--name', 'Question', | ||||
|                              'key', 'n']) | ||||
|         p.wait() | ||||
|         self.assertEqual(p.returncode, 1, "qvm-copy-to-vm unexpectedly " | ||||
|                                           "succeeded") | ||||
|         retcode = self.testvm.run("ls /home/user/QubesIncoming/%s" % | ||||
|                                   self.testvm.name, wait=True, | ||||
|                                   ignore_stderr=True) | ||||
|         self.assertEqual(retcode, 2, "QubesIncoming exists although file copy was " | ||||
|                                      "denied") | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Marek Marczykowski-Górecki
						Marek Marczykowski-Górecki