diff --git a/qubes/tests/__init__.py b/qubes/tests/__init__.py index 528eaf04..8af3dd24 100644 --- a/qubes/tests/__init__.py +++ b/qubes/tests/__init__.py @@ -1277,7 +1277,7 @@ class SystemTestCase(QubesTestCase): @asyncio.coroutine def wait_for_session(self, vm): - timeout = 30 + timeout = vm.qrexec_timeout if getattr(vm, 'template', None) and 'whonix-ws' in vm.template.name: # first boot of whonix-ws takes more time because of /home # initialization, including Tor Browser copying @@ -1287,6 +1287,12 @@ class SystemTestCase(QubesTestCase): 'qubes.WaitForSession', input=vm.default_user.encode()), timeout=timeout) + @asyncio.coroutine + def start_vm(self, vm): + """Start a VM and wait for it to be fully up""" + yield from vm.start() + yield from self.wait_for_session(vm) + _templates = None diff --git a/qubes/tests/integ/grub.py b/qubes/tests/integ/grub.py index 1fb9a775..11b84ca4 100644 --- a/qubes/tests/integ/grub.py +++ b/qubes/tests/integ/grub.py @@ -57,6 +57,9 @@ class GrubBase(object): else: assert False, "Unsupported template?!" + # wait for full VM startup first, to have functional network + self.loop.run_until_complete(self.wait_for_session(vm)) + for cmd in [cmd_install1, cmd_install2, cmd_update_grub]: try: self.loop.run_until_complete(vm.run_for_stdio( diff --git a/qubes/tests/integ/network.py b/qubes/tests/integ/network.py index 187f7023..19886c8e 100644 --- a/qubes/tests/integ/network.py +++ b/qubes/tests/integ/network.py @@ -154,7 +154,7 @@ class VmNetworkingMixin(object): ''' :type self: qubes.tests.SystemTestCase | VMNetworkingMixin ''' - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertEqual(self.run_cmd(self.testvm1, self.ping_ip), 0) self.assertEqual(self.run_cmd(self.testvm1, self.ping_name), 0) @@ -172,7 +172,7 @@ class VmNetworkingMixin(object): self.testvm1.netvm = self.proxy self.app.save() - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertTrue(self.proxy.is_running()) self.assertEqual(self.run_cmd(self.proxy, self.ping_ip), 0, "Ping by IP from ProxyVM failed") @@ -201,7 +201,7 @@ class VmNetworkingMixin(object): self.testvm1.netvm = self.proxy self.app.save() - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertTrue(self.proxy.is_running()) self.assertEqual(self.run_cmd(self.testvm1, self.ping_ip), 0, "Ping by IP failed") @@ -252,7 +252,7 @@ class VmNetworkingMixin(object): self.testvm1.firewall.rules = [qubes.firewall.Rule(action='drop')] self.testvm1.firewall.save() - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertTrue(self.proxy.is_running()) server = self.loop.run_until_complete(self.testnetvm.run( @@ -352,8 +352,8 @@ class VmNetworkingMixin(object): self.app.save() self.loop.run_until_complete(asyncio.gather( - self.testvm1.start(), - self.testvm2.start())) + self.start_vm(self.testvm1), + self.start_vm(self.testvm2))) self.assertNotEqual(self.run_cmd(self.testvm1, self.ping_cmd.format(target=self.testvm2.ip)), 0) @@ -377,7 +377,7 @@ class VmNetworkingMixin(object): :type self: qubes.tests.SystemTestCase | VMNetworkingMixin ''' - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertEqual(self.run_cmd(self.testvm1, self.ping_ip), 0) self.assertEqual(self.run_cmd(self.testnetvm, @@ -410,7 +410,7 @@ class VmNetworkingMixin(object): cmd = "systemctl stop xendriverdomain" if self.run_cmd(self.testnetvm, cmd) != 0: self.fail("Command '%s' failed" % cmd) - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) cmd = "systemctl start xendriverdomain" if self.run_cmd(self.testnetvm, cmd) != 0: @@ -423,7 +423,7 @@ class VmNetworkingMixin(object): def test_110_dynamic_attach(self): self.testvm1.netvm = None - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.testvm1.netvm = self.testnetvm # wait for it to settle down self.loop.run_until_complete(self.testvm1.run_for_stdio( @@ -431,7 +431,7 @@ class VmNetworkingMixin(object): self.assertEqual(self.run_cmd(self.testvm1, self.ping_ip), 0) def test_111_dynamic_detach_attach(self): - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.testvm1.netvm = None # wait for it to settle down self.loop.run_until_complete(self.testvm1.run_for_stdio( @@ -451,9 +451,9 @@ class VmNetworkingMixin(object): self.loop.run_until_complete(self.proxy.create_on_disk()) self.testvm1.netvm = self.proxy - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.loop.run_until_complete(self.proxy.shutdown(force=True, wait=True)) - self.loop.run_until_complete(self.proxy.start()) + self.loop.run_until_complete(self.start_vm(self.proxy)) # wait for it to settle down self.loop.run_until_complete(self.wait_for_session(self.proxy)) self.assertEqual(self.run_cmd(self.testvm1, self.ping_ip), 0) @@ -467,11 +467,9 @@ class VmNetworkingMixin(object): self.loop.run_until_complete(self.proxy.create_on_disk()) self.testvm1.netvm = self.proxy - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.loop.run_until_complete(self.proxy.kill()) - self.loop.run_until_complete(self.proxy.start()) - # wait for it to settle down - self.loop.run_until_complete(self.wait_for_session(self.proxy)) + self.loop.run_until_complete(self.start_vm(self.proxy)) self.assertEqual(self.run_cmd(self.testvm1, self.ping_ip), 0) def test_114_reattach_after_provider_crash(self): @@ -483,7 +481,7 @@ class VmNetworkingMixin(object): self.loop.run_until_complete(self.proxy.create_on_disk()) self.testvm1.netvm = self.proxy - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) p = self.loop.run_until_complete(self.proxy.run( 'echo c > /proc/sysrq-trigger', user='root')) self.loop.run_until_complete(p.wait()) @@ -493,9 +491,7 @@ class VmNetworkingMixin(object): timeout -= 1 self.assertGreater(timeout, 0, 'timeout waiting for crash cleanup') - self.loop.run_until_complete(self.proxy.start()) - # wait for it to settle down - self.loop.run_until_complete(self.wait_for_session(self.proxy)) + self.loop.run_until_complete(self.start_vm(self.proxy)) self.assertEqual(self.run_cmd(self.testvm1, self.ping_ip), 0) def test_200_fake_ip_simple(self): @@ -507,7 +503,7 @@ class VmNetworkingMixin(object): self.testvm1.features['net.fake-gateway'] = '192.168.1.1' self.testvm1.features['net.fake-netmask'] = '255.255.255.0' self.app.save() - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertEqual(self.run_cmd(self.testvm1, self.ping_ip), 0) self.assertEqual(self.run_cmd(self.testvm1, self.ping_name), 0) @@ -539,7 +535,7 @@ class VmNetworkingMixin(object): ''' self.testvm1.features['net.fake-ip'] = '192.168.1.128' self.app.save() - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertEqual(self.run_cmd(self.testvm1, self.ping_ip), 0) self.assertEqual(self.run_cmd(self.testvm1, self.ping_name), 0) @@ -579,7 +575,7 @@ class VmNetworkingMixin(object): qubes.firewall.Rule(None, action='accept', specialtarget='dns'), ] self.testvm1.firewall.save() - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertTrue(self.proxy.is_running()) server = self.loop.run_until_complete(self.testnetvm.run( @@ -624,8 +620,8 @@ class VmNetworkingMixin(object): self.testvm2.netvm = self.proxy self.app.save() - self.loop.run_until_complete(self.testvm1.start()) - self.loop.run_until_complete(self.testvm2.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) + self.loop.run_until_complete(self.start_vm(self.testvm2)) cmd = 'iptables -I FORWARD -s {} -d {} -j ACCEPT'.format( self.testvm2.ip, self.testvm1.ip) @@ -673,7 +669,7 @@ class VmNetworkingMixin(object): self.proxy.features['net.fake-netmask'] = '255.255.255.0' self.testvm1.netvm = self.proxy self.app.save() - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertEqual(self.run_cmd(self.proxy, self.ping_ip), 0) self.assertEqual(self.run_cmd(self.proxy, self.ping_name), 0) @@ -728,7 +724,7 @@ class VmNetworkingMixin(object): ''' self.testvm1.ip = '192.168.1.1' self.app.save() - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertEqual(self.run_cmd(self.testvm1, self.ping_ip), 0) self.assertEqual(self.run_cmd(self.testvm1, self.ping_name), 0) @@ -747,7 +743,7 @@ class VmNetworkingMixin(object): self.testvm1.netvm = self.proxy self.app.save() - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertEqual(self.run_cmd(self.testvm1, self.ping_ip), 0) self.assertEqual(self.run_cmd(self.testvm1, self.ping_name), 0) @@ -775,7 +771,7 @@ class VmNetworkingMixin(object): qubes.firewall.Rule(None, action='accept', specialtarget='dns'), ] self.testvm1.firewall.save() - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertTrue(self.proxy.is_running()) server = self.loop.run_until_complete(self.testnetvm.run( diff --git a/qubes/tests/integ/network_ipv6.py b/qubes/tests/integ/network_ipv6.py index cc3422b0..af39ccc1 100644 --- a/qubes/tests/integ/network_ipv6.py +++ b/qubes/tests/integ/network_ipv6.py @@ -84,7 +84,7 @@ class VmIPv6NetworkingMixin(VmNetworkingMixin): ''' :type self: qubes.tests.SystemTestCase | VmIPv6NetworkingMixin ''' - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertEqual(self.run_cmd(self.testvm1, self.ping6_ip), 0) self.assertEqual(self.run_cmd(self.testvm1, self.ping6_name), 0) @@ -102,7 +102,7 @@ class VmIPv6NetworkingMixin(VmNetworkingMixin): self.testvm1.netvm = self.proxy self.app.save() - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertTrue(self.proxy.is_running()) self.assertEqual(self.run_cmd(self.proxy, self.ping6_ip), 0, "Ping by IP from ProxyVM failed") @@ -131,7 +131,7 @@ class VmIPv6NetworkingMixin(VmNetworkingMixin): self.testvm1.netvm = self.proxy self.app.save() - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertTrue(self.proxy.is_running()) self.assertEqual(self.run_cmd(self.testvm1, self.ping6_ip), 0, "Ping by IP failed") @@ -187,7 +187,7 @@ class VmIPv6NetworkingMixin(VmNetworkingMixin): self.testvm1.firewall.rules = [qubes.firewall.Rule(action='drop')] self.testvm1.firewall.save() - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertTrue(self.proxy.is_running()) server = self.loop.run_until_complete(self.testnetvm.run( @@ -308,8 +308,8 @@ class VmIPv6NetworkingMixin(VmNetworkingMixin): self.app.save() self.loop.run_until_complete(asyncio.gather( - self.testvm1.start(), - self.testvm2.start())) + self.start_vm(self.testvm1), + self.start_vm(self.testvm2))) self.assertNotEqual(self.run_cmd(self.testvm1, self.ping_cmd.format(target=self.testvm2.ip6)), 0) @@ -335,7 +335,7 @@ class VmIPv6NetworkingMixin(VmNetworkingMixin): :type self: qubes.tests.SystemTestCase | VmIPv6NetworkingMixin ''' - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertEqual(self.run_cmd(self.testvm1, self.ping6_ip), 0) # add a simple rule counting packets @@ -369,7 +369,7 @@ class VmIPv6NetworkingMixin(VmNetworkingMixin): ''' self.testvm1.ip6 = '2000:aaaa:bbbb::1' self.app.save() - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertEqual(self.run_cmd(self.testvm1, self.ping6_ip), 0) self.assertEqual(self.run_cmd(self.testvm1, self.ping6_name), 0) @@ -388,7 +388,7 @@ class VmIPv6NetworkingMixin(VmNetworkingMixin): self.testvm1.netvm = self.proxy self.app.save() - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertEqual(self.run_cmd(self.testvm1, self.ping6_ip), 0) self.assertEqual(self.run_cmd(self.testvm1, self.ping6_name), 0) @@ -416,7 +416,7 @@ class VmIPv6NetworkingMixin(VmNetworkingMixin): qubes.firewall.Rule(None, action='accept', specialtarget='dns'), ] self.testvm1.firewall.save() - self.loop.run_until_complete(self.testvm1.start()) + self.loop.run_until_complete(self.start_vm(self.testvm1)) self.assertTrue(self.proxy.is_running()) server = self.loop.run_until_complete(self.testnetvm.run(