#!/usr/bin/env python
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import unittest
import mock
import common
from autotest_lib.server.cros.dynamic_suite import reporting
from autotest_lib.site_utils import diagnosis_utils


class DiagnosisUtilsTest(unittest.TestCase):
    """Tests for diagnosis_utils."""

    def setUp(self):
        """Set up test."""
        self.afe_mock = mock.MagicMock()
        reporting.Reporter.__init__ = mock.Mock(return_value=None)
        reporting.Reporter.report = mock.Mock(return_value=(None, 0))

    def _constructRPCHelper(self):
        """Method to construct RPCHelper"""
        return diagnosis_utils.RPCHelper(self.afe_mock)

    def _mockZeroHost(self):
        """Mock method to return zero host"""
        return ()

    def _mockTwoAvailableHosts(self):
        """Mock method to return two available hosts"""
        host_a = mock.MagicMock(status='Ready', locked=False)
        host_b = mock.MagicMock(status='Ready', locked=False)
        return (host_a, host_b)

    def _mockTwoFailedHosts(self):
        """Mock method to return two unavailable hosts"""
        host_a = mock.MagicMock(status='Repair Failed', locked=False)
        host_b = mock.MagicMock(status='Repairing', locked=False)
        return (host_a, host_b)

    def testCheckDutAvailable(self):
        """Test check_dut_availability with different scenarios"""
        rpc_helper = self._constructRPCHelper()
        board = 'test_board'
        pool = 'test_pool'

        # Mock aef.get_hosts to return 0 host
        self.afe_mock.get_hosts.return_value = self._mockZeroHost()
        skip_duts_check = False

        # When minimum_duts is 0, do not force available DUTs
        minimum_duts = 0
        rpc_helper.check_dut_availability(board, pool,
                                          minimum_duts=minimum_duts,
                                          skip_duts_check=skip_duts_check)

        # When skip_duts_check = False and minimum_duts > 0 and there's no host,
        # should raise BoardNotAvailableError
        minimum_duts = 1
        with self.assertRaises(diagnosis_utils.BoardNotAvailableError):
            rpc_helper.check_dut_availability(board, pool,
                                              minimum_duts=minimum_duts,
                                              skip_duts_check=skip_duts_check)

        # Mock aef.get_hosts to return 2 available hosts
        self.afe_mock.get_hosts.return_value = self._mockTwoAvailableHosts()

        # Set skip_duts_check to True, should not force checking avialble DUTs
        # although available DUTs are less then minimum_duts
        minimum_duts = 4
        skip_duts_check = True
        rpc_helper.check_dut_availability(board, pool,
                                          minimum_duts=minimum_duts,
                                          skip_duts_check=skip_duts_check)

        # Set skip_duts_check to False and current available DUTs are less
        # then minimum_duts, should raise NotEnoughDutsError
        skip_duts_check = False
        with self.assertRaises(diagnosis_utils.NotEnoughDutsError):
            rpc_helper.check_dut_availability(board, pool,
                                              minimum_duts=minimum_duts,
                                              skip_duts_check=skip_duts_check)

        # When skip_duts_check is False and current available DUTs
        # satisfy minimum_duts, no errors
        minimum_duts = 2
        rpc_helper.check_dut_availability(board, pool,
                                          minimum_duts=minimum_duts,
                                          skip_duts_check=skip_duts_check)

        # Mock aef.get_hosts to return 2 failed hosts
        self.afe_mock.get_hosts.return_value = self._mockTwoFailedHosts()

        # When skip_duts_check is False and the two hosts are not available,
        # should raise NotEnoughDutsError
        with self.assertRaises(diagnosis_utils.NotEnoughDutsError):
            rpc_helper.check_dut_availability(board, pool,
                                              minimum_duts=minimum_duts,
                                              skip_duts_check=skip_duts_check)

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