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

"""Tests for cros_uprevchrome."""

from __future__ import print_function

import mock
import time
import copy

from chromite.lib import cidb
from chromite.lib import fake_cidb
from chromite.lib import constants
from chromite.lib import cros_test_lib
from chromite.lib import git
from chromite.lib.buildstore import FakeBuildStore
from chromite.cli import command_unittest
from chromite.cli.cros import cros_pinchrome
from chromite.cli.cros import cros_uprevchrome

class MockUprevCommand(command_unittest.MockCommand):
  """Mock out the uprevchrome command."""
  TARGET = 'chromite.cli.cros.cros_uprevchrome.UprevChromeCommand'
  TARGET_CLASS = cros_uprevchrome.UprevChromeCommand
  COMMAND = 'uprevchrome'

  def __init__(self, *args, **kwargs):
    command_unittest.MockCommand.__init__(self, *args, **kwargs)

  def Run(self, inst):
    command_unittest.MockCommand.Run(self, inst)

class CrosUprevChromeTest(cros_test_lib.MockTempDirTestCase,
                          cros_test_lib.OutputTestCase):
  """Test for cros uprevchrome."""
  cmd_args = ['--pfq-build=100',
              '--fake-buildstore=True',
              '--bug=100']
  mock_pfq_info = {'id': '100',
                   'status': constants.BUILDER_STATUS_FAILED,
                   'build_number': '100',
                   'start_time': time.time(),
                   'build_config': constants.PFQ_MASTER}

  def SetupCommandMock(self, cmd_args):
    """Setup comand mock."""
    self.cmd_mock = MockUprevCommand(cmd_args)
    self.StartPatcher(self.cmd_mock)

  def setUp(self):
    """Patches objects."""
    self.cmd_mock = None
    cidb.CIDBConnection.__init__ = mock.Mock(return_value=None)
    self.PatchObject(cros_pinchrome, 'CloneWorkingRepo')
    self.PatchObject(git, 'RunGit')
    FakeBuildStore.GetBuildStatuses = mock.Mock(
        return_value=[self.mock_pfq_info])
    list_history = []
    cidb.CIDBConnection.GetBuildHistory = mock.Mock(
        return_value=list_history)
    self.PatchObject(git, 'Commit', return_value='change_id')

  def testValidatePFQBuild(self):
    """Test ValidatePFQBuild."""
    self.SetupCommandMock(self.cmd_args)
    db = cidb.CIDBConnection('cred_dir')
    buildstore = FakeBuildStore(db)
    self.assertEqual('100', self.cmd_mock.inst.ValidatePFQBuild(100,
                                                                buildstore))

  def testPassedPFQBuildId(self):
    """Test a passed PFQ build_id"""
    self.SetupCommandMock(self.cmd_args)
    local_mock_pfq_info = copy.deepcopy(self.mock_pfq_info)
    local_mock_pfq_info['status'] = constants.BUILDER_STATUS_PASSED
    FakeBuildStore.GetBuildStatuses = mock.Mock(
        return_value=[local_mock_pfq_info])
    self.assertRaises(cros_uprevchrome.InvalidPFQBuildIdExcpetion,
                      self.cmd_mock.inst.Run)

  def testPassedPFQBuildHistory(self):
    """Test a failed PFQ build_id with one followed PFQ which is passed."""
    self.SetupCommandMock(self.cmd_args)
    pass_list_history = [{'id': '101',
                          'status': constants.BUILDER_STATUS_PASSED}]
    fake_cidb.FakeCIDBConnection.GetBuildHistory = mock.Mock(
        return_value=pass_list_history)
    self.assertRaises(cros_uprevchrome.InvalidPFQBuildIdExcpetion,
                      self.cmd_mock.inst.Run)

  def testPassedPFQBuildHistory2(self):
    """Test a failed PFQ build_id with two followed PFQs, one is passed."""
    self.SetupCommandMock(self.cmd_args)
    pass_list_history = [{'id': '101',
                          'status': constants.BUILDER_STATUS_FAILED},
                         {'id': '102',
                          'status': constants.BUILDER_STATUS_PASSED}]
    fake_cidb.FakeCIDBConnection.GetBuildHistory = mock.Mock(
        return_value=pass_list_history)
    self.assertRaises(cros_uprevchrome.InvalidPFQBuildIdExcpetion,
                      self.cmd_mock.inst.Run)

  def testNoChangeIdCommitLogs(self):
    """Test commit logs without ChangeIds."""
    self.SetupCommandMock(self.cmd_args)
    self.PatchObject(git, 'Commit', return_value=None)
    self.assertRaises(Exception, self.cmd_mock.inst.Run)

  def testSuccessfulRun(self):
    """Test a successful uprevchrome run."""
    self.SetupCommandMock(self.cmd_args)
    fake_cidb.FakeCIDBConnection.GetBuildHistory = mock.Mock(
        return_value=[])
    self.cmd_mock.inst.Run()
