tests: create testcases on module import if environment variable is set
If QUBES_TEST_TEMPLATES or QUBES_TEST_LOAD_ALL is set, create testcases on modules import, instead of waiting until `load_tests` is called. The `QUBES_TEST_TEMPLATES` doesn't require `qubes.xml` access, so it should be safe to do regardless of the environment. The `QUBES_TEST_LOAD_ALL` force loading tests (and reading `qubes.xml`) regardless. This is useful for test runners not supporting load_tests protocol. Or with limited support - for example both default `unittest` runner and `nose2` can either use load_tests protocol _or_ select individual tests. Setting any of those variable allow to run a single test with those runners. With this feature used together load_tests protocol, tests could be registered twice. Avoid this by not listing already defined test classes in create_testcases_for_templates (according to load_tests protocol, those should already be registered).
This commit is contained in:
parent
c8929cfee9
commit
8dab298b89
@ -1193,12 +1193,29 @@ def create_testcases_for_templates(name, *bases, module, **kwds):
|
|||||||
|
|
||||||
for template in list_templates():
|
for template in list_templates():
|
||||||
clsname = name + '_' + template
|
clsname = name + '_' + template
|
||||||
|
if hasattr(module, clsname):
|
||||||
|
continue
|
||||||
cls = type(clsname, bases, {'template': template, **kwds})
|
cls = type(clsname, bases, {'template': template, **kwds})
|
||||||
cls.__module__ = module.__name__
|
cls.__module__ = module.__name__
|
||||||
# XXX I wonder what other __dunder__ attrs did I miss
|
# XXX I wonder what other __dunder__ attrs did I miss
|
||||||
setattr(module, clsname, cls)
|
setattr(module, clsname, cls)
|
||||||
yield '.'.join((module.__name__, clsname))
|
yield '.'.join((module.__name__, clsname))
|
||||||
|
|
||||||
|
def maybe_create_testcases_on_import(create_testcases_gen):
|
||||||
|
'''If certain conditions are met, call *create_testcases_gen* to create
|
||||||
|
testcases for templates tests. The purpose is to use it on integration
|
||||||
|
tests module(s) import, so the test runner could discover tests without
|
||||||
|
using load tests protocol.
|
||||||
|
|
||||||
|
The conditions - any of:
|
||||||
|
- QUBES_TEST_TEMPLATES present in the environment (it's possible to
|
||||||
|
create test cases without opening qubes.xml)
|
||||||
|
- QUBES_TEST_LOAD_ALL present in the environment
|
||||||
|
'''
|
||||||
|
if 'QUBES_TEST_TEMPLATES' in os.environ or \
|
||||||
|
'QUBES_TEST_LOAD_ALL' in os.environ:
|
||||||
|
list(create_testcases_gen())
|
||||||
|
|
||||||
def extra_info(obj):
|
def extra_info(obj):
|
||||||
'''Return short info identifying object.
|
'''Return short info identifying object.
|
||||||
|
|
||||||
|
@ -641,9 +641,14 @@ class TC_10_BackupVMMixin(BackupTestsMixin):
|
|||||||
del vms
|
del vms
|
||||||
|
|
||||||
|
|
||||||
|
def create_testcases_for_templates():
|
||||||
|
return qubes.tests.create_testcases_for_templates('TC_10_BackupVM',
|
||||||
|
TC_10_BackupVMMixin, qubes.tests.SystemTestCase,
|
||||||
|
module=sys.modules[__name__])
|
||||||
|
|
||||||
def load_tests(loader, tests, pattern):
|
def load_tests(loader, tests, pattern):
|
||||||
tests.addTests(loader.loadTestsFromNames(
|
tests.addTests(loader.loadTestsFromNames(
|
||||||
qubes.tests.create_testcases_for_templates('TC_10_BackupVM',
|
create_testcases_for_templates()))
|
||||||
TC_10_BackupVMMixin, qubes.tests.SystemTestCase,
|
|
||||||
module=sys.modules[__name__])))
|
|
||||||
return tests
|
return tests
|
||||||
|
|
||||||
|
qubes.tests.maybe_create_testcases_on_import(create_testcases_for_templates)
|
||||||
|
@ -681,17 +681,20 @@ class TC_06_AppVMMixin(object):
|
|||||||
self.loop.run_until_complete(asyncio.sleep(1))
|
self.loop.run_until_complete(asyncio.sleep(1))
|
||||||
self.assertFalse(self.vm.is_running())
|
self.assertFalse(self.vm.is_running())
|
||||||
|
|
||||||
|
def create_testcases_for_templates():
|
||||||
|
yield from qubes.tests.create_testcases_for_templates('TC_05_StandaloneVM',
|
||||||
|
TC_05_StandaloneVMMixin, qubes.tests.SystemTestCase,
|
||||||
|
module=sys.modules[__name__])
|
||||||
|
yield from qubes.tests.create_testcases_for_templates('TC_06_AppVM',
|
||||||
|
TC_06_AppVMMixin, qubes.tests.SystemTestCase,
|
||||||
|
module=sys.modules[__name__])
|
||||||
|
|
||||||
def load_tests(loader, tests, pattern):
|
def load_tests(loader, tests, pattern):
|
||||||
tests.addTests(loader.loadTestsFromNames(
|
tests.addTests(loader.loadTestsFromNames(
|
||||||
qubes.tests.create_testcases_for_templates('TC_05_StandaloneVM',
|
create_testcases_for_templates()))
|
||||||
TC_05_StandaloneVMMixin, qubes.tests.SystemTestCase,
|
|
||||||
module=sys.modules[__name__])))
|
|
||||||
tests.addTests(loader.loadTestsFromNames(
|
|
||||||
qubes.tests.create_testcases_for_templates('TC_06_AppVM',
|
|
||||||
TC_06_AppVMMixin, qubes.tests.SystemTestCase,
|
|
||||||
module=sys.modules[__name__])))
|
|
||||||
|
|
||||||
return tests
|
return tests
|
||||||
|
|
||||||
|
qubes.tests.maybe_create_testcases_on_import(create_testcases_for_templates)
|
||||||
|
|
||||||
# vim: ts=4 sw=4 et
|
# vim: ts=4 sw=4 et
|
||||||
|
@ -294,9 +294,15 @@ class TC_20_DispVMMixin(object):
|
|||||||
test_txt_content = test_txt_content[3:]
|
test_txt_content = test_txt_content[3:]
|
||||||
self.assertEqual(test_txt_content, b"Test test 2\ntest1\n")
|
self.assertEqual(test_txt_content, b"Test test 2\ntest1\n")
|
||||||
|
|
||||||
|
|
||||||
|
def create_testcases_for_templates():
|
||||||
|
return qubes.tests.create_testcases_for_templates('TC_20_DispVM',
|
||||||
|
TC_20_DispVMMixin, qubes.tests.SystemTestCase,
|
||||||
|
module=sys.modules[__name__])
|
||||||
|
|
||||||
def load_tests(loader, tests, pattern):
|
def load_tests(loader, tests, pattern):
|
||||||
tests.addTests(loader.loadTestsFromNames(
|
tests.addTests(loader.loadTestsFromNames(
|
||||||
qubes.tests.create_testcases_for_templates('TC_20_DispVM',
|
create_testcases_for_templates()))
|
||||||
TC_20_DispVMMixin, qubes.tests.SystemTestCase,
|
|
||||||
module=sys.modules[__name__])))
|
|
||||||
return tests
|
return tests
|
||||||
|
|
||||||
|
qubes.tests.maybe_create_testcases_on_import(create_testcases_for_templates)
|
||||||
|
@ -380,9 +380,14 @@ Test package
|
|||||||
'UNSIGNED package {}-1.0 installed'.format(self.pkg_name))
|
'UNSIGNED package {}-1.0 installed'.format(self.pkg_name))
|
||||||
|
|
||||||
|
|
||||||
|
def create_testcases_for_templates():
|
||||||
|
return qubes.tests.create_testcases_for_templates('TC_00_Dom0Upgrade',
|
||||||
|
TC_00_Dom0UpgradeMixin, qubes.tests.SystemTestCase,
|
||||||
|
module=sys.modules[__name__])
|
||||||
|
|
||||||
def load_tests(loader, tests, pattern):
|
def load_tests(loader, tests, pattern):
|
||||||
tests.addTests(loader.loadTestsFromNames(
|
tests.addTests(loader.loadTestsFromNames(
|
||||||
qubes.tests.create_testcases_for_templates('TC_00_Dom0Upgrade',
|
create_testcases_for_templates()))
|
||||||
TC_00_Dom0UpgradeMixin, qubes.tests.SystemTestCase,
|
|
||||||
module=sys.modules[__name__])))
|
|
||||||
return tests
|
return tests
|
||||||
|
|
||||||
|
qubes.tests.maybe_create_testcases_on_import(create_testcases_for_templates)
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
# License along with this library; if not, see <https://www.gnu.org/licenses/>.
|
# License along with this library; if not, see <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
import os
|
||||||
from distutils import spawn
|
from distutils import spawn
|
||||||
import re
|
import re
|
||||||
import subprocess
|
import subprocess
|
||||||
@ -335,9 +336,14 @@ class TC_50_MimeHandlers:
|
|||||||
["Firefox", "Iceweasel", "Navigator"],
|
["Firefox", "Iceweasel", "Navigator"],
|
||||||
dispvm=True)
|
dispvm=True)
|
||||||
|
|
||||||
|
def create_testcases_for_templates():
|
||||||
|
return qubes.tests.create_testcases_for_templates('TC_50_MimeHandlers',
|
||||||
|
TC_50_MimeHandlers, qubes.tests.SystemTestCase,
|
||||||
|
module=sys.modules[__name__])
|
||||||
|
|
||||||
def load_tests(loader, tests, pattern):
|
def load_tests(loader, tests, pattern):
|
||||||
tests.addTests(loader.loadTestsFromNames(
|
tests.addTests(loader.loadTestsFromNames(
|
||||||
qubes.tests.create_testcases_for_templates('TC_50_MimeHandlers',
|
create_testcases_for_templates()))
|
||||||
TC_50_MimeHandlers, qubes.tests.SystemTestCase,
|
|
||||||
module=sys.modules[__name__])))
|
|
||||||
return tests
|
return tests
|
||||||
|
|
||||||
|
qubes.tests.maybe_create_testcases_on_import(create_testcases_for_templates)
|
||||||
|
@ -1319,17 +1319,20 @@ SHA256:
|
|||||||
self.assertIn(self.loop.run_until_complete(p.wait()), self.exit_code_ok,
|
self.assertIn(self.loop.run_until_complete(p.wait()), self.exit_code_ok,
|
||||||
'{}: {}\n{}'.format(self.update_cmd, stdout, stderr))
|
'{}: {}\n{}'.format(self.update_cmd, stdout, stderr))
|
||||||
|
|
||||||
|
def create_testcases_for_templates():
|
||||||
|
yield from qubes.tests.create_testcases_for_templates('VmNetworking',
|
||||||
|
VmNetworkingMixin, qubes.tests.SystemTestCase,
|
||||||
|
module=sys.modules[__name__])
|
||||||
|
yield from qubes.tests.create_testcases_for_templates('VmIPv6Networking',
|
||||||
|
VmIPv6NetworkingMixin, qubes.tests.SystemTestCase,
|
||||||
|
module=sys.modules[__name__])
|
||||||
|
yield from qubes.tests.create_testcases_for_templates('VmUpdates',
|
||||||
|
VmUpdatesMixin, qubes.tests.SystemTestCase,
|
||||||
|
module=sys.modules[__name__])
|
||||||
|
|
||||||
def load_tests(loader, tests, pattern):
|
def load_tests(loader, tests, pattern):
|
||||||
tests.addTests(loader.loadTestsFromNames(
|
tests.addTests(loader.loadTestsFromNames(
|
||||||
qubes.tests.create_testcases_for_templates('VmNetworking',
|
create_testcases_for_templates()))
|
||||||
VmNetworkingMixin, qubes.tests.SystemTestCase,
|
|
||||||
module=sys.modules[__name__])))
|
|
||||||
tests.addTests(loader.loadTestsFromNames(
|
|
||||||
qubes.tests.create_testcases_for_templates('VmIPv6Networking',
|
|
||||||
VmIPv6NetworkingMixin, qubes.tests.SystemTestCase,
|
|
||||||
module=sys.modules[__name__])))
|
|
||||||
tests.addTests(loader.loadTestsFromNames(
|
|
||||||
qubes.tests.create_testcases_for_templates('VmUpdates',
|
|
||||||
VmUpdatesMixin, qubes.tests.SystemTestCase,
|
|
||||||
module=sys.modules[__name__])))
|
|
||||||
return tests
|
return tests
|
||||||
|
|
||||||
|
qubes.tests.maybe_create_testcases_on_import(create_testcases_for_templates)
|
||||||
|
@ -137,10 +137,14 @@ class TC_40_PVGrub(object):
|
|||||||
self.test_template.run_for_stdio('uname -r'))
|
self.test_template.run_for_stdio('uname -r'))
|
||||||
self.assertEquals(actual_kver.strip(), kver)
|
self.assertEquals(actual_kver.strip(), kver)
|
||||||
|
|
||||||
|
def create_testcases_for_templates():
|
||||||
|
return qubes.tests.create_testcases_for_templates('TC_40_PVGrub',
|
||||||
|
TC_40_PVGrub, qubes.tests.SystemTestCase,
|
||||||
|
module=sys.modules[__name__])
|
||||||
|
|
||||||
def load_tests(loader, tests, pattern):
|
def load_tests(loader, tests, pattern):
|
||||||
tests.addTests(loader.loadTestsFromNames(
|
tests.addTests(loader.loadTestsFromNames(
|
||||||
qubes.tests.create_testcases_for_templates('TC_40_PVGrub',
|
create_testcases_for_templates()))
|
||||||
TC_40_PVGrub, qubes.tests.SystemTestCase,
|
|
||||||
module=sys.modules[__name__])))
|
|
||||||
return tests
|
return tests
|
||||||
|
|
||||||
|
qubes.tests.maybe_create_testcases_on_import(create_testcases_for_templates)
|
||||||
|
@ -391,9 +391,15 @@ class SaltVMTestMixin(SaltTestMixin):
|
|||||||
self.assertEqual(stderr, b'')
|
self.assertEqual(stderr, b'')
|
||||||
|
|
||||||
|
|
||||||
|
def create_testcases_for_templates():
|
||||||
|
return qubes.tests.create_testcases_for_templates('TC_10_VMSalt',
|
||||||
|
SaltVMTestMixin, qubes.tests.SystemTestCase,
|
||||||
|
module=sys.modules[__name__])
|
||||||
|
|
||||||
|
|
||||||
def load_tests(loader, tests, pattern):
|
def load_tests(loader, tests, pattern):
|
||||||
tests.addTests(loader.loadTestsFromNames(
|
tests.addTests(loader.loadTestsFromNames(
|
||||||
qubes.tests.create_testcases_for_templates('TC_10_VMSalt',
|
create_testcases_for_templates()))
|
||||||
SaltVMTestMixin, qubes.tests.SystemTestCase,
|
|
||||||
module=sys.modules[__name__])))
|
|
||||||
return tests
|
return tests
|
||||||
|
|
||||||
|
qubes.tests.maybe_create_testcases_on_import(create_testcases_for_templates)
|
||||||
|
@ -1194,10 +1194,14 @@ class TC_10_Generic(qubes.tests.SystemTestCase):
|
|||||||
'Flag file created (service was run) even though should be denied,'
|
'Flag file created (service was run) even though should be denied,'
|
||||||
' qrexec-client-vm output: {} {}'.format(stdout, stderr))
|
' qrexec-client-vm output: {} {}'.format(stdout, stderr))
|
||||||
|
|
||||||
|
def create_testcases_for_templates():
|
||||||
|
return qubes.tests.create_testcases_for_templates('TC_00_AppVM',
|
||||||
|
TC_00_AppVMMixin, qubes.tests.SystemTestCase,
|
||||||
|
module=sys.modules[__name__])
|
||||||
|
|
||||||
def load_tests(loader, tests, pattern):
|
def load_tests(loader, tests, pattern):
|
||||||
tests.addTests(loader.loadTestsFromNames(
|
tests.addTests(loader.loadTestsFromNames(
|
||||||
qubes.tests.create_testcases_for_templates('TC_00_AppVM',
|
create_testcases_for_templates()))
|
||||||
TC_00_AppVMMixin, qubes.tests.SystemTestCase,
|
|
||||||
module=sys.modules[__name__])))
|
|
||||||
return tests
|
return tests
|
||||||
|
|
||||||
|
qubes.tests.maybe_create_testcases_on_import(create_testcases_for_templates)
|
||||||
|
Loading…
Reference in New Issue
Block a user