Merge xmlns decls in old manifest merger to help transition
The old manifest merger doesn't merge xmlns decls.
That could be a problem if a library has xmlns:tools
but the binary doesn't (and we don't strip tools:).
Library manifests may end up with more xmlns:tools
annotations while transitioning from the old manifest
merger to the new. It would be a problem if the same
manifest is used by both the old and new merger.
An alternative may be to strip the tools annotations
after merging w/ this old merger... other options?
--
MOS_MIGRATED_REVID=131332171
diff --git a/tools/android/merge_manifests_test.py b/tools/android/merge_manifests_test.py
index 55fef1c..62d0474 100644
--- a/tools/android/merge_manifests_test.py
+++ b/tools/android/merge_manifests_test.py
@@ -435,6 +435,84 @@
</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."""
@@ -520,6 +598,31 @@
['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()