#!/usr/bin/env python

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

# 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_TESTS = [
    'jetstream',
    'kraken',
    'octane',
    'page_cycler.typical_25',
    'session_restore.cold.typical_25',
    'smoothness.top_25_smooth',
    'speedometer',
    'startup.cold.blank_page',
]

PERF_DAILY_RUN_TESTS = [
    'dromaeo.domcoreattr',
    'dromaeo.domcoremodify',
    'dromaeo.domcorequery',
    'dromaeo.domcoretraverse',
    'image_decoding.image_decoding_measurement',
    'memory.top_7_stress',
    'robohornet_pro',
    'smoothness.tough_animation_cases',
    'smoothness.tough_canvas_cases',
    'smoothness.tough_filters_cases',
    'smoothness.tough_pinch_zoom_cases',
    'smoothness.tough_scrolling_cases',
    'smoothness.tough_webgl_cases',
    'sunspider',
    'tab_switching.top_10',
    'webrtc.webrtc_cases',
]

CONTROLFILE_TEMPLATE = (
"""# Copyright 2014 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 = 'sbasi, achuith, rohitbm'
NAME = 'telemetry_Benchmarks.{1}'
SUITE = '{0}'
TIME = 'LONG'
TEST_CATEGORY = 'Benchmark'
TEST_CLASS = 'performance'
TEST_TYPE = 'server'

DOC = '''
This server side test suite executes the Telemetry Benchmark:
{1}
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)
    job.run_test('telemetry_Benchmarks', host=host,
                 benchmark='{1}',
                 tag='{1}',
                 args=utils.args_to_dict(args))

parallel_simple(run_benchmark, machines)""")

for test in PERF_TESTS + PERF_DAILY_RUN_TESTS:
    filename = 'control.%s' % test
    with open(filename, 'w+') as f:
        if test in PERF_TESTS:
            content = CONTROLFILE_TEMPLATE.format('performance', test)
        else:
            content = CONTROLFILE_TEMPLATE.format('performance_optional', test)
        f.write(content)
