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()