| # 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. | |
| """This file contains unit tests for the merge_manifests script.""" | |
| import re | |
| import unittest | |
| import xml.dom.minidom | |
| from tools.android import merge_manifests | |
| FIRST_MANIFEST = """<?xml version='1.0' encoding='utf-8'?> | |
| <manifest | |
| xmlns:android="http://schemas.android.com/apk/res/android" | |
| package="com.google.android.apps.testapp" | |
| android:versionCode="70" | |
| android:versionName="1.0"> | |
| <uses-sdk android:minSdkVersion="10"/> | |
| <uses-feature android:name="android.hardware.nfc" android:required="true" /> | |
| <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> | |
| <application | |
| android:icon="@drawable/icon" | |
| android:name="com.google.android.apps.testapp.TestApplication" | |
| android:theme="@style/Theme.Test" | |
| android:label="@string/app_name"> | |
| <!-- START LIBRARIES (Maintain Alphabetic order) --> | |
| <!-- NFC extras --> | |
| <uses-library android:name="com.google.android.nfc_extras" android:required="false"/> | |
| <!-- END LIBRARIES --> | |
| <!-- START ACTIVITIES (Maintain Alphabetic order) --> | |
| <!-- Entry point activity - navigation and title bar. --> | |
| <activity | |
| android:name=".entrypoint.EntryPointActivityGroup" | |
| android:screenOrientation="portrait" | |
| android:launchMode="singleTop"/> | |
| <activity android:name=".ui.topup.TopUpActivity" /> | |
| <service android:name=".nfcevent.NfcEventService" /> | |
| <receiver | |
| android:name="com.receiver.TestReceiver" | |
| android:process="@string/receiver_service_name"> | |
| <!-- Receive the actual message --> | |
| <intent-filter> | |
| <action | |
| android:name="android.intent.action.USER_PRESENT"/> | |
| </intent-filter> | |
| </receiver> | |
| <provider | |
| android:name=".dataaccess.persistence.ContentProvider" | |
| android:authorities="com.google.android.apps.testapp" | |
| android:exported="false" /> | |
| </application> | |
| </manifest> | |
| """ | |
| SECOND_MANIFEST = """<?xml version='1.0' encoding='utf-8'?> | |
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
| package="com.google.android.apps.testapp2" | |
| android:versionCode="1" | |
| android:versionName="1.0"> | |
| <permission android:name="com.google.android.apps.foo.C2D_MESSAGE" | |
| android:protectionLevel="signature" /> | |
| <uses-sdk android:minSdkVersion="5" /> | |
| <uses-feature android:name="android.hardware.nfc" android:required="true" /> | |
| <uses-permission android:name="android.permission.READ_LOGS" /> | |
| <uses-permission android:name="android.permission.INTERNET" /> | |
| <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> | |
| <!-- Comment for permission android.permission.GET_ACCOUNTS. | |
| This is just to make sure the comment is being merged correctly. | |
| --> | |
| <uses-permission android:name="android.permission.GET_ACCOUNTS" /> | |
| <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> | |
| <application | |
| android:icon="@drawable/icon" | |
| android:name="com.google.android.apps.testapp.TestApplication2" | |
| android:theme="@style/Theme.Test2" | |
| android:label="@string/app_name" | |
| android:backupAgent="FooBar"> | |
| <activity android:name=".ui.home.HomeActivity" | |
| android:label="@string/app_name" > | |
| <intent-filter> | |
| <action android:name="android.intent.action.MAIN"/> | |
| <category android:name="android.intent.category.LAUNCHER"/> | |
| </intent-filter> | |
| </activity> | |
| <activity android:name=".TestActivity2"></activity> | |
| <activity android:name=".PreviewActivity"></activity> | |
| <activity android:name=".ShowTextActivity" android:excludeFromRecents="true"></activity> | |
| <activity android:name=".ShowStringListActivity" | |
| android:excludeFromRecents="true" | |
| android:parentActivityName=".ui.home.HomeActivity"> | |
| </activity> | |
| <service android:name=".TestService"> | |
| <meta-data android:name="param" android:value="value"/> | |
| </service> | |
| <service android:name=".nfcevent.NfcEventService" /> | |
| <receiver android:name=".ConnectivityReceiver" android:enabled="false" > | |
| <intent-filter> | |
| <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> | |
| </intent-filter> | |
| </receiver> | |
| <activity-alias android:name="BarFoo" android:targetActivity=".FooBar" /> | |
| <provider | |
| android:name="some.package.with.inner.class$AnInnerClass" /> | |
| <provider | |
| android:name="${packageName}" | |
| android:authorities="${packageName}.${packageName}" | |
| android:exported="false" /> | |
| <provider | |
| android:name="${packageName}.PlaceHolderProviderName" | |
| android:authorities="PlaceHolderProviderAuthorities.${packageName}" | |
| android:exported="false" /> | |
| <activity | |
| android:name="activityPrefix.${packageName}.activitySuffix"> | |
| <intent-filter> | |
| <action android:name="actionPrefix.${packageName}.actionSuffix" /> | |
| </intent-filter> | |
| </activity> | |
| </application> | |
| </manifest> | |
| """ | |
| THIRD_MANIFEST = """<?xml version='1.0' encoding='utf-8'?> | |
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
| package="com.google.android.apps.testapp3" | |
| android:versionCode="3" | |
| android:versionName="1.30"> | |
| <uses-sdk android:minSdkVersion="14" /> | |
| <uses-feature android:name="android.hardware.nfc" android:required="true" /> | |
| <uses-permission android:name="android.permission.READ_LOGS" /> | |
| <uses-permission android:name="android.permission.INTERNET" /> | |
| <application> | |
| <activity android:name=".ui.home.HomeActivity" | |
| android:label="@string/app_name" > | |
| <intent-filter> | |
| <action android:name="android.intent.action.MAIN"/> | |
| <category android:name="android.intent.category.LAUNCHER"/> | |
| </intent-filter> | |
| </activity> | |
| <activity android:name="TestActivity"></activity> | |
| <service android:name=".TestService" /> | |
| <receiver android:name=".ConnectivityReceiver" android:enabled="true" > | |
| <intent-filter> | |
| <action android:name="android.net.conn.CONNECTIVITY_CHANGER" /> | |
| </intent-filter> | |
| </receiver> | |
| </application> | |
| </manifest> | |
| """ | |
| MANUALLY_MERGED = """<?xml version='1.0' encoding='utf-8'?> | |
| <manifest | |
| xmlns:android="http://schemas.android.com/apk/res/android" | |
| package="com.google.android.apps.testapp" | |
| android:versionCode="70" | |
| android:versionName="1.0"> | |
| <!-- *** WARNING *** DO NOT EDIT! THIS IS GENERATED MANIFEST BY MERGE_MANIFEST TOOL. | |
| Merger manifest: | |
| FIRST_MANIFEST | |
| Mergee manifests: | |
| SECOND_MANIFEST | |
| THIRD_MANIFEST | |
| --> | |
| <uses-sdk android:minSdkVersion="10"/> | |
| <uses-feature android:name="android.hardware.nfc" android:required="true" /> | |
| <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <permission android:name="com.google.android.apps.foo.C2D_MESSAGE" android:protectionLevel="signature" /> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <uses-permission android:name="android.permission.INTERNET" /> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <!-- Comment for permission android.permission.GET_ACCOUNTS. | |
| This is just to make sure the comment is being merged correctly. | |
| --> | |
| <uses-permission android:name="android.permission.GET_ACCOUNTS" /> | |
| <application | |
| android:icon="@drawable/icon" | |
| android:name="com.google.android.apps.testapp.TestApplication" | |
| android:theme="@style/Theme.Test" | |
| android:label="@string/app_name"> | |
| <!-- START LIBRARIES (Maintain Alphabetic order) --> | |
| <!-- NFC extras --> | |
| <uses-library android:name="com.google.android.nfc_extras" android:required="false"/> | |
| <!-- END LIBRARIES --> | |
| <!-- START ACTIVITIES (Maintain Alphabetic order) --> | |
| <!-- Entry point activity - navigation and title bar. --> | |
| <activity | |
| android:name="com.google.android.apps.testapp.entrypoint.EntryPointActivityGroup" | |
| android:screenOrientation="portrait" | |
| android:launchMode="singleTop"/> | |
| <activity android:name="com.google.android.apps.testapp.ui.topup.TopUpActivity" /> | |
| <service android:name="com.google.android.apps.testapp.nfcevent.NfcEventService" /> | |
| <receiver | |
| android:name="com.receiver.TestReceiver" | |
| android:process="@string/receiver_service_name"> | |
| <!-- Receive the actual message --> | |
| <intent-filter> | |
| <action | |
| android:name="android.intent.action.USER_PRESENT"/> | |
| </intent-filter> | |
| </receiver> | |
| <provider android:authorities="com.google.android.apps.testapp" android:exported="false" | |
| android:name="com.google.android.apps.testapp.dataaccess.persistence.ContentProvider"/> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <activity android:label="@string/app_name" android:name="com.google.android.apps.testapp2.ui.home.HomeActivity"> | |
| <intent-filter> | |
| <action android:name="android.intent.action.MAIN"/> | |
| <category android:name="android.intent.category.LAUNCHER"/> | |
| </intent-filter> | |
| </activity> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <activity android:name="com.google.android.apps.testapp2.TestActivity2"></activity> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <activity android:name="com.google.android.apps.testapp2.PreviewActivity"></activity> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <activity android:name="com.google.android.apps.testapp2.ShowTextActivity" | |
| android:excludeFromRecents="true"></activity> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <activity android:name="com.google.android.apps.testapp2.ShowStringListActivity" | |
| android:excludeFromRecents="true" | |
| android:parentActivityName="com.google.android.apps.testapp2.ui.home.HomeActivity"> | |
| </activity> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <activity | |
| android:name="activityPrefix.com.google.android.apps.testapp.activitySuffix"> | |
| <intent-filter> | |
| <action android:name="actionPrefix.com.google.android.apps.testapp.actionSuffix" /> | |
| </intent-filter> | |
| </activity> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <provider | |
| android:name="some.package.with.inner.class$AnInnerClass" /> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <provider | |
| android:name="com.google.android.apps.testapp" | |
| android:authorities="com.google.android.apps.testapp.com.google.android.apps.testapp" | |
| android:exported="false" /> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <provider | |
| android:name="com.google.android.apps.testapp.PlaceHolderProviderName" | |
| android:authorities="PlaceHolderProviderAuthorities.com.google.android.apps.testapp" | |
| android:exported="false" /> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <receiver android:name="com.google.android.apps.testapp2.ConnectivityReceiver" | |
| android:enabled="false" > | |
| <intent-filter> | |
| <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> | |
| </intent-filter> | |
| </receiver> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <service android:name="com.google.android.apps.testapp2.TestService"> | |
| <meta-data android:name="param" android:value="value"/> | |
| </service> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <service android:name="com.google.android.apps.testapp2.nfcevent.NfcEventService"/> | |
| <!-- Merged from file: THIRD_MANIFEST --> | |
| <activity android:label="@string/app_name" android:name="com.google.android.apps.testapp3.ui.home.HomeActivity"> | |
| <intent-filter> | |
| <action android:name="android.intent.action.MAIN"/> | |
| <category android:name="android.intent.category.LAUNCHER"/> | |
| </intent-filter> | |
| </activity> | |
| <!-- Merged from file: THIRD_MANIFEST --> | |
| <activity android:name="com.google.android.apps.testapp3.TestActivity"/> | |
| <!-- Merged from file: THIRD_MANIFEST --> | |
| <receiver android:enabled="true" | |
| android:name="com.google.android.apps.testapp3.ConnectivityReceiver"> | |
| <intent-filter> | |
| <action android:name="android.net.conn.CONNECTIVITY_CHANGER"/> | |
| </intent-filter> | |
| </receiver> | |
| <!-- Merged from file: THIRD_MANIFEST --> | |
| <service android:name="com.google.android.apps.testapp3.TestService"/> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <activity-alias android:name="com.google.android.apps.testapp2.BarFoo" | |
| android:targetActivity="com.google.android.apps.testapp2.FooBar"/> | |
| </application> | |
| </manifest> | |
| """ | |
| ALIAS_MANIFEST = """<?xml version='1.0' encoding='utf-8'?> | |
| <manifest | |
| xmlns:android="http://schemas.android.com/apk/res/android" | |
| package="com.google.android.apps.testapp" | |
| android:versionCode="70" | |
| android:versionName="1.0"> | |
| <uses-sdk android:minSdkVersion="10"/> | |
| <uses-feature android:name="android.hardware.nfc" android:required="true" /> | |
| <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> | |
| <application | |
| android:icon="@drawable/icon" | |
| android:name="com.google.android.apps.testapp.TestApplication" | |
| android:theme="@style/Theme.Test" | |
| android:label="@string/app_name"> | |
| <activity-alias android:name="com.google.foo.should.not.be.first" | |
| android:targetActivity=".entrypoint.EntryPointActivityGroup"/> | |
| <!-- START LIBRARIES (Maintain Alphabetic order) --> | |
| <!-- NFC extras --> | |
| <uses-library android:name="com.google.android.nfc_extras" android:required="false"/> | |
| <!-- END LIBRARIES --> | |
| <!-- START ACTIVITIES (Maintain Alphabetic order) --> | |
| <!-- Entry point activity - navigation and title bar. --> | |
| <activity | |
| android:name=".entrypoint.EntryPointActivityGroup" | |
| android:screenOrientation="portrait" | |
| android:launchMode="singleTop"/> | |
| <activity android:name=".ui.topup.TopUpActivity" /> | |
| <service android:name=".nfcevent.NfcEventService" /> | |
| <receiver | |
| android:name="com.receiver.TestReceiver" | |
| android:process="@string/receiver_service_name"> | |
| <!-- Receive the actual message --> | |
| <intent-filter> | |
| <action | |
| android:name="android.intent.action.USER_PRESENT"/> | |
| </intent-filter> | |
| </receiver> | |
| <provider | |
| android:name=".dataaccess.persistence.ContentProvider" | |
| android:authorities="com.google.android.apps.testapp" | |
| android:exported="false" /> | |
| </application> | |
| </manifest> | |
| """ | |
| # This case exists when a library manifest relies on | |
| # dependent manifests to provide required elements, i.e. a <application> | |
| INVALID_MERGER_MANIFEST = """ | |
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
| package="com.google.android.invalid" | |
| android:versionCode="9100000" | |
| android:versionName="9.1.0.0x"> | |
| <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> | |
| </manifest> | |
| """ | |
| INVALID_MERGEE_MANIFEST = """ | |
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
| package="com.google.android.invalid" | |
| android:versionCode="9100000" | |
| android:versionName="9.1.0.0x"> | |
| <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> | |
| <permission android:name="com.google.android.apps.foo.C2D_MESSAGE" android:protectionLevel="signature"/> | |
| <uses-feature android:name="android.hardware.nfc" android:required="true"/> | |
| </manifest> | |
| """ | |
| VALID_MANIFEST = """ | |
| <manifest | |
| android:versionCode="9100000" | |
| android:versionName="9.1.0.0x" | |
| package="com.google.android.invalid" | |
| xmlns:android="http://schemas.android.com/apk/res/android"> | |
| <!-- *** WARNING *** DO NOT EDIT! THIS IS GENERATED MANIFEST BY MERGE_MANIFEST TOOL. | |
| Merger manifest: | |
| INVALID_MANIFEST | |
| Mergee manifests: | |
| SECOND_MANIFEST | |
| --> | |
| <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21"/> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <permission android:name="com.google.android.apps.foo.C2D_MESSAGE" android:protectionLevel="signature"/> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <uses-feature android:name="android.hardware.nfc" android:required="true"/> | |
| <application | |
| android:backupAgent="com.google.android.apps.testapp2.FooBar" | |
| android:icon="@drawable/icon" | |
| android:label="@string/app_name" | |
| android:name="com.google.android.apps.testapp.TestApplication2" | |
| android:theme="@style/Theme.Test2"> | |
| <activity | |
| android:name="com.google.android.apps.testapp2.TestActivity2"/> | |
| <activity | |
| android:name="com.google.android.apps.testapp2.PreviewActivity"/> | |
| <activity android:excludeFromRecents="true" | |
| android:name="com.google.android.apps.testapp2.ShowTextActivity"/> | |
| <activity android:excludeFromRecents="true" | |
| android:name="com.google.android.apps.testapp2.ShowStringListActivity" | |
| android:parentActivityName="com.google.android.apps.testapp2.ui.home.HomeActivity"> | |
| </activity> | |
| <service | |
| android:name="com.google.android.apps.testapp2.TestService"> | |
| <meta-data android:name="param" | |
| android:value="value"/> | |
| </service> | |
| <service | |
| android:name="com.google.android.apps.testapp2.nfcevent.NfcEventService"/> | |
| <receiver | |
| android:enabled="false" | |
| android:name="com.google.android.apps.testapp2.ConnectivityReceiver"> | |
| <intent-filter> | |
| <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> | |
| </intent-filter> | |
| </receiver> | |
| <provider android:name="some.package.with.inner.class$AnInnerClass"/> | |
| <provider | |
| android:authorities="com.google.android.invalid.com.google.android.invalid" | |
| android:exported="false" android:name="com.google.android.invalid"/> | |
| <provider android:authorities="PlaceHolderProviderAuthorities.com.google.android.invalid" | |
| android:exported="false" | |
| android:name="com.google.android.invalid.PlaceHolderProviderName"/> | |
| <activity android:name="activityPrefix.com.google.android.invalid.activitySuffix"> | |
| <intent-filter> | |
| <action android:name="actionPrefix.com.google.android.invalid.actionSuffix"/> | |
| </intent-filter> | |
| </activity> | |
| <!-- Merged from file: SECOND_MANIFEST --> | |
| <activity android:label="@string/app_name" | |
| android:name="com.google.android.apps.testapp2.ui.home.HomeActivity"> | |
| <intent-filter> | |
| <action android:name="android.intent.action.MAIN"/> | |
| <category android:name="android.intent.category.LAUNCHER"/> | |
| </intent-filter> | |
| </activity> | |
| <activity-alias | |
| android:name="com.google.android.apps.testapp2.BarFoo" | |
| android:targetActivity="com.google.android.apps.testapp2.FooBar"/> | |
| </application> | |
| </manifest> | |
| """ | |
| MANIFEST_WITHOUT_EXTRA_NAMESPACE = """ | |
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
| package="com.google.android.test" | |
| android:versionCode="1" | |
| android:versionName="1.0.0.0"> | |
| <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> | |
| <application> | |
| <activity android:name=".ui.home.HomeActivity" | |
| android:label="@string/app_name" > | |
| <intent-filter> | |
| <action android:name="android.intent.action.MAIN"/> | |
| <category android:name="android.intent.category.LAUNCHER"/> | |
| </intent-filter> | |
| </activity> | |
| </application> | |
| </manifest> | |
| """ | |
| MANIFEST_WITH_EXTRA_NAMESPACE = """ | |
| <manifest | |
| xmlns:android="http://schemas.android.com/apk/res/android" | |
| xmlns:tools="http://schemas.android.com/tools" | |
| package="com.google.android.library"> | |
| <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> | |
| <application> | |
| <service android:name=".nfcevent.NfcEventService" | |
| android:exported="true" | |
| tools:replace="exported" /> | |
| </application> | |
| </manifest> | |
| """ | |
| MERGED_MANIFEST_WITH_EXTRA_NAMESPACE = """ | |
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
| xmlns:tools="http://schemas.android.com/tools" | |
| package="com.google.android.test" | |
| android:versionCode="1" | |
| android:versionName="1.0.0.0"> | |
| <!-- *** WARNING *** DO NOT EDIT! THIS IS GENERATED MANIFEST BY MERGE_MANIFEST TOOL. | |
| Merger manifest: | |
| MANIFEST_WITHOUT_EXTRA_NAMESPACE | |
| Mergee manifests: | |
| MANIFEST_WITH_EXTRA_NAMESPACE | |
| --> | |
| <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> | |
| <application> | |
| <activity android:name="com.google.android.test.ui.home.HomeActivity" | |
| android:label="@string/app_name" > | |
| <intent-filter> | |
| <action android:name="android.intent.action.MAIN"/> | |
| <category android:name="android.intent.category.LAUNCHER"/> | |
| </intent-filter> | |
| </activity> | |
| <!-- Merged from file: MANIFEST_WITH_EXTRA_NAMESPACE --> | |
| <service android:exported="true" android:name="com.google.android.library.nfcevent.NfcEventService" tools:replace="exported"/> | |
| </application> | |
| </manifest> | |
| """ | |
| MANIFEST_WITH_CONFLICTING_NAMESPACE = """ | |
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
| xmlns:tools="not_tools" | |
| package="com.google.android.test" | |
| android:versionCode="1" | |
| android:versionName="1.0.0.0"> | |
| <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> | |
| <application> | |
| <activity android:name=".ui.home.HomeActivity" | |
| android:label="@string/app_name" > | |
| <intent-filter> | |
| <action android:name="android.intent.action.MAIN"/> | |
| <category android:name="android.intent.category.LAUNCHER"/> | |
| </intent-filter> | |
| </activity> | |
| </application> | |
| </manifest> | |
| """ | |
| def Reformat(string): | |
| """Reformat for comparison.""" | |
| string = re.compile(r'^[ \t]*\n?', re.MULTILINE).sub('', string) | |
| return string | |
| class MergeManifestsTest(unittest.TestCase): | |
| """Unit tests for the MergeManifest class.""" | |
| def testMerge(self): | |
| self.maxDiff = None | |
| merger = merge_manifests.MergeManifests( | |
| (FIRST_MANIFEST, 'FIRST_MANIFEST'), | |
| [(SECOND_MANIFEST, 'SECOND_MANIFEST'), | |
| (THIRD_MANIFEST, 'THIRD_MANIFEST')], | |
| ['android.permission.READ_LOGS']) | |
| result = merger.Merge() | |
| expected = xml.dom.minidom.parseString(MANUALLY_MERGED).toprettyxml() | |
| self.assertEquals(Reformat(expected), Reformat(result)) | |
| def testReformat(self): | |
| text = ' a\n b\n\n\n \t c' | |
| expected = 'a\nb\nc' | |
| self.assertEquals(expected, Reformat(text)) | |
| def testValidateAndWarnPermissions(self): | |
| permissions = ['android.permission.VIBRATE', 'android.permission.LAUGH'] | |
| warnings = merge_manifests._ValidateAndWarnPermissions(permissions) | |
| self.assertTrue('android.permission.VIBRATE' not in warnings) | |
| self.assertTrue('android.permission.LAUGH' in warnings) | |
| def testExcludeAllPermissions(self): | |
| merger = merge_manifests.MergeManifests( | |
| (FIRST_MANIFEST, 'FIRST_MANIFEST'), | |
| [(SECOND_MANIFEST, 'SECOND_MANIFEST'), | |
| (THIRD_MANIFEST, 'THIRD_MANIFEST')], | |
| ['all']) | |
| result = merger.Merge() | |
| self.assertFalse('android.permission.READ_LOGS' in result) | |
| self.assertFalse('android.permission.INTERNET' in result) | |
| self.assertTrue('android.permission.ACCESS_COARSE_LOCATION' in result) | |
| def testUndefinedArgumentPlaceholder(self): | |
| bad_manifest = SECOND_MANIFEST.replace( | |
| '${packageName}', '${unknownPlaceHolder}') | |
| merger = merge_manifests.MergeManifests( | |
| (FIRST_MANIFEST, 'FIRST_MANIFEST'), | |
| [(bad_manifest, 'invalidManifest'), | |
| (THIRD_MANIFEST, 'THIRD_MANIFEST')]) | |
| try: | |
| merger.Merge() | |
| self.fail('merging manifests with unknown placeholders didn\'t fail') | |
| except merge_manifests.UndefinedPlaceholderException: | |
| pass | |
| def testActivityAliasesAreAlwaysLast(self): | |
| merger = merge_manifests.MergeManifests( | |
| (FIRST_MANIFEST, 'FIRST_MANIFEST'), | |
| [(SECOND_MANIFEST, 'SECOND_MANIFEST'), | |
| (ALIAS_MANIFEST, 'THIRD_MANIFEST')], | |
| ['all']) | |
| result = merger.Merge() | |
| last_occurence_of_activity = result.rfind('<activity ') | |
| first_occurence_of_alias = result.find('<activity-alias ') | |
| self.assertLess(last_occurence_of_activity, first_occurence_of_alias, | |
| msg='First activity-alias is not after the last activity!') | |
| def testMergeToCreateValidManifest(self): | |
| self.maxDiff = None | |
| merger = merge_manifests.MergeManifests( | |
| (INVALID_MERGER_MANIFEST, 'INVALID_MANIFEST'), | |
| [(SECOND_MANIFEST, 'SECOND_MANIFEST')], | |
| ['all']) | |
| result = merger.Merge() | |
| expected = xml.dom.minidom.parseString(VALID_MANIFEST).toprettyxml() | |
| self.assertEquals(Reformat(expected), Reformat(result)) | |
| def testMergeWithNoApplication(self): | |
| merger = merge_manifests.MergeManifests( | |
| (INVALID_MERGER_MANIFEST, 'INVALID_MERGER_MANIFEST'), | |
| [(INVALID_MERGEE_MANIFEST, 'INVALID_MERGEE_MANIFEST')], | |
| ['all']) | |
| merger.Merge() | |
| def testMergeWithNamespaces(self): | |
| self.maxDiff = None | |
| merger = merge_manifests.MergeManifests( | |
| (MANIFEST_WITHOUT_EXTRA_NAMESPACE, 'MANIFEST_WITHOUT_EXTRA_NAMESPACE'), | |
| [(MANIFEST_WITH_EXTRA_NAMESPACE, 'MANIFEST_WITH_EXTRA_NAMESPACE')], | |
| ['all']) | |
| result = merger.Merge() | |
| expected = xml.dom.minidom.parseString( | |
| MERGED_MANIFEST_WITH_EXTRA_NAMESPACE).toprettyxml() | |
| # Make sure the result is valid xml (not missing xmlns declarations) | |
| result_reparsed = xml.dom.minidom.parseString(result).toprettyxml() | |
| self.assertEquals(Reformat(expected), Reformat(result_reparsed)) | |
| def testMergeConflictingNamespaces(self): | |
| self.maxDiff = None | |
| merger = merge_manifests.MergeManifests( | |
| (MANIFEST_WITH_CONFLICTING_NAMESPACE, | |
| 'MANIFEST_WITH_CONFLICTING_NAMESPACE'), | |
| [(MANIFEST_WITH_EXTRA_NAMESPACE, 'MANIFEST_WITH_EXTRA_NAMESPACE')], | |
| ['all']) | |
| with self.assertRaisesRegexp(merge_manifests.MalformedManifestException, | |
| 'different values for namespace xmlns:tools'): | |
| merger.Merge() | |
| if __name__ == '__main__': | |
| unittest.main() | |