#!/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 whitelist 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 whitelist.')
  parser.add_argument('path', metavar='WHITELIST_FILE_PATH',
                      help='Path to the file whitelist is written to. E.g. '
                           './attribute_whitelist.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
  whitelist = ['suite:' + x for x in suite_list]
  _WriteToFile(whitelist, args.path)


def _WriteToFile(whitelist, path):
  """"Write the whitelist 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:
    whitelist: a list contains all the allowed attributes.
    path: path to the file.
  """
  with open(path, 'wb') as attr_file:
    attr_file.write('\n'.join(whitelist))


if __name__ == '__main__':
  main()
