| # Lint as: python2, python3 |
| # Copyright 2015 The Bazel Authors. All rights reserved. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| """Unit tests for stubify_application_manifest.""" |
| |
| from __future__ import absolute_import |
| from __future__ import division |
| from __future__ import print_function |
| |
| import unittest |
| from xml.etree import ElementTree |
| |
| # Do not edit this line. Copybara replaces it with PY2 migration helper. |
| import six |
| |
| from tools.android.stubify_manifest import ANDROID |
| from tools.android.stubify_manifest import BadManifestException |
| from tools.android.stubify_manifest import INSTANT_RUN_BOOTSTRAP_APPLICATION |
| from tools.android.stubify_manifest import MOBILE_INSTALL_STUB_APPLICATION |
| from tools.android.stubify_manifest import READ_EXTERNAL_STORAGE |
| from tools.android.stubify_manifest import StubifyInstantRun |
| from tools.android.stubify_manifest import StubifyMobileInstall |
| |
| |
| MANIFEST_WITH_APPLICATION = """ |
| <manifest |
| xmlns:android="http://schemas.android.com/apk/res/android" |
| package="com.google.package"> |
| <application android:name="old.application"> |
| </application> |
| </manifest> |
| """ |
| |
| MANIFEST_WITH_HASCODE = """ |
| <manifest |
| xmlns:android="http://schemas.android.com/apk/res/android" |
| package="com.google.package"> |
| <application android:name="old.application" android:hasCode="false"> |
| </application> |
| </manifest> |
| """ |
| |
| MANIFEST_WITHOUT_APPLICATION = """ |
| <manifest |
| xmlns:android="http://schemas.android.com/apk/res/android" |
| package="com.google.package"> |
| </manifest> |
| """ |
| |
| MANIFEST_WITH_PERMISSION = """ |
| <manifest |
| xmlns:android="http://schemas.android.com/apk/res/android" |
| package="com.google.package"> |
| <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> |
| </manifest> |
| """ |
| |
| BAD_MANIFEST = """ |
| <b>Hello World!</b> |
| """ |
| |
| MULTIPLE_APPLICATIONS = """ |
| <manifest |
| xmlns:android="http://schemas.android.com/apk/res/android" |
| package="com.google.package"> |
| <application android:name="old.application"> |
| </application> |
| <application android:name="old.application"> |
| </application> |
| </manifest> |
| """ |
| |
| |
| NO_PACKAGE_MANIFEST = """ |
| <manifest |
| xmlns:android="http://schemas.android.com/apk/res/android"> |
| <application android:name="old.application"> |
| </application> |
| </manifest> |
| """ |
| |
| |
| class StubifyMobileInstallTest(unittest.TestCase): |
| |
| def GetApplication(self, manifest_string): |
| manifest = ElementTree.fromstring(manifest_string) |
| application = manifest.find("application") |
| return application.get("{%s}name" % ANDROID) |
| |
| def testReplacesOldApplication(self): |
| new_manifest, old_application, app_pkg = StubifyMobileInstall( |
| MANIFEST_WITH_APPLICATION) |
| self.assertEqual("com.google.package", app_pkg) |
| self.assertEqual("old.application", old_application) |
| self.assertEqual( |
| MOBILE_INSTALL_STUB_APPLICATION, self.GetApplication(new_manifest)) |
| |
| def testAddsNewAplication(self): |
| new_manifest, old_application, app_pkg = ( |
| StubifyMobileInstall(MANIFEST_WITHOUT_APPLICATION)) |
| self.assertEqual("com.google.package", app_pkg) |
| self.assertEqual("android.app.Application", old_application) |
| self.assertEqual( |
| MOBILE_INSTALL_STUB_APPLICATION, self.GetApplication(new_manifest)) |
| |
| def testRemovesHasCode(self): |
| new_manifest, _, _ = StubifyMobileInstall(MANIFEST_WITH_HASCODE) |
| application = ElementTree.fromstring( |
| six.ensure_str(new_manifest)).find("application") |
| self.assertFalse(("{%s}hasCode" % ANDROID) in application.attrib) |
| |
| def assertHasPermission(self, manifest_string, permission): |
| manifest = ElementTree.fromstring(manifest_string) |
| nodes = manifest.findall( |
| 'uses-permission[@android:name="%s"]' % permission, |
| namespaces={"android": ANDROID}) |
| self.assertEqual(1, len(nodes)) |
| |
| def testAddsPermission(self): |
| self.assertHasPermission( |
| StubifyMobileInstall( |
| MANIFEST_WITH_APPLICATION)[0], READ_EXTERNAL_STORAGE) |
| |
| def testDoesNotDuplicatePermission(self): |
| self.assertHasPermission( |
| StubifyMobileInstall( |
| MANIFEST_WITH_PERMISSION)[0], READ_EXTERNAL_STORAGE) |
| |
| def testBadManifest(self): |
| with self.assertRaises(BadManifestException): |
| StubifyMobileInstall(BAD_MANIFEST) |
| |
| def testTooManyApplications(self): |
| with self.assertRaises(BadManifestException): |
| StubifyMobileInstall(MULTIPLE_APPLICATIONS) |
| |
| def testNoPackageInManifest(self): |
| with self.assertRaises(BadManifestException): |
| StubifyMobileInstall(NO_PACKAGE_MANIFEST) |
| |
| |
| class StubifyInstantRunTest(unittest.TestCase): |
| |
| def testReplacesOldApplication(self): |
| new_manifest = StubifyInstantRun(MANIFEST_WITH_APPLICATION) |
| manifest = ElementTree.fromstring(new_manifest) |
| application = manifest.find("application") |
| self.assertEqual(INSTANT_RUN_BOOTSTRAP_APPLICATION, |
| application.get("{%s}name" % ANDROID)) |
| self.assertEqual("old.application", application.get("name")) |
| |
| def testReplacesAndSavesOldApplication(self): |
| new_manifest = StubifyInstantRun(MANIFEST_WITHOUT_APPLICATION) |
| manifest = ElementTree.fromstring(new_manifest) |
| application = manifest.find("application") |
| self.assertEqual(INSTANT_RUN_BOOTSTRAP_APPLICATION, |
| application.get("{%s}name" % ANDROID)) |
| self.assertEqual(None, application.get("name")) |
| |
| |
| if __name__ == "__main__": |
| unittest.main() |