Index: build/android/devil/android/device_utils_test.py |
diff --git a/build/android/devil/android/device_utils_test.py b/build/android/devil/android/device_utils_test.py |
deleted file mode 100755 |
index 659cea79fcc3aad63a23e178d6cc00998586cf7c..0000000000000000000000000000000000000000 |
--- a/build/android/devil/android/device_utils_test.py |
+++ /dev/null |
@@ -1,2291 +0,0 @@ |
-#!/usr/bin/env python |
-# Copyright 2014 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-""" |
-Unit tests for the contents of device_utils.py (mostly DeviceUtils). |
-""" |
- |
-# pylint: disable=protected-access |
-# pylint: disable=unused-argument |
- |
-import logging |
-import unittest |
- |
-from devil import devil_env |
-from devil.android import device_errors |
-from devil.android import device_signal |
-from devil.android import device_utils |
-from devil.android.sdk import adb_wrapper |
-from devil.android.sdk import intent |
-from devil.android.sdk import version_codes |
-from devil.utils import cmd_helper |
-from devil.utils import mock_calls |
- |
-with devil_env.SysPath(devil_env.PYMOCK_PATH): |
- import mock # pylint: disable=import-error |
- |
- |
-class _MockApkHelper(object): |
- def __init__(self, path, package_name, perms=None): |
- self.path = path |
- self.package_name = package_name |
- self.perms = perms |
- |
- def GetPackageName(self): |
- return self.package_name |
- |
- def GetPermissions(self): |
- return self.perms |
- |
- |
-class DeviceUtilsInitTest(unittest.TestCase): |
- |
- def testInitWithStr(self): |
- serial_as_str = str('0123456789abcdef') |
- d = device_utils.DeviceUtils('0123456789abcdef') |
- self.assertEqual(serial_as_str, d.adb.GetDeviceSerial()) |
- |
- def testInitWithUnicode(self): |
- serial_as_unicode = unicode('fedcba9876543210') |
- d = device_utils.DeviceUtils(serial_as_unicode) |
- self.assertEqual(serial_as_unicode, d.adb.GetDeviceSerial()) |
- |
- def testInitWithAdbWrapper(self): |
- serial = '123456789abcdef0' |
- a = adb_wrapper.AdbWrapper(serial) |
- d = device_utils.DeviceUtils(a) |
- self.assertEqual(serial, d.adb.GetDeviceSerial()) |
- |
- def testInitWithMissing_fails(self): |
- with self.assertRaises(ValueError): |
- device_utils.DeviceUtils(None) |
- with self.assertRaises(ValueError): |
- device_utils.DeviceUtils('') |
- |
- |
-class DeviceUtilsGetAVDsTest(mock_calls.TestCase): |
- |
- def testGetAVDs(self): |
- mocked_attrs = { |
- 'android_sdk': '/my/sdk/path' |
- } |
- with mock.patch('devil.devil_env._Environment.LocalPath', |
- mock.Mock(side_effect=lambda a: mocked_attrs[a])): |
- with self.assertCall( |
- mock.call.devil.utils.cmd_helper.GetCmdOutput( |
- [mock.ANY, 'list', 'avd']), |
- 'Available Android Virtual Devices:\n' |
- ' Name: my_android5.0\n' |
- ' Path: /some/path/to/.android/avd/my_android5.0.avd\n' |
- ' Target: Android 5.0 (API level 21)\n' |
- ' Tag/ABI: default/x86\n' |
- ' Skin: WVGA800\n'): |
- self.assertEquals(['my_android5.0'], device_utils.GetAVDs()) |
- |
- |
-class DeviceUtilsRestartServerTest(mock_calls.TestCase): |
- |
- @mock.patch('time.sleep', mock.Mock()) |
- def testRestartServer_succeeds(self): |
- with self.assertCalls( |
- mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.KillServer(), |
- (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput( |
- ['pgrep', 'adb']), |
- (1, '')), |
- mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.StartServer(), |
- (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput( |
- ['pgrep', 'adb']), |
- (1, '')), |
- (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput( |
- ['pgrep', 'adb']), |
- (0, '123\n'))): |
- device_utils.RestartServer() |
- |
- |
-class MockTempFile(object): |
- |
- def __init__(self, name='/tmp/some/file'): |
- self.file = mock.MagicMock(spec=file) |
- self.file.name = name |
- self.file.name_quoted = cmd_helper.SingleQuote(name) |
- |
- def __enter__(self): |
- return self.file |
- |
- def __exit__(self, exc_type, exc_val, exc_tb): |
- pass |
- |
- @property |
- def name(self): |
- return self.file.name |
- |
- |
-class _PatchedFunction(object): |
- def __init__(self, patched=None, mocked=None): |
- self.patched = patched |
- self.mocked = mocked |
- |
- |
-def _AdbWrapperMock(test_serial, is_ready=True): |
- adb = mock.Mock(spec=adb_wrapper.AdbWrapper) |
- adb.__str__ = mock.Mock(return_value=test_serial) |
- adb.GetDeviceSerial.return_value = test_serial |
- adb.is_ready = is_ready |
- return adb |
- |
- |
-class DeviceUtilsTest(mock_calls.TestCase): |
- |
- def setUp(self): |
- self.adb = _AdbWrapperMock('0123456789abcdef') |
- self.device = device_utils.DeviceUtils( |
- self.adb, default_timeout=10, default_retries=0) |
- self.watchMethodCalls(self.call.adb, ignore=['GetDeviceSerial']) |
- |
- def AdbCommandError(self, args=None, output=None, status=None, msg=None): |
- if args is None: |
- args = ['[unspecified]'] |
- return mock.Mock(side_effect=device_errors.AdbCommandFailedError( |
- args, output, status, msg, str(self.device))) |
- |
- def CommandError(self, msg=None): |
- if msg is None: |
- msg = 'Command failed' |
- return mock.Mock(side_effect=device_errors.CommandFailedError( |
- msg, str(self.device))) |
- |
- def ShellError(self, output=None, status=1): |
- def action(cmd, *args, **kwargs): |
- raise device_errors.AdbShellCommandFailedError( |
- cmd, output, status, str(self.device)) |
- if output is None: |
- output = 'Permission denied\n' |
- return action |
- |
- def TimeoutError(self, msg=None): |
- if msg is None: |
- msg = 'Operation timed out' |
- return mock.Mock(side_effect=device_errors.CommandTimeoutError( |
- msg, str(self.device))) |
- |
- |
-class DeviceUtilsEqTest(DeviceUtilsTest): |
- |
- def testEq_equal_deviceUtils(self): |
- other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdef')) |
- self.assertTrue(self.device == other) |
- self.assertTrue(other == self.device) |
- |
- def testEq_equal_adbWrapper(self): |
- other = adb_wrapper.AdbWrapper('0123456789abcdef') |
- self.assertTrue(self.device == other) |
- self.assertTrue(other == self.device) |
- |
- def testEq_equal_string(self): |
- other = '0123456789abcdef' |
- self.assertTrue(self.device == other) |
- self.assertTrue(other == self.device) |
- |
- def testEq_devicesNotEqual(self): |
- other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdee')) |
- self.assertFalse(self.device == other) |
- self.assertFalse(other == self.device) |
- |
- def testEq_identity(self): |
- self.assertTrue(self.device == self.device) |
- |
- def testEq_serialInList(self): |
- devices = [self.device] |
- self.assertTrue('0123456789abcdef' in devices) |
- |
- |
-class DeviceUtilsLtTest(DeviceUtilsTest): |
- |
- def testLt_lessThan(self): |
- other = device_utils.DeviceUtils(_AdbWrapperMock('ffffffffffffffff')) |
- self.assertTrue(self.device < other) |
- self.assertTrue(other > self.device) |
- |
- def testLt_greaterThan_lhs(self): |
- other = device_utils.DeviceUtils(_AdbWrapperMock('0000000000000000')) |
- self.assertFalse(self.device < other) |
- self.assertFalse(other > self.device) |
- |
- def testLt_equal(self): |
- other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdef')) |
- self.assertFalse(self.device < other) |
- self.assertFalse(other > self.device) |
- |
- def testLt_sorted(self): |
- devices = [ |
- device_utils.DeviceUtils(_AdbWrapperMock('ffffffffffffffff')), |
- device_utils.DeviceUtils(_AdbWrapperMock('0000000000000000')), |
- ] |
- sorted_devices = sorted(devices) |
- self.assertEquals('0000000000000000', |
- sorted_devices[0].adb.GetDeviceSerial()) |
- self.assertEquals('ffffffffffffffff', |
- sorted_devices[1].adb.GetDeviceSerial()) |
- |
- |
-class DeviceUtilsStrTest(DeviceUtilsTest): |
- |
- def testStr_returnsSerial(self): |
- with self.assertCalls( |
- (self.call.adb.GetDeviceSerial(), '0123456789abcdef')): |
- self.assertEqual('0123456789abcdef', str(self.device)) |
- |
- |
-class DeviceUtilsIsOnlineTest(DeviceUtilsTest): |
- |
- def testIsOnline_true(self): |
- with self.assertCall(self.call.adb.GetState(), 'device'): |
- self.assertTrue(self.device.IsOnline()) |
- |
- def testIsOnline_false(self): |
- with self.assertCall(self.call.adb.GetState(), 'offline'): |
- self.assertFalse(self.device.IsOnline()) |
- |
- def testIsOnline_error(self): |
- with self.assertCall(self.call.adb.GetState(), self.CommandError()): |
- self.assertFalse(self.device.IsOnline()) |
- |
- |
-class DeviceUtilsHasRootTest(DeviceUtilsTest): |
- |
- def testHasRoot_true(self): |
- with self.assertCall(self.call.adb.Shell('ls /root'), 'foo\n'): |
- self.assertTrue(self.device.HasRoot()) |
- |
- def testHasRoot_false(self): |
- with self.assertCall(self.call.adb.Shell('ls /root'), self.ShellError()): |
- self.assertFalse(self.device.HasRoot()) |
- |
- |
-class DeviceUtilsEnableRootTest(DeviceUtilsTest): |
- |
- def testEnableRoot_succeeds(self): |
- with self.assertCalls( |
- (self.call.device.IsUserBuild(), False), |
- self.call.adb.Root(), |
- self.call.device.WaitUntilFullyBooted()): |
- self.device.EnableRoot() |
- |
- def testEnableRoot_userBuild(self): |
- with self.assertCalls( |
- (self.call.device.IsUserBuild(), True)): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device.EnableRoot() |
- |
- def testEnableRoot_rootFails(self): |
- with self.assertCalls( |
- (self.call.device.IsUserBuild(), False), |
- (self.call.adb.Root(), self.CommandError())): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device.EnableRoot() |
- |
- |
-class DeviceUtilsIsUserBuildTest(DeviceUtilsTest): |
- |
- def testIsUserBuild_yes(self): |
- with self.assertCall( |
- self.call.device.GetProp('ro.build.type', cache=True), 'user'): |
- self.assertTrue(self.device.IsUserBuild()) |
- |
- def testIsUserBuild_no(self): |
- with self.assertCall( |
- self.call.device.GetProp('ro.build.type', cache=True), 'userdebug'): |
- self.assertFalse(self.device.IsUserBuild()) |
- |
- |
-class DeviceUtilsGetExternalStoragePathTest(DeviceUtilsTest): |
- |
- def testGetExternalStoragePath_succeeds(self): |
- with self.assertCall( |
- self.call.adb.Shell('echo $EXTERNAL_STORAGE'), '/fake/storage/path\n'): |
- self.assertEquals('/fake/storage/path', |
- self.device.GetExternalStoragePath()) |
- |
- def testGetExternalStoragePath_fails(self): |
- with self.assertCall(self.call.adb.Shell('echo $EXTERNAL_STORAGE'), '\n'): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device.GetExternalStoragePath() |
- |
- |
-class DeviceUtilsGetApplicationPathsInternalTest(DeviceUtilsTest): |
- |
- def testGetApplicationPathsInternal_exists(self): |
- with self.assertCalls( |
- (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'), |
- (self.call.device.RunShellCommand( |
- ['pm', 'path', 'android'], check_return=True), |
- ['package:/path/to/android.apk'])): |
- self.assertEquals(['/path/to/android.apk'], |
- self.device._GetApplicationPathsInternal('android')) |
- |
- def testGetApplicationPathsInternal_notExists(self): |
- with self.assertCalls( |
- (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'), |
- (self.call.device.RunShellCommand( |
- ['pm', 'path', 'not.installed.app'], check_return=True), |
- '')): |
- self.assertEquals([], |
- self.device._GetApplicationPathsInternal('not.installed.app')) |
- |
- def testGetApplicationPathsInternal_fails(self): |
- with self.assertCalls( |
- (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'), |
- (self.call.device.RunShellCommand( |
- ['pm', 'path', 'android'], check_return=True), |
- self.CommandError('ERROR. Is package manager running?\n'))): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device._GetApplicationPathsInternal('android') |
- |
- |
-class DeviceUtils_GetApplicationVersionTest(DeviceUtilsTest): |
- |
- def test_GetApplicationVersion_exists(self): |
- with self.assertCalls( |
- (self.call.adb.Shell('dumpsys package com.android.chrome'), |
- 'Packages:\n' |
- ' Package [com.android.chrome] (3901ecfb):\n' |
- ' userId=1234 gids=[123, 456, 789]\n' |
- ' pkg=Package{1fecf634 com.android.chrome}\n' |
- ' versionName=45.0.1234.7\n')): |
- self.assertEquals('45.0.1234.7', |
- self.device.GetApplicationVersion('com.android.chrome')) |
- |
- def test_GetApplicationVersion_notExists(self): |
- with self.assertCalls( |
- (self.call.adb.Shell('dumpsys package com.android.chrome'), '')): |
- self.assertEquals(None, |
- self.device.GetApplicationVersion('com.android.chrome')) |
- |
- def test_GetApplicationVersion_fails(self): |
- with self.assertCalls( |
- (self.call.adb.Shell('dumpsys package com.android.chrome'), |
- 'Packages:\n' |
- ' Package [com.android.chrome] (3901ecfb):\n' |
- ' userId=1234 gids=[123, 456, 789]\n' |
- ' pkg=Package{1fecf634 com.android.chrome}\n')): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device.GetApplicationVersion('com.android.chrome') |
- |
- |
-class DeviceUtilsGetApplicationDataDirectoryTest(DeviceUtilsTest): |
- |
- def testGetApplicationDataDirectory_exists(self): |
- with self.assertCall( |
- self.call.device._RunPipedShellCommand( |
- 'pm dump foo.bar.baz | grep dataDir='), |
- ['dataDir=/data/data/foo.bar.baz']): |
- self.assertEquals( |
- '/data/data/foo.bar.baz', |
- self.device.GetApplicationDataDirectory('foo.bar.baz')) |
- |
- def testGetApplicationDataDirectory_notExists(self): |
- with self.assertCall( |
- self.call.device._RunPipedShellCommand( |
- 'pm dump foo.bar.baz | grep dataDir='), |
- self.ShellError()): |
- self.assertIsNone(self.device.GetApplicationDataDirectory('foo.bar.baz')) |
- |
- |
-@mock.patch('time.sleep', mock.Mock()) |
-class DeviceUtilsWaitUntilFullyBootedTest(DeviceUtilsTest): |
- |
- def testWaitUntilFullyBooted_succeedsNoWifi(self): |
- with self.assertCalls( |
- self.call.adb.WaitForDevice(), |
- # sd_card_ready |
- (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), |
- (self.call.adb.Shell('test -d /fake/storage/path'), ''), |
- # pm_ready |
- (self.call.device._GetApplicationPathsInternal('android', |
- skip_cache=True), |
- ['package:/some/fake/path']), |
- # boot_completed |
- (self.call.device.GetProp('sys.boot_completed', cache=False), '1')): |
- self.device.WaitUntilFullyBooted(wifi=False) |
- |
- def testWaitUntilFullyBooted_succeedsWithWifi(self): |
- with self.assertCalls( |
- self.call.adb.WaitForDevice(), |
- # sd_card_ready |
- (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), |
- (self.call.adb.Shell('test -d /fake/storage/path'), ''), |
- # pm_ready |
- (self.call.device._GetApplicationPathsInternal('android', |
- skip_cache=True), |
- ['package:/some/fake/path']), |
- # boot_completed |
- (self.call.device.GetProp('sys.boot_completed', cache=False), '1'), |
- # wifi_enabled |
- (self.call.adb.Shell('dumpsys wifi'), |
- 'stuff\nWi-Fi is enabled\nmore stuff\n')): |
- self.device.WaitUntilFullyBooted(wifi=True) |
- |
- def testWaitUntilFullyBooted_deviceNotInitiallyAvailable(self): |
- with self.assertCalls( |
- self.call.adb.WaitForDevice(), |
- # sd_card_ready |
- (self.call.device.GetExternalStoragePath(), self.AdbCommandError()), |
- # sd_card_ready |
- (self.call.device.GetExternalStoragePath(), self.AdbCommandError()), |
- # sd_card_ready |
- (self.call.device.GetExternalStoragePath(), self.AdbCommandError()), |
- # sd_card_ready |
- (self.call.device.GetExternalStoragePath(), self.AdbCommandError()), |
- # sd_card_ready |
- (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), |
- (self.call.adb.Shell('test -d /fake/storage/path'), ''), |
- # pm_ready |
- (self.call.device._GetApplicationPathsInternal('android', |
- skip_cache=True), |
- ['package:/some/fake/path']), |
- # boot_completed |
- (self.call.device.GetProp('sys.boot_completed', cache=False), '1')): |
- self.device.WaitUntilFullyBooted(wifi=False) |
- |
- def testWaitUntilFullyBooted_sdCardReadyFails_noPath(self): |
- with self.assertCalls( |
- self.call.adb.WaitForDevice(), |
- # sd_card_ready |
- (self.call.device.GetExternalStoragePath(), self.CommandError())): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device.WaitUntilFullyBooted(wifi=False) |
- |
- def testWaitUntilFullyBooted_sdCardReadyFails_notExists(self): |
- with self.assertCalls( |
- self.call.adb.WaitForDevice(), |
- # sd_card_ready |
- (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), |
- (self.call.adb.Shell('test -d /fake/storage/path'), self.ShellError()), |
- # sd_card_ready |
- (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), |
- (self.call.adb.Shell('test -d /fake/storage/path'), self.ShellError()), |
- # sd_card_ready |
- (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), |
- (self.call.adb.Shell('test -d /fake/storage/path'), |
- self.TimeoutError())): |
- with self.assertRaises(device_errors.CommandTimeoutError): |
- self.device.WaitUntilFullyBooted(wifi=False) |
- |
- def testWaitUntilFullyBooted_devicePmFails(self): |
- with self.assertCalls( |
- self.call.adb.WaitForDevice(), |
- # sd_card_ready |
- (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), |
- (self.call.adb.Shell('test -d /fake/storage/path'), ''), |
- # pm_ready |
- (self.call.device._GetApplicationPathsInternal('android', |
- skip_cache=True), |
- self.CommandError()), |
- # pm_ready |
- (self.call.device._GetApplicationPathsInternal('android', |
- skip_cache=True), |
- self.CommandError()), |
- # pm_ready |
- (self.call.device._GetApplicationPathsInternal('android', |
- skip_cache=True), |
- self.TimeoutError())): |
- with self.assertRaises(device_errors.CommandTimeoutError): |
- self.device.WaitUntilFullyBooted(wifi=False) |
- |
- def testWaitUntilFullyBooted_bootFails(self): |
- with self.assertCalls( |
- self.call.adb.WaitForDevice(), |
- # sd_card_ready |
- (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), |
- (self.call.adb.Shell('test -d /fake/storage/path'), ''), |
- # pm_ready |
- (self.call.device._GetApplicationPathsInternal('android', |
- skip_cache=True), |
- ['package:/some/fake/path']), |
- # boot_completed |
- (self.call.device.GetProp('sys.boot_completed', cache=False), '0'), |
- # boot_completed |
- (self.call.device.GetProp('sys.boot_completed', cache=False), '0'), |
- # boot_completed |
- (self.call.device.GetProp('sys.boot_completed', cache=False), |
- self.TimeoutError())): |
- with self.assertRaises(device_errors.CommandTimeoutError): |
- self.device.WaitUntilFullyBooted(wifi=False) |
- |
- def testWaitUntilFullyBooted_wifiFails(self): |
- with self.assertCalls( |
- self.call.adb.WaitForDevice(), |
- # sd_card_ready |
- (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), |
- (self.call.adb.Shell('test -d /fake/storage/path'), ''), |
- # pm_ready |
- (self.call.device._GetApplicationPathsInternal('android', |
- skip_cache=True), |
- ['package:/some/fake/path']), |
- # boot_completed |
- (self.call.device.GetProp('sys.boot_completed', cache=False), '1'), |
- # wifi_enabled |
- (self.call.adb.Shell('dumpsys wifi'), 'stuff\nmore stuff\n'), |
- # wifi_enabled |
- (self.call.adb.Shell('dumpsys wifi'), 'stuff\nmore stuff\n'), |
- # wifi_enabled |
- (self.call.adb.Shell('dumpsys wifi'), self.TimeoutError())): |
- with self.assertRaises(device_errors.CommandTimeoutError): |
- self.device.WaitUntilFullyBooted(wifi=True) |
- |
- |
-@mock.patch('time.sleep', mock.Mock()) |
-class DeviceUtilsRebootTest(DeviceUtilsTest): |
- |
- def testReboot_nonBlocking(self): |
- with self.assertCalls( |
- self.call.adb.Reboot(), |
- (self.call.device.IsOnline(), True), |
- (self.call.device.IsOnline(), False)): |
- self.device.Reboot(block=False) |
- |
- def testReboot_blocking(self): |
- with self.assertCalls( |
- self.call.adb.Reboot(), |
- (self.call.device.IsOnline(), True), |
- (self.call.device.IsOnline(), False), |
- self.call.device.WaitUntilFullyBooted(wifi=False)): |
- self.device.Reboot(block=True) |
- |
- def testReboot_blockUntilWifi(self): |
- with self.assertCalls( |
- self.call.adb.Reboot(), |
- (self.call.device.IsOnline(), True), |
- (self.call.device.IsOnline(), False), |
- self.call.device.WaitUntilFullyBooted(wifi=True)): |
- self.device.Reboot(block=True, wifi=True) |
- |
- |
-class DeviceUtilsInstallTest(DeviceUtilsTest): |
- |
- mock_apk = _MockApkHelper('/fake/test/app.apk', 'test.package', ['p1']) |
- |
- def testInstall_noPriorInstall(self): |
- with self.patch_call(self.call.device.build_version_sdk, return_value=23): |
- with self.assertCalls( |
- (self.call.device._GetApplicationPathsInternal('test.package'), []), |
- self.call.adb.Install('/fake/test/app.apk', reinstall=False, |
- allow_downgrade=False), |
- (self.call.device.GrantPermissions('test.package', ['p1']), [])): |
- self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0) |
- |
- def testInstall_permissionsPreM(self): |
- with self.patch_call(self.call.device.build_version_sdk, return_value=20): |
- with self.assertCalls( |
- (self.call.device._GetApplicationPathsInternal('test.package'), []), |
- (self.call.adb.Install('/fake/test/app.apk', reinstall=False, |
- allow_downgrade=False))): |
- self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0) |
- |
- def testInstall_findPermissions(self): |
- with self.patch_call(self.call.device.build_version_sdk, return_value=23): |
- with self.assertCalls( |
- (self.call.device._GetApplicationPathsInternal('test.package'), []), |
- (self.call.adb.Install('/fake/test/app.apk', reinstall=False, |
- allow_downgrade=False)), |
- (self.call.device.GrantPermissions('test.package', ['p1']), [])): |
- self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0) |
- |
- def testInstall_passPermissions(self): |
- with self.assertCalls( |
- (self.call.device._GetApplicationPathsInternal('test.package'), []), |
- (self.call.adb.Install('/fake/test/app.apk', reinstall=False, |
- allow_downgrade=False)), |
- (self.call.device.GrantPermissions('test.package', ['p1', 'p2']), [])): |
- self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0, |
- permissions=['p1', 'p2']) |
- |
- def testInstall_differentPriorInstall(self): |
- with self.assertCalls( |
- (self.call.device._GetApplicationPathsInternal('test.package'), |
- ['/fake/data/app/test.package.apk']), |
- (self.call.device._ComputeStaleApks('test.package', |
- ['/fake/test/app.apk']), |
- (['/fake/test/app.apk'], None)), |
- self.call.device.Uninstall('test.package'), |
- self.call.adb.Install('/fake/test/app.apk', reinstall=False, |
- allow_downgrade=False)): |
- self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0, |
- permissions=[]) |
- |
- def testInstall_differentPriorInstall_reinstall(self): |
- with self.assertCalls( |
- (self.call.device._GetApplicationPathsInternal('test.package'), |
- ['/fake/data/app/test.package.apk']), |
- (self.call.device._ComputeStaleApks('test.package', |
- ['/fake/test/app.apk']), |
- (['/fake/test/app.apk'], None)), |
- self.call.adb.Install('/fake/test/app.apk', reinstall=True, |
- allow_downgrade=False)): |
- self.device.Install(DeviceUtilsInstallTest.mock_apk, |
- reinstall=True, retries=0, permissions=[]) |
- |
- def testInstall_identicalPriorInstall_reinstall(self): |
- with self.assertCalls( |
- (self.call.device._GetApplicationPathsInternal('test.package'), |
- ['/fake/data/app/test.package.apk']), |
- (self.call.device._ComputeStaleApks('test.package', |
- ['/fake/test/app.apk']), |
- ([], None)), |
- (self.call.device.ForceStop('test.package'))): |
- self.device.Install(DeviceUtilsInstallTest.mock_apk, |
- reinstall=True, retries=0, permissions=[]) |
- |
- def testInstall_fails(self): |
- with self.assertCalls( |
- (self.call.device._GetApplicationPathsInternal('test.package'), []), |
- (self.call.adb.Install('/fake/test/app.apk', reinstall=False, |
- allow_downgrade=False), |
- self.CommandError('Failure\r\n'))): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0) |
- |
- def testInstall_downgrade(self): |
- with self.assertCalls( |
- (self.call.device._GetApplicationPathsInternal('test.package'), |
- ['/fake/data/app/test.package.apk']), |
- (self.call.device._ComputeStaleApks('test.package', |
- ['/fake/test/app.apk']), |
- (['/fake/test/app.apk'], None)), |
- self.call.adb.Install('/fake/test/app.apk', reinstall=True, |
- allow_downgrade=True)): |
- self.device.Install(DeviceUtilsInstallTest.mock_apk, |
- reinstall=True, retries=0, permissions=[], allow_downgrade=True) |
- |
- |
-class DeviceUtilsInstallSplitApkTest(DeviceUtilsTest): |
- |
- mock_apk = _MockApkHelper('base.apk', 'test.package', ['p1']) |
- |
- def testInstallSplitApk_noPriorInstall(self): |
- with self.assertCalls( |
- (self.call.device._CheckSdkLevel(21)), |
- (mock.call.devil.android.sdk.split_select.SelectSplits( |
- self.device, 'base.apk', |
- ['split1.apk', 'split2.apk', 'split3.apk'], |
- allow_cached_props=False), |
- ['split2.apk']), |
- (self.call.device._GetApplicationPathsInternal('test.package'), []), |
- (self.call.adb.InstallMultiple( |
- ['base.apk', 'split2.apk'], partial=None, reinstall=False, |
- allow_downgrade=False))): |
- self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk, |
- ['split1.apk', 'split2.apk', 'split3.apk'], permissions=[], retries=0) |
- |
- def testInstallSplitApk_partialInstall(self): |
- with self.assertCalls( |
- (self.call.device._CheckSdkLevel(21)), |
- (mock.call.devil.android.sdk.split_select.SelectSplits( |
- self.device, 'base.apk', |
- ['split1.apk', 'split2.apk', 'split3.apk'], |
- allow_cached_props=False), |
- ['split2.apk']), |
- (self.call.device._GetApplicationPathsInternal('test.package'), |
- ['base-on-device.apk', 'split2-on-device.apk']), |
- (self.call.device._ComputeStaleApks('test.package', |
- ['base.apk', 'split2.apk']), |
- (['split2.apk'], None)), |
- (self.call.adb.InstallMultiple( |
- ['split2.apk'], partial='test.package', reinstall=True, |
- allow_downgrade=False))): |
- self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk, |
- ['split1.apk', 'split2.apk', 'split3.apk'], |
- reinstall=True, permissions=[], retries=0) |
- |
- def testInstallSplitApk_downgrade(self): |
- with self.assertCalls( |
- (self.call.device._CheckSdkLevel(21)), |
- (mock.call.devil.android.sdk.split_select.SelectSplits( |
- self.device, 'base.apk', |
- ['split1.apk', 'split2.apk', 'split3.apk'], |
- allow_cached_props=False), |
- ['split2.apk']), |
- (self.call.device._GetApplicationPathsInternal('test.package'), |
- ['base-on-device.apk', 'split2-on-device.apk']), |
- (self.call.device._ComputeStaleApks('test.package', |
- ['base.apk', 'split2.apk']), |
- (['split2.apk'], None)), |
- (self.call.adb.InstallMultiple( |
- ['split2.apk'], partial='test.package', reinstall=True, |
- allow_downgrade=True))): |
- self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk, |
- ['split1.apk', 'split2.apk', 'split3.apk'], |
- reinstall=True, permissions=[], retries=0, |
- allow_downgrade=True) |
- |
- |
-class DeviceUtilsUninstallTest(DeviceUtilsTest): |
- def testUninstall_callsThrough(self): |
- with self.assertCalls( |
- (self.call.device._GetApplicationPathsInternal('test.package'), |
- ['/path.apk']), |
- self.call.adb.Uninstall('test.package', True)): |
- self.device.Uninstall('test.package', True) |
- |
- def testUninstall_noop(self): |
- with self.assertCalls( |
- (self.call.device._GetApplicationPathsInternal('test.package'), [])): |
- self.device.Uninstall('test.package', True) |
- |
- |
-class DeviceUtilsSuTest(DeviceUtilsTest): |
- def testSu_preM(self): |
- with self.patch_call( |
- self.call.device.build_version_sdk, |
- return_value=version_codes.LOLLIPOP_MR1): |
- self.assertEquals('su -c foo', self.device._Su('foo')) |
- |
- def testSu_mAndAbove(self): |
- with self.patch_call( |
- self.call.device.build_version_sdk, |
- return_value=version_codes.MARSHMALLOW): |
- self.assertEquals('su 0 foo', self.device._Su('foo')) |
- |
- |
-class DeviceUtilsRunShellCommandTest(DeviceUtilsTest): |
- |
- def setUp(self): |
- super(DeviceUtilsRunShellCommandTest, self).setUp() |
- self.device.NeedsSU = mock.Mock(return_value=False) |
- |
- def testRunShellCommand_commandAsList(self): |
- with self.assertCall(self.call.adb.Shell('pm list packages'), ''): |
- self.device.RunShellCommand(['pm', 'list', 'packages']) |
- |
- def testRunShellCommand_commandAsListQuoted(self): |
- with self.assertCall(self.call.adb.Shell("echo 'hello world' '$10'"), ''): |
- self.device.RunShellCommand(['echo', 'hello world', '$10']) |
- |
- def testRunShellCommand_commandAsString(self): |
- with self.assertCall(self.call.adb.Shell('echo "$VAR"'), ''): |
- self.device.RunShellCommand('echo "$VAR"') |
- |
- def testNewRunShellImpl_withEnv(self): |
- with self.assertCall( |
- self.call.adb.Shell('VAR=some_string echo "$VAR"'), ''): |
- self.device.RunShellCommand('echo "$VAR"', env={'VAR': 'some_string'}) |
- |
- def testNewRunShellImpl_withEnvQuoted(self): |
- with self.assertCall( |
- self.call.adb.Shell('PATH="$PATH:/other/path" run_this'), ''): |
- self.device.RunShellCommand('run_this', env={'PATH': '$PATH:/other/path'}) |
- |
- def testNewRunShellImpl_withEnv_failure(self): |
- with self.assertRaises(KeyError): |
- self.device.RunShellCommand('some_cmd', env={'INVALID NAME': 'value'}) |
- |
- def testNewRunShellImpl_withCwd(self): |
- with self.assertCall(self.call.adb.Shell('cd /some/test/path && ls'), ''): |
- self.device.RunShellCommand('ls', cwd='/some/test/path') |
- |
- def testNewRunShellImpl_withCwdQuoted(self): |
- with self.assertCall( |
- self.call.adb.Shell("cd '/some test/path with/spaces' && ls"), ''): |
- self.device.RunShellCommand('ls', cwd='/some test/path with/spaces') |
- |
- def testRunShellCommand_withHugeCmd(self): |
- payload = 'hi! ' * 1024 |
- expected_cmd = "echo '%s'" % payload |
- with self.assertCalls( |
- (mock.call.devil.android.device_temp_file.DeviceTempFile( |
- self.adb, suffix='.sh'), MockTempFile('/sdcard/temp-123.sh')), |
- self.call.device._WriteFileWithPush('/sdcard/temp-123.sh', expected_cmd), |
- (self.call.adb.Shell('sh /sdcard/temp-123.sh'), payload + '\n')): |
- self.assertEquals([payload], |
- self.device.RunShellCommand(['echo', payload])) |
- |
- def testRunShellCommand_withHugeCmdAndSU(self): |
- payload = 'hi! ' * 1024 |
- expected_cmd_without_su = """sh -c 'echo '"'"'%s'"'"''""" % payload |
- expected_cmd = 'su -c %s' % expected_cmd_without_su |
- with self.assertCalls( |
- (self.call.device.NeedsSU(), True), |
- (self.call.device._Su(expected_cmd_without_su), expected_cmd), |
- (mock.call.devil.android.device_temp_file.DeviceTempFile( |
- self.adb, suffix='.sh'), MockTempFile('/sdcard/temp-123.sh')), |
- self.call.device._WriteFileWithPush('/sdcard/temp-123.sh', expected_cmd), |
- (self.call.adb.Shell('sh /sdcard/temp-123.sh'), payload + '\n')): |
- self.assertEquals( |
- [payload], |
- self.device.RunShellCommand(['echo', payload], as_root=True)) |
- |
- def testRunShellCommand_withSu(self): |
- expected_cmd_without_su = "sh -c 'setprop service.adb.root 0'" |
- expected_cmd = 'su -c %s' % expected_cmd_without_su |
- with self.assertCalls( |
- (self.call.device.NeedsSU(), True), |
- (self.call.device._Su(expected_cmd_without_su), expected_cmd), |
- (self.call.adb.Shell(expected_cmd), '')): |
- self.device.RunShellCommand('setprop service.adb.root 0', as_root=True) |
- |
- def testRunShellCommand_manyLines(self): |
- cmd = 'ls /some/path' |
- with self.assertCall(self.call.adb.Shell(cmd), 'file1\nfile2\nfile3\n'): |
- self.assertEquals(['file1', 'file2', 'file3'], |
- self.device.RunShellCommand(cmd)) |
- |
- def testRunShellCommand_singleLine_success(self): |
- cmd = 'echo $VALUE' |
- with self.assertCall(self.call.adb.Shell(cmd), 'some value\n'): |
- self.assertEquals('some value', |
- self.device.RunShellCommand(cmd, single_line=True)) |
- |
- def testRunShellCommand_singleLine_successEmptyLine(self): |
- cmd = 'echo $VALUE' |
- with self.assertCall(self.call.adb.Shell(cmd), '\n'): |
- self.assertEquals('', |
- self.device.RunShellCommand(cmd, single_line=True)) |
- |
- def testRunShellCommand_singleLine_successWithoutEndLine(self): |
- cmd = 'echo -n $VALUE' |
- with self.assertCall(self.call.adb.Shell(cmd), 'some value'): |
- self.assertEquals('some value', |
- self.device.RunShellCommand(cmd, single_line=True)) |
- |
- def testRunShellCommand_singleLine_successNoOutput(self): |
- cmd = 'echo -n $VALUE' |
- with self.assertCall(self.call.adb.Shell(cmd), ''): |
- self.assertEquals('', |
- self.device.RunShellCommand(cmd, single_line=True)) |
- |
- def testRunShellCommand_singleLine_failTooManyLines(self): |
- cmd = 'echo $VALUE' |
- with self.assertCall(self.call.adb.Shell(cmd), |
- 'some value\nanother value\n'): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device.RunShellCommand(cmd, single_line=True) |
- |
- def testRunShellCommand_checkReturn_success(self): |
- cmd = 'echo $ANDROID_DATA' |
- output = '/data\n' |
- with self.assertCall(self.call.adb.Shell(cmd), output): |
- self.assertEquals([output.rstrip()], |
- self.device.RunShellCommand(cmd, check_return=True)) |
- |
- def testRunShellCommand_checkReturn_failure(self): |
- cmd = 'ls /root' |
- output = 'opendir failed, Permission denied\n' |
- with self.assertCall(self.call.adb.Shell(cmd), self.ShellError(output)): |
- with self.assertRaises(device_errors.AdbCommandFailedError): |
- self.device.RunShellCommand(cmd, check_return=True) |
- |
- def testRunShellCommand_checkReturn_disabled(self): |
- cmd = 'ls /root' |
- output = 'opendir failed, Permission denied\n' |
- with self.assertCall(self.call.adb.Shell(cmd), self.ShellError(output)): |
- self.assertEquals([output.rstrip()], |
- self.device.RunShellCommand(cmd, check_return=False)) |
- |
- def testRunShellCommand_largeOutput_enabled(self): |
- cmd = 'echo $VALUE' |
- temp_file = MockTempFile('/sdcard/temp-123') |
- cmd_redirect = '( %s )>%s' % (cmd, temp_file.name) |
- with self.assertCalls( |
- (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb), |
- temp_file), |
- (self.call.adb.Shell(cmd_redirect)), |
- (self.call.device.ReadFile(temp_file.name, force_pull=True), |
- 'something')): |
- self.assertEquals( |
- ['something'], |
- self.device.RunShellCommand( |
- cmd, large_output=True, check_return=True)) |
- |
- def testRunShellCommand_largeOutput_disabledNoTrigger(self): |
- cmd = 'something' |
- with self.assertCall(self.call.adb.Shell(cmd), self.ShellError('')): |
- with self.assertRaises(device_errors.AdbCommandFailedError): |
- self.device.RunShellCommand(cmd, check_return=True) |
- |
- def testRunShellCommand_largeOutput_disabledTrigger(self): |
- cmd = 'echo $VALUE' |
- temp_file = MockTempFile('/sdcard/temp-123') |
- cmd_redirect = '( %s )>%s' % (cmd, temp_file.name) |
- with self.assertCalls( |
- (self.call.adb.Shell(cmd), self.ShellError('', None)), |
- (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb), |
- temp_file), |
- (self.call.adb.Shell(cmd_redirect)), |
- (self.call.device.ReadFile(mock.ANY, force_pull=True), |
- 'something')): |
- self.assertEquals(['something'], |
- self.device.RunShellCommand(cmd, check_return=True)) |
- |
- |
-class DeviceUtilsRunPipedShellCommandTest(DeviceUtilsTest): |
- |
- def testRunPipedShellCommand_success(self): |
- with self.assertCall( |
- self.call.device.RunShellCommand( |
- 'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"', |
- check_return=True), |
- ['This line contains foo', 'PIPESTATUS: 0 0']): |
- self.assertEquals(['This line contains foo'], |
- self.device._RunPipedShellCommand('ps | grep foo')) |
- |
- def testRunPipedShellCommand_firstCommandFails(self): |
- with self.assertCall( |
- self.call.device.RunShellCommand( |
- 'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"', |
- check_return=True), |
- ['PIPESTATUS: 1 0']): |
- with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec: |
- self.device._RunPipedShellCommand('ps | grep foo') |
- self.assertEquals([1, 0], ec.exception.status) |
- |
- def testRunPipedShellCommand_secondCommandFails(self): |
- with self.assertCall( |
- self.call.device.RunShellCommand( |
- 'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"', |
- check_return=True), |
- ['PIPESTATUS: 0 1']): |
- with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec: |
- self.device._RunPipedShellCommand('ps | grep foo') |
- self.assertEquals([0, 1], ec.exception.status) |
- |
- def testRunPipedShellCommand_outputCutOff(self): |
- with self.assertCall( |
- self.call.device.RunShellCommand( |
- 'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"', |
- check_return=True), |
- ['foo.bar'] * 256 + ['foo.ba']): |
- with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec: |
- self.device._RunPipedShellCommand('ps | grep foo') |
- self.assertIs(None, ec.exception.status) |
- |
- |
-@mock.patch('time.sleep', mock.Mock()) |
-class DeviceUtilsKillAllTest(DeviceUtilsTest): |
- |
- def testKillAll_noMatchingProcessesFailure(self): |
- with self.assertCall(self.call.device.GetPids('test_process'), {}): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device.KillAll('test_process') |
- |
- def testKillAll_noMatchingProcessesQuiet(self): |
- with self.assertCall(self.call.device.GetPids('test_process'), {}): |
- self.assertEqual(0, self.device.KillAll('test_process', quiet=True)) |
- |
- def testKillAll_nonblocking(self): |
- with self.assertCalls( |
- (self.call.device.GetPids('some.process'), |
- {'some.process': ['1234'], 'some.processing.thing': ['5678']}), |
- (self.call.adb.Shell('kill -9 1234 5678'), '')): |
- self.assertEquals( |
- 2, self.device.KillAll('some.process', blocking=False)) |
- |
- def testKillAll_blocking(self): |
- with self.assertCalls( |
- (self.call.device.GetPids('some.process'), |
- {'some.process': ['1234'], 'some.processing.thing': ['5678']}), |
- (self.call.adb.Shell('kill -9 1234 5678'), ''), |
- (self.call.device.GetPids('some.process'), |
- {'some.processing.thing': ['5678']}), |
- (self.call.device.GetPids('some.process'), |
- {'some.process': ['1111']})): # Other instance with different pid. |
- self.assertEquals( |
- 2, self.device.KillAll('some.process', blocking=True)) |
- |
- def testKillAll_exactNonblocking(self): |
- with self.assertCalls( |
- (self.call.device.GetPids('some.process'), |
- {'some.process': ['1234'], 'some.processing.thing': ['5678']}), |
- (self.call.adb.Shell('kill -9 1234'), '')): |
- self.assertEquals( |
- 1, self.device.KillAll('some.process', exact=True, blocking=False)) |
- |
- def testKillAll_exactBlocking(self): |
- with self.assertCalls( |
- (self.call.device.GetPids('some.process'), |
- {'some.process': ['1234'], 'some.processing.thing': ['5678']}), |
- (self.call.adb.Shell('kill -9 1234'), ''), |
- (self.call.device.GetPids('some.process'), |
- {'some.process': ['1234'], 'some.processing.thing': ['5678']}), |
- (self.call.device.GetPids('some.process'), |
- {'some.processing.thing': ['5678']})): |
- self.assertEquals( |
- 1, self.device.KillAll('some.process', exact=True, blocking=True)) |
- |
- def testKillAll_root(self): |
- with self.assertCalls( |
- (self.call.device.GetPids('some.process'), {'some.process': ['1234']}), |
- (self.call.device.NeedsSU(), True), |
- (self.call.device._Su("sh -c 'kill -9 1234'"), |
- "su -c sh -c 'kill -9 1234'"), |
- (self.call.adb.Shell("su -c sh -c 'kill -9 1234'"), '')): |
- self.assertEquals( |
- 1, self.device.KillAll('some.process', as_root=True)) |
- |
- def testKillAll_sigterm(self): |
- with self.assertCalls( |
- (self.call.device.GetPids('some.process'), |
- {'some.process': ['1234']}), |
- (self.call.adb.Shell('kill -15 1234'), '')): |
- self.assertEquals( |
- 1, self.device.KillAll('some.process', signum=device_signal.SIGTERM)) |
- |
- def testKillAll_multipleInstances(self): |
- with self.assertCalls( |
- (self.call.device.GetPids('some.process'), |
- {'some.process': ['1234', '4567']}), |
- (self.call.adb.Shell('kill -15 1234 4567'), '')): |
- self.assertEquals( |
- 2, self.device.KillAll('some.process', signum=device_signal.SIGTERM)) |
- |
- |
-class DeviceUtilsStartActivityTest(DeviceUtilsTest): |
- |
- def testStartActivity_actionOnly(self): |
- test_intent = intent.Intent(action='android.intent.action.VIEW') |
- with self.assertCall( |
- self.call.adb.Shell('am start ' |
- '-a android.intent.action.VIEW'), |
- 'Starting: Intent { act=android.intent.action.VIEW }'): |
- self.device.StartActivity(test_intent) |
- |
- def testStartActivity_success(self): |
- test_intent = intent.Intent(action='android.intent.action.VIEW', |
- package='test.package', |
- activity='.Main') |
- with self.assertCall( |
- self.call.adb.Shell('am start ' |
- '-a android.intent.action.VIEW ' |
- '-n test.package/.Main'), |
- 'Starting: Intent { act=android.intent.action.VIEW }'): |
- self.device.StartActivity(test_intent) |
- |
- def testStartActivity_failure(self): |
- test_intent = intent.Intent(action='android.intent.action.VIEW', |
- package='test.package', |
- activity='.Main') |
- with self.assertCall( |
- self.call.adb.Shell('am start ' |
- '-a android.intent.action.VIEW ' |
- '-n test.package/.Main'), |
- 'Error: Failed to start test activity'): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device.StartActivity(test_intent) |
- |
- def testStartActivity_blocking(self): |
- test_intent = intent.Intent(action='android.intent.action.VIEW', |
- package='test.package', |
- activity='.Main') |
- with self.assertCall( |
- self.call.adb.Shell('am start ' |
- '-W ' |
- '-a android.intent.action.VIEW ' |
- '-n test.package/.Main'), |
- 'Starting: Intent { act=android.intent.action.VIEW }'): |
- self.device.StartActivity(test_intent, blocking=True) |
- |
- def testStartActivity_withCategory(self): |
- test_intent = intent.Intent(action='android.intent.action.VIEW', |
- package='test.package', |
- activity='.Main', |
- category='android.intent.category.HOME') |
- with self.assertCall( |
- self.call.adb.Shell('am start ' |
- '-a android.intent.action.VIEW ' |
- '-c android.intent.category.HOME ' |
- '-n test.package/.Main'), |
- 'Starting: Intent { act=android.intent.action.VIEW }'): |
- self.device.StartActivity(test_intent) |
- |
- def testStartActivity_withMultipleCategories(self): |
- test_intent = intent.Intent(action='android.intent.action.VIEW', |
- package='test.package', |
- activity='.Main', |
- category=['android.intent.category.HOME', |
- 'android.intent.category.BROWSABLE']) |
- with self.assertCall( |
- self.call.adb.Shell('am start ' |
- '-a android.intent.action.VIEW ' |
- '-c android.intent.category.HOME ' |
- '-c android.intent.category.BROWSABLE ' |
- '-n test.package/.Main'), |
- 'Starting: Intent { act=android.intent.action.VIEW }'): |
- self.device.StartActivity(test_intent) |
- |
- def testStartActivity_withData(self): |
- test_intent = intent.Intent(action='android.intent.action.VIEW', |
- package='test.package', |
- activity='.Main', |
- data='http://www.google.com/') |
- with self.assertCall( |
- self.call.adb.Shell('am start ' |
- '-a android.intent.action.VIEW ' |
- '-d http://www.google.com/ ' |
- '-n test.package/.Main'), |
- 'Starting: Intent { act=android.intent.action.VIEW }'): |
- self.device.StartActivity(test_intent) |
- |
- def testStartActivity_withStringExtra(self): |
- test_intent = intent.Intent(action='android.intent.action.VIEW', |
- package='test.package', |
- activity='.Main', |
- extras={'foo': 'test'}) |
- with self.assertCall( |
- self.call.adb.Shell('am start ' |
- '-a android.intent.action.VIEW ' |
- '-n test.package/.Main ' |
- '--es foo test'), |
- 'Starting: Intent { act=android.intent.action.VIEW }'): |
- self.device.StartActivity(test_intent) |
- |
- def testStartActivity_withBoolExtra(self): |
- test_intent = intent.Intent(action='android.intent.action.VIEW', |
- package='test.package', |
- activity='.Main', |
- extras={'foo': True}) |
- with self.assertCall( |
- self.call.adb.Shell('am start ' |
- '-a android.intent.action.VIEW ' |
- '-n test.package/.Main ' |
- '--ez foo True'), |
- 'Starting: Intent { act=android.intent.action.VIEW }'): |
- self.device.StartActivity(test_intent) |
- |
- def testStartActivity_withIntExtra(self): |
- test_intent = intent.Intent(action='android.intent.action.VIEW', |
- package='test.package', |
- activity='.Main', |
- extras={'foo': 123}) |
- with self.assertCall( |
- self.call.adb.Shell('am start ' |
- '-a android.intent.action.VIEW ' |
- '-n test.package/.Main ' |
- '--ei foo 123'), |
- 'Starting: Intent { act=android.intent.action.VIEW }'): |
- self.device.StartActivity(test_intent) |
- |
- def testStartActivity_withTraceFile(self): |
- test_intent = intent.Intent(action='android.intent.action.VIEW', |
- package='test.package', |
- activity='.Main') |
- with self.assertCall( |
- self.call.adb.Shell('am start ' |
- '--start-profiler test_trace_file.out ' |
- '-a android.intent.action.VIEW ' |
- '-n test.package/.Main'), |
- 'Starting: Intent { act=android.intent.action.VIEW }'): |
- self.device.StartActivity(test_intent, |
- trace_file_name='test_trace_file.out') |
- |
- def testStartActivity_withForceStop(self): |
- test_intent = intent.Intent(action='android.intent.action.VIEW', |
- package='test.package', |
- activity='.Main') |
- with self.assertCall( |
- self.call.adb.Shell('am start ' |
- '-S ' |
- '-a android.intent.action.VIEW ' |
- '-n test.package/.Main'), |
- 'Starting: Intent { act=android.intent.action.VIEW }'): |
- self.device.StartActivity(test_intent, force_stop=True) |
- |
- def testStartActivity_withFlags(self): |
- test_intent = intent.Intent(action='android.intent.action.VIEW', |
- package='test.package', |
- activity='.Main', |
- flags='0x10000000') |
- with self.assertCall( |
- self.call.adb.Shell('am start ' |
- '-a android.intent.action.VIEW ' |
- '-n test.package/.Main ' |
- '-f 0x10000000'), |
- 'Starting: Intent { act=android.intent.action.VIEW }'): |
- self.device.StartActivity(test_intent) |
- |
- |
-class DeviceUtilsStartInstrumentationTest(DeviceUtilsTest): |
- |
- def testStartInstrumentation_nothing(self): |
- with self.assertCalls( |
- self.call.device.RunShellCommand( |
- 'p=test.package;am instrument "$p"/.TestInstrumentation', |
- check_return=True, large_output=True)): |
- self.device.StartInstrumentation( |
- 'test.package/.TestInstrumentation', |
- finish=False, raw=False, extras=None) |
- |
- def testStartInstrumentation_finish(self): |
- with self.assertCalls( |
- (self.call.device.RunShellCommand( |
- 'p=test.package;am instrument -w "$p"/.TestInstrumentation', |
- check_return=True, large_output=True), |
- ['OK (1 test)'])): |
- output = self.device.StartInstrumentation( |
- 'test.package/.TestInstrumentation', |
- finish=True, raw=False, extras=None) |
- self.assertEquals(['OK (1 test)'], output) |
- |
- def testStartInstrumentation_raw(self): |
- with self.assertCalls( |
- self.call.device.RunShellCommand( |
- 'p=test.package;am instrument -r "$p"/.TestInstrumentation', |
- check_return=True, large_output=True)): |
- self.device.StartInstrumentation( |
- 'test.package/.TestInstrumentation', |
- finish=False, raw=True, extras=None) |
- |
- def testStartInstrumentation_extras(self): |
- with self.assertCalls( |
- self.call.device.RunShellCommand( |
- 'p=test.package;am instrument -e "$p".foo Foo -e bar \'Val \'"$p" ' |
- '"$p"/.TestInstrumentation', |
- check_return=True, large_output=True)): |
- self.device.StartInstrumentation( |
- 'test.package/.TestInstrumentation', |
- finish=False, raw=False, extras={'test.package.foo': 'Foo', |
- 'bar': 'Val test.package'}) |
- |
- |
-class DeviceUtilsBroadcastIntentTest(DeviceUtilsTest): |
- |
- def testBroadcastIntent_noExtras(self): |
- test_intent = intent.Intent(action='test.package.with.an.INTENT') |
- with self.assertCall( |
- self.call.adb.Shell('am broadcast -a test.package.with.an.INTENT'), |
- 'Broadcasting: Intent { act=test.package.with.an.INTENT } '): |
- self.device.BroadcastIntent(test_intent) |
- |
- def testBroadcastIntent_withExtra(self): |
- test_intent = intent.Intent(action='test.package.with.an.INTENT', |
- extras={'foo': 'bar value'}) |
- with self.assertCall( |
- self.call.adb.Shell( |
- "am broadcast -a test.package.with.an.INTENT --es foo 'bar value'"), |
- 'Broadcasting: Intent { act=test.package.with.an.INTENT } '): |
- self.device.BroadcastIntent(test_intent) |
- |
- def testBroadcastIntent_withExtra_noValue(self): |
- test_intent = intent.Intent(action='test.package.with.an.INTENT', |
- extras={'foo': None}) |
- with self.assertCall( |
- self.call.adb.Shell( |
- 'am broadcast -a test.package.with.an.INTENT --esn foo'), |
- 'Broadcasting: Intent { act=test.package.with.an.INTENT } '): |
- self.device.BroadcastIntent(test_intent) |
- |
- |
-class DeviceUtilsGoHomeTest(DeviceUtilsTest): |
- |
- def testGoHome_popupsExist(self): |
- with self.assertCalls( |
- (self.call.device.RunShellCommand( |
- ['dumpsys', 'window', 'windows'], check_return=True, |
- large_output=True), []), |
- (self.call.device.RunShellCommand( |
- ['am', 'start', '-W', '-a', 'android.intent.action.MAIN', |
- '-c', 'android.intent.category.HOME'], check_return=True), |
- 'Starting: Intent { act=android.intent.action.MAIN }\r\n'''), |
- (self.call.device.RunShellCommand( |
- ['dumpsys', 'window', 'windows'], check_return=True, |
- large_output=True), []), |
- (self.call.device.RunShellCommand( |
- ['input', 'keyevent', '66'], check_return=True)), |
- (self.call.device.RunShellCommand( |
- ['input', 'keyevent', '4'], check_return=True)), |
- (self.call.device.RunShellCommand( |
- ['dumpsys', 'window', 'windows'], check_return=True, |
- large_output=True), |
- ['mCurrentFocus Launcher'])): |
- self.device.GoHome() |
- |
- def testGoHome_willRetry(self): |
- with self.assertCalls( |
- (self.call.device.RunShellCommand( |
- ['dumpsys', 'window', 'windows'], check_return=True, |
- large_output=True), []), |
- (self.call.device.RunShellCommand( |
- ['am', 'start', '-W', '-a', 'android.intent.action.MAIN', |
- '-c', 'android.intent.category.HOME'], check_return=True), |
- 'Starting: Intent { act=android.intent.action.MAIN }\r\n'''), |
- (self.call.device.RunShellCommand( |
- ['dumpsys', 'window', 'windows'], check_return=True, |
- large_output=True), []), |
- (self.call.device.RunShellCommand( |
- ['input', 'keyevent', '66'], check_return=True,)), |
- (self.call.device.RunShellCommand( |
- ['input', 'keyevent', '4'], check_return=True)), |
- (self.call.device.RunShellCommand( |
- ['dumpsys', 'window', 'windows'], check_return=True, |
- large_output=True), []), |
- (self.call.device.RunShellCommand( |
- ['input', 'keyevent', '66'], check_return=True)), |
- (self.call.device.RunShellCommand( |
- ['input', 'keyevent', '4'], check_return=True)), |
- (self.call.device.RunShellCommand( |
- ['dumpsys', 'window', 'windows'], check_return=True, |
- large_output=True), |
- self.TimeoutError())): |
- with self.assertRaises(device_errors.CommandTimeoutError): |
- self.device.GoHome() |
- |
- def testGoHome_alreadyFocused(self): |
- with self.assertCall( |
- self.call.device.RunShellCommand( |
- ['dumpsys', 'window', 'windows'], check_return=True, |
- large_output=True), |
- ['mCurrentFocus Launcher']): |
- self.device.GoHome() |
- |
- def testGoHome_alreadyFocusedAlternateCase(self): |
- with self.assertCall( |
- self.call.device.RunShellCommand( |
- ['dumpsys', 'window', 'windows'], check_return=True, |
- large_output=True), |
- [' mCurrentFocus .launcher/.']): |
- self.device.GoHome() |
- |
- def testGoHome_obtainsFocusAfterGoingHome(self): |
- with self.assertCalls( |
- (self.call.device.RunShellCommand( |
- ['dumpsys', 'window', 'windows'], check_return=True, |
- large_output=True), []), |
- (self.call.device.RunShellCommand( |
- ['am', 'start', '-W', '-a', 'android.intent.action.MAIN', |
- '-c', 'android.intent.category.HOME'], check_return=True), |
- 'Starting: Intent { act=android.intent.action.MAIN }\r\n'''), |
- (self.call.device.RunShellCommand( |
- ['dumpsys', 'window', 'windows'], check_return=True, |
- large_output=True), |
- ['mCurrentFocus Launcher'])): |
- self.device.GoHome() |
- |
-class DeviceUtilsForceStopTest(DeviceUtilsTest): |
- |
- def testForceStop(self): |
- with self.assertCall( |
- self.call.adb.Shell('p=test.package;if [[ "$(ps)" = *$p* ]]; then ' |
- 'am force-stop $p; fi'), |
- ''): |
- self.device.ForceStop('test.package') |
- |
- |
-class DeviceUtilsClearApplicationStateTest(DeviceUtilsTest): |
- |
- def testClearApplicationState_setPermissions(self): |
- with self.assertCalls( |
- (self.call.device.GetProp('ro.build.version.sdk', cache=True), '17'), |
- (self.call.device._GetApplicationPathsInternal('this.package.exists'), |
- ['/data/app/this.package.exists.apk']), |
- (self.call.device.RunShellCommand( |
- ['pm', 'clear', 'this.package.exists'], |
- check_return=True), |
- ['Success']), |
- (self.call.device.GrantPermissions( |
- 'this.package.exists', ['p1']), [])): |
- self.device.ClearApplicationState( |
- 'this.package.exists', permissions=['p1']) |
- |
- def testClearApplicationState_packageDoesntExist(self): |
- with self.assertCalls( |
- (self.call.device.GetProp('ro.build.version.sdk', cache=True), '11'), |
- (self.call.device._GetApplicationPathsInternal('does.not.exist'), |
- [])): |
- self.device.ClearApplicationState('does.not.exist') |
- |
- def testClearApplicationState_packageDoesntExistOnAndroidJBMR2OrAbove(self): |
- with self.assertCalls( |
- (self.call.device.GetProp('ro.build.version.sdk', cache=True), '18'), |
- (self.call.device.RunShellCommand( |
- ['pm', 'clear', 'this.package.does.not.exist'], |
- check_return=True), |
- ['Failed'])): |
- self.device.ClearApplicationState('this.package.does.not.exist') |
- |
- def testClearApplicationState_packageExists(self): |
- with self.assertCalls( |
- (self.call.device.GetProp('ro.build.version.sdk', cache=True), '17'), |
- (self.call.device._GetApplicationPathsInternal('this.package.exists'), |
- ['/data/app/this.package.exists.apk']), |
- (self.call.device.RunShellCommand( |
- ['pm', 'clear', 'this.package.exists'], |
- check_return=True), |
- ['Success'])): |
- self.device.ClearApplicationState('this.package.exists') |
- |
- def testClearApplicationState_packageExistsOnAndroidJBMR2OrAbove(self): |
- with self.assertCalls( |
- (self.call.device.GetProp('ro.build.version.sdk', cache=True), '18'), |
- (self.call.device.RunShellCommand( |
- ['pm', 'clear', 'this.package.exists'], |
- check_return=True), |
- ['Success'])): |
- self.device.ClearApplicationState('this.package.exists') |
- |
- |
-class DeviceUtilsSendKeyEventTest(DeviceUtilsTest): |
- |
- def testSendKeyEvent(self): |
- with self.assertCall(self.call.adb.Shell('input keyevent 66'), ''): |
- self.device.SendKeyEvent(66) |
- |
- |
-class DeviceUtilsPushChangedFilesIndividuallyTest(DeviceUtilsTest): |
- |
- def testPushChangedFilesIndividually_empty(self): |
- test_files = [] |
- with self.assertCalls(): |
- self.device._PushChangedFilesIndividually(test_files) |
- |
- def testPushChangedFilesIndividually_single(self): |
- test_files = [('/test/host/path', '/test/device/path')] |
- with self.assertCalls(self.call.adb.Push(*test_files[0])): |
- self.device._PushChangedFilesIndividually(test_files) |
- |
- def testPushChangedFilesIndividually_multiple(self): |
- test_files = [ |
- ('/test/host/path/file1', '/test/device/path/file1'), |
- ('/test/host/path/file2', '/test/device/path/file2')] |
- with self.assertCalls( |
- self.call.adb.Push(*test_files[0]), |
- self.call.adb.Push(*test_files[1])): |
- self.device._PushChangedFilesIndividually(test_files) |
- |
- |
-class DeviceUtilsPushChangedFilesZippedTest(DeviceUtilsTest): |
- |
- def testPushChangedFilesZipped_noUnzipCommand(self): |
- test_files = [('/test/host/path/file1', '/test/device/path/file1')] |
- mock_zip_temp = mock.mock_open() |
- mock_zip_temp.return_value.name = '/test/temp/file/tmp.zip' |
- with self.assertCalls( |
- (mock.call.tempfile.NamedTemporaryFile(suffix='.zip'), mock_zip_temp), |
- (mock.call.multiprocessing.Process( |
- target=device_utils.DeviceUtils._CreateDeviceZip, |
- args=('/test/temp/file/tmp.zip', test_files)), mock.Mock()), |
- (self.call.device._MaybeInstallCommands(), False)): |
- self.assertFalse(self.device._PushChangedFilesZipped(test_files, |
- ['/test/dir'])) |
- |
- def _testPushChangedFilesZipped_spec(self, test_files): |
- mock_zip_temp = mock.mock_open() |
- mock_zip_temp.return_value.name = '/test/temp/file/tmp.zip' |
- with self.assertCalls( |
- (mock.call.tempfile.NamedTemporaryFile(suffix='.zip'), mock_zip_temp), |
- (mock.call.multiprocessing.Process( |
- target=device_utils.DeviceUtils._CreateDeviceZip, |
- args=('/test/temp/file/tmp.zip', test_files)), mock.Mock()), |
- (self.call.device._MaybeInstallCommands(), True), |
- (self.call.device.NeedsSU(), True), |
- (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb, |
- suffix='.zip'), |
- MockTempFile('/test/sdcard/foo123.zip')), |
- self.call.adb.Push( |
- '/test/temp/file/tmp.zip', '/test/sdcard/foo123.zip'), |
- self.call.device.RunShellCommand( |
- 'unzip /test/sdcard/foo123.zip&&chmod -R 777 /test/dir', |
- as_root=True, |
- env={'PATH': '/data/local/tmp/bin:$PATH'}, |
- check_return=True)): |
- self.assertTrue(self.device._PushChangedFilesZipped(test_files, |
- ['/test/dir'])) |
- |
- def testPushChangedFilesZipped_single(self): |
- self._testPushChangedFilesZipped_spec( |
- [('/test/host/path/file1', '/test/device/path/file1')]) |
- |
- def testPushChangedFilesZipped_multiple(self): |
- self._testPushChangedFilesZipped_spec( |
- [('/test/host/path/file1', '/test/device/path/file1'), |
- ('/test/host/path/file2', '/test/device/path/file2')]) |
- |
- |
-class DeviceUtilsPathExistsTest(DeviceUtilsTest): |
- |
- def testPathExists_pathExists(self): |
- with self.assertCall( |
- self.call.device.RunShellCommand( |
- "test -e '/path/file exists'", |
- as_root=False, check_return=True, timeout=10, retries=0), |
- []): |
- self.assertTrue(self.device.PathExists('/path/file exists')) |
- |
- def testPathExists_multiplePathExists(self): |
- with self.assertCall( |
- self.call.device.RunShellCommand( |
- "test -e '/path 1' -a -e /path2", |
- as_root=False, check_return=True, timeout=10, retries=0), |
- []): |
- self.assertTrue(self.device.PathExists(('/path 1', '/path2'))) |
- |
- def testPathExists_pathDoesntExist(self): |
- with self.assertCall( |
- self.call.device.RunShellCommand( |
- "test -e /path/file.not.exists", |
- as_root=False, check_return=True, timeout=10, retries=0), |
- self.ShellError()): |
- self.assertFalse(self.device.PathExists('/path/file.not.exists')) |
- |
- def testPathExists_asRoot(self): |
- with self.assertCall( |
- self.call.device.RunShellCommand( |
- "test -e /root/path/exists", |
- as_root=True, check_return=True, timeout=10, retries=0), |
- self.ShellError()): |
- self.assertFalse( |
- self.device.PathExists('/root/path/exists', as_root=True)) |
- |
- def testFileExists_pathDoesntExist(self): |
- with self.assertCall( |
- self.call.device.RunShellCommand( |
- "test -e /path/file.not.exists", |
- as_root=False, check_return=True, timeout=10, retries=0), |
- self.ShellError()): |
- self.assertFalse(self.device.FileExists('/path/file.not.exists')) |
- |
- |
-class DeviceUtilsPullFileTest(DeviceUtilsTest): |
- |
- def testPullFile_existsOnDevice(self): |
- with mock.patch('os.path.exists', return_value=True): |
- with self.assertCall( |
- self.call.adb.Pull('/data/app/test.file.exists', |
- '/test/file/host/path')): |
- self.device.PullFile('/data/app/test.file.exists', |
- '/test/file/host/path') |
- |
- def testPullFile_doesntExistOnDevice(self): |
- with mock.patch('os.path.exists', return_value=True): |
- with self.assertCall( |
- self.call.adb.Pull('/data/app/test.file.does.not.exist', |
- '/test/file/host/path'), |
- self.CommandError('remote object does not exist')): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device.PullFile('/data/app/test.file.does.not.exist', |
- '/test/file/host/path') |
- |
- |
-class DeviceUtilsReadFileTest(DeviceUtilsTest): |
- |
- def testReadFileWithPull_success(self): |
- tmp_host_dir = '/tmp/dir/on.host/' |
- tmp_host = MockTempFile('/tmp/dir/on.host/tmp_ReadFileWithPull') |
- tmp_host.file.read.return_value = 'some interesting contents' |
- with self.assertCalls( |
- (mock.call.tempfile.mkdtemp(), tmp_host_dir), |
- (self.call.adb.Pull('/path/to/device/file', mock.ANY)), |
- (mock.call.__builtin__.open(mock.ANY, 'r'), tmp_host), |
- (mock.call.os.path.exists(tmp_host_dir), True), |
- (mock.call.shutil.rmtree(tmp_host_dir), None)): |
- self.assertEquals('some interesting contents', |
- self.device._ReadFileWithPull('/path/to/device/file')) |
- tmp_host.file.read.assert_called_once_with() |
- |
- def testReadFileWithPull_rejected(self): |
- tmp_host_dir = '/tmp/dir/on.host/' |
- with self.assertCalls( |
- (mock.call.tempfile.mkdtemp(), tmp_host_dir), |
- (self.call.adb.Pull('/path/to/device/file', mock.ANY), |
- self.CommandError()), |
- (mock.call.os.path.exists(tmp_host_dir), True), |
- (mock.call.shutil.rmtree(tmp_host_dir), None)): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device._ReadFileWithPull('/path/to/device/file') |
- |
- def testReadFile_exists(self): |
- with self.assertCalls( |
- (self.call.device.RunShellCommand( |
- ['ls', '-l', '/read/this/test/file'], |
- as_root=False, check_return=True), |
- ['-rw-rw---- root foo 256 1970-01-01 00:00 file']), |
- (self.call.device.RunShellCommand( |
- ['cat', '/read/this/test/file'], |
- as_root=False, check_return=True), |
- ['this is a test file'])): |
- self.assertEqual('this is a test file\n', |
- self.device.ReadFile('/read/this/test/file')) |
- |
- def testReadFile_doesNotExist(self): |
- with self.assertCall( |
- self.call.device.RunShellCommand( |
- ['ls', '-l', '/this/file/does.not.exist'], |
- as_root=False, check_return=True), |
- self.CommandError('File does not exist')): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device.ReadFile('/this/file/does.not.exist') |
- |
- def testReadFile_zeroSize(self): |
- with self.assertCalls( |
- (self.call.device.RunShellCommand( |
- ['ls', '-l', '/this/file/has/zero/size'], |
- as_root=False, check_return=True), |
- ['-r--r--r-- root foo 0 1970-01-01 00:00 zero_size_file']), |
- (self.call.device._ReadFileWithPull('/this/file/has/zero/size'), |
- 'but it has contents\n')): |
- self.assertEqual('but it has contents\n', |
- self.device.ReadFile('/this/file/has/zero/size')) |
- |
- def testReadFile_withSU(self): |
- with self.assertCalls( |
- (self.call.device.RunShellCommand( |
- ['ls', '-l', '/this/file/can.be.read.with.su'], |
- as_root=True, check_return=True), |
- ['-rw------- root root 256 1970-01-01 00:00 can.be.read.with.su']), |
- (self.call.device.RunShellCommand( |
- ['cat', '/this/file/can.be.read.with.su'], |
- as_root=True, check_return=True), |
- ['this is a test file', 'read with su'])): |
- self.assertEqual( |
- 'this is a test file\nread with su\n', |
- self.device.ReadFile('/this/file/can.be.read.with.su', |
- as_root=True)) |
- |
- def testReadFile_withPull(self): |
- contents = 'a' * 123456 |
- with self.assertCalls( |
- (self.call.device.RunShellCommand( |
- ['ls', '-l', '/read/this/big/test/file'], |
- as_root=False, check_return=True), |
- ['-rw-rw---- root foo 123456 1970-01-01 00:00 file']), |
- (self.call.device._ReadFileWithPull('/read/this/big/test/file'), |
- contents)): |
- self.assertEqual( |
- contents, self.device.ReadFile('/read/this/big/test/file')) |
- |
- def testReadFile_withPullAndSU(self): |
- contents = 'b' * 123456 |
- with self.assertCalls( |
- (self.call.device.RunShellCommand( |
- ['ls', '-l', '/this/big/file/can.be.read.with.su'], |
- as_root=True, check_return=True), |
- ['-rw------- root root 123456 1970-01-01 00:00 can.be.read.with.su']), |
- (self.call.device.NeedsSU(), True), |
- (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb), |
- MockTempFile('/sdcard/tmp/on.device')), |
- self.call.device.RunShellCommand( |
- 'SRC=/this/big/file/can.be.read.with.su DEST=/sdcard/tmp/on.device;' |
- 'cp "$SRC" "$DEST" && chmod 666 "$DEST"', |
- as_root=True, check_return=True), |
- (self.call.device._ReadFileWithPull('/sdcard/tmp/on.device'), |
- contents)): |
- self.assertEqual( |
- contents, |
- self.device.ReadFile('/this/big/file/can.be.read.with.su', |
- as_root=True)) |
- |
- def testReadFile_forcePull(self): |
- contents = 'a' * 123456 |
- with self.assertCall( |
- self.call.device._ReadFileWithPull('/read/this/big/test/file'), |
- contents): |
- self.assertEqual( |
- contents, |
- self.device.ReadFile('/read/this/big/test/file', force_pull=True)) |
- |
- |
-class DeviceUtilsWriteFileTest(DeviceUtilsTest): |
- |
- def testWriteFileWithPush_success(self): |
- tmp_host = MockTempFile('/tmp/file/on.host') |
- contents = 'some interesting contents' |
- with self.assertCalls( |
- (mock.call.tempfile.NamedTemporaryFile(), tmp_host), |
- self.call.adb.Push('/tmp/file/on.host', '/path/to/device/file')): |
- self.device._WriteFileWithPush('/path/to/device/file', contents) |
- tmp_host.file.write.assert_called_once_with(contents) |
- |
- def testWriteFileWithPush_rejected(self): |
- tmp_host = MockTempFile('/tmp/file/on.host') |
- contents = 'some interesting contents' |
- with self.assertCalls( |
- (mock.call.tempfile.NamedTemporaryFile(), tmp_host), |
- (self.call.adb.Push('/tmp/file/on.host', '/path/to/device/file'), |
- self.CommandError())): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device._WriteFileWithPush('/path/to/device/file', contents) |
- |
- def testWriteFile_withPush(self): |
- contents = 'some large contents ' * 26 # 20 * 26 = 520 chars |
- with self.assertCalls( |
- self.call.device._WriteFileWithPush('/path/to/device/file', contents)): |
- self.device.WriteFile('/path/to/device/file', contents) |
- |
- def testWriteFile_withPushForced(self): |
- contents = 'tiny contents' |
- with self.assertCalls( |
- self.call.device._WriteFileWithPush('/path/to/device/file', contents)): |
- self.device.WriteFile('/path/to/device/file', contents, force_push=True) |
- |
- def testWriteFile_withPushAndSU(self): |
- contents = 'some large contents ' * 26 # 20 * 26 = 520 chars |
- with self.assertCalls( |
- (self.call.device.NeedsSU(), True), |
- (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb), |
- MockTempFile('/sdcard/tmp/on.device')), |
- self.call.device._WriteFileWithPush('/sdcard/tmp/on.device', contents), |
- self.call.device.RunShellCommand( |
- ['cp', '/sdcard/tmp/on.device', '/path/to/device/file'], |
- as_root=True, check_return=True)): |
- self.device.WriteFile('/path/to/device/file', contents, as_root=True) |
- |
- def testWriteFile_withEcho(self): |
- with self.assertCall(self.call.adb.Shell( |
- "echo -n the.contents > /test/file/to.write"), ''): |
- self.device.WriteFile('/test/file/to.write', 'the.contents') |
- |
- def testWriteFile_withEchoAndQuotes(self): |
- with self.assertCall(self.call.adb.Shell( |
- "echo -n 'the contents' > '/test/file/to write'"), ''): |
- self.device.WriteFile('/test/file/to write', 'the contents') |
- |
- def testWriteFile_withEchoAndSU(self): |
- expected_cmd_without_su = "sh -c 'echo -n contents > /test/file'" |
- expected_cmd = 'su -c %s' % expected_cmd_without_su |
- with self.assertCalls( |
- (self.call.device.NeedsSU(), True), |
- (self.call.device._Su(expected_cmd_without_su), expected_cmd), |
- (self.call.adb.Shell(expected_cmd), |
- '')): |
- self.device.WriteFile('/test/file', 'contents', as_root=True) |
- |
- |
-class DeviceUtilsLsTest(DeviceUtilsTest): |
- |
- def testLs_directory(self): |
- result = [('.', adb_wrapper.DeviceStat(16889, 4096, 1417436123)), |
- ('..', adb_wrapper.DeviceStat(16873, 4096, 12382237)), |
- ('testfile.txt', adb_wrapper.DeviceStat(33206, 3, 1417436122))] |
- with self.assertCalls( |
- (self.call.adb.Ls('/data/local/tmp'), result)): |
- self.assertEquals(result, |
- self.device.Ls('/data/local/tmp')) |
- |
- def testLs_nothing(self): |
- with self.assertCalls( |
- (self.call.adb.Ls('/data/local/tmp/testfile.txt'), [])): |
- self.assertEquals([], |
- self.device.Ls('/data/local/tmp/testfile.txt')) |
- |
- |
-class DeviceUtilsStatTest(DeviceUtilsTest): |
- |
- def testStat_file(self): |
- result = [('.', adb_wrapper.DeviceStat(16889, 4096, 1417436123)), |
- ('..', adb_wrapper.DeviceStat(16873, 4096, 12382237)), |
- ('testfile.txt', adb_wrapper.DeviceStat(33206, 3, 1417436122))] |
- with self.assertCalls( |
- (self.call.adb.Ls('/data/local/tmp'), result)): |
- self.assertEquals(adb_wrapper.DeviceStat(33206, 3, 1417436122), |
- self.device.Stat('/data/local/tmp/testfile.txt')) |
- |
- def testStat_directory(self): |
- result = [('.', adb_wrapper.DeviceStat(16873, 4096, 12382237)), |
- ('..', adb_wrapper.DeviceStat(16873, 4096, 12382237)), |
- ('tmp', adb_wrapper.DeviceStat(16889, 4096, 1417436123))] |
- with self.assertCalls( |
- (self.call.adb.Ls('/data/local'), result)): |
- self.assertEquals(adb_wrapper.DeviceStat(16889, 4096, 1417436123), |
- self.device.Stat('/data/local/tmp')) |
- |
- def testStat_doesNotExist(self): |
- result = [('.', adb_wrapper.DeviceStat(16889, 4096, 1417436123)), |
- ('..', adb_wrapper.DeviceStat(16873, 4096, 12382237)), |
- ('testfile.txt', adb_wrapper.DeviceStat(33206, 3, 1417436122))] |
- with self.assertCalls( |
- (self.call.adb.Ls('/data/local/tmp'), result)): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device.Stat('/data/local/tmp/does.not.exist.txt') |
- |
- |
-class DeviceUtilsSetJavaAssertsTest(DeviceUtilsTest): |
- |
- def testSetJavaAsserts_enable(self): |
- with self.assertCalls( |
- (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH), |
- 'some.example.prop=with an example value\n' |
- 'some.other.prop=value_ok\n'), |
- self.call.device.WriteFile( |
- self.device.LOCAL_PROPERTIES_PATH, |
- 'some.example.prop=with an example value\n' |
- 'some.other.prop=value_ok\n' |
- 'dalvik.vm.enableassertions=all\n'), |
- (self.call.device.GetProp('dalvik.vm.enableassertions'), ''), |
- self.call.device.SetProp('dalvik.vm.enableassertions', 'all')): |
- self.assertTrue(self.device.SetJavaAsserts(True)) |
- |
- def testSetJavaAsserts_disable(self): |
- with self.assertCalls( |
- (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH), |
- 'some.example.prop=with an example value\n' |
- 'dalvik.vm.enableassertions=all\n' |
- 'some.other.prop=value_ok\n'), |
- self.call.device.WriteFile( |
- self.device.LOCAL_PROPERTIES_PATH, |
- 'some.example.prop=with an example value\n' |
- 'some.other.prop=value_ok\n'), |
- (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all'), |
- self.call.device.SetProp('dalvik.vm.enableassertions', '')): |
- self.assertTrue(self.device.SetJavaAsserts(False)) |
- |
- def testSetJavaAsserts_alreadyEnabled(self): |
- with self.assertCalls( |
- (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH), |
- 'some.example.prop=with an example value\n' |
- 'dalvik.vm.enableassertions=all\n' |
- 'some.other.prop=value_ok\n'), |
- (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all')): |
- self.assertFalse(self.device.SetJavaAsserts(True)) |
- |
- def testSetJavaAsserts_malformedLocalProp(self): |
- with self.assertCalls( |
- (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH), |
- 'some.example.prop=with an example value\n' |
- 'malformed_property\n' |
- 'dalvik.vm.enableassertions=all\n' |
- 'some.other.prop=value_ok\n'), |
- (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all')): |
- self.assertFalse(self.device.SetJavaAsserts(True)) |
- |
- |
-class DeviceUtilsGetPropTest(DeviceUtilsTest): |
- |
- def testGetProp_exists(self): |
- with self.assertCall( |
- self.call.device.RunShellCommand( |
- ['getprop', 'test.property'], check_return=True, single_line=True, |
- timeout=self.device._default_timeout, |
- retries=self.device._default_retries), |
- 'property_value'): |
- self.assertEqual('property_value', |
- self.device.GetProp('test.property')) |
- |
- def testGetProp_doesNotExist(self): |
- with self.assertCall( |
- self.call.device.RunShellCommand( |
- ['getprop', 'property.does.not.exist'], |
- check_return=True, single_line=True, |
- timeout=self.device._default_timeout, |
- retries=self.device._default_retries), |
- ''): |
- self.assertEqual('', self.device.GetProp('property.does.not.exist')) |
- |
- def testGetProp_cachedRoProp(self): |
- with self.assertCall( |
- self.call.device.RunShellCommand( |
- ['getprop'], check_return=True, large_output=True, |
- timeout=self.device._default_timeout, |
- retries=self.device._default_retries), |
- ['[ro.build.type]: [userdebug]']): |
- self.assertEqual('userdebug', |
- self.device.GetProp('ro.build.type', cache=True)) |
- self.assertEqual('userdebug', |
- self.device.GetProp('ro.build.type', cache=True)) |
- |
- def testGetProp_retryAndCache(self): |
- with self.assertCalls( |
- (self.call.device.RunShellCommand( |
- ['getprop'], check_return=True, large_output=True, |
- timeout=self.device._default_timeout, |
- retries=3), |
- ['[ro.build.type]: [userdebug]'])): |
- self.assertEqual('userdebug', |
- self.device.GetProp('ro.build.type', |
- cache=True, retries=3)) |
- self.assertEqual('userdebug', |
- self.device.GetProp('ro.build.type', |
- cache=True, retries=3)) |
- |
- |
-class DeviceUtilsSetPropTest(DeviceUtilsTest): |
- |
- def testSetProp(self): |
- with self.assertCall( |
- self.call.device.RunShellCommand( |
- ['setprop', 'test.property', 'test value'], check_return=True)): |
- self.device.SetProp('test.property', 'test value') |
- |
- def testSetProp_check_succeeds(self): |
- with self.assertCalls( |
- (self.call.device.RunShellCommand( |
- ['setprop', 'test.property', 'new_value'], check_return=True)), |
- (self.call.device.GetProp('test.property', cache=False), 'new_value')): |
- self.device.SetProp('test.property', 'new_value', check=True) |
- |
- def testSetProp_check_fails(self): |
- with self.assertCalls( |
- (self.call.device.RunShellCommand( |
- ['setprop', 'test.property', 'new_value'], check_return=True)), |
- (self.call.device.GetProp('test.property', cache=False), 'old_value')): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device.SetProp('test.property', 'new_value', check=True) |
- |
- |
-class DeviceUtilsGetPidsTest(DeviceUtilsTest): |
- |
- def testGetPids_noMatches(self): |
- with self.assertCall( |
- self.call.device._RunPipedShellCommand('ps | grep -F does.not.match'), |
- []): |
- self.assertEqual({}, self.device.GetPids('does.not.match')) |
- |
- def testGetPids_oneMatch(self): |
- with self.assertCall( |
- self.call.device._RunPipedShellCommand('ps | grep -F one.match'), |
- ['user 1001 100 1024 1024 ffffffff 00000000 one.match']): |
- self.assertEqual( |
- {'one.match': ['1001']}, |
- self.device.GetPids('one.match')) |
- |
- def testGetPids_multipleMatches(self): |
- with self.assertCall( |
- self.call.device._RunPipedShellCommand('ps | grep -F match'), |
- ['user 1001 100 1024 1024 ffffffff 00000000 one.match', |
- 'user 1002 100 1024 1024 ffffffff 00000000 two.match', |
- 'user 1003 100 1024 1024 ffffffff 00000000 three.match']): |
- self.assertEqual( |
- {'one.match': ['1001'], |
- 'two.match': ['1002'], |
- 'three.match': ['1003']}, |
- self.device.GetPids('match')) |
- |
- def testGetPids_exactMatch(self): |
- with self.assertCall( |
- self.call.device._RunPipedShellCommand('ps | grep -F exact.match'), |
- ['user 1000 100 1024 1024 ffffffff 00000000 not.exact.match', |
- 'user 1234 100 1024 1024 ffffffff 00000000 exact.match']): |
- self.assertEqual( |
- {'not.exact.match': ['1000'], 'exact.match': ['1234']}, |
- self.device.GetPids('exact.match')) |
- |
- def testGetPids_quotable(self): |
- with self.assertCall( |
- self.call.device._RunPipedShellCommand("ps | grep -F 'my$process'"), |
- ['user 1234 100 1024 1024 ffffffff 00000000 my$process']): |
- self.assertEqual( |
- {'my$process': ['1234']}, self.device.GetPids('my$process')) |
- |
- def testGetPids_multipleInstances(self): |
- with self.assertCall( |
- self.call.device._RunPipedShellCommand('ps | grep -F foo'), |
- ['user 1000 100 1024 1024 ffffffff 00000000 foo', |
- 'user 1234 100 1024 1024 ffffffff 00000000 foo']): |
- self.assertEqual( |
- {'foo': ['1000', '1234']}, |
- self.device.GetPids('foo')) |
- |
- |
-class DeviceUtilsTakeScreenshotTest(DeviceUtilsTest): |
- |
- def testTakeScreenshot_fileNameProvided(self): |
- with self.assertCalls( |
- (mock.call.devil.android.device_temp_file.DeviceTempFile( |
- self.adb, suffix='.png'), |
- MockTempFile('/tmp/path/temp-123.png')), |
- (self.call.adb.Shell('/system/bin/screencap -p /tmp/path/temp-123.png'), |
- ''), |
- self.call.device.PullFile('/tmp/path/temp-123.png', |
- '/test/host/screenshot.png')): |
- self.device.TakeScreenshot('/test/host/screenshot.png') |
- |
- |
-class DeviceUtilsGetMemoryUsageForPidTest(DeviceUtilsTest): |
- |
- def setUp(self): |
- super(DeviceUtilsGetMemoryUsageForPidTest, self).setUp() |
- |
- def testGetMemoryUsageForPid_validPid(self): |
- with self.assertCalls( |
- (self.call.device._RunPipedShellCommand( |
- 'showmap 1234 | grep TOTAL', as_root=True), |
- ['100 101 102 103 104 105 106 107 TOTAL']), |
- (self.call.device.ReadFile('/proc/1234/status', as_root=True), |
- 'VmHWM: 1024 kB\n')): |
- self.assertEqual( |
- { |
- 'Size': 100, |
- 'Rss': 101, |
- 'Pss': 102, |
- 'Shared_Clean': 103, |
- 'Shared_Dirty': 104, |
- 'Private_Clean': 105, |
- 'Private_Dirty': 106, |
- 'VmHWM': 1024 |
- }, |
- self.device.GetMemoryUsageForPid(1234)) |
- |
- def testGetMemoryUsageForPid_noSmaps(self): |
- with self.assertCalls( |
- (self.call.device._RunPipedShellCommand( |
- 'showmap 4321 | grep TOTAL', as_root=True), |
- ['cannot open /proc/4321/smaps: No such file or directory']), |
- (self.call.device.ReadFile('/proc/4321/status', as_root=True), |
- 'VmHWM: 1024 kb\n')): |
- self.assertEquals({'VmHWM': 1024}, self.device.GetMemoryUsageForPid(4321)) |
- |
- def testGetMemoryUsageForPid_noStatus(self): |
- with self.assertCalls( |
- (self.call.device._RunPipedShellCommand( |
- 'showmap 4321 | grep TOTAL', as_root=True), |
- ['100 101 102 103 104 105 106 107 TOTAL']), |
- (self.call.device.ReadFile('/proc/4321/status', as_root=True), |
- self.CommandError())): |
- self.assertEquals( |
- { |
- 'Size': 100, |
- 'Rss': 101, |
- 'Pss': 102, |
- 'Shared_Clean': 103, |
- 'Shared_Dirty': 104, |
- 'Private_Clean': 105, |
- 'Private_Dirty': 106, |
- }, |
- self.device.GetMemoryUsageForPid(4321)) |
- |
- |
-class DeviceUtilsDismissCrashDialogIfNeededTest(DeviceUtilsTest): |
- |
- def testDismissCrashDialogIfNeeded_crashedPageckageNotFound(self): |
- sample_dumpsys_output = ''' |
-WINDOW MANAGER WINDOWS (dumpsys window windows) |
- Window #11 Window{f8b647a u0 SearchPanel}: |
- mDisplayId=0 mSession=Session{8 94:122} mClient=android.os.BinderProxy@1ba5 |
- mOwnerUid=100 mShowToOwnerOnly=false package=com.android.systemui appop=NONE |
- mAttrs=WM.LayoutParams{(0,0)(fillxfill) gr=#53 sim=#31 ty=2024 fl=100 |
- Requested w=1080 h=1920 mLayoutSeq=426 |
- mBaseLayer=211000 mSubLayer=0 mAnimLayer=211000+0=211000 mLastLayer=211000 |
-''' |
- with self.assertCalls( |
- (self.call.device.RunShellCommand( |
- ['dumpsys', 'window', 'windows'], check_return=True, |
- large_output=True), sample_dumpsys_output.split('\n'))): |
- package_name = self.device.DismissCrashDialogIfNeeded() |
- self.assertIsNone(package_name) |
- |
- def testDismissCrashDialogIfNeeded_crashedPageckageFound(self): |
- sample_dumpsys_output = ''' |
-WINDOW MANAGER WINDOWS (dumpsys window windows) |
- Window #11 Window{f8b647a u0 SearchPanel}: |
- mDisplayId=0 mSession=Session{8 94:122} mClient=android.os.BinderProxy@1ba5 |
- mOwnerUid=102 mShowToOwnerOnly=false package=com.android.systemui appop=NONE |
- mAttrs=WM.LayoutParams{(0,0)(fillxfill) gr=#53 sim=#31 ty=2024 fl=100 |
- Requested w=1080 h=1920 mLayoutSeq=426 |
- mBaseLayer=211000 mSubLayer=0 mAnimLayer=211000+0=211000 mLastLayer=211000 |
- mHasPermanentDpad=false |
- mCurrentFocus=Window{3a27740f u0 Application Error: com.android.chrome} |
- mFocusedApp=AppWindowToken{470af6f token=Token{272ec24e ActivityRecord{t894}}} |
-''' |
- with self.assertCalls( |
- (self.call.device.RunShellCommand( |
- ['dumpsys', 'window', 'windows'], check_return=True, |
- large_output=True), sample_dumpsys_output.split('\n')), |
- (self.call.device.RunShellCommand( |
- ['input', 'keyevent', '22'], check_return=True)), |
- (self.call.device.RunShellCommand( |
- ['input', 'keyevent', '22'], check_return=True)), |
- (self.call.device.RunShellCommand( |
- ['input', 'keyevent', '66'], check_return=True)), |
- (self.call.device.RunShellCommand( |
- ['dumpsys', 'window', 'windows'], check_return=True, |
- large_output=True), [])): |
- package_name = self.device.DismissCrashDialogIfNeeded() |
- self.assertEqual(package_name, 'com.android.chrome') |
- |
- |
-class DeviceUtilsClientCache(DeviceUtilsTest): |
- |
- def testClientCache_twoCaches(self): |
- self.device._cache['test'] = 0 |
- client_cache_one = self.device.GetClientCache('ClientOne') |
- client_cache_one['test'] = 1 |
- client_cache_two = self.device.GetClientCache('ClientTwo') |
- client_cache_two['test'] = 2 |
- self.assertEqual(self.device._cache['test'], 0) |
- self.assertEqual(client_cache_one, {'test': 1}) |
- self.assertEqual(client_cache_two, {'test': 2}) |
- self.device._ClearCache() |
- self.assertTrue('test' not in self.device._cache) |
- self.assertEqual(client_cache_one, {}) |
- self.assertEqual(client_cache_two, {}) |
- |
- def testClientCache_multipleInstances(self): |
- client_cache_one = self.device.GetClientCache('ClientOne') |
- client_cache_one['test'] = 1 |
- client_cache_two = self.device.GetClientCache('ClientOne') |
- self.assertEqual(client_cache_one, {'test': 1}) |
- self.assertEqual(client_cache_two, {'test': 1}) |
- self.device._ClearCache() |
- self.assertEqual(client_cache_one, {}) |
- self.assertEqual(client_cache_two, {}) |
- |
- |
-class DeviceUtilsHealthyDevicesTest(mock_calls.TestCase): |
- |
- def testHealthyDevices_emptyBlacklist(self): |
- test_serials = ['0123456789abcdef', 'fedcba9876543210'] |
- with self.assertCalls( |
- (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(), |
- [_AdbWrapperMock(s) for s in test_serials])): |
- blacklist = mock.NonCallableMock(**{'Read.return_value': []}) |
- devices = device_utils.DeviceUtils.HealthyDevices(blacklist) |
- for serial, device in zip(test_serials, devices): |
- self.assertTrue(isinstance(device, device_utils.DeviceUtils)) |
- self.assertEquals(serial, device.adb.GetDeviceSerial()) |
- |
- def testHealthyDevices_blacklist(self): |
- test_serials = ['0123456789abcdef', 'fedcba9876543210'] |
- with self.assertCalls( |
- (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(), |
- [_AdbWrapperMock(s) for s in test_serials])): |
- blacklist = mock.NonCallableMock( |
- **{'Read.return_value': ['fedcba9876543210']}) |
- devices = device_utils.DeviceUtils.HealthyDevices(blacklist) |
- self.assertEquals(1, len(devices)) |
- self.assertTrue(isinstance(devices[0], device_utils.DeviceUtils)) |
- self.assertEquals('0123456789abcdef', devices[0].adb.GetDeviceSerial()) |
- |
- |
-class DeviceUtilsRestartAdbdTest(DeviceUtilsTest): |
- |
- def testAdbdRestart(self): |
- mock_temp_file = '/sdcard/temp-123.sh' |
- with self.assertCalls( |
- (mock.call.devil.android.device_temp_file.DeviceTempFile( |
- self.adb, suffix='.sh'), MockTempFile(mock_temp_file)), |
- self.call.device.WriteFile(mock.ANY, mock.ANY), |
- (self.call.device.RunShellCommand( |
- ['source', mock_temp_file], as_root=True)), |
- self.call.adb.WaitForDevice()): |
- self.device.RestartAdbd() |
- |
- |
-class DeviceUtilsGrantPermissionsTest(DeviceUtilsTest): |
- |
- def testGrantPermissions_none(self): |
- self.device.GrantPermissions('package', []) |
- |
- def testGrantPermissions_underM(self): |
- with self.patch_call(self.call.device.build_version_sdk, |
- return_value=version_codes.LOLLIPOP): |
- self.device.GrantPermissions('package', ['p1']) |
- |
- def testGrantPermissions_one(self): |
- permissions_cmd = 'pm grant package p1' |
- with self.patch_call(self.call.device.build_version_sdk, |
- return_value=version_codes.MARSHMALLOW): |
- with self.assertCalls( |
- (self.call.device.RunShellCommand(permissions_cmd), [])): |
- self.device.GrantPermissions('package', ['p1']) |
- |
- def testGrantPermissions_multiple(self): |
- permissions_cmd = 'pm grant package p1;pm grant package p2' |
- with self.patch_call(self.call.device.build_version_sdk, |
- return_value=version_codes.MARSHMALLOW): |
- with self.assertCalls( |
- (self.call.device.RunShellCommand(permissions_cmd), [])): |
- self.device.GrantPermissions('package', ['p1', 'p2']) |
- |
- def testGrantPermissions_WriteExtrnalStorage(self): |
- permissions_cmd = ( |
- 'pm grant package android.permission.WRITE_EXTERNAL_STORAGE;' |
- 'pm grant package android.permission.READ_EXTERNAL_STORAGE') |
- with self.patch_call(self.call.device.build_version_sdk, |
- return_value=version_codes.MARSHMALLOW): |
- with self.assertCalls( |
- (self.call.device.RunShellCommand(permissions_cmd), [])): |
- self.device.GrantPermissions( |
- 'package', ['android.permission.WRITE_EXTERNAL_STORAGE']) |
- |
- def testGrantPermissions_BlackList(self): |
- with self.patch_call(self.call.device.build_version_sdk, |
- return_value=version_codes.MARSHMALLOW): |
- self.device.GrantPermissions( |
- 'package', ['android.permission.ACCESS_MOCK_LOCATION']) |
- |
- |
-class DeviecUtilsIsScreenOn(DeviceUtilsTest): |
- |
- _L_SCREEN_ON = ['test=test mInteractive=true'] |
- _K_SCREEN_ON = ['test=test mScreenOn=true'] |
- _L_SCREEN_OFF = ['mInteractive=false'] |
- _K_SCREEN_OFF = ['mScreenOn=false'] |
- |
- def testIsScreenOn_onPreL(self): |
- with self.patch_call(self.call.device.build_version_sdk, |
- return_value=version_codes.KITKAT): |
- with self.assertCalls( |
- (self.call.device._RunPipedShellCommand( |
- 'dumpsys input_method | grep mScreenOn'), self._K_SCREEN_ON)): |
- self.assertTrue(self.device.IsScreenOn()) |
- |
- def testIsScreenOn_onL(self): |
- with self.patch_call(self.call.device.build_version_sdk, |
- return_value=version_codes.LOLLIPOP): |
- with self.assertCalls( |
- (self.call.device._RunPipedShellCommand( |
- 'dumpsys input_method | grep mInteractive'), self._L_SCREEN_ON)): |
- self.assertTrue(self.device.IsScreenOn()) |
- |
- def testIsScreenOn_offPreL(self): |
- with self.patch_call(self.call.device.build_version_sdk, |
- return_value=version_codes.KITKAT): |
- with self.assertCalls( |
- (self.call.device._RunPipedShellCommand( |
- 'dumpsys input_method | grep mScreenOn'), self._K_SCREEN_OFF)): |
- self.assertFalse(self.device.IsScreenOn()) |
- |
- def testIsScreenOn_offL(self): |
- with self.patch_call(self.call.device.build_version_sdk, |
- return_value=version_codes.LOLLIPOP): |
- with self.assertCalls( |
- (self.call.device._RunPipedShellCommand( |
- 'dumpsys input_method | grep mInteractive'), self._L_SCREEN_OFF)): |
- self.assertFalse(self.device.IsScreenOn()) |
- |
- def testIsScreenOn_noOutput(self): |
- with self.patch_call(self.call.device.build_version_sdk, |
- return_value=version_codes.LOLLIPOP): |
- with self.assertCalls( |
- (self.call.device._RunPipedShellCommand( |
- 'dumpsys input_method | grep mInteractive'), [])): |
- with self.assertRaises(device_errors.CommandFailedError): |
- self.device.IsScreenOn() |
- |
- |
-class DeviecUtilsSetScreen(DeviceUtilsTest): |
- |
- @mock.patch('time.sleep', mock.Mock()) |
- def testSetScren_alreadySet(self): |
- with self.assertCalls( |
- (self.call.device.IsScreenOn(), False)): |
- self.device.SetScreen(False) |
- |
- @mock.patch('time.sleep', mock.Mock()) |
- def testSetScreen_on(self): |
- with self.assertCalls( |
- (self.call.device.IsScreenOn(), False), |
- (self.call.device.RunShellCommand('input keyevent 26'), []), |
- (self.call.device.IsScreenOn(), True)): |
- self.device.SetScreen(True) |
- |
- |
- @mock.patch('time.sleep', mock.Mock()) |
- def testSetScreen_off(self): |
- with self.assertCalls( |
- (self.call.device.IsScreenOn(), True), |
- (self.call.device.RunShellCommand('input keyevent 26'), []), |
- (self.call.device.IsScreenOn(), False)): |
- self.device.SetScreen(False) |
- |
- @mock.patch('time.sleep', mock.Mock()) |
- def testSetScreen_slow(self): |
- with self.assertCalls( |
- (self.call.device.IsScreenOn(), True), |
- (self.call.device.RunShellCommand('input keyevent 26'), []), |
- (self.call.device.IsScreenOn(), True), |
- (self.call.device.IsScreenOn(), True), |
- (self.call.device.IsScreenOn(), False)): |
- self.device.SetScreen(False) |
- |
-if __name__ == '__main__': |
- logging.getLogger().setLevel(logging.DEBUG) |
- unittest.main(verbosity=2) |