# Copyright 2017 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.

"""Run all eCTS tests and publish results."""


import argparse
import logging
import os
import subprocess
import sys

# List of tests to run.
TESTS = ['meta', 'gpio', 'hook', 'i2c', 'interrupt', 'mutex', 'task', 'timer']


class CtsRunner(object):
  """Class running eCTS tests."""

  def __init__(self, ec_dir, dryrun):
    self.ec_dir = ec_dir
    self.cts_py = []
    if dryrun:
      self.cts_py += ['echo']
    self.cts_py += [os.path.join(ec_dir, 'cts/cts.py')]

  def run_cmd(self, cmd):
    try:
      rc = subprocess.call(cmd)
      if rc != 0:
        return False
    except OSError:
      return False
    return True

  def run_test(self, test):
    cmd = self.cts_py + ['-m', test]
    self.run_cmd(cmd)

  def run(self, tests):
    for test in tests:
      logging.info('Running', test, 'test.')
      self.run_test(test)

  def sync(self):
    logging.info('Syncing tree...')
    os.chdir(self.ec_dir)
    cmd = ['repo', 'sync', '.']
    return self.run_cmd(cmd)

  def upload(self):
    logging.info('Uploading results...')


def main():
  if not os.path.exists('/etc/cros_chroot_version'):
    logging.error('This script has to run inside chroot.')
    sys.exit(-1)

  ec_dir = os.path.realpath(os.path.dirname(__file__) + '/..')

  parser = argparse.ArgumentParser(description='Run eCTS and report results.')
  parser.add_argument('-d',
                      '--dryrun',
                      action='store_true',
                      help='Echo commands to be executed without running them.')
  parser.add_argument('-s',
                      '--sync',
                      action='store_true',
                      help='Sync tree before running tests.')
  parser.add_argument('-u',
                      '--upload',
                      action='store_true',
                      help='Upload test results.')
  args = parser.parse_args()

  runner = CtsRunner(ec_dir, args.dryrun)

  if args.sync:
    if not runner.sync():
      logging.error('Failed to sync.')
      sys.exit(-1)

  runner.run(TESTS)

  if args.upload:
    runner.upload()


if __name__ == '__main__':
  main()
