#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Copyright 2014 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unittest for crosperf."""


import argparse
import io
import tempfile
import unittest
import unittest.mock as mock

import crosperf
import experiment_file
import settings_factory


EXPERIMENT_FILE_1 = """
  board: x86-alex
  remote: chromeos-alex3
  locks_dir: /tmp
  perf_args: record -a -e cycles
  benchmark: PageCycler {
    iterations: 3
  }

  image1 {
    chromeos_image: /usr/local/google/cros_image1.bin
  }

  image2 {
    remote: chromeos-lumpy1
    chromeos_image: /usr/local/google/cros_image2.bin
  }
  """


class CrosperfTest(unittest.TestCase):
    """Crosperf test class."""

    def setUp(self):
        input_file = io.StringIO(EXPERIMENT_FILE_1)
        self.exp_file = experiment_file.ExperimentFile(input_file)

    def testDryRun(self):
        with tempfile.NamedTemporaryFile("w", encoding="utf-8") as f:
            f.write(EXPERIMENT_FILE_1)
            f.flush()
            crosperf.Main(["", f.name, "--dry_run"])

    def testConvertOptionsToSettings(self):
        parser = argparse.ArgumentParser()
        parser.add_argument(
            "-l",
            "--log_dir",
            dest="log_dir",
            default="",
            help="The log_dir, default is under " "<crosperf_logs>/logs",
        )
        crosperf.SetupParserOptions(parser)
        argv = ["crosperf/crosperf.py", "temp.exp", "--rerun=True"]
        options, _ = parser.parse_known_args(argv)
        settings = crosperf.ConvertOptionsToSettings(options)
        self.assertIsNotNone(settings)
        self.assertIsInstance(settings, settings_factory.GlobalSettings)
        self.assertEqual(len(settings.fields), 40)
        self.assertTrue(settings.GetField("rerun"))
        argv = ["crosperf/crosperf.py", "temp.exp"]
        options, _ = parser.parse_known_args(argv)
        settings = crosperf.ConvertOptionsToSettings(options)
        self.assertFalse(settings.GetField("rerun"))

    def testExceptionPrintTraceback(self):
        """Test the main function can print traceback in exception."""

        def mock_RunCrosperf(*_args, **_kwargs):
            return 10 / 0

        with mock.patch("crosperf.RunCrosperf", new=mock_RunCrosperf):
            with self.assertRaises(ZeroDivisionError) as context:
                crosperf.Main([])
            self.assertEqual("division by zero", str(context.exception))


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