blob: 7baad5d380de446bdfb45aea38f3a1077036383b [file] [log] [blame]
Colin Cross72119102019-05-20 13:14:18 -07001#!/usr/bin/env python
2#
3# Copyright (C) 2018 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16#
17"""Unit tests for manifest_fixer.py."""
18
19import sys
20import unittest
21from xml.dom import minidom
22
23import manifest_check
24
25sys.dont_write_bytecode = True
26
27
28def uses_library(name, attr=''):
29 return '<uses-library android:name="%s"%s />' % (name, attr)
30
31
32def required(value):
33 return ' android:required="%s"' % ('true' if value else 'false')
34
35
36class EnforceUsesLibrariesTest(unittest.TestCase):
37 """Unit tests for add_extract_native_libs function."""
38
39 def run_test(self, input_manifest, uses_libraries=None, optional_uses_libraries=None):
40 doc = minidom.parseString(input_manifest)
41 try:
42 manifest_check.enforce_uses_libraries(doc, uses_libraries, optional_uses_libraries)
43 return True
44 except manifest_check.ManifestMismatchError:
45 return False
46
47 manifest_tmpl = (
48 '<?xml version="1.0" encoding="utf-8"?>\n'
49 '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n'
50 ' <application>\n'
51 ' %s\n'
52 ' </application>\n'
53 '</manifest>\n')
54
55 def test_uses_library(self):
56 manifest_input = self.manifest_tmpl % (uses_library('foo'))
57 matches = self.run_test(manifest_input, uses_libraries=['foo'])
58 self.assertTrue(matches)
59
60 def test_uses_library_required(self):
61 manifest_input = self.manifest_tmpl % (uses_library('foo', required(True)))
62 matches = self.run_test(manifest_input, uses_libraries=['foo'])
63 self.assertTrue(matches)
64
65 def test_optional_uses_library(self):
66 manifest_input = self.manifest_tmpl % (uses_library('foo', required(False)))
67 matches = self.run_test(manifest_input, optional_uses_libraries=['foo'])
68 self.assertTrue(matches)
69
70 def test_expected_uses_library(self):
71 manifest_input = self.manifest_tmpl % (uses_library('foo', required(False)))
72 matches = self.run_test(manifest_input, uses_libraries=['foo'])
73 self.assertFalse(matches)
74
75 def test_expected_optional_uses_library(self):
76 manifest_input = self.manifest_tmpl % (uses_library('foo'))
77 matches = self.run_test(manifest_input, optional_uses_libraries=['foo'])
78 self.assertFalse(matches)
79
80 def test_missing_uses_library(self):
81 manifest_input = self.manifest_tmpl % ('')
82 matches = self.run_test(manifest_input, uses_libraries=['foo'])
83 self.assertFalse(matches)
84
85 def test_missing_optional_uses_library(self):
86 manifest_input = self.manifest_tmpl % ('')
87 matches = self.run_test(manifest_input, optional_uses_libraries=['foo'])
88 self.assertFalse(matches)
89
90 def test_extra_uses_library(self):
91 manifest_input = self.manifest_tmpl % (uses_library('foo'))
92 matches = self.run_test(manifest_input)
93 self.assertFalse(matches)
94
95 def test_extra_optional_uses_library(self):
96 manifest_input = self.manifest_tmpl % (uses_library('foo', required(False)))
97 matches = self.run_test(manifest_input)
98 self.assertFalse(matches)
99
100 def test_multiple_uses_library(self):
101 manifest_input = self.manifest_tmpl % ('\n'.join([uses_library('foo'),
102 uses_library('bar')]))
103 matches = self.run_test(manifest_input, uses_libraries=['foo', 'bar'])
104 self.assertTrue(matches)
105
106 def test_multiple_optional_uses_library(self):
107 manifest_input = self.manifest_tmpl % ('\n'.join([uses_library('foo', required(False)),
108 uses_library('bar', required(False))]))
109 matches = self.run_test(manifest_input, optional_uses_libraries=['foo', 'bar'])
110 self.assertTrue(matches)
111
112 def test_order_uses_library(self):
113 manifest_input = self.manifest_tmpl % ('\n'.join([uses_library('foo'),
114 uses_library('bar')]))
115 matches = self.run_test(manifest_input, uses_libraries=['bar', 'foo'])
116 self.assertFalse(matches)
117
118 def test_order_optional_uses_library(self):
119 manifest_input = self.manifest_tmpl % ('\n'.join([uses_library('foo', required(False)),
120 uses_library('bar', required(False))]))
121 matches = self.run_test(manifest_input, optional_uses_libraries=['bar', 'foo'])
122 self.assertFalse(matches)
123
124 def test_duplicate_uses_library(self):
125 manifest_input = self.manifest_tmpl % ('\n'.join([uses_library('foo'),
126 uses_library('foo')]))
127 matches = self.run_test(manifest_input, uses_libraries=['foo'])
128 self.assertTrue(matches)
129
130 def test_duplicate_optional_uses_library(self):
131 manifest_input = self.manifest_tmpl % ('\n'.join([uses_library('foo', required(False)),
132 uses_library('foo', required(False))]))
133 matches = self.run_test(manifest_input, optional_uses_libraries=['foo'])
134 self.assertTrue(matches)
135
136 def test_mixed(self):
137 manifest_input = self.manifest_tmpl % ('\n'.join([uses_library('foo'),
138 uses_library('bar', required(False))]))
139 matches = self.run_test(manifest_input, uses_libraries=['foo'],
140 optional_uses_libraries=['bar'])
141 self.assertTrue(matches)
142
143
144class ExtractTargetSdkVersionTest(unittest.TestCase):
145 def test_target_sdk_version(self):
146 manifest = (
147 '<?xml version="1.0" encoding="utf-8"?>\n'
148 '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n'
149 ' <uses-sdk android:minSdkVersion="28" android:targetSdkVersion="29" />\n'
150 '</manifest>\n')
151 doc = minidom.parseString(manifest)
152 target_sdk_version = manifest_check.extract_target_sdk_version(doc)
153 self.assertEqual(target_sdk_version, '29')
154
155 def test_min_sdk_version(self):
156 manifest = (
157 '<?xml version="1.0" encoding="utf-8"?>\n'
158 '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n'
159 ' <uses-sdk android:minSdkVersion="28" />\n'
160 '</manifest>\n')
161 doc = minidom.parseString(manifest)
162 target_sdk_version = manifest_check.extract_target_sdk_version(doc)
163 self.assertEqual(target_sdk_version, '28')
164
165if __name__ == '__main__':
166 unittest.main(verbosity=2)