[CRIU] [RFC PATCHv2 04/32] zdtm: zdtm.py: implement exhaustive group generation (still subject to test compatibility screening)

Pavel Emelyanov xemul at virtuozzo.com
Mon Mar 14 04:26:55 PDT 2016


On 03/12/2016 11:42 AM, Ivan Shapovalov wrote:
> Signed-off-by: Ivan Shapovalov <intelfx at intelfx.name>
> ---
>  test/zdtm.py | 42 ++++++++++++++++++++++++++++--------------
>  1 file changed, 28 insertions(+), 14 deletions(-)
> 
> diff --git a/test/zdtm.py b/test/zdtm.py
> index d84e1cc..c3f900a 100755
> --- a/test/zdtm.py
> +++ b/test/zdtm.py
> @@ -18,6 +18,7 @@ import imp
>  import socket
>  import fcntl
>  import errno
> +import itertools
>  
>  os.chdir(os.path.dirname(os.path.abspath(__file__)))
>  
> @@ -1331,25 +1332,37 @@ def group_tests(opts):
>  	random.shuffle(tlist)

Since you're generating all possible combinations you don't need this shuffle.

>  	if opts['exclude']:
>  		excl = re.compile(".*(" + "|".join(opts['exclude']) + ")")
> +		tlist = filter(lambda t: not excl.match(t), tlist)
>  		print "Compiled exclusion list"
>  
> -	for t in tlist:
> -		if excl and excl.match(t):
> -			continue
> +	tdlist = itertools.imap(get_test_desc, tlist)
>  
> -		td = get_test_desc(t)
> -
> -		for g in pend_groups:
> -			if g.merge(t, td):
> -				if g.size() == maxs:
> -					pend_groups.remove(g)
> -					groups.append(g)
> -				break
> -		else:
> +	if opts['exhaustive']:
> +		for tgroup in itertools.combinations(zip(tlist, tdlist), maxs):
> +			t, td = tgroup[0]
>  			g = group(t, td)
> -			pend_groups.append(g)
> +			for t, td in tgroup[1:]:
> +				# because we are enumerating all combinations,
> +				# we skip the whole combination on incompatibility
> +				# (i. e. we do not allow short groups).
> +				if not g.merge(t, td):
> +					break
> +			else:
> +				groups.append(g)
>  
> -	groups += pend_groups
> +	else:
> +		for t, td in zip(tlist, tdlist):
> +			for g in pend_groups:
> +				if g.merge(t, td):
> +					if g.size() == maxs:
> +						pend_groups.remove(g)
> +						groups.append(g)
> +					break
> +			else:
> +				g = group(t, td)
> +				pend_groups.append(g)
> +
> +		groups += pend_groups
>  
>  	nr = 0
>  	suf = opts['name'] or 'group'
> @@ -1442,6 +1455,7 @@ gp.set_defaults(action = group_tests)
>  gp.add_argument("-m", "--max-size", help = "Maximum number of tests in group")
>  gp.add_argument("-n", "--name", help = "Common name for group tests")
>  gp.add_argument("-x", "--exclude", help = "Exclude tests from --all run", action = 'append')
> +gp.add_argument("--exhaustive", help = "Generate groups for all possible combinations of tests", action = 'store_true')
>  
>  cp = sp.add_parser("clean", help = "Clean something")
>  cp.set_defaults(action = clean_stuff)
> 



More information about the CRIU mailing list