"""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()
