xref: /aosp_15_r20/external/toolchain-utils/crosperf/machine_manager_unittest.py (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
1*760c253cSXin Li#!/usr/bin/env python3
2*760c253cSXin Li# -*- coding: utf-8 -*-
3*760c253cSXin Li
4*760c253cSXin Li# Copyright 2012 The ChromiumOS Authors
5*760c253cSXin Li# Use of this source code is governed by a BSD-style license that can be
6*760c253cSXin Li# found in the LICENSE file.
7*760c253cSXin Li
8*760c253cSXin Li"""Unittest for machine_manager."""
9*760c253cSXin Li
10*760c253cSXin Li
11*760c253cSXin Liimport hashlib
12*760c253cSXin Liimport os.path
13*760c253cSXin Liimport time
14*760c253cSXin Liimport unittest
15*760c253cSXin Liimport unittest.mock as mock
16*760c253cSXin Li
17*760c253cSXin Lifrom benchmark import Benchmark
18*760c253cSXin Lifrom benchmark_run import MockBenchmarkRun
19*760c253cSXin Lifrom cros_utils import command_executer
20*760c253cSXin Lifrom cros_utils import logger
21*760c253cSXin Liimport image_checksummer
22*760c253cSXin Liimport label
23*760c253cSXin Liimport machine_manager
24*760c253cSXin Liimport test_flag
25*760c253cSXin Li
26*760c253cSXin Li
27*760c253cSXin Li# pylint: disable=protected-access
28*760c253cSXin Li
29*760c253cSXin Li
30*760c253cSXin Liclass MyMachineManager(machine_manager.MachineManager):
31*760c253cSXin Li    """Machine manager for test."""
32*760c253cSXin Li
33*760c253cSXin Li    def __init__(self, chromeos_root):
34*760c253cSXin Li        super(MyMachineManager, self).__init__(chromeos_root, 0, "average", "")
35*760c253cSXin Li
36*760c253cSXin Li    def _TryToLockMachine(self, cros_machine):
37*760c253cSXin Li        self._machines.append(cros_machine)
38*760c253cSXin Li        cros_machine.checksum = ""
39*760c253cSXin Li
40*760c253cSXin Li    def AddMachine(self, machine_name):
41*760c253cSXin Li        with self._lock:
42*760c253cSXin Li            for m in self._all_machines:
43*760c253cSXin Li                assert m.name != machine_name, (
44*760c253cSXin Li                    "Tried to double-add %s" % machine_name
45*760c253cSXin Li                )
46*760c253cSXin Li            cm = machine_manager.MockCrosMachine(
47*760c253cSXin Li                machine_name, self.chromeos_root, "average"
48*760c253cSXin Li            )
49*760c253cSXin Li            assert cm.machine_checksum, (
50*760c253cSXin Li                "Could not find checksum for machine %s" % machine_name
51*760c253cSXin Li            )
52*760c253cSXin Li            self._all_machines.append(cm)
53*760c253cSXin Li
54*760c253cSXin Li
55*760c253cSXin LiCHROMEOS_ROOT = "/tmp/chromeos-root"
56*760c253cSXin LiMACHINE_NAMES = ["lumpy1", "lumpy2", "lumpy3", "daisy1", "daisy2"]
57*760c253cSXin LiLABEL_LUMPY = label.MockLabel(
58*760c253cSXin Li    "lumpy",
59*760c253cSXin Li    "build",
60*760c253cSXin Li    "lumpy_chromeos_image",
61*760c253cSXin Li    "autotest_dir",
62*760c253cSXin Li    "debug_dir",
63*760c253cSXin Li    CHROMEOS_ROOT,
64*760c253cSXin Li    "lumpy",
65*760c253cSXin Li    ["lumpy1", "lumpy2", "lumpy3", "lumpy4"],
66*760c253cSXin Li    "",
67*760c253cSXin Li    "",
68*760c253cSXin Li    False,
69*760c253cSXin Li    "average",
70*760c253cSXin Li    "gcc",
71*760c253cSXin Li    False,
72*760c253cSXin Li    None,
73*760c253cSXin Li)
74*760c253cSXin LiLABEL_MIX = label.MockLabel(
75*760c253cSXin Li    "mix",
76*760c253cSXin Li    "build",
77*760c253cSXin Li    "chromeos_image",
78*760c253cSXin Li    "autotest_dir",
79*760c253cSXin Li    "debug_dir",
80*760c253cSXin Li    CHROMEOS_ROOT,
81*760c253cSXin Li    "mix",
82*760c253cSXin Li    ["daisy1", "daisy2", "lumpy3", "lumpy4"],
83*760c253cSXin Li    "",
84*760c253cSXin Li    "",
85*760c253cSXin Li    False,
86*760c253cSXin Li    "average",
87*760c253cSXin Li    "gcc",
88*760c253cSXin Li    False,
89*760c253cSXin Li    None,
90*760c253cSXin Li)
91*760c253cSXin Li
92*760c253cSXin Li
93*760c253cSXin Liclass MachineManagerTest(unittest.TestCase):
94*760c253cSXin Li    """Test for machine manager class."""
95*760c253cSXin Li
96*760c253cSXin Li    msgs = []
97*760c253cSXin Li    image_log = []
98*760c253cSXin Li    log_fatal_msgs = []
99*760c253cSXin Li    fake_logger_count = 0
100*760c253cSXin Li    fake_logger_msgs = []
101*760c253cSXin Li
102*760c253cSXin Li    mock_cmd_exec = mock.Mock(spec=command_executer.CommandExecuter)
103*760c253cSXin Li
104*760c253cSXin Li    mock_logger = mock.Mock(spec=logger.Logger)
105*760c253cSXin Li
106*760c253cSXin Li    mock_lumpy1 = mock.Mock(spec=machine_manager.CrosMachine)
107*760c253cSXin Li    mock_lumpy2 = mock.Mock(spec=machine_manager.CrosMachine)
108*760c253cSXin Li    mock_lumpy3 = mock.Mock(spec=machine_manager.CrosMachine)
109*760c253cSXin Li    mock_lumpy4 = mock.Mock(spec=machine_manager.CrosMachine)
110*760c253cSXin Li    mock_daisy1 = mock.Mock(spec=machine_manager.CrosMachine)
111*760c253cSXin Li    mock_daisy2 = mock.Mock(spec=machine_manager.CrosMachine)
112*760c253cSXin Li
113*760c253cSXin Li    @mock.patch.object(os.path, "isdir")
114*760c253cSXin Li
115*760c253cSXin Li    # pylint: disable=arguments-differ
116*760c253cSXin Li    def setUp(self, mock_isdir):
117*760c253cSXin Li
118*760c253cSXin Li        mock_isdir.return_value = True
119*760c253cSXin Li        self.mm = machine_manager.MachineManager(
120*760c253cSXin Li            "/usr/local/chromeos",
121*760c253cSXin Li            0,
122*760c253cSXin Li            "average",
123*760c253cSXin Li            None,
124*760c253cSXin Li            self.mock_cmd_exec,
125*760c253cSXin Li            self.mock_logger,
126*760c253cSXin Li        )
127*760c253cSXin Li
128*760c253cSXin Li        self.mock_lumpy1.name = "lumpy1"
129*760c253cSXin Li        self.mock_lumpy2.name = "lumpy2"
130*760c253cSXin Li        self.mock_lumpy3.name = "lumpy3"
131*760c253cSXin Li        self.mock_lumpy4.name = "lumpy4"
132*760c253cSXin Li        self.mock_daisy1.name = "daisy1"
133*760c253cSXin Li        self.mock_daisy2.name = "daisy2"
134*760c253cSXin Li        self.mock_lumpy1.machine_checksum = "lumpy123"
135*760c253cSXin Li        self.mock_lumpy2.machine_checksum = "lumpy123"
136*760c253cSXin Li        self.mock_lumpy3.machine_checksum = "lumpy123"
137*760c253cSXin Li        self.mock_lumpy4.machine_checksum = "lumpy123"
138*760c253cSXin Li        self.mock_daisy1.machine_checksum = "daisy12"
139*760c253cSXin Li        self.mock_daisy2.machine_checksum = "daisy12"
140*760c253cSXin Li        self.mock_lumpy1.checksum_string = "lumpy_checksum_str"
141*760c253cSXin Li        self.mock_lumpy2.checksum_string = "lumpy_checksum_str"
142*760c253cSXin Li        self.mock_lumpy3.checksum_string = "lumpy_checksum_str"
143*760c253cSXin Li        self.mock_lumpy4.checksum_string = "lumpy_checksum_str"
144*760c253cSXin Li        self.mock_daisy1.checksum_string = "daisy_checksum_str"
145*760c253cSXin Li        self.mock_daisy2.checksum_string = "daisy_checksum_str"
146*760c253cSXin Li        self.mock_lumpy1.cpuinfo = "lumpy_cpu_info"
147*760c253cSXin Li        self.mock_lumpy2.cpuinfo = "lumpy_cpu_info"
148*760c253cSXin Li        self.mock_lumpy3.cpuinfo = "lumpy_cpu_info"
149*760c253cSXin Li        self.mock_lumpy4.cpuinfo = "lumpy_cpu_info"
150*760c253cSXin Li        self.mock_daisy1.cpuinfo = "daisy_cpu_info"
151*760c253cSXin Li        self.mock_daisy2.cpuinfo = "daisy_cpu_info"
152*760c253cSXin Li        self.mm._all_machines.append(self.mock_daisy1)
153*760c253cSXin Li        self.mm._all_machines.append(self.mock_daisy2)
154*760c253cSXin Li        self.mm._all_machines.append(self.mock_lumpy1)
155*760c253cSXin Li        self.mm._all_machines.append(self.mock_lumpy2)
156*760c253cSXin Li        self.mm._all_machines.append(self.mock_lumpy3)
157*760c253cSXin Li
158*760c253cSXin Li    def testGetMachines(self):
159*760c253cSXin Li        manager = MyMachineManager(CHROMEOS_ROOT)
160*760c253cSXin Li        for m in MACHINE_NAMES:
161*760c253cSXin Li            manager.AddMachine(m)
162*760c253cSXin Li        names = [m.name for m in manager.GetMachines(LABEL_LUMPY)]
163*760c253cSXin Li        self.assertEqual(names, ["lumpy1", "lumpy2", "lumpy3"])
164*760c253cSXin Li
165*760c253cSXin Li    def testGetAvailableMachines(self):
166*760c253cSXin Li        manager = MyMachineManager(CHROMEOS_ROOT)
167*760c253cSXin Li        for m in MACHINE_NAMES:
168*760c253cSXin Li            manager.AddMachine(m)
169*760c253cSXin Li        for m in manager._all_machines:
170*760c253cSXin Li            if int(m.name[-1]) % 2:
171*760c253cSXin Li                manager._TryToLockMachine(m)
172*760c253cSXin Li        names = [m.name for m in manager.GetAvailableMachines(LABEL_LUMPY)]
173*760c253cSXin Li        self.assertEqual(names, ["lumpy1", "lumpy3"])
174*760c253cSXin Li
175*760c253cSXin Li    @mock.patch.object(time, "sleep")
176*760c253cSXin Li    @mock.patch.object(command_executer.CommandExecuter, "RunCommand")
177*760c253cSXin Li    @mock.patch.object(command_executer.CommandExecuter, "CrosRunCommand")
178*760c253cSXin Li    @mock.patch.object(image_checksummer.ImageChecksummer, "Checksum")
179*760c253cSXin Li    def test_image_machine(
180*760c253cSXin Li        self, mock_checksummer, mock_run_croscmd, mock_run_cmd, mock_sleep
181*760c253cSXin Li    ):
182*760c253cSXin Li        def FakeMD5Checksum(_input_str):
183*760c253cSXin Li            return "machine_fake_md5_checksum"
184*760c253cSXin Li
185*760c253cSXin Li        self.fake_logger_count = 0
186*760c253cSXin Li        self.fake_logger_msgs = []
187*760c253cSXin Li
188*760c253cSXin Li        def FakeLogOutput(msg):
189*760c253cSXin Li            self.fake_logger_count += 1
190*760c253cSXin Li            self.fake_logger_msgs.append(msg)
191*760c253cSXin Li
192*760c253cSXin Li        def ResetValues():
193*760c253cSXin Li            self.fake_logger_count = 0
194*760c253cSXin Li            self.fake_logger_msgs = []
195*760c253cSXin Li            mock_run_cmd.reset_mock()
196*760c253cSXin Li            mock_run_croscmd.reset_mock()
197*760c253cSXin Li            mock_checksummer.reset_mock()
198*760c253cSXin Li            mock_sleep.reset_mock()
199*760c253cSXin Li            machine.checksum = "fake_md5_checksum"
200*760c253cSXin Li            self.mm.checksum = None
201*760c253cSXin Li            self.mm.num_reimages = 0
202*760c253cSXin Li
203*760c253cSXin Li        self.mock_cmd_exec.CrosRunCommand = mock_run_croscmd
204*760c253cSXin Li        self.mock_cmd_exec.RunCommand = mock_run_cmd
205*760c253cSXin Li
206*760c253cSXin Li        self.mm.logger.LogOutput = FakeLogOutput
207*760c253cSXin Li        machine = self.mock_lumpy1
208*760c253cSXin Li        machine._GetMD5Checksum = FakeMD5Checksum
209*760c253cSXin Li        machine.checksum = "fake_md5_checksum"
210*760c253cSXin Li        mock_checksummer.return_value = "fake_md5_checksum"
211*760c253cSXin Li        self.mock_cmd_exec.log_level = "verbose"
212*760c253cSXin Li
213*760c253cSXin Li        test_flag.SetTestMode(True)
214*760c253cSXin Li        # Test 1: label.image_type == "local"
215*760c253cSXin Li        LABEL_LUMPY.image_type = "local"
216*760c253cSXin Li        self.mm.ImageMachine(machine, LABEL_LUMPY)
217*760c253cSXin Li        self.assertEqual(mock_run_cmd.call_count, 0)
218*760c253cSXin Li        self.assertEqual(mock_run_croscmd.call_count, 0)
219*760c253cSXin Li
220*760c253cSXin Li        # Test 2: label.image_type == "trybot"
221*760c253cSXin Li        ResetValues()
222*760c253cSXin Li        LABEL_LUMPY.image_type = "trybot"
223*760c253cSXin Li        mock_run_cmd.return_value = 0
224*760c253cSXin Li        self.mm.ImageMachine(machine, LABEL_LUMPY)
225*760c253cSXin Li        self.assertEqual(mock_run_croscmd.call_count, 0)
226*760c253cSXin Li        self.assertEqual(mock_checksummer.call_count, 0)
227*760c253cSXin Li
228*760c253cSXin Li        # Test 3: label.image_type is neither local nor trybot; retval from
229*760c253cSXin Li        # RunCommand is 1, i.e. image_chromeos fails...
230*760c253cSXin Li        ResetValues()
231*760c253cSXin Li        LABEL_LUMPY.image_type = "other"
232*760c253cSXin Li        mock_run_cmd.return_value = 1
233*760c253cSXin Li        try:
234*760c253cSXin Li            self.mm.ImageMachine(machine, LABEL_LUMPY)
235*760c253cSXin Li        except RuntimeError:
236*760c253cSXin Li            self.assertEqual(mock_checksummer.call_count, 0)
237*760c253cSXin Li            self.assertEqual(mock_run_cmd.call_count, 2)
238*760c253cSXin Li            self.assertEqual(mock_run_croscmd.call_count, 1)
239*760c253cSXin Li            self.assertEqual(mock_sleep.call_count, 1)
240*760c253cSXin Li            image_call_args_str = mock_run_cmd.call_args[0][0]
241*760c253cSXin Li            image_call_args = image_call_args_str.split(" ")
242*760c253cSXin Li            self.assertEqual(image_call_args[0], "python")
243*760c253cSXin Li            self.assertEqual(
244*760c253cSXin Li                image_call_args[1].split("/")[-1], "image_chromeos.pyc"
245*760c253cSXin Li            )
246*760c253cSXin Li            image_call_args = image_call_args[2:]
247*760c253cSXin Li            self.assertEqual(
248*760c253cSXin Li                image_call_args,
249*760c253cSXin Li                [
250*760c253cSXin Li                    "--chromeos_root=/tmp/chromeos-root",
251*760c253cSXin Li                    "--image=lumpy_chromeos_image",
252*760c253cSXin Li                    "--image_args=",
253*760c253cSXin Li                    "--remote=lumpy1",
254*760c253cSXin Li                    "--logging_level=average",
255*760c253cSXin Li                    "--board=lumpy",
256*760c253cSXin Li                ],
257*760c253cSXin Li            )
258*760c253cSXin Li            self.assertEqual(mock_run_croscmd.call_args[0][0], "reboot && exit")
259*760c253cSXin Li
260*760c253cSXin Li        # Test 4: Everything works properly. Trybot image type.
261*760c253cSXin Li        ResetValues()
262*760c253cSXin Li        LABEL_LUMPY.image_type = "trybot"
263*760c253cSXin Li        mock_run_cmd.return_value = 0
264*760c253cSXin Li        self.mm.ImageMachine(machine, LABEL_LUMPY)
265*760c253cSXin Li        self.assertEqual(mock_checksummer.call_count, 0)
266*760c253cSXin Li        self.assertEqual(mock_run_croscmd.call_count, 0)
267*760c253cSXin Li        self.assertEqual(mock_sleep.call_count, 0)
268*760c253cSXin Li
269*760c253cSXin Li    def test_compute_common_checksum(self):
270*760c253cSXin Li        self.mm.machine_checksum = {}
271*760c253cSXin Li        self.mm.ComputeCommonCheckSum(LABEL_LUMPY)
272*760c253cSXin Li        self.assertEqual(self.mm.machine_checksum["lumpy"], "lumpy123")
273*760c253cSXin Li        self.assertEqual(len(self.mm.machine_checksum), 1)
274*760c253cSXin Li
275*760c253cSXin Li        self.mm.machine_checksum = {}
276*760c253cSXin Li        self.assertRaisesRegex(
277*760c253cSXin Li            machine_manager.BadChecksum,
278*760c253cSXin Li            r"daisy.*\n.*lumpy",
279*760c253cSXin Li            self.mm.ComputeCommonCheckSum,
280*760c253cSXin Li            LABEL_MIX,
281*760c253cSXin Li        )
282*760c253cSXin Li
283*760c253cSXin Li    def test_compute_common_checksum_string(self):
284*760c253cSXin Li        self.mm.machine_checksum_string = {}
285*760c253cSXin Li        self.mm.ComputeCommonCheckSumString(LABEL_LUMPY)
286*760c253cSXin Li        self.assertEqual(len(self.mm.machine_checksum_string), 1)
287*760c253cSXin Li        self.assertEqual(
288*760c253cSXin Li            self.mm.machine_checksum_string["lumpy"], "lumpy_checksum_str"
289*760c253cSXin Li        )
290*760c253cSXin Li
291*760c253cSXin Li        self.mm.machine_checksum_string = {}
292*760c253cSXin Li        self.mm.ComputeCommonCheckSumString(LABEL_MIX)
293*760c253cSXin Li        self.assertEqual(len(self.mm.machine_checksum_string), 1)
294*760c253cSXin Li        self.assertEqual(
295*760c253cSXin Li            self.mm.machine_checksum_string["mix"], "daisy_checksum_str"
296*760c253cSXin Li        )
297*760c253cSXin Li
298*760c253cSXin Li    @mock.patch.object(
299*760c253cSXin Li        command_executer.CommandExecuter, "CrosRunCommandWOutput"
300*760c253cSXin Li    )
301*760c253cSXin Li    def test_try_to_lock_machine(self, mock_cros_runcmd):
302*760c253cSXin Li        mock_cros_runcmd.return_value = [0, "false_lock_checksum", ""]
303*760c253cSXin Li        self.mock_cmd_exec.CrosRunCommandWOutput = mock_cros_runcmd
304*760c253cSXin Li        self.mm._machines = []
305*760c253cSXin Li        self.mm._TryToLockMachine(self.mock_lumpy1)
306*760c253cSXin Li        self.assertEqual(len(self.mm._machines), 1)
307*760c253cSXin Li        self.assertEqual(self.mm._machines[0], self.mock_lumpy1)
308*760c253cSXin Li        self.assertEqual(self.mock_lumpy1.checksum, "false_lock_checksum")
309*760c253cSXin Li        self.assertEqual(mock_cros_runcmd.call_count, 1)
310*760c253cSXin Li        cmd_str = mock_cros_runcmd.call_args[0][0]
311*760c253cSXin Li        self.assertEqual(cmd_str, "cat /usr/local/osimage_checksum_file")
312*760c253cSXin Li        args_dict = mock_cros_runcmd.call_args[1]
313*760c253cSXin Li        self.assertEqual(len(args_dict), 2)
314*760c253cSXin Li        self.assertEqual(args_dict["machine"], self.mock_lumpy1.name)
315*760c253cSXin Li        self.assertEqual(args_dict["chromeos_root"], "/usr/local/chromeos")
316*760c253cSXin Li
317*760c253cSXin Li    @mock.patch.object(machine_manager, "CrosMachine")
318*760c253cSXin Li    def test_add_machine(self, mock_machine):
319*760c253cSXin Li
320*760c253cSXin Li        mock_machine.machine_checksum = "daisy123"
321*760c253cSXin Li        self.assertEqual(len(self.mm._all_machines), 5)
322*760c253cSXin Li        self.mm.AddMachine("daisy3")
323*760c253cSXin Li        self.assertEqual(len(self.mm._all_machines), 6)
324*760c253cSXin Li
325*760c253cSXin Li        self.assertRaises(Exception, self.mm.AddMachine, "lumpy1")
326*760c253cSXin Li
327*760c253cSXin Li    def test_remove_machine(self):
328*760c253cSXin Li        self.mm._machines = self.mm._all_machines
329*760c253cSXin Li        self.assertTrue(self.mock_lumpy2 in self.mm._machines)
330*760c253cSXin Li        self.mm.RemoveMachine(self.mock_lumpy2.name)
331*760c253cSXin Li        self.assertFalse(self.mock_lumpy2 in self.mm._machines)
332*760c253cSXin Li
333*760c253cSXin Li    def test_force_same_image_to_all_machines(self):
334*760c253cSXin Li        self.image_log = []
335*760c253cSXin Li
336*760c253cSXin Li        def FakeImageMachine(machine, label_arg):
337*760c253cSXin Li            image = label_arg.chromeos_image
338*760c253cSXin Li            self.image_log.append("Pushed %s onto %s" % (image, machine.name))
339*760c253cSXin Li
340*760c253cSXin Li        def FakeSetUpChecksumInfo():
341*760c253cSXin Li            pass
342*760c253cSXin Li
343*760c253cSXin Li        self.mm.ImageMachine = FakeImageMachine
344*760c253cSXin Li        self.mock_lumpy1.SetUpChecksumInfo = FakeSetUpChecksumInfo
345*760c253cSXin Li        self.mock_lumpy2.SetUpChecksumInfo = FakeSetUpChecksumInfo
346*760c253cSXin Li        self.mock_lumpy3.SetUpChecksumInfo = FakeSetUpChecksumInfo
347*760c253cSXin Li
348*760c253cSXin Li        self.mm.ForceSameImageToAllMachines(LABEL_LUMPY)
349*760c253cSXin Li        self.assertEqual(len(self.image_log), 3)
350*760c253cSXin Li        self.assertEqual(
351*760c253cSXin Li            self.image_log[0], "Pushed lumpy_chromeos_image onto lumpy1"
352*760c253cSXin Li        )
353*760c253cSXin Li        self.assertEqual(
354*760c253cSXin Li            self.image_log[1], "Pushed lumpy_chromeos_image onto lumpy2"
355*760c253cSXin Li        )
356*760c253cSXin Li        self.assertEqual(
357*760c253cSXin Li            self.image_log[2], "Pushed lumpy_chromeos_image onto lumpy3"
358*760c253cSXin Li        )
359*760c253cSXin Li
360*760c253cSXin Li    @mock.patch.object(image_checksummer.ImageChecksummer, "Checksum")
361*760c253cSXin Li    @mock.patch.object(hashlib, "md5")
362*760c253cSXin Li    def test_acquire_machine(self, mock_md5, mock_checksum):
363*760c253cSXin Li
364*760c253cSXin Li        self.msgs = []
365*760c253cSXin Li        self.log_fatal_msgs = []
366*760c253cSXin Li
367*760c253cSXin Li        def FakeLock(machine):
368*760c253cSXin Li            self.msgs.append("Tried to lock %s" % machine.name)
369*760c253cSXin Li
370*760c253cSXin Li        def FakeLogFatal(msg):
371*760c253cSXin Li            self.log_fatal_msgs.append(msg)
372*760c253cSXin Li
373*760c253cSXin Li        self.mm._TryToLockMachine = FakeLock
374*760c253cSXin Li        self.mm.logger.LogFatal = FakeLogFatal
375*760c253cSXin Li
376*760c253cSXin Li        mock_md5.return_value = "123456"
377*760c253cSXin Li        mock_checksum.return_value = "fake_md5_checksum"
378*760c253cSXin Li
379*760c253cSXin Li        self.mm._machines = self.mm._all_machines
380*760c253cSXin Li        self.mock_lumpy1.locked = True
381*760c253cSXin Li        self.mock_lumpy2.locked = True
382*760c253cSXin Li        self.mock_lumpy3.locked = False
383*760c253cSXin Li        self.mock_lumpy3.checksum = "fake_md5_checksum"
384*760c253cSXin Li        self.mock_daisy1.locked = True
385*760c253cSXin Li        self.mock_daisy2.locked = False
386*760c253cSXin Li        self.mock_daisy2.checksum = "fake_md5_checksum"
387*760c253cSXin Li
388*760c253cSXin Li        self.mock_lumpy1.released_time = time.time()
389*760c253cSXin Li        self.mock_lumpy2.released_time = time.time()
390*760c253cSXin Li        self.mock_lumpy3.released_time = time.time()
391*760c253cSXin Li        self.mock_daisy1.released_time = time.time()
392*760c253cSXin Li        self.mock_daisy2.released_time = time.time()
393*760c253cSXin Li
394*760c253cSXin Li        # Test 1. Basic test. Acquire lumpy3.
395*760c253cSXin Li        self.mm.AcquireMachine(LABEL_LUMPY)
396*760c253cSXin Li        m = self.mock_lumpy1
397*760c253cSXin Li        self.assertEqual(m, self.mock_lumpy1)
398*760c253cSXin Li        self.assertTrue(self.mock_lumpy1.locked)
399*760c253cSXin Li        self.assertEqual(mock_md5.call_count, 0)
400*760c253cSXin Li        self.assertEqual(
401*760c253cSXin Li            self.msgs,
402*760c253cSXin Li            [
403*760c253cSXin Li                "Tried to lock lumpy1",
404*760c253cSXin Li                "Tried to lock lumpy2",
405*760c253cSXin Li                "Tried to lock lumpy3",
406*760c253cSXin Li            ],
407*760c253cSXin Li        )
408*760c253cSXin Li
409*760c253cSXin Li        # Test the second return statment (machine is unlocked, has no checksum)
410*760c253cSXin Li        save_locked = self.mock_lumpy1.locked
411*760c253cSXin Li        self.mock_lumpy1.locked = False
412*760c253cSXin Li        self.mock_lumpy1.checksum = None
413*760c253cSXin Li        m = self.mm.AcquireMachine(LABEL_LUMPY)
414*760c253cSXin Li        self.assertEqual(m, self.mock_lumpy1)
415*760c253cSXin Li        self.assertTrue(self.mock_lumpy1.locked)
416*760c253cSXin Li
417*760c253cSXin Li        # Test the third return statement:
418*760c253cSXin Li        #   - machine is unlocked
419*760c253cSXin Li        #   - checksums don't match
420*760c253cSXin Li        #   - current time minus release time is > 20.
421*760c253cSXin Li        self.mock_lumpy1.locked = False
422*760c253cSXin Li        self.mock_lumpy1.checksum = "123"
423*760c253cSXin Li        self.mock_lumpy1.released_time = time.time() - 8
424*760c253cSXin Li        m = self.mm.AcquireMachine(LABEL_LUMPY)
425*760c253cSXin Li        self.assertEqual(m, self.mock_lumpy1)
426*760c253cSXin Li        self.assertTrue(self.mock_lumpy1.locked)
427*760c253cSXin Li
428*760c253cSXin Li        # Test all machines are already locked.
429*760c253cSXin Li        m = self.mm.AcquireMachine(LABEL_LUMPY)
430*760c253cSXin Li        self.assertIsNone(m)
431*760c253cSXin Li
432*760c253cSXin Li        # Restore values of mock_lumpy1, so other tests succeed.
433*760c253cSXin Li        self.mock_lumpy1.locked = save_locked
434*760c253cSXin Li        self.mock_lumpy1.checksum = "123"
435*760c253cSXin Li
436*760c253cSXin Li    def test_get_available_machines(self):
437*760c253cSXin Li        self.mm._machines = self.mm._all_machines
438*760c253cSXin Li
439*760c253cSXin Li        machine_list = self.mm.GetAvailableMachines()
440*760c253cSXin Li        self.assertEqual(machine_list, self.mm._all_machines)
441*760c253cSXin Li
442*760c253cSXin Li        machine_list = self.mm.GetAvailableMachines(LABEL_MIX)
443*760c253cSXin Li        self.assertEqual(
444*760c253cSXin Li            machine_list, [self.mock_daisy1, self.mock_daisy2, self.mock_lumpy3]
445*760c253cSXin Li        )
446*760c253cSXin Li
447*760c253cSXin Li        machine_list = self.mm.GetAvailableMachines(LABEL_LUMPY)
448*760c253cSXin Li        self.assertEqual(
449*760c253cSXin Li            machine_list, [self.mock_lumpy1, self.mock_lumpy2, self.mock_lumpy3]
450*760c253cSXin Li        )
451*760c253cSXin Li
452*760c253cSXin Li    def test_get_machines(self):
453*760c253cSXin Li        machine_list = self.mm.GetMachines()
454*760c253cSXin Li        self.assertEqual(machine_list, self.mm._all_machines)
455*760c253cSXin Li
456*760c253cSXin Li        machine_list = self.mm.GetMachines(LABEL_MIX)
457*760c253cSXin Li        self.assertEqual(
458*760c253cSXin Li            machine_list, [self.mock_daisy1, self.mock_daisy2, self.mock_lumpy3]
459*760c253cSXin Li        )
460*760c253cSXin Li
461*760c253cSXin Li        machine_list = self.mm.GetMachines(LABEL_LUMPY)
462*760c253cSXin Li        self.assertEqual(
463*760c253cSXin Li            machine_list, [self.mock_lumpy1, self.mock_lumpy2, self.mock_lumpy3]
464*760c253cSXin Li        )
465*760c253cSXin Li
466*760c253cSXin Li    def test_release_machines(self):
467*760c253cSXin Li
468*760c253cSXin Li        self.mm._machines = [self.mock_lumpy1, self.mock_daisy2]
469*760c253cSXin Li
470*760c253cSXin Li        self.mock_lumpy1.locked = True
471*760c253cSXin Li        self.mock_daisy2.locked = True
472*760c253cSXin Li
473*760c253cSXin Li        self.assertTrue(self.mock_lumpy1.locked)
474*760c253cSXin Li        self.mm.ReleaseMachine(self.mock_lumpy1)
475*760c253cSXin Li        self.assertFalse(self.mock_lumpy1.locked)
476*760c253cSXin Li        self.assertEqual(self.mock_lumpy1.status, "Available")
477*760c253cSXin Li
478*760c253cSXin Li        self.assertTrue(self.mock_daisy2.locked)
479*760c253cSXin Li        self.mm.ReleaseMachine(self.mock_daisy2)
480*760c253cSXin Li        self.assertFalse(self.mock_daisy2.locked)
481*760c253cSXin Li        self.assertEqual(self.mock_daisy2.status, "Available")
482*760c253cSXin Li
483*760c253cSXin Li        # Test double-relase...
484*760c253cSXin Li        self.assertRaises(
485*760c253cSXin Li            AssertionError, self.mm.ReleaseMachine, self.mock_lumpy1
486*760c253cSXin Li        )
487*760c253cSXin Li
488*760c253cSXin Li    def test_cleanup(self):
489*760c253cSXin Li        self.mock_logger.reset_mock()
490*760c253cSXin Li        self.mm.Cleanup()
491*760c253cSXin Li        self.assertEqual(self.mock_logger.call_count, 0)
492*760c253cSXin Li
493*760c253cSXin Li    OUTPUT_STR = (
494*760c253cSXin Li        "Machine Status:\nMachine                        Thread     "
495*760c253cSXin Li        "Lock Status                    Checksum"
496*760c253cSXin Li        "                        \nlumpy1                         test "
497*760c253cSXin Li        "run   True PENDING                   123"
498*760c253cSXin Li        "                             \nlumpy2                         "
499*760c253cSXin Li        "test run   False PENDING                   123"
500*760c253cSXin Li        "                             \nlumpy3                         "
501*760c253cSXin Li        "test run   False PENDING                   123"
502*760c253cSXin Li        "                             \ndaisy1                         "
503*760c253cSXin Li        "test run   False PENDING                   678"
504*760c253cSXin Li        "                             \ndaisy2                         "
505*760c253cSXin Li        "test run   True PENDING                   678"
506*760c253cSXin Li        "                             "
507*760c253cSXin Li    )
508*760c253cSXin Li
509*760c253cSXin Li    def test_as_string(self):
510*760c253cSXin Li
511*760c253cSXin Li        mock_logger = mock.Mock(spec=logger.Logger)
512*760c253cSXin Li
513*760c253cSXin Li        bench = Benchmark(
514*760c253cSXin Li            "page_cycler_v2.netsim.top_10",  # name
515*760c253cSXin Li            "page_cycler_v2.netsim.top_10",  # test_name
516*760c253cSXin Li            "",  # test_args
517*760c253cSXin Li            1,  # iteratins
518*760c253cSXin Li            False,  # rm_chroot_tmp
519*760c253cSXin Li            "",  # perf_args
520*760c253cSXin Li            suite="telemetry_Crosperf",
521*760c253cSXin Li        )  # suite
522*760c253cSXin Li
523*760c253cSXin Li        test_run = MockBenchmarkRun(
524*760c253cSXin Li            "test run",
525*760c253cSXin Li            bench,
526*760c253cSXin Li            LABEL_LUMPY,
527*760c253cSXin Li            1,
528*760c253cSXin Li            [],
529*760c253cSXin Li            self.mm,
530*760c253cSXin Li            mock_logger,
531*760c253cSXin Li            "verbose",
532*760c253cSXin Li            "",
533*760c253cSXin Li            {},
534*760c253cSXin Li        )
535*760c253cSXin Li
536*760c253cSXin Li        self.mm._machines = [
537*760c253cSXin Li            self.mock_lumpy1,
538*760c253cSXin Li            self.mock_lumpy2,
539*760c253cSXin Li            self.mock_lumpy3,
540*760c253cSXin Li            self.mock_daisy1,
541*760c253cSXin Li            self.mock_daisy2,
542*760c253cSXin Li        ]
543*760c253cSXin Li
544*760c253cSXin Li        self.mock_lumpy1.test_run = test_run
545*760c253cSXin Li        self.mock_lumpy2.test_run = test_run
546*760c253cSXin Li        self.mock_lumpy3.test_run = test_run
547*760c253cSXin Li        self.mock_daisy1.test_run = test_run
548*760c253cSXin Li        self.mock_daisy2.test_run = test_run
549*760c253cSXin Li
550*760c253cSXin Li        self.mock_lumpy1.locked = True
551*760c253cSXin Li        self.mock_lumpy2.locked = False
552*760c253cSXin Li        self.mock_lumpy3.locked = False
553*760c253cSXin Li        self.mock_daisy1.locked = False
554*760c253cSXin Li        self.mock_daisy2.locked = True
555*760c253cSXin Li
556*760c253cSXin Li        self.mock_lumpy1.checksum = "123"
557*760c253cSXin Li        self.mock_lumpy2.checksum = "123"
558*760c253cSXin Li        self.mock_lumpy3.checksum = "123"
559*760c253cSXin Li        self.mock_daisy1.checksum = "678"
560*760c253cSXin Li        self.mock_daisy2.checksum = "678"
561*760c253cSXin Li
562*760c253cSXin Li        output = self.mm.AsString()
563*760c253cSXin Li        self.assertEqual(output, self.OUTPUT_STR)
564*760c253cSXin Li
565*760c253cSXin Li    def test_get_all_cpu_info(self):
566*760c253cSXin Li        info = self.mm.GetAllCPUInfo([LABEL_LUMPY, LABEL_MIX])
567*760c253cSXin Li        self.assertEqual(
568*760c253cSXin Li            info,
569*760c253cSXin Li            "lumpy\n-------------------\nlumpy_cpu_info\n\n\nmix\n-"
570*760c253cSXin Li            "------------------\ndaisy_cpu_info\n\n\n",
571*760c253cSXin Li        )
572*760c253cSXin Li
573*760c253cSXin Li
574*760c253cSXin LiMEMINFO_STRING = """MemTotal:        3990332 kB
575*760c253cSXin LiMemFree:         2608396 kB
576*760c253cSXin LiBuffers:          147168 kB
577*760c253cSXin LiCached:           811560 kB
578*760c253cSXin LiSwapCached:            0 kB
579*760c253cSXin LiActive:           503480 kB
580*760c253cSXin LiInactive:         628572 kB
581*760c253cSXin LiActive(anon):     174532 kB
582*760c253cSXin LiInactive(anon):    88576 kB
583*760c253cSXin LiActive(file):     328948 kB
584*760c253cSXin LiInactive(file):   539996 kB
585*760c253cSXin LiUnevictable:           0 kB
586*760c253cSXin LiMlocked:               0 kB
587*760c253cSXin LiSwapTotal:       5845212 kB
588*760c253cSXin LiSwapFree:        5845212 kB
589*760c253cSXin LiDirty:              9384 kB
590*760c253cSXin LiWriteback:             0 kB
591*760c253cSXin LiAnonPages:        173408 kB
592*760c253cSXin LiMapped:           146268 kB
593*760c253cSXin LiShmem:             89676 kB
594*760c253cSXin LiSlab:             188260 kB
595*760c253cSXin LiSReclaimable:     169208 kB
596*760c253cSXin LiSUnreclaim:        19052 kB
597*760c253cSXin LiKernelStack:        2032 kB
598*760c253cSXin LiPageTables:         7120 kB
599*760c253cSXin LiNFS_Unstable:          0 kB
600*760c253cSXin LiBounce:                0 kB
601*760c253cSXin LiWritebackTmp:          0 kB
602*760c253cSXin LiCommitLimit:     7840376 kB
603*760c253cSXin LiCommitted_AS:    1082032 kB
604*760c253cSXin LiVmallocTotal:   34359738367 kB
605*760c253cSXin LiVmallocUsed:      364980 kB
606*760c253cSXin LiVmallocChunk:   34359369407 kB
607*760c253cSXin LiDirectMap4k:       45824 kB
608*760c253cSXin LiDirectMap2M:     4096000 kB
609*760c253cSXin Li"""
610*760c253cSXin Li
611*760c253cSXin LiCPUINFO_STRING = """processor: 0
612*760c253cSXin Livendor_id: GenuineIntel
613*760c253cSXin Licpu family: 6
614*760c253cSXin Limodel: 42
615*760c253cSXin Limodel name: Intel(R) Celeron(R) CPU 867 @ 1.30GHz
616*760c253cSXin Listepping: 7
617*760c253cSXin Limicrocode: 0x25
618*760c253cSXin Licpu MHz: 1300.000
619*760c253cSXin Licache size: 2048 KB
620*760c253cSXin Liphysical id: 0
621*760c253cSXin Lisiblings: 2
622*760c253cSXin Licore id: 0
623*760c253cSXin Licpu cores: 2
624*760c253cSXin Liapicid: 0
625*760c253cSXin Liinitial apicid: 0
626*760c253cSXin Lifpu: yes
627*760c253cSXin Lifpu_exception: yes
628*760c253cSXin Licpuid level: 13
629*760c253cSXin Liwp: yes
630*760c253cSXin Liflags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave lahf_lm arat epb xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid
631*760c253cSXin Libogomips: 2594.17
632*760c253cSXin Liclflush size: 64
633*760c253cSXin Licache_alignment: 64
634*760c253cSXin Liaddress sizes: 36 bits physical, 48 bits virtual
635*760c253cSXin Lipower management:
636*760c253cSXin Li
637*760c253cSXin Liprocessor: 1
638*760c253cSXin Livendor_id: GenuineIntel
639*760c253cSXin Licpu family: 6
640*760c253cSXin Limodel: 42
641*760c253cSXin Limodel name: Intel(R) Celeron(R) CPU 867 @ 1.30GHz
642*760c253cSXin Listepping: 7
643*760c253cSXin Limicrocode: 0x25
644*760c253cSXin Licpu MHz: 1300.000
645*760c253cSXin Licache size: 2048 KB
646*760c253cSXin Liphysical id: 0
647*760c253cSXin Lisiblings: 2
648*760c253cSXin Licore id: 1
649*760c253cSXin Licpu cores: 2
650*760c253cSXin Liapicid: 2
651*760c253cSXin Liinitial apicid: 2
652*760c253cSXin Lifpu: yes
653*760c253cSXin Lifpu_exception: yes
654*760c253cSXin Licpuid level: 13
655*760c253cSXin Liwp: yes
656*760c253cSXin Liflags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave lahf_lm arat epb xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid
657*760c253cSXin Libogomips: 2594.17
658*760c253cSXin Liclflush size: 64
659*760c253cSXin Licache_alignment: 64
660*760c253cSXin Liaddress sizes: 36 bits physical, 48 bits virtual
661*760c253cSXin Lipower management:
662*760c253cSXin Li"""
663*760c253cSXin Li
664*760c253cSXin LiCHECKSUM_STRING = (
665*760c253cSXin Li    "processor: 0vendor_id: GenuineIntelcpu family: 6model: "
666*760c253cSXin Li    "42model name: Intel(R) Celeron(R) CPU 867 @ "
667*760c253cSXin Li    "1.30GHzstepping: 7microcode: 0x25cache size: 2048 "
668*760c253cSXin Li    "KBphysical id: 0siblings: 2cpu cores: 2"
669*760c253cSXin Li    "fpu: yesfpu_exception: yescpuid level: "
670*760c253cSXin Li    "13wp: yesflags: fpu vme de pse tsc msr pae mce cx8 apic sep"
671*760c253cSXin Li    " mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse "
672*760c253cSXin Li    "sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc "
673*760c253cSXin Li    "arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc "
674*760c253cSXin Li    "aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 "
675*760c253cSXin Li    "ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt "
676*760c253cSXin Li    "tsc_deadline_timer xsave lahf_lm arat epb xsaveopt pln pts "
677*760c253cSXin Li    "dts tpr_shadow vnmi flexpriority ept vpidclflush size: "
678*760c253cSXin Li    "64cache_alignment: 64address sizes: 36 bits physical, 48 "
679*760c253cSXin Li    "bits virtualpower management:processor: 1vendor_id: "
680*760c253cSXin Li    "GenuineIntelcpu family: 6model: 42model name: Intel(R) "
681*760c253cSXin Li    "Celeron(R) CPU 867 @ 1.30GHzstepping: 7microcode: 0x25cache"
682*760c253cSXin Li    " size: 2048 KBphysical id: 0siblings: 2cpu cores:"
683*760c253cSXin Li    " 2fpu: yesfpu_exception: yescpuid"
684*760c253cSXin Li    " level: 13wp: yesflags: fpu vme de pse tsc msr pae mce cx8 "
685*760c253cSXin Li    "apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx "
686*760c253cSXin Li    "fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm "
687*760c253cSXin Li    "constant_tsc arch_perfmon pebs bts rep_good nopl xtopology "
688*760c253cSXin Li    "nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl "
689*760c253cSXin Li    "vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic "
690*760c253cSXin Li    "popcnt tsc_deadline_timer xsave lahf_lm arat epb xsaveopt "
691*760c253cSXin Li    "pln pts dts tpr_shadow vnmi flexpriority ept vpidclflush "
692*760c253cSXin Li    "size: 64cache_alignment: 64address sizes: 36 bits physical,"
693*760c253cSXin Li    " 48 bits virtualpower management: 4194304"
694*760c253cSXin Li)
695*760c253cSXin Li
696*760c253cSXin LiDUMP_VPD_STRING = """
697*760c253cSXin Li"PBA_SN"="Pba.txt"
698*760c253cSXin Li"Product_S/N"="HT4L91SC300208"
699*760c253cSXin Li"serial_number"="HT4L91SC300208Z"
700*760c253cSXin Li"System_UUID"="12153006-1755-4f66-b410-c43758a71127"
701*760c253cSXin Li"shipping_country"="US"
702*760c253cSXin Li"initial_locale"="en-US"
703*760c253cSXin Li"keyboard_layout"="xkb:us::eng"
704*760c253cSXin Li"initial_timezone"="America/Los_Angeles"
705*760c253cSXin Li"MACAddress"=""
706*760c253cSXin Li"System_UUID"="29dd9c61-7fa1-4c83-b89a-502e7eb08afe"
707*760c253cSXin Li"ubind_attribute"="0c433ce7585f486730b682bb05626a12ce2d896e9b57665387f8ce2ccfdcc56d2e2f1483"
708*760c253cSXin Li"gbind_attribute"="7e9a851324088e269319347c6abb8d1572ec31022fa07e28998229afe8acb45c35a89b9d"
709*760c253cSXin Li"ActivateDate"="2013-38"
710*760c253cSXin Li"""
711*760c253cSXin Li
712*760c253cSXin LiIFCONFIG_STRING = """
713*760c253cSXin Lieth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
714*760c253cSXin Li        inet 172.17.129.247  netmask 255.255.254.0  broadcast 172.17.129.255
715*760c253cSXin Li        inet6 2620:0:1000:3002:143:fed4:3ff6:279d  prefixlen 64  scopeid 0x0<global>
716*760c253cSXin Li        inet6 2620:0:1000:3002:4459:1399:1f02:9e4c  prefixlen 64  scopeid 0x0<global>
717*760c253cSXin Li        inet6 2620:0:1000:3002:d9e4:87b:d4ec:9a0e  prefixlen 64  scopeid 0x0<global>
718*760c253cSXin Li        inet6 2620:0:1000:3002:7d45:23f1:ea8a:9604  prefixlen 64  scopeid 0x0<global>
719*760c253cSXin Li        inet6 2620:0:1000:3002:250:b6ff:fe63:db65  prefixlen 64  scopeid 0x0<global>
720*760c253cSXin Li        inet6 fe80::250:b6ff:fe63:db65  prefixlen 64  scopeid 0x20<link>
721*760c253cSXin Li        ether 00:50:b6:63:db:65  txqueuelen 1000  (Ethernet)
722*760c253cSXin Li        RX packets 9817166  bytes 10865181708 (10.1 GiB)
723*760c253cSXin Li        RX errors 194  dropped 0  overruns 0  frame 194
724*760c253cSXin Li        TX packets 0  bytes 2265811903 (2.1 GiB)
725*760c253cSXin Li        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
726*760c253cSXin Li
727*760c253cSXin Lieth1: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
728*760c253cSXin Li        ether e8:03:9a:9c:50:3d  txqueuelen 1000  (Ethernet)
729*760c253cSXin Li        RX packets 0  bytes 0 (0.0 B)
730*760c253cSXin Li        RX errors 0  dropped 0  overruns 0  frame 0
731*760c253cSXin Li        TX packets 0  bytes 0 (0.0 B)
732*760c253cSXin Li        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
733*760c253cSXin Li
734*760c253cSXin Lilo: flags=73<UP,LOOPBACK,RUNNING>  mtu 16436
735*760c253cSXin Li        inet 127.0.0.1  netmask 255.0.0.0
736*760c253cSXin Li        inet6 ::1  prefixlen 128  scopeid 0x10<host>
737*760c253cSXin Li        loop  txqueuelen 0  (Local Loopback)
738*760c253cSXin Li        RX packets 981004  bytes 1127468524 (1.0 GiB)
739*760c253cSXin Li        RX errors 0  dropped 0  overruns 0  frame 0
740*760c253cSXin Li        TX packets 981004  bytes 1127468524 (1.0 GiB)
741*760c253cSXin Li        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
742*760c253cSXin Li
743*760c253cSXin Liwlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
744*760c253cSXin Li        ether 44:6d:57:20:4a:c5  txqueuelen 1000  (Ethernet)
745*760c253cSXin Li        RX packets 0  bytes 0 (0.0 B)
746*760c253cSXin Li        RX errors 0  dropped 0  overruns 0  frame 0
747*760c253cSXin Li        TX packets 0  bytes 0 (0.0 B)
748*760c253cSXin Li        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
749*760c253cSXin Li"""
750*760c253cSXin Li
751*760c253cSXin Li
752*760c253cSXin Liclass CrosMachineTest(unittest.TestCase):
753*760c253cSXin Li    """Test for CrosMachine class."""
754*760c253cSXin Li
755*760c253cSXin Li    mock_cmd_exec = mock.Mock(spec=command_executer.CommandExecuter)
756*760c253cSXin Li
757*760c253cSXin Li    @mock.patch.object(machine_manager.CrosMachine, "SetUpChecksumInfo")
758*760c253cSXin Li    def test_init(self, mock_setup):
759*760c253cSXin Li
760*760c253cSXin Li        cm = machine_manager.CrosMachine(
761*760c253cSXin Li            "daisy.cros", "/usr/local/chromeos", "average", self.mock_cmd_exec
762*760c253cSXin Li        )
763*760c253cSXin Li        self.assertEqual(mock_setup.call_count, 1)
764*760c253cSXin Li        self.assertEqual(cm.chromeos_root, "/usr/local/chromeos")
765*760c253cSXin Li        self.assertEqual(cm.log_level, "average")
766*760c253cSXin Li
767*760c253cSXin Li    @mock.patch.object(machine_manager.CrosMachine, "IsReachable")
768*760c253cSXin Li    @mock.patch.object(machine_manager.CrosMachine, "_GetMemoryInfo")
769*760c253cSXin Li    @mock.patch.object(machine_manager.CrosMachine, "_GetCPUInfo")
770*760c253cSXin Li    @mock.patch.object(
771*760c253cSXin Li        machine_manager.CrosMachine, "_ComputeMachineChecksumString"
772*760c253cSXin Li    )
773*760c253cSXin Li    @mock.patch.object(machine_manager.CrosMachine, "_GetMachineID")
774*760c253cSXin Li    @mock.patch.object(machine_manager.CrosMachine, "_GetMD5Checksum")
775*760c253cSXin Li    def test_setup_checksum_info(
776*760c253cSXin Li        self,
777*760c253cSXin Li        mock_md5sum,
778*760c253cSXin Li        mock_machineid,
779*760c253cSXin Li        mock_checkstring,
780*760c253cSXin Li        mock_cpuinfo,
781*760c253cSXin Li        mock_meminfo,
782*760c253cSXin Li        mock_isreachable,
783*760c253cSXin Li    ):
784*760c253cSXin Li
785*760c253cSXin Li        # Test 1. Machine is not reachable; SetUpChecksumInfo is called via
786*760c253cSXin Li        # __init__.
787*760c253cSXin Li        mock_isreachable.return_value = False
788*760c253cSXin Li        mock_md5sum.return_value = "md5_checksum"
789*760c253cSXin Li        cm = machine_manager.CrosMachine(
790*760c253cSXin Li            "daisy.cros", "/usr/local/chromeos", "average", self.mock_cmd_exec
791*760c253cSXin Li        )
792*760c253cSXin Li        cm.checksum_string = "This is a checksum string."
793*760c253cSXin Li        cm.machine_id = "machine_id1"
794*760c253cSXin Li        self.assertEqual(mock_isreachable.call_count, 1)
795*760c253cSXin Li        self.assertIsNone(cm.machine_checksum)
796*760c253cSXin Li        self.assertEqual(mock_meminfo.call_count, 0)
797*760c253cSXin Li
798*760c253cSXin Li        # Test 2. Machine is reachable. Call explicitly.
799*760c253cSXin Li        mock_isreachable.return_value = True
800*760c253cSXin Li        cm.checksum_string = "This is a checksum string."
801*760c253cSXin Li        cm.machine_id = "machine_id1"
802*760c253cSXin Li        cm.SetUpChecksumInfo()
803*760c253cSXin Li        self.assertEqual(mock_isreachable.call_count, 2)
804*760c253cSXin Li        self.assertEqual(mock_meminfo.call_count, 1)
805*760c253cSXin Li        self.assertEqual(mock_cpuinfo.call_count, 1)
806*760c253cSXin Li        self.assertEqual(mock_checkstring.call_count, 1)
807*760c253cSXin Li        self.assertEqual(mock_machineid.call_count, 1)
808*760c253cSXin Li        self.assertEqual(mock_md5sum.call_count, 2)
809*760c253cSXin Li        self.assertEqual(cm.machine_checksum, "md5_checksum")
810*760c253cSXin Li        self.assertEqual(cm.machine_id_checksum, "md5_checksum")
811*760c253cSXin Li        self.assertEqual(
812*760c253cSXin Li            mock_md5sum.call_args_list[0][0][0], "This is a checksum string."
813*760c253cSXin Li        )
814*760c253cSXin Li        self.assertEqual(mock_md5sum.call_args_list[1][0][0], "machine_id1")
815*760c253cSXin Li
816*760c253cSXin Li    @mock.patch.object(command_executer.CommandExecuter, "CrosRunCommand")
817*760c253cSXin Li    @mock.patch.object(machine_manager.CrosMachine, "SetUpChecksumInfo")
818*760c253cSXin Li    def test_is_reachable(self, mock_setup, mock_run_cmd):
819*760c253cSXin Li
820*760c253cSXin Li        cm = machine_manager.CrosMachine(
821*760c253cSXin Li            "daisy.cros", "/usr/local/chromeos", "average", self.mock_cmd_exec
822*760c253cSXin Li        )
823*760c253cSXin Li        self.mock_cmd_exec.CrosRunCommand = mock_run_cmd
824*760c253cSXin Li
825*760c253cSXin Li        # Test 1. CrosRunCommand returns 1 (fail)
826*760c253cSXin Li        mock_run_cmd.return_value = 1
827*760c253cSXin Li        result = cm.IsReachable()
828*760c253cSXin Li        self.assertFalse(result)
829*760c253cSXin Li        self.assertEqual(mock_setup.call_count, 1)
830*760c253cSXin Li        self.assertEqual(mock_run_cmd.call_count, 1)
831*760c253cSXin Li
832*760c253cSXin Li        # Test 2. CrosRunCommand returns 0 (success)
833*760c253cSXin Li        mock_run_cmd.return_value = 0
834*760c253cSXin Li        result = cm.IsReachable()
835*760c253cSXin Li        self.assertTrue(result)
836*760c253cSXin Li        self.assertEqual(mock_run_cmd.call_count, 2)
837*760c253cSXin Li        first_args = mock_run_cmd.call_args_list[0]
838*760c253cSXin Li        second_args = mock_run_cmd.call_args_list[1]
839*760c253cSXin Li        self.assertEqual(first_args[0], second_args[0])
840*760c253cSXin Li        self.assertEqual(first_args[1], second_args[1])
841*760c253cSXin Li        self.assertEqual(len(first_args[0]), 1)
842*760c253cSXin Li        self.assertEqual(len(first_args[1]), 2)
843*760c253cSXin Li        self.assertEqual(first_args[0][0], "ls")
844*760c253cSXin Li        args_dict = first_args[1]
845*760c253cSXin Li        self.assertEqual(args_dict["machine"], "daisy.cros")
846*760c253cSXin Li        self.assertEqual(args_dict["chromeos_root"], "/usr/local/chromeos")
847*760c253cSXin Li
848*760c253cSXin Li    @mock.patch.object(machine_manager.CrosMachine, "SetUpChecksumInfo")
849*760c253cSXin Li    def test_parse_memory_info(self, _mock_setup):
850*760c253cSXin Li        cm = machine_manager.CrosMachine(
851*760c253cSXin Li            "daisy.cros", "/usr/local/chromeos", "average", self.mock_cmd_exec
852*760c253cSXin Li        )
853*760c253cSXin Li        cm.meminfo = MEMINFO_STRING
854*760c253cSXin Li        cm._ParseMemoryInfo()
855*760c253cSXin Li        self.assertEqual(cm.phys_kbytes, 4194304)
856*760c253cSXin Li
857*760c253cSXin Li    @mock.patch.object(
858*760c253cSXin Li        command_executer.CommandExecuter, "CrosRunCommandWOutput"
859*760c253cSXin Li    )
860*760c253cSXin Li    @mock.patch.object(machine_manager.CrosMachine, "SetUpChecksumInfo")
861*760c253cSXin Li    def test_get_memory_info(self, _mock_setup, mock_run_cmd):
862*760c253cSXin Li        cm = machine_manager.CrosMachine(
863*760c253cSXin Li            "daisy.cros", "/usr/local/chromeos", "average", self.mock_cmd_exec
864*760c253cSXin Li        )
865*760c253cSXin Li        self.mock_cmd_exec.CrosRunCommandWOutput = mock_run_cmd
866*760c253cSXin Li        mock_run_cmd.return_value = [0, MEMINFO_STRING, ""]
867*760c253cSXin Li        cm._GetMemoryInfo()
868*760c253cSXin Li        self.assertEqual(mock_run_cmd.call_count, 1)
869*760c253cSXin Li        call_args = mock_run_cmd.call_args_list[0]
870*760c253cSXin Li        self.assertEqual(call_args[0][0], "cat /proc/meminfo")
871*760c253cSXin Li        args_dict = call_args[1]
872*760c253cSXin Li        self.assertEqual(args_dict["machine"], "daisy.cros")
873*760c253cSXin Li        self.assertEqual(args_dict["chromeos_root"], "/usr/local/chromeos")
874*760c253cSXin Li        self.assertEqual(cm.meminfo, MEMINFO_STRING)
875*760c253cSXin Li        self.assertEqual(cm.phys_kbytes, 4194304)
876*760c253cSXin Li
877*760c253cSXin Li        mock_run_cmd.return_value = [1, MEMINFO_STRING, ""]
878*760c253cSXin Li        self.assertRaises(Exception, cm._GetMemoryInfo)
879*760c253cSXin Li
880*760c253cSXin Li    @mock.patch.object(
881*760c253cSXin Li        command_executer.CommandExecuter, "CrosRunCommandWOutput"
882*760c253cSXin Li    )
883*760c253cSXin Li    @mock.patch.object(machine_manager.CrosMachine, "SetUpChecksumInfo")
884*760c253cSXin Li    def test_get_cpu_info(self, _mock_setup, mock_run_cmd):
885*760c253cSXin Li        cm = machine_manager.CrosMachine(
886*760c253cSXin Li            "daisy.cros", "/usr/local/chromeos", "average", self.mock_cmd_exec
887*760c253cSXin Li        )
888*760c253cSXin Li        self.mock_cmd_exec.CrosRunCommandWOutput = mock_run_cmd
889*760c253cSXin Li        mock_run_cmd.return_value = [0, CPUINFO_STRING, ""]
890*760c253cSXin Li        cm._GetCPUInfo()
891*760c253cSXin Li        self.assertEqual(mock_run_cmd.call_count, 1)
892*760c253cSXin Li        call_args = mock_run_cmd.call_args_list[0]
893*760c253cSXin Li        self.assertEqual(call_args[0][0], "cat /proc/cpuinfo")
894*760c253cSXin Li        args_dict = call_args[1]
895*760c253cSXin Li        self.assertEqual(args_dict["machine"], "daisy.cros")
896*760c253cSXin Li        self.assertEqual(args_dict["chromeos_root"], "/usr/local/chromeos")
897*760c253cSXin Li        self.assertEqual(cm.cpuinfo, CPUINFO_STRING)
898*760c253cSXin Li
899*760c253cSXin Li    @mock.patch.object(machine_manager.CrosMachine, "SetUpChecksumInfo")
900*760c253cSXin Li    def test_compute_machine_checksum_string(self, _mock_setup):
901*760c253cSXin Li        cm = machine_manager.CrosMachine(
902*760c253cSXin Li            "daisy.cros", "/usr/local/chromeos", "average", self.mock_cmd_exec
903*760c253cSXin Li        )
904*760c253cSXin Li        cm.cpuinfo = CPUINFO_STRING
905*760c253cSXin Li        cm.meminfo = MEMINFO_STRING
906*760c253cSXin Li        cm._ParseMemoryInfo()
907*760c253cSXin Li        cm._ComputeMachineChecksumString()
908*760c253cSXin Li        self.assertEqual(cm.checksum_string, CHECKSUM_STRING)
909*760c253cSXin Li
910*760c253cSXin Li    @mock.patch.object(machine_manager.CrosMachine, "SetUpChecksumInfo")
911*760c253cSXin Li    def test_get_md5_checksum(self, _mock_setup):
912*760c253cSXin Li        cm = machine_manager.CrosMachine(
913*760c253cSXin Li            "daisy.cros", "/usr/local/chromeos", "average", self.mock_cmd_exec
914*760c253cSXin Li        )
915*760c253cSXin Li        temp_str = "abcde"
916*760c253cSXin Li        checksum_str = cm._GetMD5Checksum(temp_str)
917*760c253cSXin Li        self.assertEqual(checksum_str, "ab56b4d92b40713acc5af89985d4b786")
918*760c253cSXin Li
919*760c253cSXin Li        temp_str = ""
920*760c253cSXin Li        checksum_str = cm._GetMD5Checksum(temp_str)
921*760c253cSXin Li        self.assertEqual(checksum_str, "")
922*760c253cSXin Li
923*760c253cSXin Li    @mock.patch.object(
924*760c253cSXin Li        command_executer.CommandExecuter, "CrosRunCommandWOutput"
925*760c253cSXin Li    )
926*760c253cSXin Li    @mock.patch.object(machine_manager.CrosMachine, "SetUpChecksumInfo")
927*760c253cSXin Li    def test_get_machine_id(self, _mock_setup, mock_run_cmd):
928*760c253cSXin Li        cm = machine_manager.CrosMachine(
929*760c253cSXin Li            "daisy.cros", "/usr/local/chromeos", "average", self.mock_cmd_exec
930*760c253cSXin Li        )
931*760c253cSXin Li        self.mock_cmd_exec.CrosRunCommandWOutput = mock_run_cmd
932*760c253cSXin Li        mock_run_cmd.return_value = [0, DUMP_VPD_STRING, ""]
933*760c253cSXin Li
934*760c253cSXin Li        cm._GetMachineID()
935*760c253cSXin Li        self.assertEqual(cm.machine_id, '"Product_S/N"="HT4L91SC300208"')
936*760c253cSXin Li
937*760c253cSXin Li        mock_run_cmd.return_value = [0, IFCONFIG_STRING, ""]
938*760c253cSXin Li        cm._GetMachineID()
939*760c253cSXin Li        self.assertEqual(
940*760c253cSXin Li            cm.machine_id,
941*760c253cSXin Li            "        ether 00:50:b6:63:db:65  txqueuelen 1000  (Ethernet)_        "
942*760c253cSXin Li            "ether e8:03:9a:9c:50:3d  txqueuelen 1000  (Ethernet)_        ether "
943*760c253cSXin Li            "44:6d:57:20:4a:c5  txqueuelen 1000  (Ethernet)",
944*760c253cSXin Li        )
945*760c253cSXin Li
946*760c253cSXin Li        mock_run_cmd.return_value = [0, "invalid hardware config", ""]
947*760c253cSXin Li        self.assertRaises(Exception, cm._GetMachineID)
948*760c253cSXin Li
949*760c253cSXin Li    def test_add_cooldown_waittime(self):
950*760c253cSXin Li        cm = machine_manager.CrosMachine(
951*760c253cSXin Li            "1.2.3.4.cros", "/usr/local/chromeos", "average"
952*760c253cSXin Li        )
953*760c253cSXin Li        self.assertEqual(cm.GetCooldownWaitTime(), 0)
954*760c253cSXin Li        cm.AddCooldownWaitTime(250)
955*760c253cSXin Li        self.assertEqual(cm.GetCooldownWaitTime(), 250)
956*760c253cSXin Li        cm.AddCooldownWaitTime(1)
957*760c253cSXin Li        self.assertEqual(cm.GetCooldownWaitTime(), 251)
958*760c253cSXin Li
959*760c253cSXin Li
960*760c253cSXin Liif __name__ == "__main__":
961*760c253cSXin Li    unittest.main()
962