#!/usr/bin/python2
#
# Copyright 2014 Google Inc.  All Rights Reserved
"""Unit tests for the Crosperf Benchmark class."""

from __future__ import print_function

import inspect
from benchmark import Benchmark

import unittest


class BenchmarkTestCase(unittest.TestCase):
  """Individual tests for the Benchmark class."""

  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
    self.assertTrue(b1.suite, 'telemetry_Crosperf')

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