blob: d729a9ff8ed51419410bea33f236e8c071777dd1 [file] [log] [blame]
Fathi Boudra422bf772019-12-02 11:10:16 +02001#!/usr/bin/env python3
2#
3# Copyright (c) 2019, Arm Limited. All rights reserved.
4#
5# SPDX-License-Identifier: BSD-3-Clause
6#
7#
8# Generate .test files in $workspace based on the $TEST_GROUPS parameter. Test
9# files are prefixed with a zero-padded number for a predictable ordering
10# amongst them.
11
12import os
13
14TEST_SUFFIX = ".test"
15
16
17def touch(a_file):
18 with open(a_file, "w"):
19 pass
20
21
22# Obtain the value of either $variable or $VARIABLE.
23def get_env(variable):
24 var_list = [variable, variable.upper()]
25 for v in var_list:
26 value = os.environ.get(v)
27 if value:
28 return value
29 else:
30 raise Exception("couldn't find {} in env".format(" or ".join(var_list)))
31
32
33# Perform group-specific translation on the build config
34def translate_build_config(group, config_list):
35 # config_list contains build configs as read from the test config
36 if group.startswith("scp-"):
37 # SCP configs would be specified in the following format:
Zelalem219df412020-05-17 19:21:20 -050038 # scp_config, tf_config, tftf_config, scp_tools
Fathi Boudra422bf772019-12-02 11:10:16 +020039 # Reshuffle them into the canonical format
Zelalem219df412020-05-17 19:21:20 -050040 config_list = [config_list[1], config_list[2], config_list[0], config_list[3]]
Fathi Boudra422bf772019-12-02 11:10:16 +020041
42 return config_list
43
44
45def gen_desc(group, test):
46 global num_spawn
47
48 build_config, run_config = test.split(":")
49
50 # Test descriptors are always generated in the following order:
Zelalem219df412020-05-17 19:21:20 -050051 # tf_config, tftf_config, scp_config, scp_tools
Fathi Boudra422bf772019-12-02 11:10:16 +020052 # Fill missing configs to the right with "nil".
Zelalem219df412020-05-17 19:21:20 -050053 config_list = (build_config.split(",") + ["nil"] * 4)[:4]
Fathi Boudra422bf772019-12-02 11:10:16 +020054
55 # Perform any group-specific translation on the config
56 config_list = translate_build_config(group, config_list)
57
58 test_config = ",".join(config_list) + ":" + run_config
59
60 # Create descriptor. Write the name of the original test config as its
61 # content.
62 desc = os.path.join(workspace, "%".join([str(num_spawn).zfill(3), group,
63 test_config + TEST_SUFFIX]))
64 with open(desc, "wt") as fd:
65 print(test, file=fd)
66
67 num_spawn += 1
68
69
70def process_item(item):
71 # If an item starts with @, then it's deemed to be an indirection--a file
72 # from which test groups are to be read.
73 if item.startswith("@"):
74 with open(item[1:]) as fd:
75 for line in fd:
76 line = line.strip()
77 if not line:
78 continue
79 process_item(line)
80
81 return
82
83 item_loc = os.path.join(group_dir, item)
84
85 if os.path.isfile(item_loc):
86 gen_desc(*item_loc.split(os.sep)[-2:])
87 elif os.path.isdir(item_loc):
88 # If it's a directory, select all files inside it
89 for a_file in next(os.walk(item_loc))[2]:
90 gen_desc(item, a_file)
91 else:
92 # The item doesn't exist
93 if ":" in item:
94 # A non-existent test config is specified
95 if "/" in item:
96 # The test config doesn't exist, and a group is also specified.
97 # This is not allowed.
98 raise Exception("'{}' doesn't exist.".format(item))
99 else:
100 # The user probably intended to create one on the fly; so create
101 # one in the superficial 'GENERATED' group.
102 print("note: '{}' doesn't exist; generated.".format(item))
103 touch(os.path.join(generated_dir, item))
104 gen_desc(os.path.basename(generated_dir), item)
105 else:
106 raise Exception("'{}' is not valid for test generation!".format(item))
107
108
109ci_root = os.path.abspath(os.path.join(__file__, os.pardir, os.pardir))
110group_dir = os.path.join(ci_root, "group")
111num_spawn = 0
112
113# Obtain variables from environment
114test_groups = get_env("test_groups")
115workspace = get_env("workspace")
116
117# Remove all test files, if any
118_, _, files = next(os.walk(workspace))
119for test_file in files:
120 if test_file.endswith(TEST_SUFFIX):
121 os.remove(os.path.join(workspace, test_file))
122
123generated_dir = os.path.join(group_dir, "GENERATED")
124os.makedirs(generated_dir, exist_ok=True)
125
126for item in test_groups.split():
127 process_item(item)
128
129print()
130print("{} children to be spawned...".format(num_spawn))
131print()