"""Unit tests for saft_flashrom_util.py."""

import mock
import StringIO
import unittest

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


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 ShellError if flashrom is broken"""

        bad_flashrom = mock.Mock()
        bad_flashrom.stdout = StringIO.StringIO('broken flashrom stdout')
        bad_flashrom.stderr = StringIO.StringIO('broken flashrom stderr')
        bad_flashrom.returncode = 1

        mock_subproc_popen.return_value = bad_flashrom
        with self.assertRaises(shell_wrapper.ShellError):
            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()
        good_flashrom.stdout = StringIO.StringIO('working flashrom stdout')
        good_flashrom.stderr = StringIO.StringIO('working flashrom stderr')
        good_flashrom.returncode = 0

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


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