summaryrefslogtreecommitdiffstats
path: root/util/testrunner/tests/tst_testrunner.py
diff options
context:
space:
mode:
Diffstat (limited to 'util/testrunner/tests/tst_testrunner.py')
-rwxr-xr-xutil/testrunner/tests/tst_testrunner.py551
1 files changed, 0 insertions, 551 deletions
diff --git a/util/testrunner/tests/tst_testrunner.py b/util/testrunner/tests/tst_testrunner.py
deleted file mode 100755
index 79aa0a824fc..00000000000
--- a/util/testrunner/tests/tst_testrunner.py
+++ /dev/null
@@ -1,551 +0,0 @@
-#!/usr/bin/env python3
-# Copyright (C) 2021 The Qt Company Ltd.
-# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
-
-
-import sys
-import os
-import re
-import glob
-import subprocess
-
-from subprocess import STDOUT, PIPE
-from tempfile import TemporaryDirectory, mkstemp
-
-MY_NAME = os.path.basename(__file__)
-my_dir = os.path.dirname(__file__)
-testrunner = os.path.join(my_dir, "..", "qt-testrunner.py")
-mock_test = os.path.join(my_dir, "qt_mock_test.py")
-xml_log_template = os.path.join(my_dir, "qt_mock_test-log.xml")
-
-with open(xml_log_template) as f:
- XML_TEMPLATE = f.read()
-
-
-import unittest
-
-def setUpModule():
- global TEMPDIR
- TEMPDIR = TemporaryDirectory(prefix="tst_testrunner-")
-
- global EMPTY_FILE
- EMPTY_FILE = os.path.join(TEMPDIR.name, "EMPTY")
- with open(EMPTY_FILE, "w") as f:
- pass
-
- filename = os.path.join(TEMPDIR.name, "file_1")
- print("setUpModule(): setting up temporary directory and env var"
- " QT_MOCK_TEST_STATE_FILE=" + filename + " and"
- " QT_MOCK_TEST_XML_TEMPLATE_FILE=" + xml_log_template)
-
- os.environ["QT_MOCK_TEST_STATE_FILE"] = filename
- os.environ["QT_MOCK_TEST_XML_TEMPLATE_FILE"] = xml_log_template
-
-def tearDownModule():
- print("\ntearDownModule(): Cleaning up temporary directory:",
- TEMPDIR.name)
- del os.environ["QT_MOCK_TEST_STATE_FILE"]
- TEMPDIR.cleanup()
-
-
-# Helper to run a command and always capture output
-def run(*args, **kwargs):
- if DEBUG:
- print("Running: ", args, flush=True)
- proc = subprocess.run(*args, stdout=PIPE, stderr=STDOUT, **kwargs)
- if DEBUG and proc.stdout:
- print(proc.stdout.decode(), flush=True)
- return proc
-
-# Helper to run qt-testrunner.py with proper testing arguments.
-def run_testrunner(xml_filename=None, testrunner_args=None,
- wrapper_script=None, wrapper_args=None,
- qttest_args=None, env=None):
-
- args = [ testrunner ]
- if xml_filename:
- args += [ "--parse-xml-testlog", xml_filename ]
- if testrunner_args:
- args += testrunner_args
-
- if wrapper_script:
- args += [ wrapper_script ]
- if wrapper_args:
- args += wrapper_args
-
- args += [ mock_test ]
- if qttest_args:
- args += qttest_args
-
- return run(args, env=env)
-
-# Write the XML_TEMPLATE to filename, replacing the templated results.
-def write_xml_log(filename, failure=None, inject_message=None):
- data = XML_TEMPLATE
- if failure is None:
- failure = []
- elif isinstance(failure, str):
- failure = [ failure ]
- # Replace what was asked to fail with "fail"
- for x in failure:
- data = data.replace("{{" + x + "_result}}", "fail")
- # Replace the rest with "pass"
- data = re.sub(r"{{[^}]+}}", "pass", data)
- # Inject possible <Message> tags inside the first <TestFunction>
- if inject_message:
- i = data.index("</TestFunction>")
- data = data[:i] + inject_message + data[i:]
- with open(filename, "w") as f:
- f.write(data)
-
-
-# Test that qt_mock_test.py behaves well. This is necessary to properly
-# test qt-testrunner.
-class Test_qt_mock_test(unittest.TestCase):
- def setUp(self):
- state_file = os.environ["QT_MOCK_TEST_STATE_FILE"]
- if os.path.exists(state_file):
- os.remove(state_file)
- def assertProcessCrashed(self, proc):
- if DEBUG:
- print("process returncode is:", proc.returncode)
- self.assertTrue(proc.returncode < 0 or
- proc.returncode >= 128)
-
- def test_always_pass(self):
- proc = run([mock_test, "always_pass"])
- self.assertEqual(proc.returncode, 0)
- def test_always_fail(self):
- proc = run([mock_test, "always_fail"])
- self.assertEqual(proc.returncode, 1)
- def test_fail_then_pass_2(self):
- proc = run([mock_test, "fail_then_pass:2"])
- self.assertEqual(proc.returncode, 1)
- proc = run([mock_test, "fail_then_pass:2"])
- self.assertEqual(proc.returncode, 1)
- proc = run([mock_test, "fail_then_pass:2"])
- self.assertEqual(proc.returncode, 0)
- def test_fail_then_pass_1(self):
- proc = run([mock_test, "fail_then_pass:1"])
- self.assertEqual(proc.returncode, 1)
- proc = run([mock_test, "fail_then_pass:1"])
- self.assertEqual(proc.returncode, 0)
- def test_fail_then_pass_many_tests(self):
- proc = run([mock_test, "fail_then_pass:1"])
- self.assertEqual(proc.returncode, 1)
- proc = run([mock_test, "fail_then_pass:2"])
- self.assertEqual(proc.returncode, 1)
- proc = run([mock_test, "fail_then_pass:1"])
- self.assertEqual(proc.returncode, 0)
- proc = run([mock_test, "fail_then_pass:2"])
- self.assertEqual(proc.returncode, 1)
- proc = run([mock_test, "fail_then_pass:2"])
- self.assertEqual(proc.returncode, 0)
- def test_fail_then_crash(self):
- proc = run([mock_test, "fail_then_crash"])
- self.assertEqual(proc.returncode, 1)
- proc = run([mock_test, "fail_then_crash"])
- self.assertProcessCrashed(proc)
- def test_xml_file_is_written(self):
- filename = os.path.join(TEMPDIR.name, "testlog.xml")
- proc = run([mock_test, "-o", filename+",xml"])
- self.assertEqual(proc.returncode, 0)
- self.assertTrue(os.path.exists(filename))
- self.assertGreater(os.path.getsize(filename), 0)
- os.remove(filename)
- # Test it will write an empty XML file if template is empty
- def test_empty_xml_file_is_written(self):
- my_env = {
- "QT_MOCK_TEST_STATE_FILE": os.environ["QT_MOCK_TEST_STATE_FILE"],
- "QT_MOCK_TEST_XML_TEMPLATE_FILE": EMPTY_FILE
- }
- filename = os.path.join(TEMPDIR.name, "testlog.xml")
- proc = run([mock_test, "-o", filename+",xml"],
- env=my_env)
- self.assertEqual(proc.returncode, 0)
- self.assertTrue(os.path.exists(filename))
- self.assertEqual(os.path.getsize(filename), 0)
- os.remove(filename)
- def test_crash_cleanly(self):
- proc = run(mock_test,
- env= os.environ | {"QT_MOCK_TEST_CRASH_CLEANLY":"1"} )
- if DEBUG:
- print("returncode:", proc.returncode)
- self.assertProcessCrashed(proc)
-
-
-# Test regular invocations of qt-testrunner.
-class Test_testrunner(unittest.TestCase):
- def setUp(self):
- state_file = os.environ["QT_MOCK_TEST_STATE_FILE"]
- if os.path.exists(state_file):
- os.remove(state_file)
- # The mock_test honors only the XML output arguments, the rest are ignored.
- old_logfiles = glob.glob(os.path.basename(mock_test) + "*.xml",
- root_dir=TEMPDIR.name)
- for fname in old_logfiles:
- os.remove(os.path.join(TEMPDIR.name, fname))
- self.env = dict()
- self.env["QT_MOCK_TEST_XML_TEMPLATE_FILE"] = os.environ["QT_MOCK_TEST_XML_TEMPLATE_FILE"]
- self.env["QT_MOCK_TEST_STATE_FILE"] = state_file
- self.testrunner_args = [ "--log-dir", TEMPDIR.name ]
- def prepare_env(self, run_list=None):
- if run_list is not None:
- self.env['QT_MOCK_TEST_RUN_LIST'] = ",".join(run_list)
- def run2(self):
- return run_testrunner(testrunner_args=self.testrunner_args, env=self.env)
-
- def test_simple_invocation(self):
- # All tests pass.
- proc = self.run2()
- self.assertEqual(proc.returncode, 0)
- def test_always_pass(self):
- self.prepare_env(run_list=["always_pass"])
- proc = self.run2()
- self.assertEqual(proc.returncode, 0)
- def test_output_files_are_generated(self):
- proc = self.run2()
- xml_output_files = glob.glob(os.path.basename(mock_test) + "-*[0-9].xml",
- root_dir=TEMPDIR.name)
- if DEBUG:
- print("Output files found: ",
- xml_output_files)
- self.assertEqual(len(xml_output_files), 1)
- def test_always_fail(self):
- self.prepare_env(run_list=["always_fail"])
- proc = self.run2()
- # TODO verify that re-runs==max_repeats
- self.assertEqual(proc.returncode, 2)
- def test_flaky_pass_1(self):
- self.prepare_env(run_list=["always_pass,fail_then_pass:1"])
- proc = self.run2()
- self.assertEqual(proc.returncode, 0)
- def test_flaky_pass_5(self):
- self.prepare_env(run_list=["always_pass,fail_then_pass:1,fail_then_pass:5"])
- proc = self.run2()
- self.assertEqual(proc.returncode, 0)
- def test_flaky_fail(self):
- self.prepare_env(run_list=["always_pass,fail_then_pass:6"])
- proc = self.run2()
- self.assertEqual(proc.returncode, 2)
- def test_flaky_pass_fail(self):
- self.prepare_env(run_list=["always_pass,fail_then_pass:1,fail_then_pass:6"])
- proc = self.run2()
- # TODO verify that one func was re-run and passed but the other failed.
- self.assertEqual(proc.returncode, 2)
- def test_initTestCase_fail_crash(self):
- self.prepare_env(run_list=["initTestCase,always_pass"])
- proc = self.run2()
- self.assertEqual(proc.returncode, 3)
- def test_fail_then_crash(self):
- self.prepare_env(run_list=["fail_then_crash"])
- proc = self.run2()
- self.assertEqual(proc.returncode, 3)
-
- # If no XML file is found by qt-testrunner, it is usually considered a
- # CRASH and the whole test is re-run. Even when the return code is zero.
- # It is a PASS only if the test is not capable of XML output (see no_extra_args, TODO test it).
- def test_no_xml_log_written_pass_crash(self):
- del self.env["QT_MOCK_TEST_XML_TEMPLATE_FILE"]
- self.prepare_env(run_list=["always_pass"])
- proc = self.run2()
- self.assertEqual(proc.returncode, 3)
- # On the 2nd iteration of the full test, both of the tests pass.
- # Still it's a CRASH because no XML file was found.
- def test_no_xml_log_written_fail_then_pass_crash(self):
- del self.env["QT_MOCK_TEST_XML_TEMPLATE_FILE"]
- self.prepare_env(run_list=["always_pass,fail_then_pass:1"])
- proc = self.run2()
- # TODO verify that the whole test has run twice.
- self.assertEqual(proc.returncode, 3)
- # Even after 2 iterations of the full test we still get failures but no XML file,
- # and this is considered a CRASH.
- def test_no_xml_log_written_crash(self):
- del self.env["QT_MOCK_TEST_XML_TEMPLATE_FILE"]
- self.prepare_env(run_list=["fail_then_pass:2"])
- proc = self.run2()
- self.assertEqual(proc.returncode, 3)
-
- def test_empty_xml_crash_1(self):
- self.env["QT_MOCK_TEST_XML_TEMPLATE_FILE"] = EMPTY_FILE
- self.prepare_env(run_list=["always_pass"])
- proc = self.run2()
- self.assertEqual(proc.returncode, 3)
- def test_empty_xml_crash_2(self):
- self.env["QT_MOCK_TEST_XML_TEMPLATE_FILE"] = EMPTY_FILE
- self.prepare_env(run_list=["always_fail"])
- proc = self.run2()
- self.assertEqual(proc.returncode, 3)
-
- # test qFatal should be a crash in all cases.
- def test_qfatal_crash_1(self):
- fatal_xml_message = """
- <Message type="qfatal" file="" line="0">
- <DataTag><![CDATA[modal]]></DataTag>
- <Description><![CDATA[Failed to initialize graphics backend for OpenGL.]]></Description>
- </Message>
- """
- logfile = os.path.join(TEMPDIR.name, os.path.basename(mock_test) + ".xml")
- write_xml_log(logfile, failure=None, inject_message=fatal_xml_message)
- del self.env["QT_MOCK_TEST_XML_TEMPLATE_FILE"]
- self.env["QT_TESTRUNNER_DEBUG_NO_UNIQUE_OUTPUT_FILENAME"] = "1"
- self.prepare_env(run_list=["always_pass"])
- proc = self.run2()
- self.assertEqual(proc.returncode, 3)
- def test_qfatal_crash_2(self):
- fatal_xml_message = """
- <Message type="qfatal" file="" line="0">
- <DataTag><![CDATA[modal]]></DataTag>
- <Description><![CDATA[Failed to initialize graphics backend for OpenGL.]]></Description>
- </Message>
- """
- logfile = os.path.join(TEMPDIR.name, os.path.basename(mock_test) + ".xml")
- write_xml_log(logfile, failure="always_fail", inject_message=fatal_xml_message)
- del self.env["QT_MOCK_TEST_XML_TEMPLATE_FILE"]
- self.env["QT_TESTRUNNER_DEBUG_NO_UNIQUE_OUTPUT_FILENAME"] = "1"
- self.prepare_env(run_list=["always_pass,always_fail"])
- proc = self.run2()
- self.assertEqual(proc.returncode, 3)
-
- def test_qwarn_is_ignored_1(self):
- qwarn_xml_message = """
- <Message type="qwarn" file="" line="0">
- <DataTag><![CDATA[modal]]></DataTag>
- <Description><![CDATA[Failed to create RHI (backend 2)]]></Description>
- </Message>
- """
- logfile = os.path.join(TEMPDIR.name, os.path.basename(mock_test) + ".xml")
- write_xml_log(logfile, failure=None, inject_message=qwarn_xml_message)
- del self.env["QT_MOCK_TEST_XML_TEMPLATE_FILE"]
- self.env["QT_TESTRUNNER_DEBUG_NO_UNIQUE_OUTPUT_FILENAME"] = "1"
- self.prepare_env(run_list=["always_pass"])
- proc = self.run2()
- self.assertEqual(proc.returncode, 0)
- def test_qwarn_is_ignored_2(self):
- fatal_xml_message = """
- <Message type="qfatal" file="" line="0">
- <DataTag><![CDATA[modal]]></DataTag>
- <Description><![CDATA[Failed to initialize graphics backend for OpenGL.]]></Description>
- </Message>
- <Message type="qwarn" file="" line="0">
- <DataTag><![CDATA[modal]]></DataTag>
- <Description><![CDATA[Failed to create RHI (backend 2)]]></Description>
- </Message>
- """
- logfile = os.path.join(TEMPDIR.name, os.path.basename(mock_test) + ".xml")
- write_xml_log(logfile, failure=None, inject_message=fatal_xml_message)
- del self.env["QT_MOCK_TEST_XML_TEMPLATE_FILE"]
- self.env["QT_TESTRUNNER_DEBUG_NO_UNIQUE_OUTPUT_FILENAME"] = "1"
- self.prepare_env(run_list=["always_pass"])
- proc = self.run2()
- self.assertEqual(proc.returncode, 3)
-
- # If a test returns success but XML contains failures, it's a CRASH.
- def test_wrong_xml_log_written_1_crash(self):
- logfile = os.path.join(TEMPDIR.name, os.path.basename(mock_test) + ".xml")
- write_xml_log(logfile, failure="always_fail")
- del self.env["QT_MOCK_TEST_XML_TEMPLATE_FILE"]
- self.env["QT_TESTRUNNER_DEBUG_NO_UNIQUE_OUTPUT_FILENAME"] = "1"
- self.prepare_env(run_list=["always_pass"])
- proc = self.run2()
- self.assertEqual(proc.returncode, 3)
- # If a test returns failure but XML contains only pass, it's a CRASH.
- def test_wrong_xml_log_written_2_crash(self):
- logfile = os.path.join(TEMPDIR.name, os.path.basename(mock_test) + ".xml")
- write_xml_log(logfile)
- del self.env["QT_MOCK_TEST_XML_TEMPLATE_FILE"]
- self.env["QT_TESTRUNNER_DEBUG_NO_UNIQUE_OUTPUT_FILENAME"] = "1"
- self.prepare_env(run_list=["always_fail"])
- proc = self.run2()
- self.assertEqual(proc.returncode, 3)
-
- def create_wrapper(self, filename, content=None):
- if not content:
- content='exec "$@"'
- filename = os.path.join(TEMPDIR.name, filename)
- with open(filename, "w") as f:
- f.write(f'#!/bin/sh\n{content}\n')
- self.wrapper_script = f.name
- os.chmod(self.wrapper_script, 0o700)
-
- # Test that it re-runs the full executable in case of crash, even if the
- # XML file is valid and shows one specific test failing.
- def test_crash_reruns_full_QTQAINFRA_5226(self):
- self.env["QT_MOCK_TEST_RUN_LIST"] = "always_fail"
- # Tell qt_mock_test to crash after writing a proper XML file.
- self.env["QT_MOCK_TEST_CRASH_CLEANLY"] = "1"
- proc = self.run2()
- # Verify qt-testrunner exited with 3 which means CRASH.
- self.assertEqual(proc.returncode, 3)
- # Verify that a full executable re-run happened that re-runs 2 times,
- # instead of individual functions that re-run 5 times.
- xml_output_files = glob.glob(os.path.basename(mock_test) + "-*[0-9].xml",
- root_dir=TEMPDIR.name)
- if DEBUG:
- print("XML output files found: ", xml_output_files)
- self.assertEqual(len(xml_output_files), 2)
-
- # Test that qt-testrunner detects the correct executable name even if we
- # use a special wrapper script, and that it uses that in the XML log filename.
- @unittest.skipUnless(os.name == "posix", "Wrapper script needs POSIX shell")
- def test_wrapper(self):
- self.create_wrapper("coin_vxworks_qemu_runner.sh")
- proc = run_testrunner(wrapper_script=self.wrapper_script,
- testrunner_args=["--log-dir",TEMPDIR.name],
- env=self.env)
- self.assertEqual(proc.returncode, 0)
- xml_output_files = glob.glob(os.path.basename(mock_test) + "-*[0-9].xml",
- root_dir=TEMPDIR.name)
- if DEBUG:
- print("XML output files found: ", xml_output_files)
- self.assertEqual(len(xml_output_files), 1)
-
- # The "androidtestrunner" wrapper is special. It expects the QTest arguments after "--".
- # So our mock androidtestrunner wrapper ignores everything before "--"
- # and executes our hardcoded mock_test with the arguments that follow.
- def create_mock_anroidtestrunner_wrapper(self):
- self.create_wrapper("androidtestrunner", content=
- 'while [ "$1" != "--" ]; do shift; done; shift; exec {} "$@"'.format(mock_test))
-
- @unittest.skipUnless(os.name == "posix", "Wrapper script needs POSIX shell")
- def test_androidtestrunner_with_aab(self):
- self.create_mock_anroidtestrunner_wrapper()
- # Copied from our CI logs. The only relevant option is --aab.
- androidtestrunner_args= [
- '--path', '/home/qt/work/qt/qtdeclarative_standalone_tests/tests/auto/quickcontrols/qquickpopup/android-build-tst_qquickpopup',
- '--adb', '/opt/android/sdk/platform-tools/adb', '--skip-install-root',
- '--ndk-stack', '/opt/android/android-ndk-r27c/ndk-stack',
- '--manifest', '/home/qt/work/qt/qtdeclarative_standalone_tests/tests/auto/quickcontrols/qquickpopup/android-build-tst_qquickpopup/app/AndroidManifest.xml',
- '--make', '"/opt/cmake-3.30.5/bin/cmake" --build /home/qt/work/qt/qtdeclarative_standalone_tests --target tst_qquickpopup_make_aab',
- '--aab', '/home/qt/work/qt/qtdeclarative_standalone_tests/tests/auto/quickcontrols/qquickpopup/android-build-tst_qquickpopup/tst_qquickpopup.aab',
- '--bundletool', '/opt/bundletool/bundletool', '--timeout', '1425'
- ]
- # In COIN CI, TESTRUNNER="qt-testrunner.py --". That's why we append "--".
- proc = run_testrunner(testrunner_args=["--log-dir", TEMPDIR.name, "--"],
- wrapper_script=self.wrapper_script,
- wrapper_args=androidtestrunner_args,
- env=self.env)
- self.assertEqual(proc.returncode, 0)
- xml_output_files = glob.glob("tst_qquickpopup-*[0-9].xml",
- root_dir=TEMPDIR.name)
- if DEBUG:
- print("XML output files found: ", xml_output_files)
- self.assertEqual(len(xml_output_files), 1)
- # similar to above but with "--apk"
- @unittest.skipUnless(os.name == "posix", "Wrapper script needs POSIX shell")
- def test_androidtestrunner_with_apk(self):
- self.create_mock_anroidtestrunner_wrapper()
- androidtestrunner_args= ['--blah', '--apk', '/whatever/waza.apk', 'blue']
- proc = run_testrunner(testrunner_args=["--log-dir", TEMPDIR.name, "--"],
- wrapper_script=self.wrapper_script,
- wrapper_args=androidtestrunner_args,
- env=self.env)
- self.assertEqual(proc.returncode, 0)
- xml_output_files = glob.glob("waza-*[0-9].xml",
- root_dir=TEMPDIR.name)
- if DEBUG:
- print("XML output files found: ", xml_output_files)
- self.assertEqual(len(xml_output_files), 1)
- # similar to above but with neither "--apk" nor "--aab". qt-testrunner throws error.
- @unittest.skipUnless(os.name == "posix", "Wrapper script needs POSIX shell")
- def test_androidtestrunner_fail_to_detect_filename(self):
- self.create_mock_anroidtestrunner_wrapper()
- androidtestrunner_args= ['--blah', '--argh', '/whatever/waza.apk', 'waza.aab']
- proc = run_testrunner(testrunner_args=["--log-dir", TEMPDIR.name, "--"],
- wrapper_script=self.wrapper_script,
- wrapper_args=androidtestrunner_args,
- env=self.env)
- self.assertEqual(proc.returncode, 1)
- xml_output_files = glob.glob("waza-*[0-9].xml",
- root_dir=TEMPDIR.name)
- if DEBUG:
- print("XML output files found: ", xml_output_files)
- self.assertEqual(len(xml_output_files), 0)
-
-
-# Test qt-testrunner script with an existing XML log file:
-# qt-testrunner.py qt_mock_test.py --parse-xml-testlog file.xml
-# qt-testrunner should repeat the testcases that are logged as
-# failures and fail or pass depending on how the testcases behave.
-# Different XML files are generated for the following test cases.
-# + No failure logged. qt-testrunner should exit(0)
-# + The "always_pass" test has failed. qt-testrunner should exit(0).
-# + The "always_fail" test has failed. qt-testrunner should exit(2).
-# + The "always_crash" test has failed. qt-testrunner should exit(3)
-# since the re-run will crash.
-# + The "fail_then_pass:2" test failed. qt-testrunner should exit(0).
-# + The "fail_then_pass:5" test failed. qt-testrunner should exit(2).
-# + The "initTestCase" failed which is listed as NO_RERUN thus
-# qt-testrunner should exit(3).
-class Test_testrunner_with_xml_logfile(unittest.TestCase):
- # Runs before every single test function, creating a unique temp file.
- def setUp(self):
- (_handle, self.xml_file) = mkstemp(
- suffix=".xml", prefix="qt_mock_test-log-",
- dir=TEMPDIR.name)
- if os.path.exists(os.environ["QT_MOCK_TEST_STATE_FILE"]):
- os.remove(os.environ["QT_MOCK_TEST_STATE_FILE"])
- def tearDown(self):
- os.remove(self.xml_file)
- del self.xml_file
-
- def test_no_failure(self):
- write_xml_log(self.xml_file, failure=None)
- proc = run_testrunner(self.xml_file)
- self.assertEqual(proc.returncode, 0)
- def test_always_pass_failed(self):
- write_xml_log(self.xml_file, failure="always_pass")
- proc = run_testrunner(self.xml_file)
- self.assertEqual(proc.returncode, 0)
- def test_always_pass_failed_max_repeats_0(self):
- write_xml_log(self.xml_file, failure="always_pass")
- proc = run_testrunner(self.xml_file,
- testrunner_args=["--max-repeats", "0"])
- self.assertEqual(proc.returncode, 2)
- def test_always_fail_failed(self):
- write_xml_log(self.xml_file, failure="always_fail")
- proc = run_testrunner(self.xml_file)
- self.assertEqual(proc.returncode, 2)
- # Assert that one of the re-runs was in verbose mode
- matches = re.findall("VERBOSE RUN",
- proc.stdout.decode())
- self.assertEqual(len(matches), 1)
- # Assert that the environment was altered too
- self.assertIn("QT_LOGGING_RULES", proc.stdout.decode())
- def test_always_crash_crashed(self):
- write_xml_log(self.xml_file, failure="always_crash")
- proc = run_testrunner(self.xml_file)
- self.assertEqual(proc.returncode, 3)
- def test_fail_then_pass_2_failed(self):
- write_xml_log(self.xml_file, failure="fail_then_pass:2")
- proc = run_testrunner(self.xml_file)
- self.assertEqual(proc.returncode, 0)
- def test_fail_then_pass_5_failed(self):
- write_xml_log(self.xml_file, failure="fail_then_pass:5")
- proc = run_testrunner(self.xml_file)
- self.assertEqual(proc.returncode, 2)
- def test_with_two_failures(self):
- write_xml_log(self.xml_file,
- failure=["always_pass", "fail_then_pass:2"])
- proc = run_testrunner(self.xml_file)
- self.assertEqual(proc.returncode, 0)
- # Check that test output is properly interleaved with qt-testrunner's logging.
- matches = re.findall(r"(PASS|FAIL!).*\n.*Test process exited with code",
- proc.stdout.decode())
- self.assertEqual(len(matches), 4)
- def test_initTestCase_fail_crash(self):
- write_xml_log(self.xml_file, failure="initTestCase")
- proc = run_testrunner(self.xml_file)
- self.assertEqual(proc.returncode, 3)
-
-
-if __name__ == "__main__":
-
- DEBUG = False
- if "--debug" in sys.argv:
- sys.argv.remove("--debug")
- DEBUG = True
-
- # We set failfast=True as we do not want the test suite to continue if the
- # tests of qt_mock_test failed. The next ones depend on it.
- unittest.main(failfast=True)