#!/usr/bin/python2

# Copyright (c) 2015 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.
"""This script creates a allowlist of test attributes based on the 'suite' read
from test control files.
"""
import argparse

import common
from autotest_lib.client.common_lib.cros import dev_server
from autotest_lib.server.cros.dynamic_suite.suite import Suite


def main():
    """main script."""
    # Parse filepath from cmd line.
    parser = argparse.ArgumentParser(description='Create attribute allowlist.')
    parser.add_argument('path',
                        metavar='ALLOWLIST_FILE_PATH',
                        help='Path to the file allowlist is written to. E.g. '
                        './attribute_allowlist.txt')
    args = parser.parse_args()

    # Get all the suites from current test control files, and order them.
    fs_getter = Suite.create_fs_getter(common.autotest_dir)
    devserver = dev_server.ImageServer('')
    suite_list = Suite.list_all_suites('', devserver, fs_getter)
    suite_list.sort(key=str.lower)

    # Parse attributes from suites, and write to a file
    allowlist = ['suite:' + x for x in suite_list]
    _WriteToFile(allowlist, args.path)


def _WriteToFile(allowlist, path):
    """"Write the allowlist to a file under the path.

  The format of the file used here is a list, which can be easily read to a list
  by using ast.literal_eval.

  Args:
    allowlist: a list contains all the allowed attributes.
    path: path to the file.
  """
    with open(path, 'wb') as attr_file:
        attr_file.write('\n'.join(allowlist))


if __name__ == '__main__':
    main()
