summaryrefslogtreecommitdiff
path: root/systrace/catapult/devil/devil/android/tools/system_app_devicetest.py
diff options
context:
space:
mode:
Diffstat (limited to 'systrace/catapult/devil/devil/android/tools/system_app_devicetest.py')
-rwxr-xr-xsystrace/catapult/devil/devil/android/tools/system_app_devicetest.py98
1 files changed, 98 insertions, 0 deletions
diff --git a/systrace/catapult/devil/devil/android/tools/system_app_devicetest.py b/systrace/catapult/devil/devil/android/tools/system_app_devicetest.py
new file mode 100755
index 0000000..0e8afdc
--- /dev/null
+++ b/systrace/catapult/devil/devil/android/tools/system_app_devicetest.py
@@ -0,0 +1,98 @@
+#!/usr/bin/env python
+# Copyright 2017 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.
+
+import logging
+import os
+import posixpath
+import shutil
+import sys
+import tempfile
+import unittest
+
+if __name__ == '__main__':
+ sys.path.append(
+ os.path.abspath(os.path.join(
+ os.path.dirname(__file__), '..', '..', '..')))
+
+from devil import base_error
+from devil import devil_env
+from devil.android import device_temp_file
+from devil.android import device_test_case
+from devil.android import device_utils
+from devil.android.tools import system_app
+
+logger = logging.getLogger(__name__)
+
+
+class SystemAppDeviceTest(device_test_case.DeviceTestCase):
+
+ PACKAGE = 'com.google.android.webview'
+
+ def setUp(self):
+ super(SystemAppDeviceTest, self).setUp()
+ self._device = device_utils.DeviceUtils(self.serial)
+ self._original_paths = self._device.GetApplicationPaths(self.PACKAGE)
+ self._apk_cache_dir = tempfile.mkdtemp()
+ # Host location -> device location
+ self._cached_apks = {}
+ for o in self._original_paths:
+ h = os.path.join(self._apk_cache_dir, posixpath.basename(o))
+ self._device.PullFile(o, h)
+ self._cached_apks[h] = o
+
+ def tearDown(self):
+ final_paths = self._device.GetApplicationPaths(self.PACKAGE)
+ if self._original_paths != final_paths:
+ try:
+ self._device.Uninstall(self.PACKAGE)
+ except Exception: # pylint: disable=broad-except
+ pass
+
+ with system_app.EnableSystemAppModification(self._device):
+ for cached_apk, install_path in self._cached_apks.iteritems():
+ try:
+ with device_temp_file.DeviceTempFile(self._device.adb) as tmp:
+ self._device.adb.Push(cached_apk, tmp.name)
+ self._device.RunShellCommand(
+ ['mv', tmp.name, install_path],
+ as_root=True, check_return=True)
+ except base_error.BaseError:
+ logger.warning('Failed to reinstall %s',
+ os.path.basename(cached_apk))
+
+ try:
+ shutil.rmtree(self._apk_cache_dir)
+ except IOError:
+ logger.error('Unable to remove app cache directory.')
+
+ super(SystemAppDeviceTest, self).tearDown()
+
+ def _check_preconditions(self):
+ if not self._original_paths:
+ self.skipTest('%s is not installed on %s' % (
+ self.PACKAGE, str(self._device)))
+ if not any(p.startswith('/system/') for p in self._original_paths):
+ self.skipTest('%s is not installed in a system location on %s' % (
+ self.PACKAGE, str(self._device)))
+
+ def testReplace(self):
+ self._check_preconditions()
+ replacement = devil_env.config.FetchPath(
+ 'empty_system_webview', device=self._device)
+ with system_app.ReplaceSystemApp(self._device, self.PACKAGE, replacement):
+ replaced_paths = self._device.GetApplicationPaths(self.PACKAGE)
+ self.assertNotEqual(self._original_paths, replaced_paths)
+ restored_paths = self._device.GetApplicationPaths(self.PACKAGE)
+ self.assertEqual(self._original_paths, restored_paths)
+
+ def testRemove(self):
+ self._check_preconditions()
+ system_app.RemoveSystemApps(self._device, [self.PACKAGE])
+ removed_paths = self._device.GetApplicationPaths(self.PACKAGE)
+ self.assertEqual([], removed_paths)
+
+
+if __name__ == '__main__':
+ unittest.main()