| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2014 The Chromium Authors. All rights reserved. | 2 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """ | 6 """ |
| 7 Unit tests for the contents of device_utils.py (mostly DeviceUtils). | 7 Unit tests for the contents of device_utils.py (mostly DeviceUtils). |
| 8 """ | 8 """ |
| 9 | 9 |
| 10 # pylint: disable=C0321 | 10 # pylint: disable=C0321 |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 return type(self).AndroidCommandsCalls(self, [(cmd, ret)], comp) | 211 return type(self).AndroidCommandsCalls(self, [(cmd, ret)], comp) |
| 212 | 212 |
| 213 def assertCallsSequence(self, cmd_ret, comp=str.__eq__): | 213 def assertCallsSequence(self, cmd_ret, comp=str.__eq__): |
| 214 return type(self).AndroidCommandsCalls(self, cmd_ret, comp) | 214 return type(self).AndroidCommandsCalls(self, cmd_ret, comp) |
| 215 | 215 |
| 216 def setUp(self): | 216 def setUp(self): |
| 217 self.device = device_utils.DeviceUtils( | 217 self.device = device_utils.DeviceUtils( |
| 218 '0123456789abcdef', default_timeout=1, default_retries=0) | 218 '0123456789abcdef', default_timeout=1, default_retries=0) |
| 219 | 219 |
| 220 | 220 |
| 221 class Args: |
| 222 def __init__(self, *args, **kwargs): |
| 223 self.args = args |
| 224 self.kwargs = kwargs |
| 225 |
| 226 def __eq__(self, other): |
| 227 return (self.args, self.kwargs) == (other.args, other.kwargs) |
| 228 |
| 229 def __repr__(self): |
| 230 return '%s(%s)' % (type(self).__name__, str(self)) |
| 231 |
| 232 def __str__(self): |
| 233 toks = (['%r' % v for v in self.args] + |
| 234 ['%s=%r' % (k, self.kwargs[k]) for k in sorted(self.kwargs)]) |
| 235 return ', '.join(toks) |
| 236 |
| 237 |
| 238 class MockCallSequence(object): |
| 239 def __init__(self, test_case, obj, method, calls): |
| 240 def assert_and_return(*args, **kwargs): |
| 241 received_args = Args(*args, **kwargs) |
| 242 test_case.assertTrue( |
| 243 self._calls, |
| 244 msg=('Unexpected call\n' |
| 245 ' received: %s(%s)\n' % (self._method, received_args))) |
| 246 expected_args, return_value = self._calls.pop(0) |
| 247 test_case.assertTrue( |
| 248 received_args == expected_args, |
| 249 msg=('Call does not match expected args\n' |
| 250 ' received: %s(%s)\n' |
| 251 ' expected: %s(%s)\n' |
| 252 % (self._method, received_args, |
| 253 self._method, expected_args))) |
| 254 if isinstance(return_value, Exception): |
| 255 raise return_value |
| 256 else: |
| 257 return return_value |
| 258 |
| 259 self._calls = list(calls) |
| 260 self._test_case = test_case |
| 261 self._method = method |
| 262 self._patched = mock.patch.object(obj, self._method, |
| 263 side_effect=assert_and_return) |
| 264 |
| 265 def __enter__(self): |
| 266 return self._patched.__enter__() |
| 267 |
| 268 def __exit__(self, exc_type, exc_val, exc_tb): |
| 269 self._patched.__exit__(exc_type, exc_val, exc_tb) |
| 270 if exc_type is None: |
| 271 missing = ''.join(' expected: %s(%s)\n' |
| 272 % (self._method, expected_args) |
| 273 for expected_args, _ in self._calls) |
| 274 self._test_case.assertTrue( |
| 275 not missing, |
| 276 msg=('Expected calls not found\n' + missing)) |
| 277 |
| 278 |
| 279 class _ShellError: |
| 280 def __init__(self, output=None, return_code=1): |
| 281 if output is None: |
| 282 self.output = 'Permission denied\r\n' |
| 283 else: |
| 284 self.output = output |
| 285 self.return_code = return_code |
| 286 |
| 287 |
| 221 class DeviceUtilsNewImplTest(unittest.TestCase): | 288 class DeviceUtilsNewImplTest(unittest.TestCase): |
| 222 | 289 |
| 223 def setUp(self): | 290 def setUp(self): |
| 224 test_serial = '0123456789abcdef' | 291 test_serial = '0123456789abcdef' |
| 225 self.adb = mock.Mock(spec=adb_wrapper.AdbWrapper) | 292 self.adb = mock.Mock(spec=adb_wrapper.AdbWrapper) |
| 226 self.adb.__str__ = mock.Mock(return_value=test_serial) | 293 self.adb.__str__ = mock.Mock(return_value=test_serial) |
| 227 self.adb.GetDeviceSerial.return_value = test_serial | 294 self.adb.GetDeviceSerial.return_value = test_serial |
| 228 self.device = device_utils.DeviceUtils( | 295 self.device = device_utils.DeviceUtils( |
| 229 self.adb, default_timeout=1, default_retries=0) | 296 self.adb, default_timeout=1, default_retries=0) |
| 230 | 297 |
| 298 def assertShellCallSequence(self, calls): |
| 299 '''Assert that we expect a sequence of calls to adb.Shell. |
| 300 |
| 301 Args: |
| 302 calls: a sequence of (cmd, return_value) pairs, where |cmd| is the |
| 303 expected shell command to run on the device (with any quoting already |
| 304 applied), and |return_value| is either a string to give as mock output |
| 305 or a _ShellError object to raise an AdbShellCommandFailedError. |
| 306 ''' |
| 307 def mk_expected_call(cmd, return_value): |
| 308 expected_args = Args(cmd, expect_rc=0) |
| 309 if isinstance(return_value, _ShellError): |
| 310 return_value = device_errors.AdbShellCommandFailedError(cmd, |
| 311 return_value.return_code, return_value.output, str(self.device)) |
| 312 return (expected_args, return_value) |
| 313 |
| 314 expected_calls = (mk_expected_call(a, r) for a, r in calls) |
| 315 return MockCallSequence(self, self.adb, 'Shell', expected_calls) |
| 316 |
| 317 def assertShellCall(self, cmd, return_value=''): |
| 318 return self.assertShellCallSequence([(cmd, return_value)]) |
| 319 |
| 231 | 320 |
| 232 class DeviceUtilsHybridImplTest(DeviceUtilsOldImplTest): | 321 class DeviceUtilsHybridImplTest(DeviceUtilsOldImplTest): |
| 233 | 322 |
| 234 def setUp(self): | 323 def setUp(self): |
| 235 super(DeviceUtilsHybridImplTest, self).setUp() | 324 super(DeviceUtilsHybridImplTest, self).setUp() |
| 236 self.device.adb = self.adb = mock.Mock(spec=adb_wrapper.AdbWrapper) | 325 self.device.adb = self.adb = mock.Mock(spec=adb_wrapper.AdbWrapper) |
| 237 | 326 |
| 238 | 327 |
| 239 class DeviceUtilsIsOnlineTest(DeviceUtilsOldImplTest): | 328 class DeviceUtilsIsOnlineTest(DeviceUtilsOldImplTest): |
| 240 | 329 |
| 241 def testIsOnline_true(self): | 330 def testIsOnline_true(self): |
| 242 with self.assertCalls('adb -s 0123456789abcdef devices', | 331 with self.assertCalls('adb -s 0123456789abcdef devices', |
| 243 '00123456789abcdef device\r\n'): | 332 '00123456789abcdef device\r\n'): |
| 244 self.assertTrue(self.device.IsOnline()) | 333 self.assertTrue(self.device.IsOnline()) |
| 245 | 334 |
| 246 def testIsOnline_false(self): | 335 def testIsOnline_false(self): |
| 247 with self.assertCalls('adb -s 0123456789abcdef devices', '\r\n'): | 336 with self.assertCalls('adb -s 0123456789abcdef devices', '\r\n'): |
| 248 self.assertFalse(self.device.IsOnline()) | 337 self.assertFalse(self.device.IsOnline()) |
| 249 | 338 |
| 250 | 339 |
| 251 class DeviceUtilsHasRootTest(DeviceUtilsOldImplTest): | 340 class DeviceUtilsHasRootTest(DeviceUtilsNewImplTest): |
| 252 | 341 |
| 253 def testHasRoot_true(self): | 342 def testHasRoot_true(self): |
| 254 with self.assertCalls("adb -s 0123456789abcdef shell 'ls /root'", | 343 with self.assertShellCall('ls /root', 'foo\r\n'): |
| 255 'foo\r\n'): | |
| 256 self.assertTrue(self.device.HasRoot()) | 344 self.assertTrue(self.device.HasRoot()) |
| 257 | 345 |
| 258 def testHasRoot_false(self): | 346 def testHasRoot_false(self): |
| 259 with self.assertCalls("adb -s 0123456789abcdef shell 'ls /root'", | 347 with self.assertShellCall('ls /root', _ShellError()): |
| 260 'Permission denied\r\n'): | |
| 261 self.assertFalse(self.device.HasRoot()) | 348 self.assertFalse(self.device.HasRoot()) |
| 262 | 349 |
| 263 | 350 |
| 264 class DeviceUtilsEnableRootTest(DeviceUtilsOldImplTest): | 351 class DeviceUtilsEnableRootTest(DeviceUtilsOldImplTest): |
| 265 | 352 |
| 266 def testEnableRoot_succeeds(self): | 353 def testEnableRoot_succeeds(self): |
| 267 with self.assertCallsSequence([ | 354 with self.assertCallsSequence([ |
| 268 ('adb -s 0123456789abcdef shell getprop ro.build.type', | 355 ('adb -s 0123456789abcdef shell getprop ro.build.type', |
| 269 'userdebug\r\n'), | 356 'userdebug\r\n'), |
| 270 ('adb -s 0123456789abcdef root', 'restarting adbd as root\r\n'), | 357 ('adb -s 0123456789abcdef root', 'restarting adbd as root\r\n'), |
| (...skipping 25 matching lines...) Expand all Loading... |
| 296 'user\r\n'): | 383 'user\r\n'): |
| 297 self.assertTrue(self.device.IsUserBuild()) | 384 self.assertTrue(self.device.IsUserBuild()) |
| 298 | 385 |
| 299 def testIsUserBuild_no(self): | 386 def testIsUserBuild_no(self): |
| 300 with self.assertCalls( | 387 with self.assertCalls( |
| 301 'adb -s 0123456789abcdef shell getprop ro.build.type', | 388 'adb -s 0123456789abcdef shell getprop ro.build.type', |
| 302 'userdebug\r\n'): | 389 'userdebug\r\n'): |
| 303 self.assertFalse(self.device.IsUserBuild()) | 390 self.assertFalse(self.device.IsUserBuild()) |
| 304 | 391 |
| 305 | 392 |
| 306 class DeviceUtilsGetExternalStoragePathTest(DeviceUtilsOldImplTest): | 393 class DeviceUtilsGetExternalStoragePathTest(DeviceUtilsNewImplTest): |
| 307 | 394 |
| 308 def testGetExternalStoragePath_succeeds(self): | 395 def testGetExternalStoragePath_succeeds(self): |
| 309 fakeStoragePath = '/fake/storage/path' | 396 fakeStoragePath = '/fake/storage/path' |
| 310 with self.assertCalls( | 397 with self.assertShellCall('echo $EXTERNAL_STORAGE', |
| 311 "adb -s 0123456789abcdef shell 'echo $EXTERNAL_STORAGE'", | 398 '%s\r\n' % fakeStoragePath): |
| 312 '%s\r\n' % fakeStoragePath): | |
| 313 self.assertEquals(fakeStoragePath, | 399 self.assertEquals(fakeStoragePath, |
| 314 self.device.GetExternalStoragePath()) | 400 self.device.GetExternalStoragePath()) |
| 315 | 401 |
| 316 def testGetExternalStoragePath_fails(self): | 402 def testGetExternalStoragePath_fails(self): |
| 317 with self.assertCalls( | 403 with self.assertShellCall('echo $EXTERNAL_STORAGE', '\r\n'): |
| 318 "adb -s 0123456789abcdef shell 'echo $EXTERNAL_STORAGE'", '\r\n'): | |
| 319 with self.assertRaises(device_errors.CommandFailedError): | 404 with self.assertRaises(device_errors.CommandFailedError): |
| 320 self.device.GetExternalStoragePath() | 405 self.device.GetExternalStoragePath() |
| 321 | 406 |
| 322 | 407 |
| 323 class DeviceUtilsWaitUntilFullyBootedTest(DeviceUtilsOldImplTest): | 408 class DeviceUtilsWaitUntilFullyBootedTest(DeviceUtilsOldImplTest): |
| 324 | 409 |
| 325 def testWaitUntilFullyBooted_succeedsNoWifi(self): | 410 def testWaitUntilFullyBooted_succeedsNoWifi(self): |
| 326 with self.assertCallsSequence([ | 411 with self.assertCallsSequence([ |
| 327 # AndroidCommands.WaitForSystemBootCompleted | 412 # AndroidCommands.WaitForSystemBootCompleted |
| 328 ('adb -s 0123456789abcdef wait-for-device', ''), | 413 ('adb -s 0123456789abcdef wait-for-device', ''), |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 537 return_value='this.is.a.test.package')): | 622 return_value='this.is.a.test.package')): |
| 538 with self.assertCallsSequence([ | 623 with self.assertCallsSequence([ |
| 539 ("adb -s 0123456789abcdef shell 'pm path this.is.a.test.package'", | 624 ("adb -s 0123456789abcdef shell 'pm path this.is.a.test.package'", |
| 540 ''), | 625 ''), |
| 541 ("adb -s 0123456789abcdef install /fake/test/app.apk", | 626 ("adb -s 0123456789abcdef install /fake/test/app.apk", |
| 542 'Failure\r\n')]): | 627 'Failure\r\n')]): |
| 543 with self.assertRaises(device_errors.CommandFailedError): | 628 with self.assertRaises(device_errors.CommandFailedError): |
| 544 self.device.Install('/fake/test/app.apk', retries=0) | 629 self.device.Install('/fake/test/app.apk', retries=0) |
| 545 | 630 |
| 546 | 631 |
| 547 class DeviceUtilsRunShellCommandTest(DeviceUtilsOldImplTest): | 632 class DeviceUtilsRunShellCommandTest(DeviceUtilsNewImplTest): |
| 548 | |
| 549 def testRunShellCommand_commandAsList(self): | 633 def testRunShellCommand_commandAsList(self): |
| 550 with self.assertCalls( | 634 with self.assertShellCall('pm list packages'): |
| 551 "adb -s 0123456789abcdef shell 'pm list packages'", | |
| 552 'pacakge:android\r\n'): | |
| 553 self.device.RunShellCommand(['pm', 'list', 'packages']) | 635 self.device.RunShellCommand(['pm', 'list', 'packages']) |
| 554 | 636 |
| 637 def testRunShellCommand_commandAsListQuoted(self): |
| 638 with self.assertShellCall("echo 'hello world' '$10'"): |
| 639 self.device.RunShellCommand(['echo', 'hello world', '$10']) |
| 640 |
| 555 def testRunShellCommand_commandAsString(self): | 641 def testRunShellCommand_commandAsString(self): |
| 556 with self.assertCalls( | 642 with self.assertShellCall('echo "$VAR"'): |
| 557 "adb -s 0123456789abcdef shell 'dumpsys wifi'", | 643 self.device.RunShellCommand('echo "$VAR"') |
| 558 'Wi-Fi is enabled\r\n'): | 644 |
| 559 self.device.RunShellCommand('dumpsys wifi') | 645 def testNewRunShellImpl_withEnv(self): |
| 646 with self.assertShellCall('VAR=some_string echo "$VAR"'): |
| 647 self.device.RunShellCommand('echo "$VAR"', env={'VAR': 'some_string'}) |
| 648 |
| 649 def testNewRunShellImpl_withEnvQuoted(self): |
| 650 with self.assertShellCall('PATH="$PATH:/other/path" run_this'): |
| 651 self.device.RunShellCommand('run_this', env={'PATH': '$PATH:/other/path'}) |
| 652 |
| 653 def testNewRunShellImpl_withEnv_failure(self): |
| 654 with self.assertRaises(KeyError): |
| 655 self.device.RunShellCommand('some_cmd', env={'INVALID NAME': 'value'}) |
| 656 |
| 657 def testNewRunShellImpl_withCwd(self): |
| 658 with self.assertShellCall('cd /some/test/path && ls'): |
| 659 self.device.RunShellCommand('ls', cwd='/some/test/path') |
| 660 |
| 661 def testNewRunShellImpl_withCwdQuoted(self): |
| 662 with self.assertShellCall("cd '/some test/path with/spaces' && ls"): |
| 663 self.device.RunShellCommand('ls', cwd='/some test/path with/spaces') |
| 560 | 664 |
| 561 def testRunShellCommand_withSu(self): | 665 def testRunShellCommand_withSu(self): |
| 562 with self.assertCallsSequence([ | 666 with self.assertShellCallSequence([ |
| 563 ("adb -s 0123456789abcdef shell 'ls /root'", 'Permission denied\r\n'), | 667 ('ls /root', _ShellError()), |
| 564 ("adb -s 0123456789abcdef shell 'su -c setprop service.adb.root 0'", | 668 ('su -c setprop service.adb.root 0', '')]): |
| 565 '')]): | |
| 566 self.device.RunShellCommand('setprop service.adb.root 0', as_root=True) | 669 self.device.RunShellCommand('setprop service.adb.root 0', as_root=True) |
| 567 | 670 |
| 568 def testRunShellCommand_withRoot(self): | 671 def testRunShellCommand_withRoot(self): |
| 569 with self.assertCallsSequence([ | 672 with self.assertShellCallSequence([ |
| 570 ("adb -s 0123456789abcdef shell 'ls /root'", 'hello\r\nworld\r\n'), | 673 ('ls /root', '\r\n'), |
| 571 ("adb -s 0123456789abcdef shell 'setprop service.adb.root 0'", '')]): | 674 ('setprop service.adb.root 0', '')]): |
| 572 self.device.RunShellCommand('setprop service.adb.root 0', as_root=True) | 675 self.device.RunShellCommand('setprop service.adb.root 0', as_root=True) |
| 573 | 676 |
| 677 def testRunShellCommand_manyLines(self): |
| 678 cmd = 'ls /some/path' |
| 679 with self.assertShellCall(cmd, 'file1\r\nfile2\r\nfile3\r\n'): |
| 680 self.assertEquals(['file1', 'file2', 'file3'], |
| 681 self.device.RunShellCommand(cmd)) |
| 682 |
| 683 def testRunShellCommand_singleLine_success(self): |
| 684 cmd = 'echo $VALUE' |
| 685 with self.assertShellCall(cmd, 'some value\r\n'): |
| 686 self.assertEquals('some value', |
| 687 self.device.RunShellCommand(cmd, single_line=True)) |
| 688 |
| 689 def testRunShellCommand_singleLine_successEmptyLine(self): |
| 690 cmd = 'echo $VALUE' |
| 691 with self.assertShellCall(cmd, '\r\n'): |
| 692 self.assertEquals('', |
| 693 self.device.RunShellCommand(cmd, single_line=True)) |
| 694 |
| 695 def testRunShellCommand_singleLine_successWithoutEndLine(self): |
| 696 cmd = 'echo -n $VALUE' |
| 697 with self.assertShellCall(cmd, 'some value'): |
| 698 self.assertEquals('some value', |
| 699 self.device.RunShellCommand(cmd, single_line=True)) |
| 700 |
| 701 def testRunShellCommand_singleLine_failNoLines(self): |
| 702 cmd = 'echo $VALUE' |
| 703 with self.assertShellCall(cmd, ''): |
| 704 with self.assertRaises(device_errors.CommandFailedError): |
| 705 self.device.RunShellCommand(cmd, single_line=True) |
| 706 |
| 707 def testRunShellCommand_singleLine_failTooManyLines(self): |
| 708 cmd = 'echo $VALUE' |
| 709 with self.assertShellCall(cmd, 'some value\r\nanother value\r\n'): |
| 710 with self.assertRaises(device_errors.CommandFailedError): |
| 711 self.device.RunShellCommand(cmd, single_line=True) |
| 712 |
| 574 def testRunShellCommand_checkReturn_success(self): | 713 def testRunShellCommand_checkReturn_success(self): |
| 575 with self.assertCalls( | 714 cmd = 'echo $ANDROID_DATA' |
| 576 "adb -s 0123456789abcdef shell 'echo $ANDROID_DATA; echo %$?'", | 715 output = '/data\r\n' |
| 577 '/data\r\n%0\r\n'): | 716 with self.assertShellCall(cmd, output): |
| 578 self.device.RunShellCommand('echo $ANDROID_DATA', check_return=True) | 717 self.assertEquals([output.rstrip()], |
| 718 self.device.RunShellCommand(cmd, check_return=True)) |
| 579 | 719 |
| 580 def testRunShellCommand_checkReturn_failure(self): | 720 def testRunShellCommand_checkReturn_failure(self): |
| 581 with self.assertCalls( | 721 cmd = 'ls /root' |
| 582 "adb -s 0123456789abcdef shell 'echo $ANDROID_DATA; echo %$?'", | 722 output = 'opendir failed, Permission denied\r\n' |
| 583 '\r\n%1\r\n'): | 723 with self.assertShellCall(cmd, _ShellError(output)): |
| 584 with self.assertRaises(device_errors.CommandFailedError): | 724 with self.assertRaises(device_errors.AdbShellCommandFailedError): |
| 585 self.device.RunShellCommand('echo $ANDROID_DATA', check_return=True) | 725 self.device.RunShellCommand(cmd, check_return=True) |
| 726 |
| 727 def testRunShellCommand_checkReturn_disabled(self): |
| 728 cmd = 'ls /root' |
| 729 output = 'opendir failed, Permission denied\r\n' |
| 730 with self.assertShellCall(cmd, _ShellError(output)): |
| 731 self.assertEquals([output.rstrip()], |
| 732 self.device.RunShellCommand(cmd, check_return=False)) |
| 586 | 733 |
| 587 | 734 |
| 588 class DeviceUtilsKillAllTest(DeviceUtilsOldImplTest): | 735 class DeviceUtilsKillAllTest(DeviceUtilsNewImplTest): |
| 589 | 736 |
| 590 def testKillAll_noMatchingProcesses(self): | 737 def testKillAll_noMatchingProcesses(self): |
| 591 with self.assertCalls( | 738 output = 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' |
| 592 "adb -s 0123456789abcdef shell 'ps'", | 739 with self.assertShellCallSequence([('ps', output)]): |
| 593 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n'): | |
| 594 with self.assertRaises(device_errors.CommandFailedError): | 740 with self.assertRaises(device_errors.CommandFailedError): |
| 595 self.device.KillAll('test_process') | 741 self.device.KillAll('test_process') |
| 596 | 742 |
| 597 def testKillAll_nonblocking(self): | 743 def testKillAll_nonblocking(self): |
| 598 with self.assertCallsSequence([ | 744 with self.assertShellCallSequence([ |
| 599 ("adb -s 0123456789abcdef shell 'ps'", | 745 ('ps', 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' |
| 600 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' | 746 'u0_a1 1234 174 123456 54321 ffffffff 456789ab ' |
| 601 'u0_a1 1234 174 123456 54321 ffffffff 456789ab ' | 747 'this.is.a.test.process\r\n'), |
| 602 'this.is.a.test.process\r\n'), | 748 ('kill -9 1234', '')]): |
| 603 ("adb -s 0123456789abcdef shell 'kill -9 1234'", '')]): | |
| 604 self.assertEquals(1, | 749 self.assertEquals(1, |
| 605 self.device.KillAll('this.is.a.test.process', blocking=False)) | 750 self.device.KillAll('this.is.a.test.process', blocking=False)) |
| 606 | 751 |
| 607 def testKillAll_blocking(self): | 752 def testKillAll_blocking(self): |
| 608 with mock.patch('time.sleep'): | 753 with mock.patch('time.sleep'): |
| 609 with self.assertCallsSequence([ | 754 with self.assertShellCallSequence([ |
| 610 ("adb -s 0123456789abcdef shell 'ps'", | 755 ('ps', 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' |
| 611 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' | 756 'u0_a1 1234 174 123456 54321 ffffffff 456789ab ' |
| 612 'u0_a1 1234 174 123456 54321 ffffffff 456789ab ' | 757 'this.is.a.test.process\r\n'), |
| 613 'this.is.a.test.process\r\n'), | 758 ('kill -9 1234', ''), |
| 614 ("adb -s 0123456789abcdef shell 'kill -9 1234'", ''), | 759 ('ps', 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' |
| 615 ("adb -s 0123456789abcdef shell 'ps'", | 760 'u0_a1 1234 174 123456 54321 ffffffff 456789ab ' |
| 616 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' | 761 'this.is.a.test.process\r\n'), |
| 617 'u0_a1 1234 174 123456 54321 ffffffff 456789ab ' | 762 ('ps', 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n')]): |
| 618 'this.is.a.test.process\r\n'), | |
| 619 ("adb -s 0123456789abcdef shell 'ps'", | |
| 620 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n')]): | |
| 621 self.assertEquals(1, | 763 self.assertEquals(1, |
| 622 self.device.KillAll('this.is.a.test.process', blocking=True)) | 764 self.device.KillAll('this.is.a.test.process', blocking=True)) |
| 623 | 765 |
| 624 def testKillAll_root(self): | 766 def testKillAll_root(self): |
| 625 with self.assertCallsSequence([ | 767 with self.assertShellCallSequence([ |
| 626 ("adb -s 0123456789abcdef shell 'ps'", | 768 ('ps', 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' |
| 627 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' | 769 'u0_a1 1234 174 123456 54321 ffffffff 456789ab ' |
| 628 'u0_a1 1234 174 123456 54321 ffffffff 456789ab ' | 770 'this.is.a.test.process\r\n'), |
| 629 'this.is.a.test.process\r\n'), | 771 ('ls /root', _ShellError()), |
| 630 ("adb -s 0123456789abcdef shell 'ls /root'", 'Permission denied\r\n'), | 772 ('su -c kill -9 1234', '')]): |
| 631 ("adb -s 0123456789abcdef shell 'su -c kill -9 1234'", '')]): | |
| 632 self.assertEquals(1, | 773 self.assertEquals(1, |
| 633 self.device.KillAll('this.is.a.test.process', as_root=True)) | 774 self.device.KillAll('this.is.a.test.process', as_root=True)) |
| 634 | 775 |
| 635 def testKillAll_sigterm(self): | 776 def testKillAll_sigterm(self): |
| 636 with self.assertCallsSequence([ | 777 with self.assertShellCallSequence([ |
| 637 ("adb -s 0123456789abcdef shell 'ps'", | 778 ('ps', 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' |
| 638 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' | 779 'u0_a1 1234 174 123456 54321 ffffffff 456789ab ' |
| 639 'u0_a1 1234 174 123456 54321 ffffffff 456789ab ' | 780 'this.is.a.test.process\r\n'), |
| 640 'this.is.a.test.process\r\n'), | 781 ('kill -15 1234', '')]): |
| 641 ("adb -s 0123456789abcdef shell 'kill -15 1234'", '')]): | |
| 642 self.assertEquals(1, | 782 self.assertEquals(1, |
| 643 self.device.KillAll('this.is.a.test.process', signum=signal.SIGTERM)) | 783 self.device.KillAll('this.is.a.test.process', signum=signal.SIGTERM)) |
| 644 | 784 |
| 645 | 785 |
| 646 class DeviceUtilsStartActivityTest(DeviceUtilsOldImplTest): | 786 class DeviceUtilsStartActivityTest(DeviceUtilsOldImplTest): |
| 647 | 787 |
| 648 def testStartActivity_actionOnly(self): | 788 def testStartActivity_actionOnly(self): |
| 649 test_intent = intent.Intent(action='android.intent.action.VIEW') | 789 test_intent = intent.Intent(action='android.intent.action.VIEW') |
| 650 with self.assertCalls( | 790 with self.assertCalls( |
| 651 "adb -s 0123456789abcdef shell 'am start " | 791 "adb -s 0123456789abcdef shell 'am start " |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 937 self.device._PushChangedFilesZipped(test_files) | 1077 self.device._PushChangedFilesZipped(test_files) |
| 938 | 1078 |
| 939 mock_zip_proc.assert_called_once_with( | 1079 mock_zip_proc.assert_called_once_with( |
| 940 target=device_utils.DeviceUtils._CreateDeviceZip, | 1080 target=device_utils.DeviceUtils._CreateDeviceZip, |
| 941 args=('/test/temp/file/tmp.zip', test_files)) | 1081 args=('/test/temp/file/tmp.zip', test_files)) |
| 942 self.adb.Push.assert_called_once_with( | 1082 self.adb.Push.assert_called_once_with( |
| 943 '/test/temp/file/tmp.zip', '/test/device/external_dir/tmp.zip') | 1083 '/test/temp/file/tmp.zip', '/test/device/external_dir/tmp.zip') |
| 944 self.assertEqual(2, self.device._RunShellCommandImpl.call_count) | 1084 self.assertEqual(2, self.device._RunShellCommandImpl.call_count) |
| 945 self.device._RunShellCommandImpl.assert_any_call( | 1085 self.device._RunShellCommandImpl.assert_any_call( |
| 946 ['unzip', '/test/device/external_dir/tmp.zip'], | 1086 ['unzip', '/test/device/external_dir/tmp.zip'], |
| 947 as_root=True, check_return=True, | 1087 as_root=True, |
| 948 env={'PATH': '$PATH:/data/local/tmp/bin'}) | 1088 env={'PATH': '$PATH:/data/local/tmp/bin'}, |
| 1089 check_return=True) |
| 949 self.device._RunShellCommandImpl.assert_any_call( | 1090 self.device._RunShellCommandImpl.assert_any_call( |
| 950 ['rm', '/test/device/external_dir/tmp.zip']) | 1091 ['rm', '/test/device/external_dir/tmp.zip'], check_return=True) |
| 951 | 1092 |
| 952 def testPushChangedFilesZipped_multiple(self): | 1093 def testPushChangedFilesZipped_multiple(self): |
| 953 test_files = [('/test/host/path/file1', '/test/device/path/file1'), | 1094 test_files = [('/test/host/path/file1', '/test/device/path/file1'), |
| 954 ('/test/host/path/file2', '/test/device/path/file2')] | 1095 ('/test/host/path/file2', '/test/device/path/file2')] |
| 955 | 1096 |
| 956 self.device._GetExternalStoragePathImpl = mock.Mock( | 1097 self.device._GetExternalStoragePathImpl = mock.Mock( |
| 957 return_value='/test/device/external_dir') | 1098 return_value='/test/device/external_dir') |
| 958 self.device._IsOnlineImpl = mock.Mock(return_value=True) | 1099 self.device._IsOnlineImpl = mock.Mock(return_value=True) |
| 959 self.device._RunShellCommandImpl = mock.Mock() | 1100 self.device._RunShellCommandImpl = mock.Mock() |
| 960 mock_zip_temp = mock.mock_open() | 1101 mock_zip_temp = mock.mock_open() |
| 961 mock_zip_temp.return_value.name = '/test/temp/file/tmp.zip' | 1102 mock_zip_temp.return_value.name = '/test/temp/file/tmp.zip' |
| 962 with mock.patch('multiprocessing.Process') as mock_zip_proc, ( | 1103 with mock.patch('multiprocessing.Process') as mock_zip_proc, ( |
| 963 mock.patch('tempfile.NamedTemporaryFile', mock_zip_temp)): | 1104 mock.patch('tempfile.NamedTemporaryFile', mock_zip_temp)): |
| 964 self.device._PushChangedFilesZipped(test_files) | 1105 self.device._PushChangedFilesZipped(test_files) |
| 965 | 1106 |
| 966 mock_zip_proc.assert_called_once_with( | 1107 mock_zip_proc.assert_called_once_with( |
| 967 target=device_utils.DeviceUtils._CreateDeviceZip, | 1108 target=device_utils.DeviceUtils._CreateDeviceZip, |
| 968 args=('/test/temp/file/tmp.zip', test_files)) | 1109 args=('/test/temp/file/tmp.zip', test_files)) |
| 969 self.adb.Push.assert_called_once_with( | 1110 self.adb.Push.assert_called_once_with( |
| 970 '/test/temp/file/tmp.zip', '/test/device/external_dir/tmp.zip') | 1111 '/test/temp/file/tmp.zip', '/test/device/external_dir/tmp.zip') |
| 971 self.assertEqual(2, self.device._RunShellCommandImpl.call_count) | 1112 self.assertEqual(2, self.device._RunShellCommandImpl.call_count) |
| 972 self.device._RunShellCommandImpl.assert_any_call( | 1113 self.device._RunShellCommandImpl.assert_any_call( |
| 973 ['unzip', '/test/device/external_dir/tmp.zip'], | 1114 ['unzip', '/test/device/external_dir/tmp.zip'], |
| 974 as_root=True, check_return=True, | 1115 as_root=True, |
| 975 env={'PATH': '$PATH:/data/local/tmp/bin'}) | 1116 env={'PATH': '$PATH:/data/local/tmp/bin'}, |
| 1117 check_return=True) |
| 976 self.device._RunShellCommandImpl.assert_any_call( | 1118 self.device._RunShellCommandImpl.assert_any_call( |
| 977 ['rm', '/test/device/external_dir/tmp.zip']) | 1119 ['rm', '/test/device/external_dir/tmp.zip'], check_return=True) |
| 978 | 1120 |
| 979 | 1121 |
| 980 class DeviceUtilsFileExistsTest(DeviceUtilsOldImplTest): | 1122 class DeviceUtilsFileExistsTest(DeviceUtilsOldImplTest): |
| 981 | 1123 |
| 982 def testFileExists_usingTest_fileExists(self): | 1124 def testFileExists_usingTest_fileExists(self): |
| 983 with self.assertCalls( | 1125 with self.assertCalls( |
| 984 "adb -s 0123456789abcdef shell " | 1126 "adb -s 0123456789abcdef shell " |
| 985 "'test -e \"/data/app/test.file.exists\"; echo $?'", | 1127 "'test -e \"/data/app/test.file.exists\"; echo $?'", |
| 986 '0\r\n'): | 1128 '0\r\n'): |
| 987 self.assertTrue(self.device.FileExists('/data/app/test.file.exists')) | 1129 self.assertTrue(self.device.FileExists('/data/app/test.file.exists')) |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1195 self.device.WriteFile('/test/file/written.to.device', | 1337 self.device.WriteFile('/test/file/written.to.device', |
| 1196 'new test file contents', as_root=True) | 1338 'new test file contents', as_root=True) |
| 1197 | 1339 |
| 1198 def testWriteFile_asRoot_rejected(self): | 1340 def testWriteFile_asRoot_rejected(self): |
| 1199 self.device.old_interface._privileged_command_runner = None | 1341 self.device.old_interface._privileged_command_runner = None |
| 1200 self.device.old_interface._protected_file_access_method_initialized = True | 1342 self.device.old_interface._protected_file_access_method_initialized = True |
| 1201 with self.assertRaises(device_errors.CommandFailedError): | 1343 with self.assertRaises(device_errors.CommandFailedError): |
| 1202 self.device.WriteFile('/test/file/no.permissions.to.write', | 1344 self.device.WriteFile('/test/file/no.permissions.to.write', |
| 1203 'new test file contents', as_root=True) | 1345 'new test file contents', as_root=True) |
| 1204 | 1346 |
| 1205 class DeviceUtilsWriteTextFileTest(DeviceUtilsOldImplTest): | 1347 class DeviceUtilsWriteTextFileTest(DeviceUtilsNewImplTest): |
| 1206 | 1348 |
| 1207 def testWriteTextFileTest_basic(self): | 1349 def testWriteTextFileTest_basic(self): |
| 1208 with self.assertCalls( | 1350 with self.assertShellCall('echo some.string > /test/file/to.write'): |
| 1209 "adb -s 0123456789abcdef shell 'echo some.string" | |
| 1210 " > /test/file/to.write; echo %$?'", '%0\r\n'): | |
| 1211 self.device.WriteTextFile('/test/file/to.write', 'some.string') | 1351 self.device.WriteTextFile('/test/file/to.write', 'some.string') |
| 1212 | 1352 |
| 1213 def testWriteTextFileTest_stringWithSpaces(self): | 1353 def testWriteTextFileTest_quoted(self): |
| 1214 with self.assertCalls( | 1354 with self.assertShellCall( |
| 1215 "adb -s 0123456789abcdef shell 'echo '\\''some other string'\\''" | 1355 "echo 'some other string' > '/test/file/to write'"): |
| 1216 " > /test/file/to.write; echo %$?'", '%0\r\n'): | 1356 self.device.WriteTextFile('/test/file/to write', 'some other string') |
| 1217 self.device.WriteTextFile('/test/file/to.write', 'some other string') | |
| 1218 | 1357 |
| 1219 def testWriteTextFileTest_asRoot_withSu(self): | 1358 def testWriteTextFileTest_asRoot(self): |
| 1220 with self.assertCallsSequence([ | 1359 with self.assertShellCallSequence([ |
| 1221 ("adb -s 0123456789abcdef shell 'ls /root'", 'Permission denied\r\n'), | 1360 ('ls /root', _ShellError()), |
| 1222 ("adb -s 0123456789abcdef shell 'su -c echo some.string" | 1361 ('su -c echo string > /test/file', '')]): |
| 1223 " > /test/file/to.write; echo %$?'", '%0\r\n')]): | 1362 self.device.WriteTextFile('/test/file', 'string', as_root=True) |
| 1224 self.device.WriteTextFile('/test/file/to.write', 'some.string', | |
| 1225 as_root=True) | |
| 1226 | |
| 1227 def testWriteTextFileTest_asRoot_withRoot(self): | |
| 1228 with self.assertCallsSequence([ | |
| 1229 ("adb -s 0123456789abcdef shell 'ls /root'", 'hello\r\nworld\r\n'), | |
| 1230 ("adb -s 0123456789abcdef shell 'echo some.string" | |
| 1231 " > /test/file/to.write; echo %$?'", '%0\r\n')]): | |
| 1232 self.device.WriteTextFile('/test/file/to.write', 'some.string', | |
| 1233 as_root=True) | |
| 1234 | |
| 1235 def testWriteTextFileTest_asRoot_rejected(self): | |
| 1236 with self.assertCallsSequence([ | |
| 1237 ("adb -s 0123456789abcdef shell 'ls /root'", 'Permission denied\r\n'), | |
| 1238 ("adb -s 0123456789abcdef shell 'su -c echo some.string" | |
| 1239 " > /test/file/to.write; echo %$?'", '%1\r\n')]): | |
| 1240 with self.assertRaises(device_errors.CommandFailedError): | |
| 1241 self.device.WriteTextFile('/test/file/to.write', 'some.string', | |
| 1242 as_root=True) | |
| 1243 | 1363 |
| 1244 class DeviceUtilsLsTest(DeviceUtilsOldImplTest): | 1364 class DeviceUtilsLsTest(DeviceUtilsOldImplTest): |
| 1245 | 1365 |
| 1246 def testLs_nothing(self): | 1366 def testLs_nothing(self): |
| 1247 with self.assertCallsSequence([ | 1367 with self.assertCallsSequence([ |
| 1248 ("adb -s 0123456789abcdef shell 'ls -lR /this/file/does.not.exist'", | 1368 ("adb -s 0123456789abcdef shell 'ls -lR /this/file/does.not.exist'", |
| 1249 '/this/file/does.not.exist: No such file or directory\r\n'), | 1369 '/this/file/does.not.exist: No such file or directory\r\n'), |
| 1250 ("adb -s 0123456789abcdef shell 'date +%z'", '+0000')]): | 1370 ("adb -s 0123456789abcdef shell 'date +%z'", '+0000')]): |
| 1251 self.assertEqual({}, self.device.Ls('/this/file/does.not.exist')) | 1371 self.assertEqual({}, self.device.Ls('/this/file/does.not.exist')) |
| 1252 | 1372 |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1389 class DeviceUtilsSetPropTest(DeviceUtilsOldImplTest): | 1509 class DeviceUtilsSetPropTest(DeviceUtilsOldImplTest): |
| 1390 | 1510 |
| 1391 def testSetProp(self): | 1511 def testSetProp(self): |
| 1392 with self.assertCalls( | 1512 with self.assertCalls( |
| 1393 'adb -s 0123456789abcdef shell ' | 1513 'adb -s 0123456789abcdef shell ' |
| 1394 'setprop this.is.a.test.property "test_property_value"', | 1514 'setprop this.is.a.test.property "test_property_value"', |
| 1395 ''): | 1515 ''): |
| 1396 self.device.SetProp('this.is.a.test.property', 'test_property_value') | 1516 self.device.SetProp('this.is.a.test.property', 'test_property_value') |
| 1397 | 1517 |
| 1398 | 1518 |
| 1399 class DeviceUtilsGetPidsTest(DeviceUtilsOldImplTest): | 1519 class DeviceUtilsGetPidsTest(DeviceUtilsNewImplTest): |
| 1400 | 1520 |
| 1401 def testGetPids_noMatches(self): | 1521 def testGetPids_noMatches(self): |
| 1402 with self.assertCalls( | 1522 with self.assertShellCall( |
| 1403 "adb -s 0123456789abcdef shell 'ps'", | 1523 'ps', |
| 1404 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' | 1524 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' |
| 1405 'user 1000 100 1024 1024 ffffffff 00000000 no.match\r\n'): | 1525 'user 1000 100 1024 1024 ffffffff 00000000 no.match\r\n'): |
| 1406 self.assertEqual({}, self.device.GetPids('does.not.match')) | 1526 self.assertEqual({}, self.device.GetPids('does.not.match')) |
| 1407 | 1527 |
| 1408 def testGetPids_oneMatch(self): | 1528 def testGetPids_oneMatch(self): |
| 1409 with self.assertCalls( | 1529 with self.assertShellCall( |
| 1410 "adb -s 0123456789abcdef shell 'ps'", | 1530 'ps', |
| 1411 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' | 1531 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' |
| 1412 'user 1000 100 1024 1024 ffffffff 00000000 not.a.match\r\n' | 1532 'user 1000 100 1024 1024 ffffffff 00000000 not.a.match\r\n' |
| 1413 'user 1001 100 1024 1024 ffffffff 00000000 one.match\r\n'): | 1533 'user 1001 100 1024 1024 ffffffff 00000000 one.match\r\n'): |
| 1414 self.assertEqual({'one.match': '1001'}, self.device.GetPids('one.match')) | 1534 self.assertEqual({'one.match': '1001'}, self.device.GetPids('one.match')) |
| 1415 | 1535 |
| 1416 def testGetPids_mutlipleMatches(self): | 1536 def testGetPids_mutlipleMatches(self): |
| 1417 with self.assertCalls( | 1537 with self.assertShellCall( |
| 1418 "adb -s 0123456789abcdef shell 'ps'", | 1538 'ps', |
| 1419 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' | 1539 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' |
| 1420 'user 1000 100 1024 1024 ffffffff 00000000 not\r\n' | 1540 'user 1000 100 1024 1024 ffffffff 00000000 not\r\n' |
| 1421 'user 1001 100 1024 1024 ffffffff 00000000 one.match\r\n' | 1541 'user 1001 100 1024 1024 ffffffff 00000000 one.match\r\n' |
| 1422 'user 1002 100 1024 1024 ffffffff 00000000 two.match\r\n' | 1542 'user 1002 100 1024 1024 ffffffff 00000000 two.match\r\n' |
| 1423 'user 1003 100 1024 1024 ffffffff 00000000 three.match\r\n'): | 1543 'user 1003 100 1024 1024 ffffffff 00000000 three.match\r\n'): |
| 1424 self.assertEqual( | 1544 self.assertEqual( |
| 1425 {'one.match': '1001', 'two.match': '1002', 'three.match': '1003'}, | 1545 {'one.match': '1001', 'two.match': '1002', 'three.match': '1003'}, |
| 1426 self.device.GetPids('match')) | 1546 self.device.GetPids('match')) |
| 1427 | 1547 |
| 1428 def testGetPids_exactMatch(self): | 1548 def testGetPids_exactMatch(self): |
| 1429 with self.assertCalls( | 1549 with self.assertShellCall( |
| 1430 "adb -s 0123456789abcdef shell 'ps'", | 1550 'ps', |
| 1431 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' | 1551 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n' |
| 1432 'user 1000 100 1024 1024 ffffffff 00000000 not.exact.match\r\n' | 1552 'user 1000 100 1024 1024 ffffffff 00000000 not.exact.match\r\n' |
| 1433 'user 1234 100 1024 1024 ffffffff 00000000 exact.match\r\n'): | 1553 'user 1234 100 1024 1024 ffffffff 00000000 exact.match\r\n'): |
| 1434 self.assertEqual( | 1554 self.assertEqual( |
| 1435 {'not.exact.match': '1000', 'exact.match': '1234'}, | 1555 {'not.exact.match': '1000', 'exact.match': '1234'}, |
| 1436 self.device.GetPids('exact.match')) | 1556 self.device.GetPids('exact.match')) |
| 1437 | 1557 |
| 1438 | 1558 |
| 1439 class DeviceUtilsTakeScreenshotTest(DeviceUtilsOldImplTest): | 1559 class DeviceUtilsTakeScreenshotTest(DeviceUtilsOldImplTest): |
| 1440 | 1560 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1526 self.device = device_utils.DeviceUtils(None) | 1646 self.device = device_utils.DeviceUtils(None) |
| 1527 with self.assertCalls('adb get-serialno', 'unknown'), ( | 1647 with self.assertCalls('adb get-serialno', 'unknown'), ( |
| 1528 self.assertRaises(device_errors.NoDevicesError)): | 1648 self.assertRaises(device_errors.NoDevicesError)): |
| 1529 str(self.device) | 1649 str(self.device) |
| 1530 | 1650 |
| 1531 | 1651 |
| 1532 if __name__ == '__main__': | 1652 if __name__ == '__main__': |
| 1533 logging.getLogger().setLevel(logging.DEBUG) | 1653 logging.getLogger().setLevel(logging.DEBUG) |
| 1534 unittest.main(verbosity=2) | 1654 unittest.main(verbosity=2) |
| 1535 | 1655 |
| OLD | NEW |