#!/usr/bin/python3
"""Unit tests for flashrom_handler.py."""

import mock
import unittest

from autotest_lib.client.common_lib import autotemp
from autotest_lib.client.cros.faft.utils import (os_interface,
                                                 flashrom_handler)


class TestFlashromHandler(unittest.TestCase):
    """Tests for flashrom_handler.FlashromHandler()"""

    def setUp(self):
        self._tempdir = autotemp.tempdir(unique_id='flashrom_handler_test')
        self.addCleanup(self._tempdir.clean)

        self.os_if = os_interface.OSInterface(
                self._tempdir.name, test_mode=True)
        self.flashrom_handler = flashrom_handler.FlashromHandler(self.os_if)

        self.good_flashrom = mock.Mock()
        attrs = {
                'communicate.return_value':
                ('working flashrom stdout', 'working flashrom stderr')
        }
        self.good_flashrom.configure_mock(**attrs)
        self.good_flashrom.returncode = 0

        self.bad_flashrom = mock.Mock()
        attrs = {
                'communicate.return_value':
                ('broken flashrom stdout', 'broken flashrom stderr')
        }
        self.bad_flashrom.configure_mock(**attrs)
        self.bad_flashrom.returncode = 1

    @mock.patch('subprocess.Popen')
    def testHandlerUnavailable(self, mock_subproc_popen):
        """Failing flashrom check should mark the handler unavailable"""

        mock_subproc_popen.return_value = self.bad_flashrom
        self.assertFalse(self.flashrom_handler.is_available())

    @mock.patch('subprocess.Popen')
    def testHandlerUnavailableCached(self, mock_subproc_popen):
        """Status of flashrom handler should be cached, and not rechecked"""

        mock_subproc_popen.return_value = self.bad_flashrom
        self.assertFalse(self.flashrom_handler.is_available())

        mock_subproc_popen.return_value = self.good_flashrom
        self.assertFalse(self.flashrom_handler.is_available())

        mock_subproc_popen.assert_called_once()

    @mock.patch('subprocess.Popen')
    def testHandlerAvailable(self, mock_subproc_popen):
        """Successful flashrom check should mark the handler available"""

        mock_subproc_popen.return_value = self.good_flashrom
        self.assertTrue(self.flashrom_handler.is_available())

    @mock.patch('subprocess.Popen')
    def testHandlerAvailableCached(self, mock_subproc_popen):
        """Status of flashrom handler should be cached, and not rechecked"""

        mock_subproc_popen.return_value = self.good_flashrom
        self.assertTrue(self.flashrom_handler.is_available())

        mock_subproc_popen.return_value = self.bad_flashrom
        self.assertTrue(self.flashrom_handler.is_available())

        mock_subproc_popen.assert_called_once()

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