Skip to content

Commit

Permalink
Merge pull request #459 from commial/feature/only-tags
Browse files Browse the repository at this point in the history
Add a only-tags option for test_all
  • Loading branch information
serpilliere committed Jan 14, 2017
2 parents 29456a7 + 0cf7591 commit 6fef06f
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 31 deletions.
32 changes: 21 additions & 11 deletions test/test_all.py
Expand Up @@ -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",
Expand Down Expand Up @@ -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()
Expand All @@ -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
Expand Down Expand Up @@ -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()
Expand Down
50 changes: 30 additions & 20 deletions test/utils/testset.py
Expand Up @@ -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

0 comments on commit 6fef06f

Please sign in to comment.