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