#!/usr/bin/python
#
# Copyright 2014 Google Inc.  All Rights Reserved

import inspect
from benchmark import Benchmark

import unittest

class BenchmarkTestCase(unittest.TestCase):

  def test_benchmark(self):
    # Test creating a benchmark with all the fields filled out.
    b1 = Benchmark("b1_test", # name
                   "octane",  # test_name
                   "",        # test_args
                   3,         # iterations
                   False,     # rm_chroot_tmp
                   "record -e cycles",   # perf_args
                   "telemetry_Crosperf", # suite
                   True)      # show_all_results

    # Test creating a benchmark field with default fields left out.
    b2 = Benchmark("b2_test", # name
                   "octane",  # test_name
                   "",        # test_args
                   3,         # iterations
                   False,     # rm_chroot_tmp
                   "record -e cycles")   # perf_args
    self.assertEqual(b2.suite, "")
    self.assertFalse(b2.show_all_results)

    # Test explicitly creating 'suite=Telemetry' and 'show_all_results=False"
    # and see what happens.
    b3 = Benchmark("b3_test", # name
                   "octane",  # test_name
                   "",        # test_args
                   3,         # iterations
                   False,     # rm_chroot_tmp
                   "record -e cycles",   # perf_args
                   "telemetry", # suite
                   False)     # show_all_results
    self.assertTrue(b3.show_all_results)

    # Check to see if the args to Benchmark have changed since the last time
    # this test was updated.
    args_list = ['self', 'name', 'test_name', 'test_args', 'iterations',
                 'rm_chroot_tmp', 'perf_args', 'suite', 'show_all_results',
                 'retries', 'run_local']
    arg_spec = inspect.getargspec(Benchmark.__init__)
    self.assertEqual(len(arg_spec.args), len(args_list))
    for arg in args_list:
      self.assertIn (arg, arg_spec.args)


if __name__ == '__main__':
  unittest.main()
