#!/usr/bin/python2 # # 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. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function 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_DENYLIST = 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_DENYLIST: 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())