#!/usr/bin/env python2

"""
This file generates all telemetry_Benchmarks control files from a main list.
"""

from __future__ import print_function

from datetime import datetime
import os
import re

# This test list is a subset of telemetry benchmark tests. The full list can be
# obtained by executing
# /build/${BOARD}/usr/local/telemetry/src/tools/perf/list_benchmarks

# PLEASE READ THIS:

# PERF_TESTS: these tests run on each build: tot, tot-1, tot-2 and expensive to
# run.

# PERF_DAILY_RUN_TESTS: these tests run on a nightly build: tot. If you are
# trying to gain confidence for a new test, adding your test in this list is a
# good start.

# For adding a new test to any of these lists, please add rohitbm, lafeenstra,
# haddowk in the change.

PERF_PER_BUILD_TESTS = (
    'loading.desktop',
    'rendering.desktop',
    'speedometer2',
)

PERF_DAILY_RUN_TESTS = (
    'blink_perf.image_decoder',
)

ALL_TESTS = (PERF_PER_BUILD_TESTS + PERF_DAILY_RUN_TESTS)

EXTRA_ARGS_MAP = {
    'loading.desktop': '--story-tag-filter=typical',
    'rendering.desktop': '--story-tag-filter=top_real_world_desktop',
}

DEFAULT_YEAR = str(datetime.now().year)

DEFAULT_AUTHOR = 'Chrome OS Team'

CONTROLFILE_TEMPLATE = (
"""# Copyright {year} 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.

# Do not edit this file! It was created by generate_controlfiles.py.

from autotest_lib.client.common_lib import utils

AUTHOR = '{author}'
NAME = 'telemetry_Benchmarks.{test}'
{attributes}
TIME = 'LONG'
TEST_CATEGORY = 'Benchmark'
TEST_CLASS = 'performance'
TEST_TYPE = 'server'

DOC = '''
This server side test suite executes the Telemetry Benchmark:
{test}
This is part of Chrome for Chrome OS performance testing.

Pass local=True to run with local telemetry and no AFE server.
'''

def run_benchmark(machine):
    host = hosts.create_host(machine)
    dargs = utils.args_to_dict(args)
    dargs['extra_args'] = '{extra_args}'.split()
    job.run_test('telemetry_Benchmarks', host=host,
                 benchmark='{test}',
                 tag='{test}',
                 args=dargs)

parallel_simple(run_benchmark, machines)""")


def _get_suite(test):
    if test in PERF_PER_BUILD_TESTS:
        return 'ATTRIBUTES = \'suite:crosbolt_perf_perbuild\''
    elif test in PERF_DAILY_RUN_TESTS:
        return 'ATTRIBUTES = \'suite:crosbolt_perf_nightly\''
    return ''


def get_existing_fields(filename):
    """Returns the existing copyright year and author of the control file."""
    if not os.path.isfile(filename):
        return (DEFAULT_YEAR, DEFAULT_AUTHOR)

    copyright_year = DEFAULT_YEAR
    author = DEFAULT_AUTHOR
    copyright_pattern = re.compile(
            '# Copyright (\d+) The Chromium OS Authors.')
    author_pattern = re.compile("AUTHOR = '(.+)'")
    with open(filename) as f:
        for line in f:
            match_year = copyright_pattern.match(line)
            if match_year:
                copyright_year = match_year.group(1)
            match_author = author_pattern.match(line)
            if match_author:
                author = match_author.group(1)
    return (copyright_year, author)


def generate_control(test):
    """Generates control file from the template."""
    filename = 'control.%s' % test
    copyright_year, author = get_existing_fields(filename)
    extra_args = EXTRA_ARGS_MAP.get(test, '')

    with open(filename, 'w+') as f:
        content = CONTROLFILE_TEMPLATE.format(
                attributes=_get_suite(test),
                author=author,
                extra_args=extra_args,
                test=test,
                year=copyright_year)
        f.write(content)


def check_unmanaged_control_files():
    """Prints warning if there is unmanaged control file."""
    for filename in os.listdir('.'):
        if not filename.startswith('control.'):
            continue
        test = filename[len('control.'):]
        if test not in ALL_TESTS:
            print('warning, unmanaged control file:', test)


def main():
    """The main function."""
    for test in ALL_TESTS:
        generate_control(test)
    check_unmanaged_control_files()


if __name__ == "__main__":
    main()
