#!/usr/bin/python
# Copyright 2012 Google Inc. All Rights Reserved.
"""This script generates a crosperf overhead-testing experiment file for MoreJS.

Use: experiment_gen.py --crosperf=/home/mrdmnd/depot2/crosperf --chromeos_root=
/home/mrdmnd/chromiumos --remote-host=chromeos-zgb3.mtv --board=x86-zgb --event=
cycles -F 10 -F 20 -c 10582 -c 10785211 --perf_options="-g"
"""

import optparse
import subprocess
import sys
import time

HEADER = """
board: %s
remote: %s
benchmark: baseline {
 iterations: %s
 autotest_name: desktopui_PyAutoPerfTests
 autotest_args: --args='--iterations=%s perf.PageCyclerTest.testMoreJSFile'
}"""

EXPERIMENT = """
benchmark: %s {
 iterations: %s
 autotest_name: desktopui_PyAutoPerfTests
 autotest_args: --args='--iterations=%s perf.PageCyclerTest.testMoreJSFile' --profiler=custom_perf --profiler_args='perf_options="record -a %s %s -e %s"' \n}"""  # pylint: disable-msg=C6310

DEFAULT_IMAGE = """
default {
 chromeos_image: %s/src/build/images/%s/latest/chromiumos_test_image.bin
}"""


def main():
  parser = optparse.OptionParser()
  parser.add_option('--crosperf', dest='crosperf_root', action='store',
                    default='/home/mrdmnd/depot2/crosperf',
                    help='Crosperf root directory.')
  parser.add_option('--chromeos_root', dest='chromeos_root', action='store',
                    default='/home/mrdmnd/chromiumos',
                    help='ChromiumOS root directory.')
  parser.add_option('--remote', dest='remote', action='store',
                    help='Host to run test on. Required.')
  parser.add_option('--board', dest='board', action='store',
                    help='Board architecture to run on. Required.')
  parser.add_option('--event', dest='event', action='store',
                    help='Event to profile. Required.')
  parser.add_option('-F', dest='sampling_frequencies', action='append',
                    help='A target frequency to sample at.')
  parser.add_option('-c', dest='sampling_periods', action='append',
                    help='A target period to sample at. Event specific.')
  parser.add_option('--benchmark-iterations', dest='benchmark_iterations',
                    action='store', default=4, help='Number of benchmark iters')
  parser.add_option('--test-iterations', dest='test_iterations',
                    action='store', default=10, help='Number of test iters')
  parser.add_option('-p', dest='print_only', action='store_true',
                    help='If enabled, will print experiment file and exit.')
  parser.add_option('--perf_options', dest='perf_options', action='store',
                    help='Arbitrary flags to perf. Surround with dblquotes.')
  options = parser.parse_args()[0]
  if options.remote is None:
    print '%s requires a remote hostname.' % sys.argv[0]
    return 1
  elif options.board is None:
    print '%s requires a target board.' % sys.argv[0]
    return 1
  elif options.event is None:
    print '%s requires an event to profile.' % sys.argv[0]
    return 1
  else:
    crosperf_root = options.crosperf_root
    chromeos_root = options.chromeos_root
    remote = options.remote
    board = options.board
    event = options.event
    bench_iters = options.benchmark_iterations
    test_iters = options.test_iterations
    perf_opts = options.perf_options
    # Set up baseline test.
    experiment_file = HEADER % (board, remote, bench_iters, test_iters)
    # Set up experimental tests.
    if options.sampling_frequencies:
      for freq in options.sampling_frequencies:
        test_string = str(freq) + 'Freq'
        experiment_file += EXPERIMENT % (test_string, bench_iters, test_iters,
                                         '-F %s' % freq,
                                         '' if perf_opts is None else perf_opts,
                                         event)
    if options.sampling_periods:
      for period in options.sampling_periods:
        test_string = str(period) + 'Period'
        experiment_file += EXPERIMENT % (test_string, bench_iters, test_iters,
                                         '-c %s' % period,
                                         '' if perf_opts is None else perf_opts,
                                         event)
    # Point to the target image.
    experiment_file += DEFAULT_IMAGE % (chromeos_root, board)
    if options.print_only:
      print experiment_file
    else:
      current_time = int(round(time.time() * 1000))
      file_name = 'perf_overhead_%s' % str(current_time)
      with open(file_name, "w") as f:
        f.write(experiment_file)
      try:
        process = subprocess.Popen(['%s/crosperf' % crosperf_root, file_name])
        process.communicate()
      except OSError:
        print 'Could not find crosperf, make sure --crosperf flag is set right.'
        return 1
    return 0

if __name__ == '__main__':
  exit(main())
