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

import mock
import unittest

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


class TestFlashromUtil(unittest.TestCase):
    """Tests for saft_flashrom_util.flashrom_util()."""

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

        self.os_if = os_interface.OSInterface(
                self._tempdir.name, test_mode=True)
        self.flashrom_util = saft_flashrom_util.flashrom_util(self.os_if)

    @mock.patch('subprocess.Popen')
    def testTargetIsBroken(self, mock_subproc_popen):
        """check_target should raise error.CmdError if flashrom is broken"""

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

        mock_subproc_popen.return_value = bad_flashrom
        with self.assertRaises(error.CmdError):
            self.flashrom_util.check_target()

    @mock.patch('subprocess.Popen')
    def testTargetIsNotBroken(self, mock_subproc_popen):
        """check_target should return True if flashrom is working"""

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

        mock_subproc_popen.return_value = good_flashrom
        self.assertTrue(self.flashrom_util.check_target())


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