#!/usr/bin/env python
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import imp
import importlib
import os
import sys

try:
  imp.find_module('mopy')
except ImportError:
  sys.path.append(os.path.abspath(os.path.join(
      __file__, os.pardir, os.pardir, 'mojo', 'tools')))
from mopy.paths import Paths


class BenchmarkRunner(object):
  def __init__(self, args):
    self._args = args
    self._benchmark_dir = os.path.dirname(os.path.realpath(__file__))
    if args.release:
      build_directory = os.path.join('out', 'Release')
    else:
      build_directory = os.path.join('out', 'Debug')
    self._paths = Paths(build_dir=build_directory)

  def _list_tests(self):
    for name in os.listdir(self._benchmark_dir):
      path = os.path.join(self._benchmark_dir, name)
      if os.path.isdir(path):
        yield name

  def _run_test(self, test_name):
    print "Running %s ..." % test_name
    run_script_path = os.path.join(self._benchmark_dir, test_name, 'run.py')
    if os.path.isfile(run_script_path):
      run_module = '.'.join([test_name, 'run'])
      importlib.import_module(run_module)
      result = sys.modules[run_module].run(self._args, self._paths)

      #TODO(yzshen): (1) consider using more structured result;
      #              (2) upload the result to server.
      print result

  def run(self):
    for test in self._list_tests():
      self._run_test(test)


def main():
  parser = argparse.ArgumentParser(
      description='Mojo performance benchmark runner')

  debug_group = parser.add_mutually_exclusive_group()
  debug_group.add_argument('--release',
                           help='test against release build (default)',
                           default=True, action='store_true')
  debug_group.add_argument('--debug', help='test against debug build',
                           default=False, dest='release', action='store_false')

  args = parser.parse_args()

  BenchmarkRunner(args).run()


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