xref: /aosp_15_r20/build/soong/scripts/manifest_fixer_test.py (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker#!/usr/bin/env python
2*333d2b36SAndroid Build Coastguard Worker#
3*333d2b36SAndroid Build Coastguard Worker# Copyright (C) 2018 The Android Open Source Project
4*333d2b36SAndroid Build Coastguard Worker#
5*333d2b36SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*333d2b36SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*333d2b36SAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*333d2b36SAndroid Build Coastguard Worker#
9*333d2b36SAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
10*333d2b36SAndroid Build Coastguard Worker#
11*333d2b36SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*333d2b36SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*333d2b36SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*333d2b36SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*333d2b36SAndroid Build Coastguard Worker# limitations under the License.
16*333d2b36SAndroid Build Coastguard Worker#
17*333d2b36SAndroid Build Coastguard Worker"""Unit tests for manifest_fixer.py."""
18*333d2b36SAndroid Build Coastguard Worker
19*333d2b36SAndroid Build Coastguard Workerimport io
20*333d2b36SAndroid Build Coastguard Workerimport sys
21*333d2b36SAndroid Build Coastguard Workerimport unittest
22*333d2b36SAndroid Build Coastguard Workerfrom xml.dom import minidom
23*333d2b36SAndroid Build Coastguard Workerimport xml.etree.ElementTree as ElementTree
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Workerimport manifest_fixer
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Workersys.dont_write_bytecode = True
28*333d2b36SAndroid Build Coastguard Worker
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Workerclass CompareVersionGtTest(unittest.TestCase):
31*333d2b36SAndroid Build Coastguard Worker  """Unit tests for compare_version_gt function."""
32*333d2b36SAndroid Build Coastguard Worker
33*333d2b36SAndroid Build Coastguard Worker  def test_sdk(self):
34*333d2b36SAndroid Build Coastguard Worker    """Test comparing sdk versions."""
35*333d2b36SAndroid Build Coastguard Worker    self.assertTrue(manifest_fixer.compare_version_gt('28', '27'))
36*333d2b36SAndroid Build Coastguard Worker    self.assertFalse(manifest_fixer.compare_version_gt('27', '28'))
37*333d2b36SAndroid Build Coastguard Worker    self.assertFalse(manifest_fixer.compare_version_gt('28', '28'))
38*333d2b36SAndroid Build Coastguard Worker
39*333d2b36SAndroid Build Coastguard Worker  def test_codename(self):
40*333d2b36SAndroid Build Coastguard Worker    """Test comparing codenames."""
41*333d2b36SAndroid Build Coastguard Worker    self.assertTrue(manifest_fixer.compare_version_gt('Q', 'P'))
42*333d2b36SAndroid Build Coastguard Worker    self.assertFalse(manifest_fixer.compare_version_gt('P', 'Q'))
43*333d2b36SAndroid Build Coastguard Worker    self.assertFalse(manifest_fixer.compare_version_gt('Q', 'Q'))
44*333d2b36SAndroid Build Coastguard Worker
45*333d2b36SAndroid Build Coastguard Worker  def test_sdk_codename(self):
46*333d2b36SAndroid Build Coastguard Worker    """Test comparing sdk versions with codenames."""
47*333d2b36SAndroid Build Coastguard Worker    self.assertTrue(manifest_fixer.compare_version_gt('Q', '28'))
48*333d2b36SAndroid Build Coastguard Worker    self.assertFalse(manifest_fixer.compare_version_gt('28', 'Q'))
49*333d2b36SAndroid Build Coastguard Worker
50*333d2b36SAndroid Build Coastguard Worker  def test_compare_numeric(self):
51*333d2b36SAndroid Build Coastguard Worker    """Test that numbers are compared in numeric and not lexicographic order."""
52*333d2b36SAndroid Build Coastguard Worker    self.assertTrue(manifest_fixer.compare_version_gt('18', '8'))
53*333d2b36SAndroid Build Coastguard Worker
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Workerclass RaiseMinSdkVersionTest(unittest.TestCase):
56*333d2b36SAndroid Build Coastguard Worker  """Unit tests for raise_min_sdk_version function."""
57*333d2b36SAndroid Build Coastguard Worker
58*333d2b36SAndroid Build Coastguard Worker  def raise_min_sdk_version_test(self, input_manifest, min_sdk_version,
59*333d2b36SAndroid Build Coastguard Worker                                 target_sdk_version, library):
60*333d2b36SAndroid Build Coastguard Worker    doc = minidom.parseString(input_manifest)
61*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.raise_min_sdk_version(doc, min_sdk_version,
62*333d2b36SAndroid Build Coastguard Worker                                         target_sdk_version, library)
63*333d2b36SAndroid Build Coastguard Worker    output = io.StringIO()
64*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.write_xml(output, doc)
65*333d2b36SAndroid Build Coastguard Worker    return output.getvalue()
66*333d2b36SAndroid Build Coastguard Worker
67*333d2b36SAndroid Build Coastguard Worker  manifest_tmpl = (
68*333d2b36SAndroid Build Coastguard Worker      '<?xml version="1.0" encoding="utf-8"?>\n'
69*333d2b36SAndroid Build Coastguard Worker      '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n'
70*333d2b36SAndroid Build Coastguard Worker      '%s'
71*333d2b36SAndroid Build Coastguard Worker      '</manifest>\n')
72*333d2b36SAndroid Build Coastguard Worker
73*333d2b36SAndroid Build Coastguard Worker  def uses_sdk(self, min_sdk=None, target_sdk=None, extra=''):
74*333d2b36SAndroid Build Coastguard Worker    attrs = ''
75*333d2b36SAndroid Build Coastguard Worker    if min_sdk:
76*333d2b36SAndroid Build Coastguard Worker      attrs += ' android:minSdkVersion="%s"' % min_sdk
77*333d2b36SAndroid Build Coastguard Worker    if target_sdk:
78*333d2b36SAndroid Build Coastguard Worker      attrs += ' android:targetSdkVersion="%s"' % target_sdk
79*333d2b36SAndroid Build Coastguard Worker    if extra:
80*333d2b36SAndroid Build Coastguard Worker      attrs += ' ' + extra
81*333d2b36SAndroid Build Coastguard Worker    return '    <uses-sdk%s/>\n' % attrs
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Worker  def assert_xml_equal(self, output, expected):
84*333d2b36SAndroid Build Coastguard Worker    self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected))
85*333d2b36SAndroid Build Coastguard Worker
86*333d2b36SAndroid Build Coastguard Worker  def test_no_uses_sdk(self):
87*333d2b36SAndroid Build Coastguard Worker    """Tests inserting a uses-sdk element into a manifest."""
88*333d2b36SAndroid Build Coastguard Worker
89*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % ''
90*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='28')
91*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, '28', '28', False)
92*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Worker  def test_no_min(self):
95*333d2b36SAndroid Build Coastguard Worker    """Tests inserting a minSdkVersion attribute into a uses-sdk element."""
96*333d2b36SAndroid Build Coastguard Worker
97*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % '    <uses-sdk extra="foo"/>\n'
98*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='28',
99*333d2b36SAndroid Build Coastguard Worker                                                  extra='extra="foo"')
100*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, '28', '28', False)
101*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
102*333d2b36SAndroid Build Coastguard Worker
103*333d2b36SAndroid Build Coastguard Worker  def test_raise_min(self):
104*333d2b36SAndroid Build Coastguard Worker    """Tests inserting a minSdkVersion attribute into a uses-sdk element."""
105*333d2b36SAndroid Build Coastguard Worker
106*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_sdk(min_sdk='27')
107*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='28')
108*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, '28', '28', False)
109*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
110*333d2b36SAndroid Build Coastguard Worker
111*333d2b36SAndroid Build Coastguard Worker  def test_raise(self):
112*333d2b36SAndroid Build Coastguard Worker    """Tests raising a minSdkVersion attribute."""
113*333d2b36SAndroid Build Coastguard Worker
114*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_sdk(min_sdk='27')
115*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='28')
116*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, '28', '28', False)
117*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Worker  def test_no_raise_min(self):
120*333d2b36SAndroid Build Coastguard Worker    """Tests a minSdkVersion that doesn't need raising."""
121*333d2b36SAndroid Build Coastguard Worker
122*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_sdk(min_sdk='28')
123*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='27')
124*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, '27', '27', False)
125*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
126*333d2b36SAndroid Build Coastguard Worker
127*333d2b36SAndroid Build Coastguard Worker  def test_raise_codename(self):
128*333d2b36SAndroid Build Coastguard Worker    """Tests raising a minSdkVersion attribute to a codename."""
129*333d2b36SAndroid Build Coastguard Worker
130*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_sdk(min_sdk='28')
131*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_sdk(min_sdk='P', target_sdk='P')
132*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, 'P', 'P', False)
133*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
134*333d2b36SAndroid Build Coastguard Worker
135*333d2b36SAndroid Build Coastguard Worker  def test_no_raise_codename(self):
136*333d2b36SAndroid Build Coastguard Worker    """Tests a minSdkVersion codename that doesn't need raising."""
137*333d2b36SAndroid Build Coastguard Worker
138*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_sdk(min_sdk='P')
139*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_sdk(min_sdk='P', target_sdk='28')
140*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, '28', '28', False)
141*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
142*333d2b36SAndroid Build Coastguard Worker
143*333d2b36SAndroid Build Coastguard Worker  def test_target(self):
144*333d2b36SAndroid Build Coastguard Worker    """Tests an existing targetSdkVersion is preserved."""
145*333d2b36SAndroid Build Coastguard Worker
146*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_sdk(min_sdk='26', target_sdk='27')
147*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='27')
148*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, '28', '29', False)
149*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
150*333d2b36SAndroid Build Coastguard Worker
151*333d2b36SAndroid Build Coastguard Worker  def test_no_target(self):
152*333d2b36SAndroid Build Coastguard Worker    """Tests inserting targetSdkVersion when minSdkVersion exists."""
153*333d2b36SAndroid Build Coastguard Worker
154*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_sdk(min_sdk='27')
155*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='29')
156*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, '28', '29', False)
157*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
158*333d2b36SAndroid Build Coastguard Worker
159*333d2b36SAndroid Build Coastguard Worker  def test_target_no_min(self):
160*333d2b36SAndroid Build Coastguard Worker    """"Tests inserting targetSdkVersion when minSdkVersion exists."""
161*333d2b36SAndroid Build Coastguard Worker
162*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_sdk(target_sdk='27')
163*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='27')
164*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, '28', '29', False)
165*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
166*333d2b36SAndroid Build Coastguard Worker
167*333d2b36SAndroid Build Coastguard Worker  def test_no_target_no_min(self):
168*333d2b36SAndroid Build Coastguard Worker    """Tests inserting targetSdkVersion when minSdkVersion does not exist."""
169*333d2b36SAndroid Build Coastguard Worker
170*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % ''
171*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='29')
172*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, '28', '29', False)
173*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
174*333d2b36SAndroid Build Coastguard Worker
175*333d2b36SAndroid Build Coastguard Worker  def test_library_no_target(self):
176*333d2b36SAndroid Build Coastguard Worker    """Tests inserting targetSdkVersion when minSdkVersion exists."""
177*333d2b36SAndroid Build Coastguard Worker
178*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_sdk(min_sdk='27')
179*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='16')
180*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, '28', '29', True)
181*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
182*333d2b36SAndroid Build Coastguard Worker
183*333d2b36SAndroid Build Coastguard Worker  def test_library_target_no_min(self):
184*333d2b36SAndroid Build Coastguard Worker    """Tests inserting targetSdkVersion when minSdkVersion exists."""
185*333d2b36SAndroid Build Coastguard Worker
186*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_sdk(target_sdk='27')
187*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='27')
188*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, '28', '29', True)
189*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
190*333d2b36SAndroid Build Coastguard Worker
191*333d2b36SAndroid Build Coastguard Worker  def test_library_no_target_no_min(self):
192*333d2b36SAndroid Build Coastguard Worker    """Tests inserting targetSdkVersion when minSdkVersion does not exist."""
193*333d2b36SAndroid Build Coastguard Worker
194*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % ''
195*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='16')
196*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, '28', '29', True)
197*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
198*333d2b36SAndroid Build Coastguard Worker
199*333d2b36SAndroid Build Coastguard Worker  def test_extra(self):
200*333d2b36SAndroid Build Coastguard Worker    """Tests that extra attributes and elements are maintained."""
201*333d2b36SAndroid Build Coastguard Worker
202*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % (
203*333d2b36SAndroid Build Coastguard Worker        '    <!-- comment -->\n'
204*333d2b36SAndroid Build Coastguard Worker        '    <uses-sdk android:minSdkVersion="27" extra="foo"/>\n'
205*333d2b36SAndroid Build Coastguard Worker        '    <application/>\n')
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Worker    # pylint: disable=line-too-long
208*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % (
209*333d2b36SAndroid Build Coastguard Worker        '    <!-- comment -->\n'
210*333d2b36SAndroid Build Coastguard Worker        '    <uses-sdk android:minSdkVersion="28" extra="foo" android:targetSdkVersion="29"/>\n'
211*333d2b36SAndroid Build Coastguard Worker        '    <application/>\n')
212*333d2b36SAndroid Build Coastguard Worker
213*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, '28', '29', False)
214*333d2b36SAndroid Build Coastguard Worker
215*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
216*333d2b36SAndroid Build Coastguard Worker
217*333d2b36SAndroid Build Coastguard Worker  def test_indent(self):
218*333d2b36SAndroid Build Coastguard Worker    """Tests that an inserted element copies the existing indentation."""
219*333d2b36SAndroid Build Coastguard Worker
220*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % '  <!-- comment -->\n'
221*333d2b36SAndroid Build Coastguard Worker
222*333d2b36SAndroid Build Coastguard Worker    # pylint: disable=line-too-long
223*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % (
224*333d2b36SAndroid Build Coastguard Worker        '  <uses-sdk android:minSdkVersion="28" android:targetSdkVersion="29"/>\n'
225*333d2b36SAndroid Build Coastguard Worker        '  <!-- comment -->\n')
226*333d2b36SAndroid Build Coastguard Worker
227*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, '28', '29', False)
228*333d2b36SAndroid Build Coastguard Worker
229*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
230*333d2b36SAndroid Build Coastguard Worker
231*333d2b36SAndroid Build Coastguard Worker  def test_multiple_uses_sdks(self):
232*333d2b36SAndroid Build Coastguard Worker    """Tests a manifest that contains multiple uses_sdks elements."""
233*333d2b36SAndroid Build Coastguard Worker
234*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % (
235*333d2b36SAndroid Build Coastguard Worker        '    <uses-sdk android:featureFlag="foo" android:minSdkVersion="21" />\n'
236*333d2b36SAndroid Build Coastguard Worker        '    <uses-sdk android:featureFlag="!foo" android:minSdkVersion="22" />\n')
237*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % (
238*333d2b36SAndroid Build Coastguard Worker      '    <uses-sdk android:featureFlag="foo" android:minSdkVersion="28" android:targetSdkVersion="28" />\n'
239*333d2b36SAndroid Build Coastguard Worker      '    <uses-sdk android:featureFlag="!foo" android:minSdkVersion="28" android:targetSdkVersion="28" />\n')
240*333d2b36SAndroid Build Coastguard Worker
241*333d2b36SAndroid Build Coastguard Worker    output = self.raise_min_sdk_version_test(manifest_input, '28', '28', False)
242*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
243*333d2b36SAndroid Build Coastguard Worker
244*333d2b36SAndroid Build Coastguard Workerclass AddLoggingParentTest(unittest.TestCase):
245*333d2b36SAndroid Build Coastguard Worker  """Unit tests for add_logging_parent function."""
246*333d2b36SAndroid Build Coastguard Worker
247*333d2b36SAndroid Build Coastguard Worker  def assert_xml_equal(self, output, expected):
248*333d2b36SAndroid Build Coastguard Worker    self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected))
249*333d2b36SAndroid Build Coastguard Worker
250*333d2b36SAndroid Build Coastguard Worker  def add_logging_parent_test(self, input_manifest, logging_parent=None):
251*333d2b36SAndroid Build Coastguard Worker    doc = minidom.parseString(input_manifest)
252*333d2b36SAndroid Build Coastguard Worker    if logging_parent:
253*333d2b36SAndroid Build Coastguard Worker      manifest_fixer.add_logging_parent(doc, logging_parent)
254*333d2b36SAndroid Build Coastguard Worker    output = io.StringIO()
255*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.write_xml(output, doc)
256*333d2b36SAndroid Build Coastguard Worker    return output.getvalue()
257*333d2b36SAndroid Build Coastguard Worker
258*333d2b36SAndroid Build Coastguard Worker  manifest_tmpl = (
259*333d2b36SAndroid Build Coastguard Worker      '<?xml version="1.0" encoding="utf-8"?>\n'
260*333d2b36SAndroid Build Coastguard Worker      '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n'
261*333d2b36SAndroid Build Coastguard Worker      '%s'
262*333d2b36SAndroid Build Coastguard Worker      '</manifest>\n')
263*333d2b36SAndroid Build Coastguard Worker
264*333d2b36SAndroid Build Coastguard Worker  def uses_logging_parent(self, logging_parent=None):
265*333d2b36SAndroid Build Coastguard Worker    attrs = ''
266*333d2b36SAndroid Build Coastguard Worker    if logging_parent:
267*333d2b36SAndroid Build Coastguard Worker      meta_text = ('<meta-data android:name="android.content.pm.LOGGING_PARENT" '
268*333d2b36SAndroid Build Coastguard Worker                   'android:value="%s"/>\n') % logging_parent
269*333d2b36SAndroid Build Coastguard Worker      attrs += '    <application>\n        %s    </application>\n' % meta_text
270*333d2b36SAndroid Build Coastguard Worker
271*333d2b36SAndroid Build Coastguard Worker    return attrs
272*333d2b36SAndroid Build Coastguard Worker
273*333d2b36SAndroid Build Coastguard Worker  def test_no_logging_parent(self):
274*333d2b36SAndroid Build Coastguard Worker    """Tests manifest_fixer with no logging_parent."""
275*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % ''
276*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_logging_parent()
277*333d2b36SAndroid Build Coastguard Worker    output = self.add_logging_parent_test(manifest_input)
278*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
279*333d2b36SAndroid Build Coastguard Worker
280*333d2b36SAndroid Build Coastguard Worker  def test_logging_parent(self):
281*333d2b36SAndroid Build Coastguard Worker    """Tests manifest_fixer with no logging_parent."""
282*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % ''
283*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_logging_parent('FOO')
284*333d2b36SAndroid Build Coastguard Worker    output = self.add_logging_parent_test(manifest_input, 'FOO')
285*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
286*333d2b36SAndroid Build Coastguard Worker
287*333d2b36SAndroid Build Coastguard Worker
288*333d2b36SAndroid Build Coastguard Workerclass AddUsesLibrariesTest(unittest.TestCase):
289*333d2b36SAndroid Build Coastguard Worker  """Unit tests for add_uses_libraries function."""
290*333d2b36SAndroid Build Coastguard Worker
291*333d2b36SAndroid Build Coastguard Worker  def assert_xml_equal(self, output, expected):
292*333d2b36SAndroid Build Coastguard Worker    self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected))
293*333d2b36SAndroid Build Coastguard Worker
294*333d2b36SAndroid Build Coastguard Worker  def run_test(self, input_manifest, new_uses_libraries):
295*333d2b36SAndroid Build Coastguard Worker    doc = minidom.parseString(input_manifest)
296*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.add_uses_libraries(doc, new_uses_libraries, True)
297*333d2b36SAndroid Build Coastguard Worker    output = io.StringIO()
298*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.write_xml(output, doc)
299*333d2b36SAndroid Build Coastguard Worker    return output.getvalue()
300*333d2b36SAndroid Build Coastguard Worker
301*333d2b36SAndroid Build Coastguard Worker  manifest_tmpl = (
302*333d2b36SAndroid Build Coastguard Worker      '<?xml version="1.0" encoding="utf-8"?>\n'
303*333d2b36SAndroid Build Coastguard Worker      '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n'
304*333d2b36SAndroid Build Coastguard Worker      '%s'
305*333d2b36SAndroid Build Coastguard Worker      '</manifest>\n')
306*333d2b36SAndroid Build Coastguard Worker
307*333d2b36SAndroid Build Coastguard Worker  def uses_libraries(self, name_required_pairs):
308*333d2b36SAndroid Build Coastguard Worker    ret = '    <application>\n'
309*333d2b36SAndroid Build Coastguard Worker    for name, required in name_required_pairs:
310*333d2b36SAndroid Build Coastguard Worker      ret += (
311*333d2b36SAndroid Build Coastguard Worker          '        <uses-library android:name="%s" android:required="%s"/>\n'
312*333d2b36SAndroid Build Coastguard Worker      ) % (name, required)
313*333d2b36SAndroid Build Coastguard Worker    ret += '    </application>\n'
314*333d2b36SAndroid Build Coastguard Worker    return ret
315*333d2b36SAndroid Build Coastguard Worker
316*333d2b36SAndroid Build Coastguard Worker  def test_empty(self):
317*333d2b36SAndroid Build Coastguard Worker    """Empty new_uses_libraries must not touch the manifest."""
318*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_libraries([
319*333d2b36SAndroid Build Coastguard Worker        ('foo', 'true'),
320*333d2b36SAndroid Build Coastguard Worker        ('bar', 'false')])
321*333d2b36SAndroid Build Coastguard Worker    expected = manifest_input
322*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, [])
323*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
324*333d2b36SAndroid Build Coastguard Worker
325*333d2b36SAndroid Build Coastguard Worker  def test_not_overwrite(self):
326*333d2b36SAndroid Build Coastguard Worker    """new_uses_libraries must not overwrite existing tags."""
327*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_libraries([
328*333d2b36SAndroid Build Coastguard Worker        ('foo', 'true'),
329*333d2b36SAndroid Build Coastguard Worker        ('bar', 'false')])
330*333d2b36SAndroid Build Coastguard Worker    expected = manifest_input
331*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, ['foo', 'bar'])
332*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
333*333d2b36SAndroid Build Coastguard Worker
334*333d2b36SAndroid Build Coastguard Worker  def test_add(self):
335*333d2b36SAndroid Build Coastguard Worker    """New names are added with 'required:true'."""
336*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_libraries([
337*333d2b36SAndroid Build Coastguard Worker        ('foo', 'true'),
338*333d2b36SAndroid Build Coastguard Worker        ('bar', 'false')])
339*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_libraries([
340*333d2b36SAndroid Build Coastguard Worker        ('foo', 'true'),
341*333d2b36SAndroid Build Coastguard Worker        ('bar', 'false'),
342*333d2b36SAndroid Build Coastguard Worker        ('baz', 'true'),
343*333d2b36SAndroid Build Coastguard Worker        ('qux', 'true')])
344*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, ['bar', 'baz', 'qux'])
345*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
346*333d2b36SAndroid Build Coastguard Worker
347*333d2b36SAndroid Build Coastguard Worker  def test_no_application(self):
348*333d2b36SAndroid Build Coastguard Worker    """When there is no <application> tag, the tag is added."""
349*333d2b36SAndroid Build Coastguard Worker    manifest_input = (
350*333d2b36SAndroid Build Coastguard Worker        '<?xml version="1.0" encoding="utf-8"?>\n'
351*333d2b36SAndroid Build Coastguard Worker        '<manifest xmlns:android='
352*333d2b36SAndroid Build Coastguard Worker        '"http://schemas.android.com/apk/res/android">\n'
353*333d2b36SAndroid Build Coastguard Worker        '</manifest>\n')
354*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_libraries([
355*333d2b36SAndroid Build Coastguard Worker        ('foo', 'true'),
356*333d2b36SAndroid Build Coastguard Worker        ('bar', 'true')])
357*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, ['foo', 'bar'])
358*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
359*333d2b36SAndroid Build Coastguard Worker
360*333d2b36SAndroid Build Coastguard Worker  def test_empty_application(self):
361*333d2b36SAndroid Build Coastguard Worker    """Even when here is an empty <application/> tag, the libs are added."""
362*333d2b36SAndroid Build Coastguard Worker    manifest_input = (
363*333d2b36SAndroid Build Coastguard Worker        '<?xml version="1.0" encoding="utf-8"?>\n'
364*333d2b36SAndroid Build Coastguard Worker        '<manifest xmlns:android='
365*333d2b36SAndroid Build Coastguard Worker        '"http://schemas.android.com/apk/res/android">\n'
366*333d2b36SAndroid Build Coastguard Worker        '    <application/>\n'
367*333d2b36SAndroid Build Coastguard Worker        '</manifest>\n')
368*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_libraries([
369*333d2b36SAndroid Build Coastguard Worker        ('foo', 'true'),
370*333d2b36SAndroid Build Coastguard Worker        ('bar', 'true')])
371*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, ['foo', 'bar'])
372*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
373*333d2b36SAndroid Build Coastguard Worker
374*333d2b36SAndroid Build Coastguard Worker  def test_multiple_application(self):
375*333d2b36SAndroid Build Coastguard Worker    """When there are multiple applications, the libs are added to each."""
376*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % (
377*333d2b36SAndroid Build Coastguard Worker            self.uses_libraries([('foo', 'false')]) +
378*333d2b36SAndroid Build Coastguard Worker            self.uses_libraries([('bar', 'false')]))
379*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % (
380*333d2b36SAndroid Build Coastguard Worker            self.uses_libraries([('foo', 'false'), ('bar', 'true')]) +
381*333d2b36SAndroid Build Coastguard Worker            self.uses_libraries([('bar', 'false'), ('foo', 'true')]))
382*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, ['foo', 'bar'])
383*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
384*333d2b36SAndroid Build Coastguard Worker
385*333d2b36SAndroid Build Coastguard Worker
386*333d2b36SAndroid Build Coastguard Workerclass AddUsesNonSdkApiTest(unittest.TestCase):
387*333d2b36SAndroid Build Coastguard Worker  """Unit tests for add_uses_libraries function."""
388*333d2b36SAndroid Build Coastguard Worker
389*333d2b36SAndroid Build Coastguard Worker  def assert_xml_equal(self, output, expected):
390*333d2b36SAndroid Build Coastguard Worker    self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected))
391*333d2b36SAndroid Build Coastguard Worker
392*333d2b36SAndroid Build Coastguard Worker  def run_test(self, input_manifest):
393*333d2b36SAndroid Build Coastguard Worker    doc = minidom.parseString(input_manifest)
394*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.add_uses_non_sdk_api(doc)
395*333d2b36SAndroid Build Coastguard Worker    output = io.StringIO()
396*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.write_xml(output, doc)
397*333d2b36SAndroid Build Coastguard Worker    return output.getvalue()
398*333d2b36SAndroid Build Coastguard Worker
399*333d2b36SAndroid Build Coastguard Worker  manifest_tmpl = (
400*333d2b36SAndroid Build Coastguard Worker      '<?xml version="1.0" encoding="utf-8"?>\n'
401*333d2b36SAndroid Build Coastguard Worker      '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n'
402*333d2b36SAndroid Build Coastguard Worker      '    %s\n'
403*333d2b36SAndroid Build Coastguard Worker      '</manifest>\n')
404*333d2b36SAndroid Build Coastguard Worker
405*333d2b36SAndroid Build Coastguard Worker  def uses_non_sdk_api(self, value):
406*333d2b36SAndroid Build Coastguard Worker    return '<application %s/>' % ('android:usesNonSdkApi="true"' if value else '')
407*333d2b36SAndroid Build Coastguard Worker
408*333d2b36SAndroid Build Coastguard Worker  def test_set_true(self):
409*333d2b36SAndroid Build Coastguard Worker    """Empty new_uses_libraries must not touch the manifest."""
410*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_non_sdk_api(False)
411*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_non_sdk_api(True)
412*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input)
413*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
414*333d2b36SAndroid Build Coastguard Worker
415*333d2b36SAndroid Build Coastguard Worker  def test_already_set(self):
416*333d2b36SAndroid Build Coastguard Worker    """new_uses_libraries must not overwrite existing tags."""
417*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_non_sdk_api(True)
418*333d2b36SAndroid Build Coastguard Worker    expected = manifest_input
419*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input)
420*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
421*333d2b36SAndroid Build Coastguard Worker
422*333d2b36SAndroid Build Coastguard Worker  def test_multiple_applications(self):
423*333d2b36SAndroid Build Coastguard Worker    """new_uses_libraries must be added to all applications."""
424*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % (self.uses_non_sdk_api(True) +  self.uses_non_sdk_api(False))
425*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % (self.uses_non_sdk_api(True) +  self.uses_non_sdk_api(True))
426*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input)
427*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
428*333d2b36SAndroid Build Coastguard Worker
429*333d2b36SAndroid Build Coastguard Worker
430*333d2b36SAndroid Build Coastguard Workerclass UseEmbeddedDexTest(unittest.TestCase):
431*333d2b36SAndroid Build Coastguard Worker  """Unit tests for add_use_embedded_dex function."""
432*333d2b36SAndroid Build Coastguard Worker
433*333d2b36SAndroid Build Coastguard Worker  def assert_xml_equal(self, output, expected):
434*333d2b36SAndroid Build Coastguard Worker    self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected))
435*333d2b36SAndroid Build Coastguard Worker
436*333d2b36SAndroid Build Coastguard Worker  def run_test(self, input_manifest):
437*333d2b36SAndroid Build Coastguard Worker    doc = minidom.parseString(input_manifest)
438*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.add_use_embedded_dex(doc)
439*333d2b36SAndroid Build Coastguard Worker    output = io.StringIO()
440*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.write_xml(output, doc)
441*333d2b36SAndroid Build Coastguard Worker    return output.getvalue()
442*333d2b36SAndroid Build Coastguard Worker
443*333d2b36SAndroid Build Coastguard Worker  manifest_tmpl = (
444*333d2b36SAndroid Build Coastguard Worker      '<?xml version="1.0" encoding="utf-8"?>\n'
445*333d2b36SAndroid Build Coastguard Worker      '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n'
446*333d2b36SAndroid Build Coastguard Worker      '    %s\n'
447*333d2b36SAndroid Build Coastguard Worker      '</manifest>\n')
448*333d2b36SAndroid Build Coastguard Worker
449*333d2b36SAndroid Build Coastguard Worker  def use_embedded_dex(self, value):
450*333d2b36SAndroid Build Coastguard Worker    return '<application android:useEmbeddedDex="%s" />' % value
451*333d2b36SAndroid Build Coastguard Worker
452*333d2b36SAndroid Build Coastguard Worker  def test_manifest_with_undeclared_preference(self):
453*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % '<application/>'
454*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.use_embedded_dex('true')
455*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input)
456*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
457*333d2b36SAndroid Build Coastguard Worker
458*333d2b36SAndroid Build Coastguard Worker  def test_manifest_with_use_embedded_dex(self):
459*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.use_embedded_dex('true')
460*333d2b36SAndroid Build Coastguard Worker    expected = manifest_input
461*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input)
462*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
463*333d2b36SAndroid Build Coastguard Worker
464*333d2b36SAndroid Build Coastguard Worker  def test_manifest_with_not_use_embedded_dex(self):
465*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.use_embedded_dex('false')
466*333d2b36SAndroid Build Coastguard Worker    self.assertRaises(RuntimeError, self.run_test, manifest_input)
467*333d2b36SAndroid Build Coastguard Worker
468*333d2b36SAndroid Build Coastguard Worker  def test_multiple_applications(self):
469*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % (
470*333d2b36SAndroid Build Coastguard Worker        self.use_embedded_dex('true') +
471*333d2b36SAndroid Build Coastguard Worker        '<application/>'
472*333d2b36SAndroid Build Coastguard Worker    )
473*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % (
474*333d2b36SAndroid Build Coastguard Worker        self.use_embedded_dex('true') +
475*333d2b36SAndroid Build Coastguard Worker        self.use_embedded_dex('true')
476*333d2b36SAndroid Build Coastguard Worker    )
477*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input)
478*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
479*333d2b36SAndroid Build Coastguard Worker
480*333d2b36SAndroid Build Coastguard Worker
481*333d2b36SAndroid Build Coastguard Workerclass AddExtractNativeLibsTest(unittest.TestCase):
482*333d2b36SAndroid Build Coastguard Worker  """Unit tests for add_extract_native_libs function."""
483*333d2b36SAndroid Build Coastguard Worker
484*333d2b36SAndroid Build Coastguard Worker  def assert_xml_equal(self, output, expected):
485*333d2b36SAndroid Build Coastguard Worker    self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected))
486*333d2b36SAndroid Build Coastguard Worker
487*333d2b36SAndroid Build Coastguard Worker  def run_test(self, input_manifest, value):
488*333d2b36SAndroid Build Coastguard Worker    doc = minidom.parseString(input_manifest)
489*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.add_extract_native_libs(doc, value)
490*333d2b36SAndroid Build Coastguard Worker    output = io.StringIO()
491*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.write_xml(output, doc)
492*333d2b36SAndroid Build Coastguard Worker    return output.getvalue()
493*333d2b36SAndroid Build Coastguard Worker
494*333d2b36SAndroid Build Coastguard Worker  manifest_tmpl = (
495*333d2b36SAndroid Build Coastguard Worker      '<?xml version="1.0" encoding="utf-8"?>\n'
496*333d2b36SAndroid Build Coastguard Worker      '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n'
497*333d2b36SAndroid Build Coastguard Worker      '    %s\n'
498*333d2b36SAndroid Build Coastguard Worker      '</manifest>\n')
499*333d2b36SAndroid Build Coastguard Worker
500*333d2b36SAndroid Build Coastguard Worker  def extract_native_libs(self, value):
501*333d2b36SAndroid Build Coastguard Worker    return '<application android:extractNativeLibs="%s" />' % value
502*333d2b36SAndroid Build Coastguard Worker
503*333d2b36SAndroid Build Coastguard Worker  def test_set_true(self):
504*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % '<application/>'
505*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.extract_native_libs('true')
506*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, True)
507*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
508*333d2b36SAndroid Build Coastguard Worker
509*333d2b36SAndroid Build Coastguard Worker  def test_set_false(self):
510*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % '<application/>'
511*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.extract_native_libs('false')
512*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, False)
513*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
514*333d2b36SAndroid Build Coastguard Worker
515*333d2b36SAndroid Build Coastguard Worker  def test_match(self):
516*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.extract_native_libs('true')
517*333d2b36SAndroid Build Coastguard Worker    expected = manifest_input
518*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, True)
519*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
520*333d2b36SAndroid Build Coastguard Worker
521*333d2b36SAndroid Build Coastguard Worker  def test_conflict(self):
522*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.extract_native_libs('true')
523*333d2b36SAndroid Build Coastguard Worker    self.assertRaises(RuntimeError, self.run_test, manifest_input, False)
524*333d2b36SAndroid Build Coastguard Worker
525*333d2b36SAndroid Build Coastguard Worker  def test_multiple_applications(self):
526*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % (self.extract_native_libs('true') + '<application/>')
527*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % (self.extract_native_libs('true') + self.extract_native_libs('true'))
528*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, True)
529*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
530*333d2b36SAndroid Build Coastguard Worker
531*333d2b36SAndroid Build Coastguard Worker
532*333d2b36SAndroid Build Coastguard Workerclass AddNoCodeApplicationTest(unittest.TestCase):
533*333d2b36SAndroid Build Coastguard Worker  """Unit tests for set_has_code_to_false function."""
534*333d2b36SAndroid Build Coastguard Worker
535*333d2b36SAndroid Build Coastguard Worker  def assert_xml_equal(self, output, expected):
536*333d2b36SAndroid Build Coastguard Worker    self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected))
537*333d2b36SAndroid Build Coastguard Worker
538*333d2b36SAndroid Build Coastguard Worker  def run_test(self, input_manifest):
539*333d2b36SAndroid Build Coastguard Worker    doc = minidom.parseString(input_manifest)
540*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.set_has_code_to_false(doc)
541*333d2b36SAndroid Build Coastguard Worker    output = io.StringIO()
542*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.write_xml(output, doc)
543*333d2b36SAndroid Build Coastguard Worker    return output.getvalue()
544*333d2b36SAndroid Build Coastguard Worker
545*333d2b36SAndroid Build Coastguard Worker  manifest_tmpl = (
546*333d2b36SAndroid Build Coastguard Worker      '<?xml version="1.0" encoding="utf-8"?>\n'
547*333d2b36SAndroid Build Coastguard Worker      '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n'
548*333d2b36SAndroid Build Coastguard Worker      '%s'
549*333d2b36SAndroid Build Coastguard Worker      '</manifest>\n')
550*333d2b36SAndroid Build Coastguard Worker
551*333d2b36SAndroid Build Coastguard Worker  def test_no_application(self):
552*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % ''
553*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % '    <application android:hasCode="false"/>\n'
554*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input)
555*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
556*333d2b36SAndroid Build Coastguard Worker
557*333d2b36SAndroid Build Coastguard Worker  def test_has_application_no_has_code(self):
558*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % '    <application/>\n'
559*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % '    <application android:hasCode="false"/>\n'
560*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input)
561*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
562*333d2b36SAndroid Build Coastguard Worker
563*333d2b36SAndroid Build Coastguard Worker  def test_has_application_has_code_false(self):
564*333d2b36SAndroid Build Coastguard Worker    """ Do nothing if there's already an application element. """
565*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % '    <application android:hasCode="false"/>\n'
566*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input)
567*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, manifest_input)
568*333d2b36SAndroid Build Coastguard Worker
569*333d2b36SAndroid Build Coastguard Worker  def test_has_application_has_code_true(self):
570*333d2b36SAndroid Build Coastguard Worker    """ Do nothing if there's already an application element even if its
571*333d2b36SAndroid Build Coastguard Worker     hasCode attribute is true. """
572*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % '    <application android:hasCode="true"/>\n'
573*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input)
574*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, manifest_input)
575*333d2b36SAndroid Build Coastguard Worker
576*333d2b36SAndroid Build Coastguard Worker  def test_multiple_applications(self):
577*333d2b36SAndroid Build Coastguard Worker    """ Apply to all applications  """
578*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % (
579*333d2b36SAndroid Build Coastguard Worker        '    <application android:hasCode="true" />\n' +
580*333d2b36SAndroid Build Coastguard Worker        '    <application android:hasCode="false" />\n' +
581*333d2b36SAndroid Build Coastguard Worker        '    <application/>\n')
582*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % (
583*333d2b36SAndroid Build Coastguard Worker        '    <application android:hasCode="true" />\n' +
584*333d2b36SAndroid Build Coastguard Worker        '    <application android:hasCode="false" />\n' +
585*333d2b36SAndroid Build Coastguard Worker        '    <application android:hasCode="false" />\n')
586*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input)
587*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
588*333d2b36SAndroid Build Coastguard Worker
589*333d2b36SAndroid Build Coastguard Worker
590*333d2b36SAndroid Build Coastguard Workerclass AddTestOnlyApplicationTest(unittest.TestCase):
591*333d2b36SAndroid Build Coastguard Worker  """Unit tests for set_test_only_flag_to_true function."""
592*333d2b36SAndroid Build Coastguard Worker
593*333d2b36SAndroid Build Coastguard Worker  def assert_xml_equal(self, output, expected):
594*333d2b36SAndroid Build Coastguard Worker    self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected))
595*333d2b36SAndroid Build Coastguard Worker
596*333d2b36SAndroid Build Coastguard Worker  def run_test(self, input_manifest):
597*333d2b36SAndroid Build Coastguard Worker    doc = minidom.parseString(input_manifest)
598*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.set_test_only_flag_to_true(doc)
599*333d2b36SAndroid Build Coastguard Worker    output = io.StringIO()
600*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.write_xml(output, doc)
601*333d2b36SAndroid Build Coastguard Worker    return output.getvalue()
602*333d2b36SAndroid Build Coastguard Worker
603*333d2b36SAndroid Build Coastguard Worker  manifest_tmpl = (
604*333d2b36SAndroid Build Coastguard Worker      '<?xml version="1.0" encoding="utf-8"?>\n'
605*333d2b36SAndroid Build Coastguard Worker      '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n'
606*333d2b36SAndroid Build Coastguard Worker      '%s'
607*333d2b36SAndroid Build Coastguard Worker      '</manifest>\n')
608*333d2b36SAndroid Build Coastguard Worker
609*333d2b36SAndroid Build Coastguard Worker  def test_no_application(self):
610*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % ''
611*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % '    <application android:testOnly="true"/>\n'
612*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input)
613*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
614*333d2b36SAndroid Build Coastguard Worker
615*333d2b36SAndroid Build Coastguard Worker  def test_has_application_no_test_only(self):
616*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % '    <application/>\n'
617*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % '    <application android:testOnly="true"/>\n'
618*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input)
619*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
620*333d2b36SAndroid Build Coastguard Worker
621*333d2b36SAndroid Build Coastguard Worker  def test_has_application_test_only_true(self):
622*333d2b36SAndroid Build Coastguard Worker    """ If there's already an application element."""
623*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % '    <application android:testOnly="true"/>\n'
624*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input)
625*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, manifest_input)
626*333d2b36SAndroid Build Coastguard Worker
627*333d2b36SAndroid Build Coastguard Worker  def test_has_application_test_only_false(self):
628*333d2b36SAndroid Build Coastguard Worker    """ If there's already an application element with the testOnly attribute as false."""
629*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % '    <application android:testOnly="false"/>\n'
630*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input)
631*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, manifest_input)
632*333d2b36SAndroid Build Coastguard Worker
633*333d2b36SAndroid Build Coastguard Worker  def test_multiple_applications(self):
634*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % (
635*333d2b36SAndroid Build Coastguard Worker        '    <application android:testOnly="true" />\n' +
636*333d2b36SAndroid Build Coastguard Worker        '    <application android:testOnly="false" />\n' +
637*333d2b36SAndroid Build Coastguard Worker        '    <application/>\n'
638*333d2b36SAndroid Build Coastguard Worker    )
639*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % (
640*333d2b36SAndroid Build Coastguard Worker        '    <application android:testOnly="true" />\n' +
641*333d2b36SAndroid Build Coastguard Worker        '    <application android:testOnly="false" />\n' +
642*333d2b36SAndroid Build Coastguard Worker        '    <application android:testOnly="true" />\n'
643*333d2b36SAndroid Build Coastguard Worker    )
644*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input)
645*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
646*333d2b36SAndroid Build Coastguard Worker
647*333d2b36SAndroid Build Coastguard Worker
648*333d2b36SAndroid Build Coastguard Workerclass SetMaxSdkVersionTest(unittest.TestCase):
649*333d2b36SAndroid Build Coastguard Worker  """Unit tests for set_max_sdk_version function."""
650*333d2b36SAndroid Build Coastguard Worker
651*333d2b36SAndroid Build Coastguard Worker  def assert_xml_equal(self, output, expected):
652*333d2b36SAndroid Build Coastguard Worker    self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected))
653*333d2b36SAndroid Build Coastguard Worker
654*333d2b36SAndroid Build Coastguard Worker  def run_test(self, input_manifest, max_sdk_version):
655*333d2b36SAndroid Build Coastguard Worker    doc = minidom.parseString(input_manifest)
656*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.set_max_sdk_version(doc, max_sdk_version)
657*333d2b36SAndroid Build Coastguard Worker    output = io.StringIO()
658*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.write_xml(output, doc)
659*333d2b36SAndroid Build Coastguard Worker    return output.getvalue()
660*333d2b36SAndroid Build Coastguard Worker
661*333d2b36SAndroid Build Coastguard Worker  manifest_tmpl = (
662*333d2b36SAndroid Build Coastguard Worker      '<?xml version="1.0" encoding="utf-8"?>\n'
663*333d2b36SAndroid Build Coastguard Worker      '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n'
664*333d2b36SAndroid Build Coastguard Worker      '%s'
665*333d2b36SAndroid Build Coastguard Worker      '</manifest>\n')
666*333d2b36SAndroid Build Coastguard Worker
667*333d2b36SAndroid Build Coastguard Worker  def permission(self, max_sdk=None):
668*333d2b36SAndroid Build Coastguard Worker    if max_sdk is None:
669*333d2b36SAndroid Build Coastguard Worker      return '   <permission/>'
670*333d2b36SAndroid Build Coastguard Worker    return '    <permission android:maxSdkVersion="%s"/>\n' % max_sdk
671*333d2b36SAndroid Build Coastguard Worker
672*333d2b36SAndroid Build Coastguard Worker  def uses_permission(self, max_sdk=None):
673*333d2b36SAndroid Build Coastguard Worker    if max_sdk is None:
674*333d2b36SAndroid Build Coastguard Worker      return '   <uses-permission/>'
675*333d2b36SAndroid Build Coastguard Worker    return '    <uses-permission android:maxSdkVersion="%s"/>\n' % max_sdk
676*333d2b36SAndroid Build Coastguard Worker
677*333d2b36SAndroid Build Coastguard Worker  def test_permission_no_max_sdk_version(self):
678*333d2b36SAndroid Build Coastguard Worker    """Tests if permission has no maxSdkVersion attribute"""
679*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.permission()
680*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.permission()
681*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, '9000')
682*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
683*333d2b36SAndroid Build Coastguard Worker
684*333d2b36SAndroid Build Coastguard Worker  def test_permission_max_sdk_version_changed(self):
685*333d2b36SAndroid Build Coastguard Worker    """Tests if permission maxSdkVersion attribute is set to current"""
686*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.permission('current')
687*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.permission(9000)
688*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, '9000')
689*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
690*333d2b36SAndroid Build Coastguard Worker
691*333d2b36SAndroid Build Coastguard Worker  def test_permission_max_sdk_version_not_changed(self):
692*333d2b36SAndroid Build Coastguard Worker    """Tests if permission maxSdkVersion attribute is not set to current"""
693*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.permission(30)
694*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.permission(30)
695*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, '9000')
696*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
697*333d2b36SAndroid Build Coastguard Worker
698*333d2b36SAndroid Build Coastguard Worker  def test_uses_permission_no_max_sdk_version(self):
699*333d2b36SAndroid Build Coastguard Worker    """Tests if uses-permission has no maxSdkVersion attribute"""
700*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_permission()
701*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_permission()
702*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, '9000')
703*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
704*333d2b36SAndroid Build Coastguard Worker
705*333d2b36SAndroid Build Coastguard Worker  def test_uses_permission_max_sdk_version_changed(self):
706*333d2b36SAndroid Build Coastguard Worker    """Tests if uses-permission maxSdkVersion attribute is set to current"""
707*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_permission('current')
708*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_permission(9000)
709*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, '9000')
710*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
711*333d2b36SAndroid Build Coastguard Worker
712*333d2b36SAndroid Build Coastguard Worker  def test_uses_permission_max_sdk_version_not_changed(self):
713*333d2b36SAndroid Build Coastguard Worker    """Tests if uses-permission maxSdkVersion attribute is not set to current"""
714*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % self.uses_permission(30)
715*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % self.uses_permission(30)
716*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, '9000')
717*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
718*333d2b36SAndroid Build Coastguard Worker
719*333d2b36SAndroid Build Coastguard Worker
720*333d2b36SAndroid Build Coastguard Workerclass OverrideDefaultVersionTest(unittest.TestCase):
721*333d2b36SAndroid Build Coastguard Worker  """Unit tests for override_default_version function."""
722*333d2b36SAndroid Build Coastguard Worker
723*333d2b36SAndroid Build Coastguard Worker  def assert_xml_equal(self, output, expected):
724*333d2b36SAndroid Build Coastguard Worker    self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected))
725*333d2b36SAndroid Build Coastguard Worker
726*333d2b36SAndroid Build Coastguard Worker  def run_test(self, input_manifest, version):
727*333d2b36SAndroid Build Coastguard Worker    doc = minidom.parseString(input_manifest)
728*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.override_placeholder_version(doc, version)
729*333d2b36SAndroid Build Coastguard Worker    output = io.StringIO()
730*333d2b36SAndroid Build Coastguard Worker    manifest_fixer.write_xml(output, doc)
731*333d2b36SAndroid Build Coastguard Worker    return output.getvalue()
732*333d2b36SAndroid Build Coastguard Worker
733*333d2b36SAndroid Build Coastguard Worker  manifest_tmpl = (
734*333d2b36SAndroid Build Coastguard Worker      '<?xml version="1.0" encoding="utf-8"?>\n'
735*333d2b36SAndroid Build Coastguard Worker      '<manifest xmlns:android="http://schemas.android.com/apk/res/android" '
736*333d2b36SAndroid Build Coastguard Worker      'android:versionCode="%s">\n'
737*333d2b36SAndroid Build Coastguard Worker      '</manifest>\n')
738*333d2b36SAndroid Build Coastguard Worker
739*333d2b36SAndroid Build Coastguard Worker  def test_doesnt_override_existing_version(self):
740*333d2b36SAndroid Build Coastguard Worker    """Tests that an existing version is not overridden"""
741*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % '12345'
742*333d2b36SAndroid Build Coastguard Worker    expected = manifest_input
743*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, '67890')
744*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
745*333d2b36SAndroid Build Coastguard Worker
746*333d2b36SAndroid Build Coastguard Worker  def test_overrides_default_version(self):
747*333d2b36SAndroid Build Coastguard Worker    """Tests that a default version is overridden"""
748*333d2b36SAndroid Build Coastguard Worker    manifest_input = self.manifest_tmpl % '0'
749*333d2b36SAndroid Build Coastguard Worker    expected = self.manifest_tmpl % '67890'
750*333d2b36SAndroid Build Coastguard Worker    output = self.run_test(manifest_input, '67890')
751*333d2b36SAndroid Build Coastguard Worker    self.assert_xml_equal(output, expected)
752*333d2b36SAndroid Build Coastguard Worker
753*333d2b36SAndroid Build Coastguard Worker
754*333d2b36SAndroid Build Coastguard Workerif __name__ == '__main__':
755*333d2b36SAndroid Build Coastguard Worker  unittest.main(verbosity=2)
756