lin
2025-08-14 dae8bad597b6607a449b32bf76c523423f7720ed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/usr/bin/python
#
# Copyright (c) 20123 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
 
"""Tool for preprocessing control files to build a suite to control files map.
 
Given an autotest root directory, this tool will bucket tests accroding to
their suite.Data will be written to stdout (or, optionally a file), eg:
 
{'suite1': ['path/to/test1/control', 'path/to/test2/control'],
 'suite2': ['path/to/test4/control', 'path/to/test5/control']}
 
This is intended for use only with Chrome OS test suites that leverage the
dynamic suite infrastructure in server/cros/dynamic_suite.py. It is invoked
at build time to generate said suite to control files map, which dynamic_suite
consults at run time to determine which tests belong to a suite.
"""
 
 
import collections, json, os, sys
 
import common
from autotest_lib.server.cros.dynamic_suite import suite
from autotest_lib.site_utils import suite_preprocessor
 
 
# A set of SUITES that we choose not to preprocess as they might have tests
# added later.
SUITE_BLACKLIST = set(['au'])
 
 
def _get_control_files_to_process(autotest_dir):
    """Find all control files in autotest_dir that have 'SUITE='
 
    @param autotest_dir: The directory to search for control files.
    @return: All control files in autotest_dir that have a suite attribute.
    """
    fs_getter = suite.Suite.create_fs_getter(autotest_dir)
    predicate = lambda t: hasattr(t, 'suite')
    return suite.Suite.find_and_parse_tests(fs_getter, predicate,
                                            add_experimental=True)
 
 
def get_suite_control_files(autotest_dir, external_autotest_dirs=None):
    """
    Partition all control files in autotest_dir based on suite.
 
    @param autotest_dir: Directory to walk looking for control files.
    @param external_autotest_dirs: A list of directories under which to search
            for extra Autotest tests. Defaults to None.
 
    @return suite_control_files: A dictionary mapping suite->[control files]
                                 as described in this files docstring.
    @raise ValueError: If autotest_dir doesn't exist.
    """
    if not os.path.exists(autotest_dir):
        raise ValueError('Could not find directory: %s, failed to map suites to'
                       ' their control files.' % autotest_dir)
 
    suite_control_files = collections.defaultdict(list)
    for d in [autotest_dir] + (external_autotest_dirs or []):
        d = d.rstrip('/')
        for test in _get_control_files_to_process(d):
            for suite_name in test.suite_tag_parts:
                if suite_name in SUITE_BLACKLIST:
                    continue
 
                suite_control_files[suite_name].append(
                    test.path.replace('%s/' % d, ''))
    return suite_control_files
 
 
def main():
    """
    Main function.
    """
    options = suite_preprocessor.parse_options()
 
    if options.extra_autotest_dirs:
        extra_autotest_dirs = options.extra_autotest_dirs.split(',')
    else:
        extra_autotest_dirs = None
 
    suite_control_files = get_suite_control_files(options.autotest_dir,
                                                  extra_autotest_dirs)
    if options.output_file:
        with open(options.output_file, 'w') as file_obj:
            json.dump(suite_control_files, file_obj)
    else:
        print suite_control_files
 
 
if __name__ == '__main__':
    sys.exit(main())