manifest_utils_test.py (5096B)
1 #!/usr/bin/env python3 2 # Copyright 2020 The Chromium Authors 3 # Use of this source code is governed by a BSD-style license that can be 4 # found in the LICENSE file. 5 6 import collections 7 import os 8 import sys 9 import unittest 10 11 sys.path.insert(1, os.path.join(os.path.dirname(__file__), '..')) 12 from util import manifest_utils 13 14 _TEST_MANIFEST = """\ 15 <?xml version="1.0" ?> 16 <manifest package="test.pkg" 17 android:versionCode="1234" 18 android:versionName="1.2.33.4" 19 tools:ignore="MissingVersion" 20 xmlns:android="http://schemas.android.com/apk/res/android" 21 xmlns:tools="http://schemas.android.com/tools"> 22 <!-- Should be one line. --> 23 <uses-sdk android:minSdkVersion="24" 24 android:targetSdkVersion="30"/> 25 <!-- Should have attrs sorted--> 26 <uses-feature android:required="false" android:version="1" 27 android:name="android.hardware.vr.headtracking" /> 28 <!-- Should not be wrapped since < 100 chars. --> 29 <application 30 android:name="testname"> 31 <activity 32 {extra_activity_attr} 33 android:icon="@drawable/ic_devices_48dp" 34 android:label="label with spaces" 35 android:name="to be hashed" 36 android:theme="@style/Theme.Chromium.Activity.TranslucentNoAnimations"> 37 <intent-filter> 38 {extra_intent_filter_elem} 39 <action android:name="android.intent.action.SEND"/> 40 <category android:name="android.intent.category.DEFAULT"/> 41 <data android:mimeType="text/plain"/> 42 </intent-filter> 43 </activity> 44 <!-- Should be made non-self-closing. --> 45 <receiver android:exported="false" android:name="\ 46 org.chromium.chrome.browser.announcement.AnnouncementNotificationManager$Rcvr"/> 47 </application> 48 </manifest> 49 """ 50 51 _TEST_MANIFEST_NORMALIZED = """\ 52 <?xml version="1.0" ?> 53 <manifest 54 xmlns:android="http://schemas.android.com/apk/res/android" 55 xmlns:tools="http://schemas.android.com/tools" 56 package="test.pkg" 57 android:versionCode="OFFSET=4" 58 android:versionName="#.#.#.#" 59 tools:ignore="MissingVersion"> 60 <uses-feature android:name="android.hardware.vr.headtracking" \ 61 android:required="false" android:version="1"/> 62 <uses-sdk android:minSdkVersion="24" android:targetSdkVersion="30"/> 63 <application android:name="testname"> 64 <activity # DIFF-ANCHOR: {activity_diff_anchor} 65 android:name="to be hashed" 66 {extra_activity_attr}android:icon="@drawable/ic_devices_48dp" 67 android:label="label with spaces" 68 android:theme="@style/Theme.Chromium.Activity.TranslucentNoAnimations"> 69 <intent-filter> # DIFF-ANCHOR: {intent_filter_diff_anchor} 70 {extra_intent_filter_elem}\ 71 <action android:name="android.intent.action.SEND"/> 72 <category android:name="android.intent.category.DEFAULT"/> 73 <data android:mimeType="text/plain"/> 74 </intent-filter> # DIFF-ANCHOR: {intent_filter_diff_anchor} 75 </activity> # DIFF-ANCHOR: {activity_diff_anchor} 76 <receiver # DIFF-ANCHOR: ddab3320 77 android:name=\ 78 "org.chromium.chrome.browser.announcement.AnnouncementNotificationManager$Rcvr" 79 android:exported="false"> 80 </receiver> # DIFF-ANCHOR: ddab3320 81 </application> 82 </manifest> 83 """ 84 85 _ACTIVITY_DIFF_ANCHOR = '32b3a641' 86 _INTENT_FILTER_DIFF_ANCHOR = '4ee601b7' 87 88 89 def _CreateTestData(intent_filter_diff_anchor=_INTENT_FILTER_DIFF_ANCHOR, 90 extra_activity_attr='', 91 extra_intent_filter_elem=''): 92 if extra_activity_attr: 93 extra_activity_attr += '\n ' 94 if extra_intent_filter_elem: 95 extra_intent_filter_elem += '\n ' 96 test_manifest = _TEST_MANIFEST.format( 97 extra_activity_attr=extra_activity_attr, 98 extra_intent_filter_elem=extra_intent_filter_elem) 99 expected = _TEST_MANIFEST_NORMALIZED.format( 100 activity_diff_anchor=_ACTIVITY_DIFF_ANCHOR, 101 intent_filter_diff_anchor=intent_filter_diff_anchor, 102 extra_activity_attr=extra_activity_attr, 103 extra_intent_filter_elem=extra_intent_filter_elem) 104 return test_manifest, expected 105 106 107 class ManifestUtilsTest(unittest.TestCase): 108 # Enable diff output. 109 maxDiff = None 110 111 def testNormalizeManifest_golden(self): 112 test_manifest, expected = _CreateTestData() 113 actual = manifest_utils.NormalizeManifest(test_manifest, 1230, None) 114 self.assertMultiLineEqual(expected, actual) 115 116 def testNormalizeManifest_nameUsedForActivity(self): 117 test_manifest, expected = _CreateTestData(extra_activity_attr='a="b"') 118 actual = manifest_utils.NormalizeManifest(test_manifest, 1230, None) 119 # Checks that the DIFF-ANCHOR does not change with the added attribute. 120 self.assertMultiLineEqual(expected, actual) 121 122 def testNormalizeManifest_nameNotUsedForIntentFilter(self): 123 test_manifest, expected = _CreateTestData( 124 extra_intent_filter_elem='<a/>', intent_filter_diff_anchor='5f5c8a70') 125 actual = manifest_utils.NormalizeManifest(test_manifest, 1230, None) 126 # Checks that the DIFF-ANCHOR does change with the added element despite 127 # having a nested element with an android:name set. 128 self.assertMultiLineEqual(expected, actual) 129 130 131 if __name__ == '__main__': 132 unittest.main()