#!/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()
