xref: /aosp_15_r20/external/autotest/client/cros/faft/utils/flashrom_handler_unittest.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1#!/usr/bin/python3
2"""Unit tests for flashrom_handler.py."""
3
4import unittest
5from unittest import mock
6
7from autotest_lib.client.common_lib import autotemp
8from autotest_lib.client.cros.faft.utils import (os_interface,
9                                                 flashrom_handler)
10
11
12class TestFlashromHandler(unittest.TestCase):
13    """Tests for flashrom_handler.FlashromHandler()"""
14
15    def setUp(self):
16        self._tempdir = autotemp.tempdir(unique_id='flashrom_handler_test')
17        self.addCleanup(self._tempdir.clean)
18
19        self.os_if = os_interface.OSInterface(
20                self._tempdir.name, test_mode=True)
21        self.flashrom_handler = flashrom_handler.FlashromHandler(self.os_if)
22
23        self.good_flashrom = mock.Mock()
24        attrs = {
25                'communicate.return_value':
26                (b'working flashrom stdout', b'working flashrom stderr')
27        }
28        self.good_flashrom.configure_mock(**attrs)
29        self.good_flashrom.returncode = 0
30
31        self.bad_flashrom = mock.Mock()
32        attrs = {
33                'communicate.return_value':
34                (b'broken flashrom stdout', b'broken flashrom stderr')
35        }
36        self.bad_flashrom.configure_mock(**attrs)
37        self.bad_flashrom.returncode = 1
38
39    @mock.patch('subprocess.Popen')
40    def testHandlerUnavailable(self, mock_subproc_popen):
41        """Failing flashrom check should mark the handler unavailable"""
42
43        mock_subproc_popen.return_value = self.bad_flashrom
44        self.assertFalse(self.flashrom_handler.is_available())
45
46    @mock.patch('subprocess.Popen')
47    def testHandlerUnavailableCached(self, mock_subproc_popen):
48        """Status of flashrom handler should be cached, and not rechecked"""
49
50        mock_subproc_popen.return_value = self.bad_flashrom
51        self.assertFalse(self.flashrom_handler.is_available())
52
53        mock_subproc_popen.return_value = self.good_flashrom
54        self.assertFalse(self.flashrom_handler.is_available())
55
56        mock_subproc_popen.assert_called_once()
57
58    @mock.patch('subprocess.Popen')
59    def testHandlerAvailable(self, mock_subproc_popen):
60        """Successful flashrom check should mark the handler available"""
61
62        mock_subproc_popen.return_value = self.good_flashrom
63        self.assertTrue(self.flashrom_handler.is_available())
64
65    @mock.patch('subprocess.Popen')
66    def testHandlerAvailableCached(self, mock_subproc_popen):
67        """Status of flashrom handler should be cached, and not rechecked"""
68
69        mock_subproc_popen.return_value = self.good_flashrom
70        self.assertTrue(self.flashrom_handler.is_available())
71
72        mock_subproc_popen.return_value = self.bad_flashrom
73        self.assertTrue(self.flashrom_handler.is_available())
74
75        mock_subproc_popen.assert_called_once()
76
77if __name__ == '__main__':
78    unittest.main()
79