1 #!/usr/bin/python 2 # Copyright 2017 The Chromium OS Authors. All rights reserved. 3 # Use of this source code is governed by a BSD-style license that can be 4 # found in the LICENSE file. 5 6 import mox 7 import unittest 8 9 import common 10 from autotest_lib.client.common_lib import error 11 from autotest_lib.server.hosts import testbed 12 13 14 BOARD_1 = 'board1' 15 BOARD_1_BUILD_1 = 'branch1/board1-userdebug/1' 16 BOARD_1_BUILD_2 = 'branch1/board1-userdebug/2' 17 BOARD_2 = 'board2' 18 BOARD_2_BUILD_1 = 'branch1/board2-userdebug/1' 19 20 21 class TestBedUnittests(mox.MoxTestBase): 22 """Tests for TestBed.""" 23 24 def testLocateDeviceSuccess_SingleBuild(self): 25 """Test locate_device call can allocate devices by given builds. 26 """ 27 serials = ['s1', 's2', 's3'] 28 testbed_1 = testbed.TestBed(adb_serials=serials) 29 hosts = [self.mox.CreateMockAnything(), 30 self.mox.CreateMockAnything(), 31 self.mox.CreateMockAnything()] 32 for host in hosts: 33 self.mox.StubOutWithMock(host, 'get_device_aliases') 34 host.get_device_aliases().MultipleTimes().AndReturn([BOARD_1]) 35 self.mox.StubOutWithMock(testbed_1, 'get_adb_devices') 36 testbed_1.get_adb_devices().AndReturn(dict(zip(serials, hosts))) 37 images = [(BOARD_1_BUILD_1, None)]*3 38 self.mox.ReplayAll() 39 40 devices = testbed_1.locate_devices(images) 41 self.assertEqual(devices, dict(zip(serials, [BOARD_1_BUILD_1]*3))) 42 43 44 def testLocateDeviceFail_MixedBuild(self): 45 """Test locate_device call cannot allocate devices by given builds. 46 47 If the given builds are not the same and the number of duts required is 48 less than the number of devices the testbed has, it should fail to 49 locate devices for the test. 50 """ 51 serials = ['s1', 's2', 's3'] 52 testbed_1 = testbed.TestBed(adb_serials=serials) 53 hosts = [self.mox.CreateMockAnything(), 54 self.mox.CreateMockAnything(), 55 self.mox.CreateMockAnything()] 56 for host in hosts: 57 self.mox.StubOutWithMock(host, 'get_device_aliases') 58 host.get_device_aliases().MultipleTimes().AndReturn([BOARD_1]) 59 self.mox.StubOutWithMock(testbed_1, 'get_adb_devices') 60 testbed_1.get_adb_devices().AndReturn(dict(zip(serials, hosts))) 61 images = [(BOARD_1_BUILD_1, None), (BOARD_1_BUILD_2, None)] 62 self.mox.ReplayAll() 63 64 self.assertRaises(error.InstallError, testbed_1.locate_devices, images) 65 66 67 def testLocateDeviceFail_TooManyBuilds(self): 68 """Test locate_device call cannot allocate devices by given builds. 69 70 If the given builds are more than the number of devices the testbed has, 71 it should fail to locate devices for the test. 72 """ 73 serials = ['s1', 's2', 's3'] 74 testbed_1 = testbed.TestBed(adb_serials=serials) 75 hosts = [self.mox.CreateMockAnything(), 76 self.mox.CreateMockAnything(), 77 self.mox.CreateMockAnything()] 78 for host in hosts: 79 self.mox.StubOutWithMock(host, 'get_device_aliases') 80 host.get_device_aliases().MultipleTimes().AndReturn([BOARD_1]) 81 self.mox.StubOutWithMock(testbed_1, 'get_adb_devices') 82 testbed_1.get_adb_devices().AndReturn(dict(zip(serials, hosts))) 83 # Request 4 images but the testbed has only 3 duts. 84 images = [(BOARD_1_BUILD_1, None)]*4 85 self.mox.ReplayAll() 86 87 self.assertRaises(error.InstallError, testbed_1.locate_devices, images) 88 89 90 def testLocateDeviceSuccess_MixedBuildsSingleBoard(self): 91 """Test locate_device call can allocate devices by given builds. 92 93 If the given builds are the same and the number of duts required is 94 less than the number of devices the testbed has, it should return all 95 devices with the same build. 96 """ 97 serials = ['s1', 's2', 's3'] 98 testbed_1 = testbed.TestBed(adb_serials=serials) 99 hosts = [self.mox.CreateMockAnything(), 100 self.mox.CreateMockAnything(), 101 self.mox.CreateMockAnything()] 102 for host in hosts: 103 self.mox.StubOutWithMock(host, 'get_device_aliases') 104 host.get_device_aliases().MultipleTimes().AndReturn([BOARD_1]) 105 self.mox.StubOutWithMock(testbed_1, 'get_adb_devices') 106 testbed_1.get_adb_devices().AndReturn(dict(zip(serials, hosts))) 107 images = [(BOARD_1_BUILD_1, None), (BOARD_1_BUILD_1, None)] 108 self.mox.ReplayAll() 109 110 devices = testbed_1.locate_devices(images) 111 self.assertEqual(devices, dict(zip(serials, [BOARD_1_BUILD_1]*3))) 112 113 114 def testLocateDeviceSuccess_MixedBuildsMultiBoards(self): 115 """Test locate_device call can allocate devices by given builds for 116 multiple boards. 117 """ 118 serials = ['s1', 's2', 's3', 's4'] 119 testbed_1 = testbed.TestBed(adb_serials=serials) 120 hosts = [self.mox.CreateMockAnything(), 121 self.mox.CreateMockAnything(), 122 self.mox.CreateMockAnything(), 123 self.mox.CreateMockAnything()] 124 for i in [0, 1]: 125 self.mox.StubOutWithMock(hosts[i], 'get_device_aliases') 126 hosts[i].get_device_aliases().MultipleTimes().AndReturn([BOARD_1]) 127 for i in [2, 3]: 128 self.mox.StubOutWithMock(hosts[i], 'get_device_aliases') 129 hosts[i].get_device_aliases().MultipleTimes().AndReturn([BOARD_2]) 130 self.mox.StubOutWithMock(testbed_1, 'get_adb_devices') 131 testbed_1.get_adb_devices().AndReturn(dict(zip(serials, hosts))) 132 images = [(BOARD_1_BUILD_1, None), (BOARD_1_BUILD_1, None), 133 (BOARD_2_BUILD_1, None), (BOARD_2_BUILD_1, None)] 134 self.mox.ReplayAll() 135 136 devices = testbed_1.locate_devices(images) 137 expected = dict(zip(serials[0:2], [BOARD_1_BUILD_1]*2)) 138 expected.update(dict(zip(serials[2:], [BOARD_2_BUILD_1]*2))) 139 self.assertEqual(devices, expected) 140 141 142 if __name__ == "__main__": 143 unittest.main() 144