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

