mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-20 13:06:23 +00:00
validate:launcher: Allow more flexible handling of flaky tests
And retry twice flaky tests Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1113>
This commit is contained in:
parent
ff8d8bbc97
commit
23dbfdf70d
3 changed files with 21 additions and 18 deletions
|
@ -127,7 +127,7 @@ class Test(Loggable):
|
||||||
self.is_parallel = is_parallel
|
self.is_parallel = is_parallel
|
||||||
self.generator = None
|
self.generator = None
|
||||||
self.workdir = workdir
|
self.workdir = workdir
|
||||||
self.allow_flakiness = False
|
self.max_retries = 0
|
||||||
self.html_log = None
|
self.html_log = None
|
||||||
self.rr_logdir = None
|
self.rr_logdir = None
|
||||||
|
|
||||||
|
@ -708,7 +708,7 @@ class Test(Loggable):
|
||||||
extra_logs.append(shutil.copy(logfile, path))
|
extra_logs.append(shutil.copy(logfile, path))
|
||||||
self.extra_logfiles = extra_logs
|
self.extra_logfiles = extra_logs
|
||||||
|
|
||||||
def test_end(self, retry_on_failure=False):
|
def test_end(self):
|
||||||
self.kill_subprocess()
|
self.kill_subprocess()
|
||||||
self.thread.join()
|
self.thread.join()
|
||||||
self.time_taken = time.time() - self._starting_time
|
self.time_taken = time.time() - self._starting_time
|
||||||
|
@ -1465,9 +1465,10 @@ class TestsManager(Loggable):
|
||||||
tests_regexes.append(regex)
|
tests_regexes.append(regex)
|
||||||
for test in self.tests:
|
for test in self.tests:
|
||||||
if regex.findall(test.classname):
|
if regex.findall(test.classname):
|
||||||
if failure_def.get('allow_flakiness'):
|
max_retries = failure_def.get('allow_flakiness', failure_def.get('max_retries'))
|
||||||
test.allow_flakiness = True
|
if max_retries:
|
||||||
self.debug("%s allow flakiness" % (test.classname))
|
test.max_retries = int(max_retries)
|
||||||
|
self.debug(f"{test.classname} allow {test.max_retries}")
|
||||||
else:
|
else:
|
||||||
for issue in failure_def['issues']:
|
for issue in failure_def['issues']:
|
||||||
issue['bug'] = bugid
|
issue['bug'] = bugid
|
||||||
|
@ -1486,9 +1487,10 @@ class TestsManager(Loggable):
|
||||||
failure_def['bug'] = bugid
|
failure_def['bug'] = bugid
|
||||||
for regex in failure_def['tests']:
|
for regex in failure_def['tests']:
|
||||||
if regex.findall(test.classname):
|
if regex.findall(test.classname):
|
||||||
if failure_def.get('allow_flakiness'):
|
max_retries = failure_def.get('allow_flakiness', failure_def.get('max_retries'))
|
||||||
test.allow_flakiness = True
|
if max_retries:
|
||||||
self.debug("%s allow flakiness" % (test.classname))
|
test.max_retries = int(max_retries)
|
||||||
|
self.debug(f"{test.classname} allow {test.max_retries}")
|
||||||
else:
|
else:
|
||||||
for issue in failure_def['issues']:
|
for issue in failure_def['issues']:
|
||||||
issue['bug'] = bugid
|
issue['bug'] = bugid
|
||||||
|
@ -2067,7 +2069,7 @@ class _TestsLauncher(Loggable):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def print_result(self, current_test_num, test, total_num_tests, retry_on_failure=False):
|
def print_result(self, current_test_num, test, total_num_tests, retry_on_failure=False):
|
||||||
if test.result != Result.PASSED and not retry_on_failure:
|
if test.result != Result.PASSED and (not retry_on_failure or test.max_retries):
|
||||||
printc(str(test), color=utils.get_color_for_result(test.result))
|
printc(str(test), color=utils.get_color_for_result(test.result))
|
||||||
|
|
||||||
length = 80
|
length = 80
|
||||||
|
@ -2136,7 +2138,7 @@ class _TestsLauncher(Loggable):
|
||||||
test = self.tests_wait()
|
test = self.tests_wait()
|
||||||
jobs_running -= 1
|
jobs_running -= 1
|
||||||
current_test_num += 1
|
current_test_num += 1
|
||||||
res = test.test_end(retry_on_failure=retry_on_failures)
|
res = test.test_end()
|
||||||
to_report = True
|
to_report = True
|
||||||
if res not in [Result.PASSED, Result.SKIPPED, Result.KNOWN_ERROR]:
|
if res not in [Result.PASSED, Result.SKIPPED, Result.KNOWN_ERROR]:
|
||||||
if self.options.forever or self.options.fatal_error:
|
if self.options.forever or self.options.fatal_error:
|
||||||
|
@ -2145,27 +2147,28 @@ class _TestsLauncher(Loggable):
|
||||||
self.reporter.after_test(test)
|
self.reporter.after_test(test)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if retry_on_failures:
|
if retry_on_failures or test.max_retries:
|
||||||
if not self.options.redirect_logs and test.allow_flakiness:
|
if not self.options.redirect_logs and test.max_retries:
|
||||||
test.copy_logfiles()
|
test.copy_logfiles()
|
||||||
to_retry.append(test)
|
to_retry.append(test)
|
||||||
|
|
||||||
# Not adding to final report if flakiness is tolerated
|
# Not adding to final report if flakiness is tolerated
|
||||||
to_report = not test.allow_flakiness
|
if test.max_retries:
|
||||||
|
test.max_retries -= 1
|
||||||
|
to_report = False
|
||||||
self.print_result(current_test_num - 1, test,
|
self.print_result(current_test_num - 1, test,
|
||||||
retry_on_failure=retry_on_failures,
|
retry_on_failure=retry_on_failures,
|
||||||
total_num_tests=total_num_tests)
|
total_num_tests=total_num_tests)
|
||||||
if to_report:
|
if to_report:
|
||||||
self.reporter.after_test(test)
|
self.reporter.after_test(test)
|
||||||
if retry_on_failures:
|
|
||||||
test.clean()
|
|
||||||
if self.start_new_job(tests_left):
|
if self.start_new_job(tests_left):
|
||||||
jobs_running += 1
|
jobs_running += 1
|
||||||
|
|
||||||
if to_retry:
|
if to_retry:
|
||||||
printc("--> Rerunning the following tests to see if they are flaky:", Colors.WARNING)
|
printc("--> Rerunning the following tests to see if they are flaky:", Colors.WARNING)
|
||||||
for test in to_retry:
|
for test in to_retry:
|
||||||
printc(' * %s' % test.classname)
|
test.clean()
|
||||||
|
printc(f' * {test.classname}')
|
||||||
printc('')
|
printc('')
|
||||||
self.current_progress = -1
|
self.current_progress = -1
|
||||||
res = self._run_tests(
|
res = self._run_tests(
|
||||||
|
|
|
@ -33,6 +33,6 @@ KNOWN_ISSUES = {
|
||||||
r"^ges\.((?!render).)*$",
|
r"^ges\.((?!render).)*$",
|
||||||
r"^ges\.playback\.nested.*$",
|
r"^ges\.playback\.nested.*$",
|
||||||
],
|
],
|
||||||
"allow_flakiness": True,
|
"max_retries": 2,
|
||||||
},
|
},
|
||||||
}
|
}
|
|
@ -9,7 +9,7 @@ KNOWN_ISSUES = {
|
||||||
r"^validate\.((?!launch_pipeline).)*$",
|
r"^validate\.((?!launch_pipeline).)*$",
|
||||||
r"^validate\.((?!rtsp*).)*$",
|
r"^validate\.((?!rtsp*).)*$",
|
||||||
],
|
],
|
||||||
"allow_flakiness": True,
|
"max_retries": 2,
|
||||||
},
|
},
|
||||||
"https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/486": {
|
"https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/486": {
|
||||||
"tests": [
|
"tests": [
|
||||||
|
|
Loading…
Reference in a new issue