# Copyright (c) 2013 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.
"""Setting files for global, benchmark and labels."""

from __future__ import print_function

from field import BooleanField
from field import IntegerField
from field import ListField
from field import TextField
from settings import Settings


class BenchmarkSettings(Settings):
  """Settings used to configure individual benchmarks."""

  def __init__(self, name):
    super(BenchmarkSettings, self).__init__(name, 'benchmark')
    self.AddField(
        TextField(
            'test_name',
            description='The name of the test to run. '
            'Defaults to the name of the benchmark.'))
    self.AddField(
        TextField(
            'test_args', description='Arguments to be passed to the '
            'test.'))
    self.AddField(
        IntegerField(
            'iterations',
            default=1,
            description='Number of iterations to run the '
            'test.'))
    self.AddField(
        TextField(
            'suite', default='', description='The type of the benchmark.'))
    self.AddField(
        IntegerField(
            'retries',
            default=0,
            description='Number of times to retry a '
            'benchmark run.'))
    self.AddField(
        BooleanField(
            'run_local',
            description='Run benchmark harness on the DUT. '
            'Currently only compatible with the suite: '
            'telemetry_Crosperf.',
            required=False,
            default=True))


class LabelSettings(Settings):
  """Settings for each label."""

  def __init__(self, name):
    super(LabelSettings, self).__init__(name, 'label')
    self.AddField(
        TextField(
            'chromeos_image',
            required=False,
            description='The path to the image to run tests '
            'on, for local/custom-built images. See the '
            "'build' option for official or trybot images."))
    self.AddField(
        TextField(
            'autotest_path',
            required=False,
            description='Autotest directory path relative to chroot which '
            'has autotest files for the image to run tests requiring autotest files'
        ))
    self.AddField(
        TextField(
            'chromeos_root',
            description='The path to a chromeos checkout which '
            'contains a src/scripts directory. Defaults to '
            'the chromeos checkout which contains the '
            'chromeos_image.'))
    self.AddField(
        ListField(
            'remote',
            description='A comma-separated list of IPs of chromeos'
            'devices to run experiments on.'))
    self.AddField(
        TextField(
            'image_args',
            required=False,
            default='',
            description='Extra arguments to pass to '
            'image_chromeos.py.'))
    self.AddField(
        TextField(
            'cache_dir',
            default='',
            description='The cache dir for this image.'))
    self.AddField(
        TextField(
            'compiler',
            default='gcc',
            description='The compiler used to build the '
            'ChromeOS image (gcc or llvm).'))
    self.AddField(
        TextField(
            'chrome_src',
            description='The path to the source of chrome. '
            'This is used to run telemetry benchmarks. '
            'The default one is the src inside chroot.',
            required=False,
            default=''))
    self.AddField(
        TextField(
            'build',
            description='The xbuddy specification for an '
            'official or trybot image to use for tests. '
            "'/remote' is assumed, and the board is given "
            "elsewhere, so omit the '/remote/<board>/' xbuddy "
            'prefix.',
            required=False,
            default=''))


