# -*- coding: utf-8 -*-
# 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.

"""This module tests the cros bisect command."""

from __future__ import print_function

import argparse
import sys

from chromite.cros_bisect import autotest_evaluator
from chromite.cros_bisect import git_bisector
from chromite.cros_bisect import simple_chrome_builder
from chromite.cli.cros import cros_bisect
from chromite.lib import commandline
from chromite.lib import cros_test_lib
from chromite.lib import remote_access

pytestmark = cros_test_lib.pytestmark_inside_only


assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'


class CrosBisectTest(cros_test_lib.MockTestCase):
  """Test BisectCommand."""
  DEFAULT_ARGS = ['--good', '900d900d', '--bad', 'badbad', '--remote',
                  '192.168.0.11', '--base-dir', '/tmp/bisect']

  def setUp(self):
    self.parser = commandline.ArgumentParser()
    cros_bisect.BisectCommand.AddParser(self.parser)

  def testAddParser(self):
    # Use commandline.ArgumentParser to get 'path' type support.
    options = self.parser.parse_args(self.DEFAULT_ARGS)
    self.assertTrue(
        simple_chrome_builder.SimpleChromeBuilder.SanityCheckOptions(options))
    self.assertTrue(
        autotest_evaluator.AutotestEvaluator.SanityCheckOptions(options))
    self.assertTrue(
        git_bisector.GitBisector.SanityCheckOptions(options))

  def testRun(self):
    options = self.parser.parse_args(self.DEFAULT_ARGS + ['--board', 'test'])

    self.PatchObject(simple_chrome_builder.SimpleChromeBuilder, '__init__',
                     return_value=None)
    self.PatchObject(autotest_evaluator.AutotestEvaluator, '__init__',
                     return_value=None)
    self.PatchObject(git_bisector.GitBisector, '__init__',
                     return_value=None)
    self.PatchObject(git_bisector.GitBisector, 'SetUp')
    self.PatchObject(git_bisector.GitBisector, 'Run')

    bisector = cros_bisect.BisectCommand(options)
    bisector.Run()

  def testProcessOptionsReuseFlag(self):
    args_with_board = self.DEFAULT_ARGS + ['--board', 'test']
    options = self.parser.parse_args(self.DEFAULT_ARGS)
    options = self.parser.parse_args(args_with_board)
    bisector = cros_bisect.BisectCommand(options)
    bisector.ProcessOptions()
    self.assertFalse(bisector.options.reuse_repo)
    self.assertFalse(bisector.options.reuse_build)
    self.assertFalse(bisector.options.reuse_eval)

    # Flip --reuse.
    options = self.parser.parse_args(args_with_board + ['--reuse'])
    bisector = cros_bisect.BisectCommand(options)
    bisector.ProcessOptions()
    self.assertTrue(bisector.options.reuse_repo)
    self.assertTrue(bisector.options.reuse_build)
    self.assertTrue(bisector.options.reuse_eval)

  def testProcessOptionsResolveBoard(self):
    # No --board specified.
    options = self.parser.parse_args(self.DEFAULT_ARGS)

    self.PatchObject(remote_access, 'ChromiumOSDevice',
                     return_value=cros_test_lib.EasyAttr(board='test_board'))
    bisector = cros_bisect.BisectCommand(options)
    bisector.ProcessOptions()
    self.assertEqual('test_board', bisector.options.board)

  def testProcessOptionsResolveBoardFailed(self):
    # No --board specified.
    options = self.parser.parse_args(self.DEFAULT_ARGS)

    self.PatchObject(remote_access, 'ChromiumOSDevice',
                     return_value=cros_test_lib.EasyAttr(board=''))
    bisector = cros_bisect.BisectCommand(options)
    self.assertRaisesRegex(Exception, 'Unable to obtain board name from DUT',
                           bisector.ProcessOptions)

  def testGoodBadCommitType(self):
    """Tests GoodBadCommitType."""
    sha1 = '900d900d'
    self.assertEqual(sha1, cros_bisect.GoodBadCommitType(sha1))

    not_sha1 = 'bad_sha1'
    self.assertRaises(argparse.ArgumentTypeError,
                      cros_bisect.GoodBadCommitType,
                      not_sha1)

    cros_version = 'R60-9531.0.0'
    self.assertEqual(cros_version, cros_bisect.GoodBadCommitType(cros_version))

    cros_version_variant = '60.9531.0.0'
    self.assertEqual(cros_version,
                     cros_bisect.GoodBadCommitType(cros_version_variant))

    not_cros_version = '91.3.3'
    self.assertRaises(argparse.ArgumentTypeError,
                      cros_bisect.GoodBadCommitType,
                      not_cros_version)
