[CRIU] [PATCH] zdtm.py: add support of TAP reports

Pavel Emelyanov xemul at parallels.com
Tue Dec 29 05:51:57 PST 2015


On 12/29/2015 03:32 PM, Sergey Bronnikov wrote:
> Usually we run CRIU tests automatically using Jenkins and it reports status as
> PASS/FAIL for overall testsuite on used environment. You should dig in log files
> to figure out how many tests were failed and skipped.
> Jenkins has a plugin with TAP support, it allows to show extended status for
> testrun with passed/failed/skip tests on the graph without digging in log files.
> 
> TAP is a simple protocol for reporting test results (https://testanything.org/)
> Jenkins TAP Plugin: https://wiki.jenkins-ci.org/display/JENKINS/TAP+Plugin
> 
> Signed-off-by: Sergey Bronnikov <sergeyb at openvz.org>
> ---
>  Makefile     |  1 +
>  test/zdtm.py | 22 ++++++++++++++++++++++
>  2 files changed, 23 insertions(+)
> 
> diff --git a/Makefile b/Makefile
> index 8a0a230..948f1cd 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -287,6 +287,7 @@ clean: clean-built
>  	$(Q) $(RM) ./*.pyc
>  	$(Q) $(RM) -r build
>  	$(Q) $(RM) -r usr
> +	$(Q) $(RM) ./test/*.tap
>  
>  distclean: clean
>  	$(E) "  DISTCLEAN"
> diff --git a/test/zdtm.py b/test/zdtm.py
> index eb59290..e0df4d6 100755
> --- a/test/zdtm.py
> +++ b/test/zdtm.py
> @@ -18,9 +18,13 @@ import imp
>  import socket
>  import fcntl
>  import errno
> +import datetime
>  
>  os.chdir(os.path.dirname(os.path.abspath(__file__)))
>  
> +now = datetime.datetime.now()
> +report = "testreport-" + now.strftime("%Y-%m-%d-%H-%M-%S") + ".tap"

Can we put tap report into --report dir?

> +
>  prev_line = None
>  def traceit(f, e, a):
>  	if e == "line":
> @@ -952,6 +956,7 @@ class launcher:
>  		self.__max = int(opts['parallel'] or 1)
>  		self.__subs = {}
>  		self.__fail = False
> +		init_tap(nr_tests)
>  
>  	def __show_progress(self):
>  		perc = self.__nr * 16 / self.__total
> @@ -960,6 +965,7 @@ class launcher:
>  	def skip(self, name, reason):
>  		print "Skipping %s (%s)" % (name, reason)
>  		self.__nr += 1
> +		write_tap("not ok " + str(self.__nr) + " - " + str(name.split('/')[-1:][0]) + " # SKIP " + reason)
>  
>  	def run_test(self, name, desc, flavor):
>  
> @@ -989,6 +995,11 @@ class launcher:
>  				stdout = log, stderr = subprocess.STDOUT)
>  		self.__subs[sub.pid] = { 'sub': sub, 'log': logf }
>  
> +		if sub:
> +			write_tap("ok " + str(self.__nr) + " - " + str(name.split('/')[-1:][0]))
> +		else:
> +			write_tap("not ok " + str(self.__nr) + " - " + str(name.split('/')[-1:][0]))
> +
>  		if test_flag(desc, 'excl'):
>  			self.wait()

The launcher would abort tests execution on the very first failure and report
will contain incomplete data.

>  
> @@ -1074,6 +1085,17 @@ def print_fname(fname, typ):
>  def print_sep(title, sep = "=", width = 80):
>  	print (" " + title + " ").center(width, sep)
>  
> +def init_tap(total):
> +	f = open(report, 'a')
> +	print >> f, "TAP version 13"
> +	print >> f, "1.." + str(total)
> +	f.close()
> +
> +def write_tap(tcase):
> +	f = open(report, 'a')
> +	print >> f, tcase
> +	f.close()

Why not open report file once in launcher and feed data into it eventually instead
of constant re-opening one?

> +
>  def grep_errors(fname):
>  	first = True
>  	for l in open(fname):
> 

-- Pavel


More information about the CRIU mailing list