class GlobalSettings(Settings):
  """Settings that apply per-experiment."""

  def __init__(self, name):
    super(GlobalSettings, self).__init__(name, 'global')
    self.AddField(
        TextField(
            'name',
            description='The name of the experiment. Just an '
            'identifier.'))
    self.AddField(
        TextField(
            'board',
            description='The target board for running '
            'experiments on, e.g. x86-alex.'))
    self.AddField(
        ListField(
            'remote',
            description='A comma-separated list of IPs of '
            'chromeos devices to run experiments on.'))
    self.AddField(
        BooleanField(
            'rerun_if_failed',
            description='Whether to re-run failed test runs '
            'or not.',
            default=False))
    self.AddField(
        BooleanField(
            'rm_chroot_tmp',
            default=False,
            description='Whether to remove the test_that '
            'result in the chroot.'))
    self.AddField(
        ListField(
            'email',
            description='Space-separated list of email '
            'addresses to send email to.'))
    self.AddField(
        BooleanField(
            'rerun',
            description='Whether to ignore the cache and '
            'for tests to be re-run.',
            default=False))
    self.AddField(
        BooleanField(
            'same_specs',
            default=True,
            description='Ensure cached runs are run on the '
            'same kind of devices which are specified as a '
            'remote.'))
    self.AddField(
        BooleanField(
            'same_machine',
            default=False,
            description='Ensure cached runs are run on the '
            'same remote.'))
    self.AddField(
        BooleanField(
            'use_file_locks',
            default=False,
            description='Whether to use the file locks '
            'mechanism (deprecated) instead of the AFE '
            'server lock mechanism.'))
    self.AddField(
        IntegerField(
            'iterations',
            default=1,
            description='Number of iterations to run all '
            'tests.'))
    self.AddField(
        TextField(
            'chromeos_root',
            description='The path to a chromeos checkout which '
            'contains a src/scripts directory. Defaults to '
            'the chromeos checkout which contains the '
            'chromeos_image.'))
    self.AddField(
        TextField(
            'logging_level',
            default='average',
            description='The level of logging desired. '
            "Options are 'quiet', 'average', and 'verbose'."))
    self.AddField(
        IntegerField(
            'acquire_timeout',
            default=0,
            description='Number of seconds to wait for '
            'machine before exit if all the machines in '
            'the experiment file are busy. Default is 0.'))
    self.AddField(
        TextField(
            'perf_args',
            default='',
            description='The optional profile command. It '
            'enables perf commands to record perforamance '
            'related counters. It must start with perf '
            'command record or stat followed by arguments.'))
    self.AddField(
        TextField(
            'cache_dir',
            default='',
            description='The abs path of cache dir. '
            'Default is /home/$(whoami)/cros_scratch.'))
    self.AddField(
        BooleanField(
            'cache_only',
            default=False,
            description='Whether to use only cached '
            'results (do not rerun failed tests).'))
    self.AddField(
        BooleanField(
            'no_email',
            default=False,
            description='Whether to disable the email to '
            'user after crosperf finishes.'))
    self.AddField(
        BooleanField(
            'json_report',
            default=False,
            description='Whether to generate a json version '
            'of the report, for archiving.'))
    self.AddField(
        BooleanField(
            'show_all_results',
            default=False,
            description='When running Telemetry tests, '
            'whether to all the results, instead of just '
            'the default (summary) results.'))
    self.AddField(
        TextField(
            'share_cache',
            default='',
            description='Path to alternate cache whose data '
            'you want to use. It accepts multiple directories '
            'separated by a ",".'))
    self.AddField(
        TextField(
            'results_dir', default='', description='The results dir.'))
    self.AddField(
        TextField(
            'locks_dir',
            default='',
            description='An alternate directory to use for '
            'storing/checking machine locks. Using this field '
            'automatically sets use_file_locks to True.\n'
            'WARNING: If you use your own locks directory, '
            'there is no guarantee that someone else might not '
            'hold a lock on the same machine in a different '
            'locks directory.'))
    self.AddField(
        TextField(
            'chrome_src',
            description='The path to the source of chrome. '
            'This is used to run telemetry benchmarks. '
            'The default one is the src inside chroot.',
            required=False,
            default=''))
    self.AddField(
        IntegerField(
            'retries',
            default=0,
            description='Number of times to retry a '
            'benchmark run.'))


class SettingsFactory(object):
  """Factory class for building different types of Settings objects.

  This factory is currently hardcoded to produce settings for ChromeOS
  experiment files. The idea is that in the future, other types
  of settings could be produced.
  """

  def GetSettings(self, name, settings_type):
    if settings_type == 'label' or not settings_type:
      return LabelSettings(name)
    if settings_type == 'global':
      return GlobalSettings(name)
    if settings_type == 'benchmark':
      return BenchmarkSettings(name)

    raise TypeError("Invalid settings type: '%s'." % settings_type)
