diff --git a/test/test_all.py b/test/test_all.py index c710a8ab0..e49ce514f 100755 --- a/test/test_all.py +++ b/test/test_all.py @@ -57,7 +57,7 @@ def __init__(self, script, jitter ,*args, **kwargs): # script -> blacklisted jitter blacklist = { - "x86/unit/mn_float.py": ["python"], + "x86/unit/mn_float.py": ["python", "llvm"], } for script in ["x86/sem.py", "x86/unit/mn_strings.py", @@ -628,6 +628,9 @@ class ExampleJitterNoPython(ExampleJitter): parser.add_argument("-t", "--omit-tags", help="Omit tests based on tags \ (tag1,tag2). Available tags are %s. \ By default, no tag is omitted." % ", ".join(TAGS.keys()), default="") + parser.add_argument("-o", "--only-tags", help="Restrict to tests based on tags \ +(tag1,tag2). Available tags are %s. \ +By default, all tag are considered." % ", ".join(TAGS.keys()), default="") parser.add_argument("-n", "--do-not-clean", help="Do not clean tests products", action="store_true") args = parser.parse_args() @@ -637,16 +640,23 @@ class ExampleJitterNoPython(ExampleJitter): if args.mono is True or args.coverage is True: multiproc = False - ## Parse omit-tags argument + ## Parse omit-tags and only-tags argument exclude_tags = [] - for tag in args.omit_tags.split(","): - if not tag: - continue - if tag not in TAGS: - print "%(red)s[TAG]%(end)s" % cosmetics.colors, \ - "Unkown tag '%s'" % tag - exit(-1) - exclude_tags.append(TAGS[tag]) + include_tags = [] + for dest, src in ((exclude_tags, args.omit_tags), + (include_tags, args.only_tags)): + for tag in src.split(","): + if not tag: + continue + if tag not in TAGS: + print "%(red)s[TAG]%(end)s" % cosmetics.colors, \ + "Unkown tag '%s'" % tag + exit(-1) + dest.append(TAGS[tag]) + + if exclude_tags and include_tags: + print "%(red)s[TAG]%(end)s" % cosmetics.colors, \ + "Omit and Only used together: whitelist mode" # Handle coverage coveragerc = None @@ -736,7 +746,7 @@ class ExampleJitterNoPython(ExampleJitter): # Filter testset according to tags - testset.filter_tags(exclude_tags=exclude_tags) + testset.filter_tags(exclude_tags=exclude_tags, include_tags=include_tags) # Run tests testset.run() diff --git a/test/utils/testset.py b/test/utils/testset.py index 4336f4fa5..e1df01a40 100644 --- a/test/utils/testset.py +++ b/test/utils/testset.py @@ -267,26 +267,36 @@ def filter_tags(self, include_tags=None, exclude_tags=None): """Filter tests by tags @include_tags: list of tags' name (whitelist) @exclude_tags: list of tags' name (blacklist) - @include_tags and @exclude_tags cannot be used together""" - - if include_tags and exclude_tags: - raise ValueError("Include and Exclude cannot be used together") + If @include_tags and @exclude_tags are used together, @exclude_tags will + act as a blacklist on @include_tags generated tests + """ - new_testset_include = [] - new_testset_exclude = list(self.tests) + new_testset = [] - # Update include and exclude lists - for index, test in enumerate(self.tests): - for tag in test.tags: - if exclude_tags and tag in exclude_tags: - new_testset_exclude.remove(test) - break - if include_tags and tag in include_tags: - new_testset_include.append(test) - break + include_tags = set(include_tags) + exclude_tags = set(exclude_tags) + if include_tags.intersection(exclude_tags): + raise ValueError("Tags are mutually included and excluded: %s" % include_tags.intersection(exclude_tags)) - # Update testset list - if include_tags: - self.tests = new_testset_include - elif exclude_tags: - self.tests = new_testset_exclude + for test in self.tests: + tags = set(test.tags) + if exclude_tags.intersection(tags): + # Ignore the current test because it is excluded + continue + if not include_tags: + new_testset.append(test) + else: + if include_tags.intersection(tags): + new_testset.append(test) + + # Add tests dependencies + dependency = list(test.depends) + while dependency: + subtest = dependency.pop() + if subtest not in new_testset: + new_testset.append(subtest) + for subdepends in subtest.depends: + if subdepends not in new_testset: + dependency.append(subdepends) + + self.tests = new_testset