Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """ | 5 """ |
| 6 Unit tests for the contents of device_utils.py (mostly DeviceUtils). | 6 Unit tests for the contents of device_utils.py (mostly DeviceUtils). |
| 7 """ | 7 """ |
| 8 | 8 |
| 9 # pylint: disable=W0212 | 9 # pylint: disable=W0212 |
| 10 # pylint: disable=W0613 | 10 # pylint: disable=W0613 |
| 11 | 11 |
| 12 import os | |
| 13 import tempfile | |
| 14 import time | |
| 12 import unittest | 15 import unittest |
| 16 | |
| 13 from pylib import android_commands | 17 from pylib import android_commands |
| 14 from pylib import cmd_helper | 18 from pylib import cmd_helper |
| 15 from pylib.device import adb_wrapper | 19 from pylib.device import adb_wrapper |
| 16 from pylib.device import device_utils | 20 from pylib.device import device_utils |
| 17 | 21 |
| 18 | 22 |
| 23 class _ParallelTestObject(object): | |
| 24 """ Class used to test device_utils._ParallelExecutor. | |
| 25 | |
| 26 Note that this has to live at top-level so it can be pickled. | |
|
craigdh
2014/05/16 21:59:35
out of date?
jbudorick
2014/05/21 16:42:48
Done.
| |
| 27 """ | |
| 28 | |
| 29 parallel = device_utils._ParallelExecutor | |
| 30 | |
| 31 def __init__(self, thing, completion_file_name=None): | |
| 32 self._thing = thing | |
| 33 self._completion_file_name = completion_file_name | |
| 34 self.helper = _ParallelTestObjectHelper(thing) | |
| 35 | |
| 36 @staticmethod | |
| 37 def doReturn(what): | |
| 38 return what | |
| 39 | |
| 40 @classmethod | |
| 41 def doRaise(cls, what): | |
| 42 raise what | |
| 43 | |
| 44 def doReturnTheThing(self): | |
| 45 return self._thing | |
| 46 | |
| 47 def doRaiseTheThing(self): | |
| 48 raise self._thing | |
| 49 | |
| 50 def doRaiseIfExceptionElseSleepFor(self, sleep_duration): | |
| 51 if isinstance(self._thing, Exception): | |
| 52 raise self._thing | |
| 53 time.sleep(sleep_duration) | |
| 54 self._write_completion_file() | |
| 55 return self._thing | |
| 56 | |
| 57 def _write_completion_file(self): | |
| 58 if self._completion_file_name and len(self._completion_file_name): | |
| 59 with open(self._completion_file_name, 'w+b') as completion_file: | |
| 60 completion_file.write('complete') | |
| 61 | |
| 62 def __getitem__(self, index): | |
| 63 return self._thing[index] | |
| 64 | |
| 65 def __str__(self): | |
| 66 return type(self).__name__ | |
| 67 | |
| 68 | |
| 69 class _ParallelTestObjectHelper(object): | |
| 70 | |
| 71 def __init__(self, thing): | |
| 72 self._thing = thing | |
| 73 | |
| 74 def doReturnStringThing(self): | |
| 75 return str(self._thing) | |
| 76 | |
| 77 | |
| 19 class DeviceUtilsTest(unittest.TestCase): | 78 class DeviceUtilsTest(unittest.TestCase): |
| 20 def testGetAVDs(self): | 79 def testGetAVDs(self): |
| 21 pass | 80 pass |
| 22 | 81 |
| 23 def testRestartServerNotRunning(self): | 82 def testRestartServerNotRunning(self): |
| 24 # TODO(jbudorick) If these fail, it's not DeviceUtils's fault. | 83 # TODO(jbudorick) If these fail, it's not DeviceUtils's fault. |
| 25 self.assertEqual(0, cmd_helper.RunCmd(['pkill', 'adb'])) | 84 self.assertEqual(0, cmd_helper.RunCmd(['pkill', 'adb'])) |
| 26 self.assertNotEqual(0, cmd_helper.RunCmd(['pgrep', 'adb'])) | 85 self.assertNotEqual(0, cmd_helper.RunCmd(['pgrep', 'adb'])) |
| 27 device_utils.RestartServer() | 86 device_utils.RestartServer() |
| 28 self.assertEqual(0, cmd_helper.RunCmd(['pgrep', 'adb'])) | 87 self.assertEqual(0, cmd_helper.RunCmd(['pgrep', 'adb'])) |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 56 def testInitWithAndroidCommands(self): | 115 def testInitWithAndroidCommands(self): |
| 57 serial = '0fedcba987654321' | 116 serial = '0fedcba987654321' |
| 58 a = android_commands.AndroidCommands(device=serial) | 117 a = android_commands.AndroidCommands(device=serial) |
| 59 d = device_utils.DeviceUtils(a) | 118 d = device_utils.DeviceUtils(a) |
| 60 self.assertEqual(serial, d.old_interface.GetDevice()) | 119 self.assertEqual(serial, d.old_interface.GetDevice()) |
| 61 | 120 |
| 62 def testInitWithNone(self): | 121 def testInitWithNone(self): |
| 63 d = device_utils.DeviceUtils(None) | 122 d = device_utils.DeviceUtils(None) |
| 64 self.assertIsNone(d.old_interface.GetDevice()) | 123 self.assertIsNone(d.old_interface.GetDevice()) |
| 65 | 124 |
| 125 def testParallelAllReturn(self): | |
| 126 devices = [_ParallelTestObject(True) for _ in xrange(0, 10)] | |
| 127 results = _ParallelTestObject.parallel(devices).doReturnTheThing().get(1) | |
| 128 self.assertTrue(isinstance(results, list)) | |
| 129 self.assertEquals(10, len(results)) | |
| 130 self.assertTrue(all(results)) | |
| 131 | |
| 132 def testParallelAllRaise(self): | |
| 133 devices = [_ParallelTestObject(Exception('thing %d' % i)) | |
| 134 for i in xrange(0, 10)] | |
| 135 p = _ParallelTestObject.parallel(devices).doRaiseTheThing() | |
| 136 with self.assertRaises(Exception): | |
| 137 p.get(1) | |
| 138 | |
| 139 def testParallelOneFailOthersComplete(self): | |
| 140 parallel_device_count = 10 | |
| 141 exception_index = 7 | |
| 142 exception_msg = 'thing %d' % exception_index | |
| 143 | |
| 144 try: | |
| 145 completion_files = [tempfile.NamedTemporaryFile(delete=False) | |
| 146 for _ in xrange(0, parallel_device_count)] | |
| 147 devices = [ | |
| 148 _ParallelTestObject( | |
| 149 i if i != exception_index else Exception(exception_msg), | |
| 150 completion_files[i].name) | |
| 151 for i in xrange(0, parallel_device_count)] | |
| 152 for f in completion_files: | |
| 153 f.close() | |
| 154 p = _ParallelTestObject.parallel(devices) | |
| 155 with self.assertRaises(Exception) as e: | |
| 156 p.doRaiseIfExceptionElseSleepFor(2).get(3) | |
| 157 self.assertTrue(exception_msg in str(e.exception)) | |
| 158 for i in xrange(0, parallel_device_count): | |
| 159 with open(completion_files[i].name) as f: | |
| 160 if i == exception_index: | |
| 161 self.assertEquals('', f.read()) | |
| 162 else: | |
| 163 self.assertEquals('complete', f.read()) | |
| 164 finally: | |
| 165 for f in completion_files: | |
| 166 os.remove(f.name) | |
| 167 | |
| 168 def testParallelReusable(self): | |
| 169 devices = [_ParallelTestObject(True) for _ in xrange(0, 10)] | |
| 170 p = _ParallelTestObject.parallel(devices) | |
| 171 results = p.doReturn(True).get(1) | |
| 172 self.assertTrue(all(results)) | |
| 173 results = p.doReturn(True).get(1) | |
| 174 self.assertTrue(all(results)) | |
| 175 with self.assertRaises(Exception): | |
| 176 results = p.doRaise(Exception('reusableTest')).get(1) | |
| 177 | |
| 178 def testParallelContained(self): | |
| 179 devices = [_ParallelTestObject(i) for i in xrange(0, 10)] | |
| 180 results = (_ParallelTestObject.parallel(devices).helper | |
| 181 .doReturnStringThing().get(1)) | |
| 182 self.assertTrue(isinstance(results, list)) | |
| 183 self.assertEquals(10, len(results)) | |
| 184 for i in xrange(0, 10): | |
| 185 self.assertEquals(str(i), results[i]) | |
| 186 | |
| 187 def testParallelGetItem(self): | |
| 188 devices = [_ParallelTestObject(range(i, i+10)) for i in xrange(0, 10)] | |
| 189 results = _ParallelTestObject.parallel(devices)[9].get(1) | |
| 190 self.assertEquals(range(9, 19), results) | |
| 191 | |
| 66 | 192 |
| 67 if __name__ == '__main__': | 193 if __name__ == '__main__': |
| 68 unittest.main() | 194 unittest.main(verbosity=2) |
| 69 | 195 |
| OLD | NEW |