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 |
11 # pylint: disable=W0212 | 11 # pylint: disable=W0212 |
12 # pylint: disable=W0613 | 12 # pylint: disable=W0613 |
13 | 13 |
14 import collections | 14 import collections |
15 import datetime | 15 import datetime |
16 import logging | 16 import logging |
17 import os | 17 import os |
18 import re | 18 import re |
19 import sys | 19 import sys |
20 import unittest | 20 import unittest |
21 | 21 |
22 from pylib import android_commands | 22 from pylib import android_commands |
23 from pylib import cmd_helper | 23 from pylib import cmd_helper |
24 from pylib import constants | 24 from pylib import constants |
25 from pylib import device_signal | 25 from pylib import device_signal |
26 from pylib.device import adb_wrapper | 26 from pylib.device import adb_wrapper |
27 from pylib.device import device_errors | 27 from pylib.device import device_errors |
28 from pylib.device import device_utils | 28 from pylib.device import device_utils |
29 from pylib.device import intent | 29 from pylib.device import intent |
| 30 from pylib.sdk import split_select |
30 from pylib.utils import mock_calls | 31 from pylib.utils import mock_calls |
31 | 32 |
32 # RunCommand from third_party/android_testrunner/run_command.py is mocked | 33 # RunCommand from third_party/android_testrunner/run_command.py is mocked |
33 # below, so its path needs to be in sys.path. | 34 # below, so its path needs to be in sys.path. |
34 sys.path.append(os.path.join( | 35 sys.path.append(os.path.join( |
35 constants.DIR_SOURCE_ROOT, 'third_party', 'android_testrunner')) | 36 constants.DIR_SOURCE_ROOT, 'third_party', 'android_testrunner')) |
36 | 37 |
37 sys.path.append(os.path.join( | 38 sys.path.append(os.path.join( |
38 constants.DIR_SOURCE_ROOT, 'third_party', 'pymock')) | 39 constants.DIR_SOURCE_ROOT, 'third_party', 'pymock')) |
39 import mock # pylint: disable=F0401 | 40 import mock # pylint: disable=F0401 |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 self.call.adb.Shell('echo $EXTERNAL_STORAGE'), '/fake/storage/path\n'): | 304 self.call.adb.Shell('echo $EXTERNAL_STORAGE'), '/fake/storage/path\n'): |
304 self.assertEquals('/fake/storage/path', | 305 self.assertEquals('/fake/storage/path', |
305 self.device.GetExternalStoragePath()) | 306 self.device.GetExternalStoragePath()) |
306 | 307 |
307 def testGetExternalStoragePath_fails(self): | 308 def testGetExternalStoragePath_fails(self): |
308 with self.assertCall(self.call.adb.Shell('echo $EXTERNAL_STORAGE'), '\n'): | 309 with self.assertCall(self.call.adb.Shell('echo $EXTERNAL_STORAGE'), '\n'): |
309 with self.assertRaises(device_errors.CommandFailedError): | 310 with self.assertRaises(device_errors.CommandFailedError): |
310 self.device.GetExternalStoragePath() | 311 self.device.GetExternalStoragePath() |
311 | 312 |
312 | 313 |
313 class DeviceUtilsGetApplicationPathTest(DeviceUtilsTest): | 314 class DeviceUtilsGetApplicationPathsTest(DeviceUtilsTest): |
314 | 315 |
315 def testGetApplicationPath_exists(self): | 316 def testGetApplicationPaths_exists(self): |
316 with self.assertCalls( | 317 with self.assertCalls( |
317 (self.call.adb.Shell('getprop ro.build.version.sdk'), '19\n'), | 318 (self.call.adb.Shell('getprop ro.build.version.sdk'), '19\n'), |
318 (self.call.adb.Shell('pm path android'), | 319 (self.call.adb.Shell('pm path android'), |
319 'package:/path/to/android.apk\n')): | 320 'package:/path/to/android.apk\n')): |
320 self.assertEquals('/path/to/android.apk', | 321 self.assertEquals(['/path/to/android.apk'], |
321 self.device.GetApplicationPath('android')) | 322 self.device.GetApplicationPaths('android')) |
322 | 323 |
323 def testGetApplicationPath_notExists(self): | 324 def testGetApplicationPaths_notExists(self): |
324 with self.assertCalls( | 325 with self.assertCalls( |
325 (self.call.adb.Shell('getprop ro.build.version.sdk'), '19\n'), | 326 (self.call.adb.Shell('getprop ro.build.version.sdk'), '19\n'), |
326 (self.call.adb.Shell('pm path not.installed.app'), '')): | 327 (self.call.adb.Shell('pm path not.installed.app'), '')): |
327 self.assertEquals(None, | 328 self.assertEquals([], |
328 self.device.GetApplicationPath('not.installed.app')) | 329 self.device.GetApplicationPaths('not.installed.app')) |
329 | 330 |
330 def testGetApplicationPath_fails(self): | 331 def testGetApplicationPaths_fails(self): |
331 with self.assertCalls( | 332 with self.assertCalls( |
332 (self.call.adb.Shell('getprop ro.build.version.sdk'), '19\n'), | 333 (self.call.adb.Shell('getprop ro.build.version.sdk'), '19\n'), |
333 (self.call.adb.Shell('pm path android'), | 334 (self.call.adb.Shell('pm path android'), |
334 self.CommandError('ERROR. Is package manager running?\n'))): | 335 self.CommandError('ERROR. Is package manager running?\n'))): |
335 with self.assertRaises(device_errors.CommandFailedError): | 336 with self.assertRaises(device_errors.CommandFailedError): |
336 self.device.GetApplicationPath('android') | 337 self.device.GetApplicationPaths('android') |
| 338 |
| 339 |
| 340 class DeviceUtilsGetApplicationDataDirectoryTest(DeviceUtilsTest): |
| 341 |
| 342 def testGetApplicationDataDirectory_exists(self): |
| 343 with self.assertCall( |
| 344 self.call.device._RunPipedShellCommand( |
| 345 'pm dump foo.bar.baz | grep dataDir='), |
| 346 ['dataDir=/data/data/foo.bar.baz']): |
| 347 self.assertEquals( |
| 348 '/data/data/foo.bar.baz', |
| 349 self.device.GetApplicationDataDirectory('foo.bar.baz')) |
| 350 |
| 351 def testGetApplicationDataDirectory_notExists(self): |
| 352 with self.assertCall( |
| 353 self.call.device._RunPipedShellCommand( |
| 354 'pm dump foo.bar.baz | grep dataDir='), |
| 355 self.ShellError()): |
| 356 self.assertIsNone(self.device.GetApplicationDataDirectory('foo.bar.baz')) |
337 | 357 |
338 | 358 |
339 @mock.patch('time.sleep', mock.Mock()) | 359 @mock.patch('time.sleep', mock.Mock()) |
340 class DeviceUtilsWaitUntilFullyBootedTest(DeviceUtilsTest): | 360 class DeviceUtilsWaitUntilFullyBootedTest(DeviceUtilsTest): |
341 | 361 |
342 def testWaitUntilFullyBooted_succeedsNoWifi(self): | 362 def testWaitUntilFullyBooted_succeedsNoWifi(self): |
343 with self.assertCalls( | 363 with self.assertCalls( |
344 self.call.adb.WaitForDevice(), | 364 self.call.adb.WaitForDevice(), |
345 # sd_card_ready | 365 # sd_card_ready |
346 (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), | 366 (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), |
347 (self.call.adb.Shell('test -d /fake/storage/path'), ''), | 367 (self.call.adb.Shell('test -d /fake/storage/path'), ''), |
348 # pm_ready | 368 # pm_ready |
349 (self.call.device.GetApplicationPath('android'), | 369 (self.call.device.GetApplicationPaths('android'), |
350 'package:/some/fake/path'), | 370 ['package:/some/fake/path']), |
351 # boot_completed | 371 # boot_completed |
352 (self.call.device.GetProp('sys.boot_completed'), '1')): | 372 (self.call.device.GetProp('sys.boot_completed'), '1')): |
353 self.device.WaitUntilFullyBooted(wifi=False) | 373 self.device.WaitUntilFullyBooted(wifi=False) |
354 | 374 |
355 def testWaitUntilFullyBooted_succeedsWithWifi(self): | 375 def testWaitUntilFullyBooted_succeedsWithWifi(self): |
356 with self.assertCalls( | 376 with self.assertCalls( |
357 self.call.adb.WaitForDevice(), | 377 self.call.adb.WaitForDevice(), |
358 # sd_card_ready | 378 # sd_card_ready |
359 (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), | 379 (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), |
360 (self.call.adb.Shell('test -d /fake/storage/path'), ''), | 380 (self.call.adb.Shell('test -d /fake/storage/path'), ''), |
361 # pm_ready | 381 # pm_ready |
362 (self.call.device.GetApplicationPath('android'), | 382 (self.call.device.GetApplicationPaths('android'), |
363 'package:/some/fake/path'), | 383 ['package:/some/fake/path']), |
364 # boot_completed | 384 # boot_completed |
365 (self.call.device.GetProp('sys.boot_completed'), '1'), | 385 (self.call.device.GetProp('sys.boot_completed'), '1'), |
366 # wifi_enabled | 386 # wifi_enabled |
367 (self.call.adb.Shell('dumpsys wifi'), | 387 (self.call.adb.Shell('dumpsys wifi'), |
368 'stuff\nWi-Fi is enabled\nmore stuff\n')): | 388 'stuff\nWi-Fi is enabled\nmore stuff\n')): |
369 self.device.WaitUntilFullyBooted(wifi=True) | 389 self.device.WaitUntilFullyBooted(wifi=True) |
370 | 390 |
371 def testWaitUntilFullyBooted_deviceNotInitiallyAvailable(self): | 391 def testWaitUntilFullyBooted_deviceNotInitiallyAvailable(self): |
372 with self.assertCalls( | 392 with self.assertCalls( |
373 self.call.adb.WaitForDevice(), | 393 self.call.adb.WaitForDevice(), |
374 # sd_card_ready | 394 # sd_card_ready |
375 (self.call.device.GetExternalStoragePath(), self.AdbCommandError()), | 395 (self.call.device.GetExternalStoragePath(), self.AdbCommandError()), |
376 # sd_card_ready | 396 # sd_card_ready |
377 (self.call.device.GetExternalStoragePath(), self.AdbCommandError()), | 397 (self.call.device.GetExternalStoragePath(), self.AdbCommandError()), |
378 # sd_card_ready | 398 # sd_card_ready |
379 (self.call.device.GetExternalStoragePath(), self.AdbCommandError()), | 399 (self.call.device.GetExternalStoragePath(), self.AdbCommandError()), |
380 # sd_card_ready | 400 # sd_card_ready |
381 (self.call.device.GetExternalStoragePath(), self.AdbCommandError()), | 401 (self.call.device.GetExternalStoragePath(), self.AdbCommandError()), |
382 # sd_card_ready | 402 # sd_card_ready |
383 (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), | 403 (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), |
384 (self.call.adb.Shell('test -d /fake/storage/path'), ''), | 404 (self.call.adb.Shell('test -d /fake/storage/path'), ''), |
385 # pm_ready | 405 # pm_ready |
386 (self.call.device.GetApplicationPath('android'), | 406 (self.call.device.GetApplicationPaths('android'), |
387 'package:/some/fake/path'), | 407 ['package:/some/fake/path']), |
388 # boot_completed | 408 # boot_completed |
389 (self.call.device.GetProp('sys.boot_completed'), '1')): | 409 (self.call.device.GetProp('sys.boot_completed'), '1')): |
390 self.device.WaitUntilFullyBooted(wifi=False) | 410 self.device.WaitUntilFullyBooted(wifi=False) |
391 | 411 |
392 def testWaitUntilFullyBooted_sdCardReadyFails_noPath(self): | 412 def testWaitUntilFullyBooted_sdCardReadyFails_noPath(self): |
393 with self.assertCalls( | 413 with self.assertCalls( |
394 self.call.adb.WaitForDevice(), | 414 self.call.adb.WaitForDevice(), |
395 # sd_card_ready | 415 # sd_card_ready |
396 (self.call.device.GetExternalStoragePath(), self.CommandError())): | 416 (self.call.device.GetExternalStoragePath(), self.CommandError())): |
397 with self.assertRaises(device_errors.CommandFailedError): | 417 with self.assertRaises(device_errors.CommandFailedError): |
(...skipping 15 matching lines...) Expand all Loading... |
413 with self.assertRaises(device_errors.CommandTimeoutError): | 433 with self.assertRaises(device_errors.CommandTimeoutError): |
414 self.device.WaitUntilFullyBooted(wifi=False) | 434 self.device.WaitUntilFullyBooted(wifi=False) |
415 | 435 |
416 def testWaitUntilFullyBooted_devicePmFails(self): | 436 def testWaitUntilFullyBooted_devicePmFails(self): |
417 with self.assertCalls( | 437 with self.assertCalls( |
418 self.call.adb.WaitForDevice(), | 438 self.call.adb.WaitForDevice(), |
419 # sd_card_ready | 439 # sd_card_ready |
420 (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), | 440 (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), |
421 (self.call.adb.Shell('test -d /fake/storage/path'), ''), | 441 (self.call.adb.Shell('test -d /fake/storage/path'), ''), |
422 # pm_ready | 442 # pm_ready |
423 (self.call.device.GetApplicationPath('android'), self.CommandError()), | 443 (self.call.device.GetApplicationPaths('android'), self.CommandError()), |
424 # pm_ready | 444 # pm_ready |
425 (self.call.device.GetApplicationPath('android'), self.CommandError()), | 445 (self.call.device.GetApplicationPaths('android'), self.CommandError()), |
426 # pm_ready | 446 # pm_ready |
427 (self.call.device.GetApplicationPath('android'), self.TimeoutError())): | 447 (self.call.device.GetApplicationPaths('android'), self.TimeoutError())): |
428 with self.assertRaises(device_errors.CommandTimeoutError): | 448 with self.assertRaises(device_errors.CommandTimeoutError): |
429 self.device.WaitUntilFullyBooted(wifi=False) | 449 self.device.WaitUntilFullyBooted(wifi=False) |
430 | 450 |
431 def testWaitUntilFullyBooted_bootFails(self): | 451 def testWaitUntilFullyBooted_bootFails(self): |
432 with self.assertCalls( | 452 with self.assertCalls( |
433 self.call.adb.WaitForDevice(), | 453 self.call.adb.WaitForDevice(), |
434 # sd_card_ready | 454 # sd_card_ready |
435 (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), | 455 (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), |
436 (self.call.adb.Shell('test -d /fake/storage/path'), ''), | 456 (self.call.adb.Shell('test -d /fake/storage/path'), ''), |
437 # pm_ready | 457 # pm_ready |
438 (self.call.device.GetApplicationPath('android'), | 458 (self.call.device.GetApplicationPaths('android'), |
439 'package:/some/fake/path'), | 459 ['package:/some/fake/path']), |
440 # boot_completed | 460 # boot_completed |
441 (self.call.device.GetProp('sys.boot_completed'), '0'), | 461 (self.call.device.GetProp('sys.boot_completed'), '0'), |
442 # boot_completed | 462 # boot_completed |
443 (self.call.device.GetProp('sys.boot_completed'), '0'), | 463 (self.call.device.GetProp('sys.boot_completed'), '0'), |
444 # boot_completed | 464 # boot_completed |
445 (self.call.device.GetProp('sys.boot_completed'), self.TimeoutError())): | 465 (self.call.device.GetProp('sys.boot_completed'), self.TimeoutError())): |
446 with self.assertRaises(device_errors.CommandTimeoutError): | 466 with self.assertRaises(device_errors.CommandTimeoutError): |
447 self.device.WaitUntilFullyBooted(wifi=False) | 467 self.device.WaitUntilFullyBooted(wifi=False) |
448 | 468 |
449 def testWaitUntilFullyBooted_wifiFails(self): | 469 def testWaitUntilFullyBooted_wifiFails(self): |
450 with self.assertCalls( | 470 with self.assertCalls( |
451 self.call.adb.WaitForDevice(), | 471 self.call.adb.WaitForDevice(), |
452 # sd_card_ready | 472 # sd_card_ready |
453 (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), | 473 (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), |
454 (self.call.adb.Shell('test -d /fake/storage/path'), ''), | 474 (self.call.adb.Shell('test -d /fake/storage/path'), ''), |
455 # pm_ready | 475 # pm_ready |
456 (self.call.device.GetApplicationPath('android'), | 476 (self.call.device.GetApplicationPaths('android'), |
457 'package:/some/fake/path'), | 477 ['package:/some/fake/path']), |
458 # boot_completed | 478 # boot_completed |
459 (self.call.device.GetProp('sys.boot_completed'), '1'), | 479 (self.call.device.GetProp('sys.boot_completed'), '1'), |
460 # wifi_enabled | 480 # wifi_enabled |
461 (self.call.adb.Shell('dumpsys wifi'), 'stuff\nmore stuff\n'), | 481 (self.call.adb.Shell('dumpsys wifi'), 'stuff\nmore stuff\n'), |
462 # wifi_enabled | 482 # wifi_enabled |
463 (self.call.adb.Shell('dumpsys wifi'), 'stuff\nmore stuff\n'), | 483 (self.call.adb.Shell('dumpsys wifi'), 'stuff\nmore stuff\n'), |
464 # wifi_enabled | 484 # wifi_enabled |
465 (self.call.adb.Shell('dumpsys wifi'), self.TimeoutError())): | 485 (self.call.adb.Shell('dumpsys wifi'), self.TimeoutError())): |
466 with self.assertRaises(device_errors.CommandTimeoutError): | 486 with self.assertRaises(device_errors.CommandTimeoutError): |
467 self.device.WaitUntilFullyBooted(wifi=True) | 487 self.device.WaitUntilFullyBooted(wifi=True) |
(...skipping 25 matching lines...) Expand all Loading... |
493 self.call.device.WaitUntilFullyBooted(wifi=True)): | 513 self.call.device.WaitUntilFullyBooted(wifi=True)): |
494 self.device.Reboot(block=True, wifi=True) | 514 self.device.Reboot(block=True, wifi=True) |
495 | 515 |
496 | 516 |
497 class DeviceUtilsInstallTest(DeviceUtilsTest): | 517 class DeviceUtilsInstallTest(DeviceUtilsTest): |
498 | 518 |
499 def testInstall_noPriorInstall(self): | 519 def testInstall_noPriorInstall(self): |
500 with self.assertCalls( | 520 with self.assertCalls( |
501 (mock.call.pylib.utils.apk_helper.GetPackageName('/fake/test/app.apk'), | 521 (mock.call.pylib.utils.apk_helper.GetPackageName('/fake/test/app.apk'), |
502 'this.is.a.test.package'), | 522 'this.is.a.test.package'), |
503 (self.call.device.GetApplicationPath('this.is.a.test.package'), None), | 523 (self.call.device.GetApplicationPaths('this.is.a.test.package'), []), |
504 self.call.adb.Install('/fake/test/app.apk', reinstall=False)): | 524 self.call.adb.Install('/fake/test/app.apk', reinstall=False)): |
505 self.device.Install('/fake/test/app.apk', retries=0) | 525 self.device.Install('/fake/test/app.apk', retries=0) |
506 | 526 |
507 def testInstall_differentPriorInstall(self): | 527 def testInstall_differentPriorInstall(self): |
508 with self.assertCalls( | 528 with self.assertCalls( |
509 (mock.call.pylib.utils.apk_helper.GetPackageName('/fake/test/app.apk'), | 529 (mock.call.pylib.utils.apk_helper.GetPackageName('/fake/test/app.apk'), |
510 'this.is.a.test.package'), | 530 'this.is.a.test.package'), |
511 (self.call.device.GetApplicationPath('this.is.a.test.package'), | 531 (self.call.device.GetApplicationPaths('this.is.a.test.package'), |
512 '/fake/data/app/this.is.a.test.package.apk'), | 532 ['/fake/data/app/this.is.a.test.package.apk']), |
513 (self.call.device._GetChangedFilesImpl( | 533 (self.call.device._GetChangedAndStaleFiles( |
514 '/fake/test/app.apk', '/fake/data/app/this.is.a.test.package.apk'), | 534 '/fake/test/app.apk', '/fake/data/app/this.is.a.test.package.apk'), |
515 [('/fake/test/app.apk', '/fake/data/app/this.is.a.test.package.apk')]), | 535 ([('/fake/test/app.apk', '/fake/data/app/this.is.a.test.package.apk')], |
| 536 [])), |
516 self.call.adb.Uninstall('this.is.a.test.package'), | 537 self.call.adb.Uninstall('this.is.a.test.package'), |
517 self.call.adb.Install('/fake/test/app.apk', reinstall=False)): | 538 self.call.adb.Install('/fake/test/app.apk', reinstall=False)): |
518 self.device.Install('/fake/test/app.apk', retries=0) | 539 self.device.Install('/fake/test/app.apk', retries=0) |
519 | 540 |
520 def testInstall_differentPriorInstall_reinstall(self): | 541 def testInstall_differentPriorInstall_reinstall(self): |
521 with self.assertCalls( | 542 with self.assertCalls( |
522 (mock.call.pylib.utils.apk_helper.GetPackageName('/fake/test/app.apk'), | 543 (mock.call.pylib.utils.apk_helper.GetPackageName('/fake/test/app.apk'), |
523 'this.is.a.test.package'), | 544 'this.is.a.test.package'), |
524 (self.call.device.GetApplicationPath('this.is.a.test.package'), | 545 (self.call.device.GetApplicationPaths('this.is.a.test.package'), |
525 '/fake/data/app/this.is.a.test.package.apk'), | 546 ['/fake/data/app/this.is.a.test.package.apk']), |
526 (self.call.device._GetChangedFilesImpl( | 547 (self.call.device._GetChangedAndStaleFiles( |
527 '/fake/test/app.apk', '/fake/data/app/this.is.a.test.package.apk'), | 548 '/fake/test/app.apk', '/fake/data/app/this.is.a.test.package.apk'), |
528 [('/fake/test/app.apk', '/fake/data/app/this.is.a.test.package.apk')]), | 549 ([('/fake/test/app.apk', '/fake/data/app/this.is.a.test.package.apk')], |
| 550 [])), |
529 self.call.adb.Install('/fake/test/app.apk', reinstall=True)): | 551 self.call.adb.Install('/fake/test/app.apk', reinstall=True)): |
530 self.device.Install('/fake/test/app.apk', reinstall=True, retries=0) | 552 self.device.Install('/fake/test/app.apk', reinstall=True, retries=0) |
531 | 553 |
532 def testInstall_identicalPriorInstall(self): | 554 def testInstall_identicalPriorInstall(self): |
533 with self.assertCalls( | 555 with self.assertCalls( |
534 (mock.call.pylib.utils.apk_helper.GetPackageName('/fake/test/app.apk'), | 556 (mock.call.pylib.utils.apk_helper.GetPackageName('/fake/test/app.apk'), |
535 'this.is.a.test.package'), | 557 'this.is.a.test.package'), |
536 (self.call.device.GetApplicationPath('this.is.a.test.package'), | 558 (self.call.device.GetApplicationPaths('this.is.a.test.package'), |
537 '/fake/data/app/this.is.a.test.package.apk'), | 559 ['/fake/data/app/this.is.a.test.package.apk']), |
538 (self.call.device._GetChangedFilesImpl( | 560 (self.call.device._GetChangedAndStaleFiles( |
539 '/fake/test/app.apk', '/fake/data/app/this.is.a.test.package.apk'), | 561 '/fake/test/app.apk', '/fake/data/app/this.is.a.test.package.apk'), |
540 [])): | 562 ([], []))): |
541 self.device.Install('/fake/test/app.apk', retries=0) | 563 self.device.Install('/fake/test/app.apk', retries=0) |
542 | 564 |
543 def testInstall_fails(self): | 565 def testInstall_fails(self): |
544 with self.assertCalls( | 566 with self.assertCalls( |
545 (mock.call.pylib.utils.apk_helper.GetPackageName('/fake/test/app.apk'), | 567 (mock.call.pylib.utils.apk_helper.GetPackageName('/fake/test/app.apk'), |
546 'this.is.a.test.package'), | 568 'this.is.a.test.package'), |
547 (self.call.device.GetApplicationPath('this.is.a.test.package'), None), | 569 (self.call.device.GetApplicationPaths('this.is.a.test.package'), []), |
548 (self.call.adb.Install('/fake/test/app.apk', reinstall=False), | 570 (self.call.adb.Install('/fake/test/app.apk', reinstall=False), |
549 self.CommandError('Failure\r\n'))): | 571 self.CommandError('Failure\r\n'))): |
550 with self.assertRaises(device_errors.CommandFailedError): | 572 with self.assertRaises(device_errors.CommandFailedError): |
551 self.device.Install('/fake/test/app.apk', retries=0) | 573 self.device.Install('/fake/test/app.apk', retries=0) |
552 | 574 |
| 575 class DeviceUtilsInstallSplitApkTest(DeviceUtilsTest): |
| 576 |
| 577 def testInstallSplitApk_noPriorInstall(self): |
| 578 with self.assertCalls( |
| 579 (self.call.device._CheckSdkLevel(21)), |
| 580 (mock.call.pylib.sdk.split_select.SelectSplits( |
| 581 self.device, 'base.apk', |
| 582 ['split1.apk', 'split2.apk', 'split3.apk']), |
| 583 ['split2.apk']), |
| 584 (mock.call.pylib.utils.apk_helper.GetPackageName('base.apk'), |
| 585 'this.is.a.test.package'), |
| 586 (self.call.device.GetApplicationPaths('this.is.a.test.package'), []), |
| 587 (self.call.adb.InstallMultiple( |
| 588 ['base.apk', 'split2.apk'], partial=None, reinstall=False))): |
| 589 self.device.InstallSplitApk('base.apk', |
| 590 ['split1.apk', 'split2.apk', 'split3.apk'], retries=0) |
| 591 |
| 592 def testInstallSplitApk_partialInstall(self): |
| 593 with self.assertCalls( |
| 594 (self.call.device._CheckSdkLevel(21)), |
| 595 (mock.call.pylib.sdk.split_select.SelectSplits( |
| 596 self.device, 'base.apk', |
| 597 ['split1.apk', 'split2.apk', 'split3.apk']), |
| 598 ['split2.apk']), |
| 599 (mock.call.pylib.utils.apk_helper.GetPackageName('base.apk'), |
| 600 'test.package'), |
| 601 (self.call.device.GetApplicationPaths('test.package'), |
| 602 ['base-on-device.apk', 'split2-on-device.apk']), |
| 603 (mock.call.pylib.utils.md5sum.CalculateDeviceMd5Sums( |
| 604 ['base-on-device.apk', 'split2-on-device.apk'], self.device), |
| 605 {'base-on-device.apk': 'AAA', 'split2-on-device.apk': 'BBB'}), |
| 606 (mock.call.pylib.utils.md5sum.CalculateHostMd5Sums( |
| 607 ['base.apk', 'split2.apk']), |
| 608 {'base.apk': 'AAA', 'split2.apk': 'CCC'}), |
| 609 (self.call.adb.InstallMultiple( |
| 610 ['split2.apk'], partial='test.package', reinstall=True))): |
| 611 self.device.InstallSplitApk('base.apk', |
| 612 ['split1.apk', 'split2.apk', 'split3.apk'], reinstall=True, retries=0) |
| 613 |
553 | 614 |
554 class DeviceUtilsRunShellCommandTest(DeviceUtilsTest): | 615 class DeviceUtilsRunShellCommandTest(DeviceUtilsTest): |
555 | 616 |
556 def setUp(self): | 617 def setUp(self): |
557 super(DeviceUtilsRunShellCommandTest, self).setUp() | 618 super(DeviceUtilsRunShellCommandTest, self).setUp() |
558 self.device.NeedsSU = mock.Mock(return_value=False) | 619 self.device.NeedsSU = mock.Mock(return_value=False) |
559 | 620 |
560 def testRunShellCommand_commandAsList(self): | 621 def testRunShellCommand_commandAsList(self): |
561 with self.assertCall(self.call.adb.Shell('pm list packages'), ''): | 622 with self.assertCall(self.call.adb.Shell('pm list packages'), ''): |
562 self.device.RunShellCommand(['pm', 'list', 'packages']) | 623 self.device.RunShellCommand(['pm', 'list', 'packages']) |
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
965 'Starting: Intent { act=android.intent.action.VIEW }'): | 1026 'Starting: Intent { act=android.intent.action.VIEW }'): |
966 self.device.StartActivity(test_intent) | 1027 self.device.StartActivity(test_intent) |
967 | 1028 |
968 | 1029 |
969 class DeviceUtilsStartInstrumentationTest(DeviceUtilsTest): | 1030 class DeviceUtilsStartInstrumentationTest(DeviceUtilsTest): |
970 | 1031 |
971 def testStartInstrumentation_nothing(self): | 1032 def testStartInstrumentation_nothing(self): |
972 with self.assertCalls( | 1033 with self.assertCalls( |
973 self.call.device.RunShellCommand( | 1034 self.call.device.RunShellCommand( |
974 ['am', 'instrument', 'test.package/.TestInstrumentation'], | 1035 ['am', 'instrument', 'test.package/.TestInstrumentation'], |
975 check_return=True)): | 1036 check_return=True, large_output=True)): |
976 self.device.StartInstrumentation( | 1037 self.device.StartInstrumentation( |
977 'test.package/.TestInstrumentation', | 1038 'test.package/.TestInstrumentation', |
978 finish=False, raw=False, extras=None) | 1039 finish=False, raw=False, extras=None) |
979 | 1040 |
980 def testStartInstrumentation_finish(self): | 1041 def testStartInstrumentation_finish(self): |
981 with self.assertCalls( | 1042 with self.assertCalls( |
982 (self.call.device.RunShellCommand( | 1043 (self.call.device.RunShellCommand( |
983 ['am', 'instrument', '-w', 'test.package/.TestInstrumentation'], | 1044 ['am', 'instrument', '-w', 'test.package/.TestInstrumentation'], |
984 check_return=True), | 1045 check_return=True, large_output=True), |
985 ['OK (1 test)'])): | 1046 ['OK (1 test)'])): |
986 output = self.device.StartInstrumentation( | 1047 output = self.device.StartInstrumentation( |
987 'test.package/.TestInstrumentation', | 1048 'test.package/.TestInstrumentation', |
988 finish=True, raw=False, extras=None) | 1049 finish=True, raw=False, extras=None) |
989 self.assertEquals(['OK (1 test)'], output) | 1050 self.assertEquals(['OK (1 test)'], output) |
990 | 1051 |
991 def testStartInstrumentation_raw(self): | 1052 def testStartInstrumentation_raw(self): |
992 with self.assertCalls( | 1053 with self.assertCalls( |
993 self.call.device.RunShellCommand( | 1054 self.call.device.RunShellCommand( |
994 ['am', 'instrument', '-r', 'test.package/.TestInstrumentation'], | 1055 ['am', 'instrument', '-r', 'test.package/.TestInstrumentation'], |
995 check_return=True)): | 1056 check_return=True, large_output=True)): |
996 self.device.StartInstrumentation( | 1057 self.device.StartInstrumentation( |
997 'test.package/.TestInstrumentation', | 1058 'test.package/.TestInstrumentation', |
998 finish=False, raw=True, extras=None) | 1059 finish=False, raw=True, extras=None) |
999 | 1060 |
1000 def testStartInstrumentation_extras(self): | 1061 def testStartInstrumentation_extras(self): |
1001 with self.assertCalls( | 1062 with self.assertCalls( |
1002 self.call.device.RunShellCommand( | 1063 self.call.device.RunShellCommand( |
1003 ['am', 'instrument', '-e', 'foo', 'Foo', '-e', 'bar', 'Bar', | 1064 ['am', 'instrument', '-e', 'foo', 'Foo', '-e', 'bar', 'Bar', |
1004 'test.package/.TestInstrumentation'], | 1065 'test.package/.TestInstrumentation'], |
1005 check_return=True)): | 1066 check_return=True, large_output=True)): |
1006 self.device.StartInstrumentation( | 1067 self.device.StartInstrumentation( |
1007 'test.package/.TestInstrumentation', | 1068 'test.package/.TestInstrumentation', |
1008 finish=False, raw=False, extras={'foo': 'Foo', 'bar': 'Bar'}) | 1069 finish=False, raw=False, extras={'foo': 'Foo', 'bar': 'Bar'}) |
1009 | 1070 |
1010 | 1071 |
1011 class DeviceUtilsBroadcastIntentTest(DeviceUtilsTest): | 1072 class DeviceUtilsBroadcastIntentTest(DeviceUtilsTest): |
1012 | 1073 |
1013 def testBroadcastIntent_noExtras(self): | 1074 def testBroadcastIntent_noExtras(self): |
1014 test_intent = intent.Intent(action='test.package.with.an.INTENT') | 1075 test_intent = intent.Intent(action='test.package.with.an.INTENT') |
1015 with self.assertCall( | 1076 with self.assertCall( |
(...skipping 15 matching lines...) Expand all Loading... |
1031 extras={'foo': None}) | 1092 extras={'foo': None}) |
1032 with self.assertCall( | 1093 with self.assertCall( |
1033 self.call.adb.Shell( | 1094 self.call.adb.Shell( |
1034 'am broadcast -a test.package.with.an.INTENT --esn foo'), | 1095 'am broadcast -a test.package.with.an.INTENT --esn foo'), |
1035 'Broadcasting: Intent { act=test.package.with.an.INTENT } '): | 1096 'Broadcasting: Intent { act=test.package.with.an.INTENT } '): |
1036 self.device.BroadcastIntent(test_intent) | 1097 self.device.BroadcastIntent(test_intent) |
1037 | 1098 |
1038 | 1099 |
1039 class DeviceUtilsGoHomeTest(DeviceUtilsTest): | 1100 class DeviceUtilsGoHomeTest(DeviceUtilsTest): |
1040 | 1101 |
1041 def testGoHome(self): | 1102 def testGoHome_popupsExist(self): |
1042 with self.assertCall( | 1103 with self.assertCalls( |
1043 self.call.adb.Shell('am start -W -a android.intent.action.MAIN ' | 1104 (self.call.device.RunShellCommand( |
1044 '-c android.intent.category.HOME'), | 1105 ['dumpsys', 'window', 'windows'], check_return=True, |
1045 'Starting: Intent { act=android.intent.action.MAIN }\r\n'): | 1106 large_output=True), []), |
| 1107 (self.call.device.RunShellCommand( |
| 1108 ['am', 'start', '-W', '-a', 'android.intent.action.MAIN', |
| 1109 '-c', 'android.intent.category.HOME'], check_return=True), |
| 1110 'Starting: Intent { act=android.intent.action.MAIN }\r\n'''), |
| 1111 (self.call.device.RunShellCommand( |
| 1112 ['dumpsys', 'window', 'windows'], check_return=True, |
| 1113 large_output=True), []), |
| 1114 (self.call.device.RunShellCommand( |
| 1115 ['input', 'keyevent', '66'], check_return=True)), |
| 1116 (self.call.device.RunShellCommand( |
| 1117 ['input', 'keyevent', '4'], check_return=True)), |
| 1118 (self.call.device.RunShellCommand( |
| 1119 ['dumpsys', 'window', 'windows'], check_return=True, |
| 1120 large_output=True), |
| 1121 ['mCurrentFocus Launcher'])): |
1046 self.device.GoHome() | 1122 self.device.GoHome() |
1047 | 1123 |
| 1124 def testGoHome_willRetry(self): |
| 1125 with self.assertCalls( |
| 1126 (self.call.device.RunShellCommand( |
| 1127 ['dumpsys', 'window', 'windows'], check_return=True, |
| 1128 large_output=True), []), |
| 1129 (self.call.device.RunShellCommand( |
| 1130 ['am', 'start', '-W', '-a', 'android.intent.action.MAIN', |
| 1131 '-c', 'android.intent.category.HOME'], check_return=True), |
| 1132 'Starting: Intent { act=android.intent.action.MAIN }\r\n'''), |
| 1133 (self.call.device.RunShellCommand( |
| 1134 ['dumpsys', 'window', 'windows'], check_return=True, |
| 1135 large_output=True), []), |
| 1136 (self.call.device.RunShellCommand( |
| 1137 ['input', 'keyevent', '66'], check_return=True,)), |
| 1138 (self.call.device.RunShellCommand( |
| 1139 ['input', 'keyevent', '4'], check_return=True)), |
| 1140 (self.call.device.RunShellCommand( |
| 1141 ['dumpsys', 'window', 'windows'], check_return=True, |
| 1142 large_output=True), []), |
| 1143 (self.call.device.RunShellCommand( |
| 1144 ['input', 'keyevent', '66'], check_return=True)), |
| 1145 (self.call.device.RunShellCommand( |
| 1146 ['input', 'keyevent', '4'], check_return=True)), |
| 1147 (self.call.device.RunShellCommand( |
| 1148 ['dumpsys', 'window', 'windows'], check_return=True, |
| 1149 large_output=True), |
| 1150 self.TimeoutError())): |
| 1151 with self.assertRaises(device_errors.CommandTimeoutError): |
| 1152 self.device.GoHome() |
| 1153 |
| 1154 def testGoHome_alreadyFocused(self): |
| 1155 with self.assertCall( |
| 1156 self.call.device.RunShellCommand( |
| 1157 ['dumpsys', 'window', 'windows'], check_return=True, |
| 1158 large_output=True), |
| 1159 ['mCurrentFocus Launcher']): |
| 1160 self.device.GoHome() |
| 1161 |
| 1162 def testGoHome_alreadyFocusedAlternateCase(self): |
| 1163 with self.assertCall( |
| 1164 self.call.device.RunShellCommand( |
| 1165 ['dumpsys', 'window', 'windows'], check_return=True, |
| 1166 large_output=True), |
| 1167 [' mCurrentFocus .launcher/.']): |
| 1168 self.device.GoHome() |
| 1169 |
| 1170 def testGoHome_obtainsFocusAfterGoingHome(self): |
| 1171 with self.assertCalls( |
| 1172 (self.call.device.RunShellCommand( |
| 1173 ['dumpsys', 'window', 'windows'], check_return=True, |
| 1174 large_output=True), []), |
| 1175 (self.call.device.RunShellCommand( |
| 1176 ['am', 'start', '-W', '-a', 'android.intent.action.MAIN', |
| 1177 '-c', 'android.intent.category.HOME'], check_return=True), |
| 1178 'Starting: Intent { act=android.intent.action.MAIN }\r\n'''), |
| 1179 (self.call.device.RunShellCommand( |
| 1180 ['dumpsys', 'window', 'windows'], check_return=True, |
| 1181 large_output=True), |
| 1182 ['mCurrentFocus Launcher'])): |
| 1183 self.device.GoHome() |
1048 | 1184 |
1049 class DeviceUtilsForceStopTest(DeviceUtilsTest): | 1185 class DeviceUtilsForceStopTest(DeviceUtilsTest): |
1050 | 1186 |
1051 def testForceStop(self): | 1187 def testForceStop(self): |
1052 with self.assertCall( | 1188 with self.assertCall( |
1053 self.call.adb.Shell('am force-stop this.is.a.test.package'), | 1189 self.call.adb.Shell('am force-stop this.is.a.test.package'), |
1054 ''): | 1190 ''): |
1055 self.device.ForceStop('this.is.a.test.package') | 1191 self.device.ForceStop('this.is.a.test.package') |
1056 | 1192 |
1057 | 1193 |
1058 class DeviceUtilsClearApplicationStateTest(DeviceUtilsTest): | 1194 class DeviceUtilsClearApplicationStateTest(DeviceUtilsTest): |
1059 | 1195 |
1060 def testClearApplicationState_packageDoesntExist(self): | 1196 def testClearApplicationState_packageDoesntExist(self): |
1061 with self.assertCalls( | 1197 with self.assertCalls( |
1062 (self.call.adb.Shell('getprop ro.build.version.sdk'), '17\n'), | 1198 (self.call.adb.Shell('getprop ro.build.version.sdk'), '17\n'), |
1063 (self.call.device.GetApplicationPath('this.package.does.not.exist'), | 1199 (self.call.device.GetApplicationPaths('this.package.does.not.exist'), |
1064 None)): | 1200 [])): |
1065 self.device.ClearApplicationState('this.package.does.not.exist') | 1201 self.device.ClearApplicationState('this.package.does.not.exist') |
1066 | 1202 |
1067 def testClearApplicationState_packageDoesntExistOnAndroidJBMR2OrAbove(self): | 1203 def testClearApplicationState_packageDoesntExistOnAndroidJBMR2OrAbove(self): |
1068 with self.assertCalls( | 1204 with self.assertCalls( |
1069 (self.call.adb.Shell('getprop ro.build.version.sdk'), '18\n'), | 1205 (self.call.adb.Shell('getprop ro.build.version.sdk'), '18\n'), |
1070 (self.call.adb.Shell('pm clear this.package.does.not.exist'), | 1206 (self.call.adb.Shell('pm clear this.package.does.not.exist'), |
1071 'Failed\r\n')): | 1207 'Failed\r\n')): |
1072 self.device.ClearApplicationState('this.package.does.not.exist') | 1208 self.device.ClearApplicationState('this.package.does.not.exist') |
1073 | 1209 |
1074 def testClearApplicationState_packageExists(self): | 1210 def testClearApplicationState_packageExists(self): |
1075 with self.assertCalls( | 1211 with self.assertCalls( |
1076 (self.call.adb.Shell('getprop ro.build.version.sdk'), '17\n'), | 1212 (self.call.adb.Shell('getprop ro.build.version.sdk'), '17\n'), |
1077 (self.call.device.GetApplicationPath('this.package.exists'), | 1213 (self.call.device.GetApplicationPaths('this.package.exists'), |
1078 '/data/app/this.package.exists.apk'), | 1214 ['/data/app/this.package.exists.apk']), |
1079 (self.call.adb.Shell('pm clear this.package.exists'), | 1215 (self.call.adb.Shell('pm clear this.package.exists'), |
1080 'Success\r\n')): | 1216 'Success\r\n')): |
1081 self.device.ClearApplicationState('this.package.exists') | 1217 self.device.ClearApplicationState('this.package.exists') |
1082 | 1218 |
1083 def testClearApplicationState_packageExistsOnAndroidJBMR2OrAbove(self): | 1219 def testClearApplicationState_packageExistsOnAndroidJBMR2OrAbove(self): |
1084 with self.assertCalls( | 1220 with self.assertCalls( |
1085 (self.call.adb.Shell('getprop ro.build.version.sdk'), '18\n'), | 1221 (self.call.adb.Shell('getprop ro.build.version.sdk'), '18\n'), |
1086 (self.call.adb.Shell('pm clear this.package.exists'), | 1222 (self.call.adb.Shell('pm clear this.package.exists'), |
1087 'Success\r\n')): | 1223 'Success\r\n')): |
1088 self.device.ClearApplicationState('this.package.exists') | 1224 self.device.ClearApplicationState('this.package.exists') |
(...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1700 devices = device_utils.DeviceUtils.HealthyDevices() | 1836 devices = device_utils.DeviceUtils.HealthyDevices() |
1701 self.assertEquals(1, len(devices)) | 1837 self.assertEquals(1, len(devices)) |
1702 self.assertTrue(isinstance(devices[0], device_utils.DeviceUtils)) | 1838 self.assertTrue(isinstance(devices[0], device_utils.DeviceUtils)) |
1703 self.assertEquals('0123456789abcdef', devices[0].adb.GetDeviceSerial()) | 1839 self.assertEquals('0123456789abcdef', devices[0].adb.GetDeviceSerial()) |
1704 | 1840 |
1705 | 1841 |
1706 if __name__ == '__main__': | 1842 if __name__ == '__main__': |
1707 logging.getLogger().setLevel(logging.DEBUG) | 1843 logging.getLogger().setLevel(logging.DEBUG) |
1708 unittest.main(verbosity=2) | 1844 unittest.main(verbosity=2) |
1709 | 1845 |
OLD | NEW |