Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 53 additions & 16 deletions scripts/ci/test_plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@
if "ZEPHYR_BASE" not in os.environ:
exit("$ZEPHYR_BASE environment variable undefined.")

repository_path = Path(os.environ['ZEPHYR_BASE'])
zephyr_base = Path(os.environ['ZEPHYR_BASE'])
logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO)

sys.path.append(os.path.join(repository_path, 'scripts'))
sys.path.append(os.path.join(zephyr_base, 'scripts'))
import list_boards

def _get_match_fn(globs, regexes):
Expand Down Expand Up @@ -86,15 +86,23 @@ def __repr__(self):
return "<Tag {}>".format(self.name)

class Filters:
def __init__(self, modified_files, pull_request=False, platforms=[]):
def __init__(self, modified_files, pull_request=False, platforms=[], detailed_test_id=True, ignore_path=None, alt_tags=None, testsuite_root=None):
self.modified_files = modified_files
self.testsuite_root = testsuite_root
self.twister_options = []
self.full_twister = False
self.all_tests = []
self.tag_options = []
self.pull_request = pull_request
self.platforms = platforms
self.default_run = False
self.detailed_test_id = detailed_test_id
self.tag_cfg_file = os.path.join(zephyr_base, 'scripts', 'ci', 'tags.yaml')
if alt_tags:
self.tag_cfg_file = alt_tags
self.ignore_path = f"{zephyr_base}/scripts/ci/twister_ignore.txt"
if ignore_path:
self.ignore_path = ignore_path

def process(self):
self.find_modules()
Expand All @@ -109,9 +117,14 @@ def process(self):
else:
self.find_excludes()

def get_plan(self, options, integration=False):
def get_plan(self, options, integration=False, use_testsuite_root=True):
fname = "_test_plan_partial.json"
cmd = ["scripts/twister", "-c"] + options + ["--save-tests", fname ]
cmd = [f"{zephyr_base}/scripts/twister", "-c"] + options + ["--save-tests", fname ]
if not self.detailed_test_id:
cmd += ["--no-detailed-test-id"]
if self.testsuite_root and use_testsuite_root:
for root in self.testsuite_root:
cmd+=["-T", root]
if integration:
cmd.append("--integration")

Expand All @@ -128,7 +141,7 @@ def find_modules(self):
if 'west.yml' in self.modified_files:
print(f"Manifest file 'west.yml' changed")
print("=========")
old_manifest_content = repo.git.show(f"{args.commits[:-2]}:west.yml")
old_manifest_content = repo_to_scan.git.show(f"{args.commits[:-2]}:west.yml")
with open("west_old.yml", "w") as manifest:
manifest.write(old_manifest_content)
old_manifest = Manifest.from_file("west_old.yml")
Expand Down Expand Up @@ -209,8 +222,12 @@ def find_boards(self):
if p and p.groups():
boards.add(p.group(1))

# Limit search to $ZEPHYR_BASE since this is where the changed files are
lb_args = argparse.Namespace(**{ 'arch_roots': [repository_path], 'board_roots': [repository_path] })
roots = [zephyr_base]
if repository_path != zephyr_base:
roots.append(repository_path)

# Look for boards in monitored repositories
lb_args = argparse.Namespace(**{ 'arch_roots': roots, 'board_roots': roots})
known_boards = list_boards.find_boards(lb_args)
for b in boards:
name_re = re.compile(b)
Expand Down Expand Up @@ -261,12 +278,11 @@ def find_tests(self):
_options.extend(["-p", platform])
else:
_options.append("--all")
self.get_plan(_options)
self.get_plan(_options, use_testsuite_root=False)

def find_tags(self):

tag_cfg_file = os.path.join(repository_path, 'scripts', 'ci', 'tags.yaml')
with open(tag_cfg_file, 'r') as ymlfile:
with open(self.tag_cfg_file, 'r') as ymlfile:
tags_config = yaml.safe_load(ymlfile)

tags = {}
Expand Down Expand Up @@ -303,7 +319,7 @@ def find_tags(self):
logging.info(f'Potential tag based filters: {exclude_tags}')

def find_excludes(self, skip=[]):
with open("scripts/ci/twister_ignore.txt", "r") as twister_ignore:
with open(self.ignore_path, "r") as twister_ignore:
ignores = twister_ignore.read().splitlines()
ignores = filter(lambda x: not x.startswith("#"), ignores)

Expand Down Expand Up @@ -353,6 +369,25 @@ def parse_args():
help="Number of tests per builder")
parser.add_argument('-n', '--default-matrix', default=10, type=int,
help="Number of tests per builder")
parser.add_argument('--detailed-test-id', action='store_true',
help="Include paths to tests' locations in tests' names.")
parser.add_argument("--no-detailed-test-id", dest='detailed_test_id', action="store_false",
help="Don't put paths into tests' names.")
parser.add_argument('-r', '--repo-to-scan', default=None,
help="Repo to scan")
parser.add_argument('--ignore-path', default=None,
help="Path to a text file with patterns of files to be matched against changed files")
parser.add_argument('--alt-tags', default=None,
help="Path to a file describing relations between directories and tags")
parser.add_argument(
"-T", "--testsuite-root", action="append", default=[],
help="Base directory to recursively search for test cases. All "
"testcase.yaml files under here will be processed. May be "
"called multiple times. Defaults to the 'samples/' and "
"'tests/' directories at the base of the Zephyr tree.")

# Include paths in names by default.
parser.set_defaults(detailed_test_id=True)

return parser.parse_args()

Expand All @@ -362,9 +397,12 @@ def parse_args():
args = parse_args()
files = []
errors = 0
repository_path = zephyr_base
if args.repo_to_scan:
repository_path = Path(args.repo_to_scan)
if args.commits:
repo = Repo(repository_path)
commit = repo.git.diff("--name-only", args.commits)
repo_to_scan = Repo(repository_path)
commit = repo_to_scan.git.diff("--name-only", args.commits)
files = commit.split("\n")
elif args.modified_files:
with open(args.modified_files, "r") as fp:
Expand All @@ -375,8 +413,7 @@ def parse_args():
print("\n".join(files))
print("=========")


f = Filters(files, args.pull_request, args.platform)
f = Filters(files, args.pull_request, args.platform, args.detailed_test_id, args.ignore_path, args.alt_tags, args.testsuite_root)
f.process()

# remove dupes and filtered cases
Expand Down