diff options
Diffstat (limited to 'test/AssembleVintfTest.cpp')
-rw-r--r-- | test/AssembleVintfTest.cpp | 360 |
1 files changed, 360 insertions, 0 deletions
diff --git a/test/AssembleVintfTest.cpp b/test/AssembleVintfTest.cpp new file mode 100644 index 0000000..53a1d0d --- /dev/null +++ b/test/AssembleVintfTest.cpp | |||
@@ -0,0 +1,360 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2017 The Android Open Source Project | ||
3 | * | ||
4 | * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | * you may not use this file except in compliance with the License. | ||
6 | * You may obtain a copy of the License at | ||
7 | * | ||
8 | * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | * | ||
10 | * Unless required by applicable law or agreed to in writing, software | ||
11 | * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | * See the License for the specific language governing permissions and | ||
14 | * limitations under the License. | ||
15 | */ | ||
16 | |||
17 | #define LOG_TAG "AssembleVintfTest" | ||
18 | |||
19 | #include <android-base/logging.h> | ||
20 | #include <gtest/gtest.h> | ||
21 | #include <vintf/AssembleVintf.h> | ||
22 | #include <vintf/parse_string.h> | ||
23 | |||
24 | namespace android { | ||
25 | namespace vintf { | ||
26 | |||
27 | static bool In(const std::string& sub, const std::string& str) { | ||
28 | return str.find(sub) != std::string::npos; | ||
29 | } | ||
30 | #define EXPECT_IN(sub, str) EXPECT_TRUE(In((sub), (str))) << (str); | ||
31 | |||
32 | class AssembleVintfTest : public ::testing::Test { | ||
33 | public: | ||
34 | virtual void SetUp() override { | ||
35 | mInstance = AssembleVintf::newInstance(); | ||
36 | auto s = makeStream(""); | ||
37 | mOutputStream = s.get(); | ||
38 | mInstance->setOutputStream(std::move(s)); | ||
39 | } | ||
40 | virtual void TearDown() override { mInstance = nullptr; } | ||
41 | |||
42 | const std::unique_ptr<AssembleVintf>& getInstance() { return mInstance; } | ||
43 | |||
44 | std::string getOutput() { return mOutputStream->str(); } | ||
45 | |||
46 | void resetOutput() { mOutputStream->str(""); } | ||
47 | |||
48 | void setFakeEnvs(const std::map<std::string, std::string>& envs) { | ||
49 | for (const auto& pair : envs) { | ||
50 | getInstance()->setFakeEnv(pair.first, pair.second); | ||
51 | } | ||
52 | } | ||
53 | |||
54 | void addInput(const std::string& name, const std::string& s) { | ||
55 | getInstance()->addInputStream(name, makeStream(s)); | ||
56 | } | ||
57 | |||
58 | std::unique_ptr<std::stringstream> makeStream(const std::string& s) { | ||
59 | return std::make_unique<std::stringstream>(s); | ||
60 | } | ||
61 | |||
62 | std::unique_ptr<AssembleVintf> mInstance; | ||
63 | // do not own this object. | ||
64 | std::stringstream* mOutputStream; | ||
65 | }; | ||
66 | |||
67 | TEST_F(AssembleVintfTest, FrameworkMatrixEmpty) { | ||
68 | std::string xmlEmpty = "<compatibility-matrix version=\"1.0\" type=\"framework\" />"; | ||
69 | std::string kernel318 = "CONFIG_FOO=y\n"; | ||
70 | std::string kernel318_64 = "CONFIG_BAR=y\n"; | ||
71 | std::string kernel44 = "# CONFIG_FOO is not set\n"; | ||
72 | std::string kernel44_64 = "CONFIG_BAR=y\n"; | ||
73 | |||
74 | addInput("compatibility_matrix.empty.xml", xmlEmpty); | ||
75 | setFakeEnvs({ | ||
76 | {"POLICYVERS", "30"}, | ||
77 | {"BOARD_SEPOLICY_VERS", "10000.0"}, | ||
78 | {"FRAMEWORK_VBMETA_VERSION", "1.0"}, | ||
79 | }); | ||
80 | getInstance()->addKernelConfigInputStream({3, 18}, "android-base.cfg", makeStream(kernel318)); | ||
81 | getInstance()->addKernelConfigInputStream({3, 18}, "android-base-arm64.cfg", | ||
82 | makeStream(kernel318_64)); | ||
83 | getInstance()->addKernelConfigInputStream({4, 4}, "android-base.cfg", makeStream(kernel44)); | ||
84 | getInstance()->addKernelConfigInputStream({4, 4}, "android-base-arm64.cfg", | ||
85 | makeStream(kernel44_64)); | ||
86 | |||
87 | EXPECT_TRUE(getInstance()->assemble()); | ||
88 | |||
89 | EXPECT_IN( | ||
90 | "<compatibility-matrix version=\"1.0\" type=\"framework\">\n" | ||
91 | " <kernel version=\"3.18.0\">\n" | ||
92 | " <config>\n" | ||
93 | " <key>CONFIG_FOO</key>\n" | ||
94 | " <value type=\"tristate\">y</value>\n" | ||
95 | " </config>\n" | ||
96 | " </kernel>\n" | ||
97 | " <kernel version=\"3.18.0\">\n" | ||
98 | " <conditions>\n" | ||
99 | " <config>\n" | ||
100 | " <key>CONFIG_ARM64</key>\n" | ||
101 | " <value type=\"tristate\">y</value>\n" | ||
102 | " </config>\n" | ||
103 | " </conditions>\n" | ||
104 | " <config>\n" | ||
105 | " <key>CONFIG_BAR</key>\n" | ||
106 | " <value type=\"tristate\">y</value>\n" | ||
107 | " </config>\n" | ||
108 | " </kernel>\n" | ||
109 | " <kernel version=\"4.4.0\">\n" | ||
110 | " <config>\n" | ||
111 | " <key>CONFIG_FOO</key>\n" | ||
112 | " <value type=\"tristate\">n</value>\n" | ||
113 | " </config>\n" | ||
114 | " </kernel>\n" | ||
115 | " <kernel version=\"4.4.0\">\n" | ||
116 | " <conditions>\n" | ||
117 | " <config>\n" | ||
118 | " <key>CONFIG_ARM64</key>\n" | ||
119 | " <value type=\"tristate\">y</value>\n" | ||
120 | " </config>\n" | ||
121 | " </conditions>\n" | ||
122 | " <config>\n" | ||
123 | " <key>CONFIG_BAR</key>\n" | ||
124 | " <value type=\"tristate\">y</value>\n" | ||
125 | " </config>\n" | ||
126 | " </kernel>\n" | ||
127 | " <sepolicy>\n" | ||
128 | " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n" | ||
129 | " <sepolicy-version>10000.0</sepolicy-version>\n" | ||
130 | " </sepolicy>\n" | ||
131 | " <avb>\n" | ||
132 | " <vbmeta-version>1.0</vbmeta-version>\n" | ||
133 | " </avb>\n" | ||
134 | "</compatibility-matrix>\n", | ||
135 | getOutput()); | ||
136 | } | ||
137 | |||
138 | TEST_F(AssembleVintfTest, FrameworkMatrix) { | ||
139 | std::string tail = | ||
140 | " <kernel version=\"3.18.0\">\n" | ||
141 | " <config>\n" | ||
142 | " <key>CONFIG_FOO</key>\n" | ||
143 | " <value type=\"tristate\">y</value>\n" | ||
144 | " </config>\n" | ||
145 | " </kernel>\n" | ||
146 | " <sepolicy>\n" | ||
147 | " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n" | ||
148 | " <sepolicy-version>10000.0</sepolicy-version>\n" | ||
149 | " </sepolicy>\n" | ||
150 | " <avb>\n" | ||
151 | " <vbmeta-version>1.0</vbmeta-version>\n" | ||
152 | " </avb>\n" | ||
153 | "</compatibility-matrix>\n"; | ||
154 | |||
155 | std::string xmlEmpty = "<compatibility-matrix version=\"1.0\" type=\"framework\">\n" + tail; | ||
156 | |||
157 | std::string xml1 = | ||
158 | "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n" | ||
159 | " <hal format=\"hidl\" optional=\"true\">\n" | ||
160 | " <name>android.hardware.foo</name>\n" | ||
161 | " <version>1.0</version>\n" | ||
162 | " <interface>\n" | ||
163 | " <name>IFoo</name>\n" | ||
164 | " <instance>default</instance>\n" | ||
165 | " </interface>\n" | ||
166 | " </hal>\n" | ||
167 | "</compatibility-matrix>\n"; | ||
168 | |||
169 | std::string xml2 = | ||
170 | "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n" | ||
171 | " <hal format=\"hidl\" optional=\"true\">\n" | ||
172 | " <name>android.hardware.foo</name>\n" | ||
173 | " <version>1.0-1</version>\n" | ||
174 | " <interface>\n" | ||
175 | " <name>IFoo</name>\n" | ||
176 | " <instance>default</instance>\n" | ||
177 | " </interface>\n" | ||
178 | " </hal>\n" | ||
179 | "</compatibility-matrix>\n"; | ||
180 | |||
181 | std::string xml3 = | ||
182 | "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"3\">\n" | ||
183 | " <hal format=\"hidl\" optional=\"false\">\n" | ||
184 | " <name>android.hardware.foo</name>\n" | ||
185 | " <version>2.0</version>\n" | ||
186 | " <interface>\n" | ||
187 | " <name>IFoo</name>\n" | ||
188 | " <instance>default</instance>\n" | ||
189 | " </interface>\n" | ||
190 | " </hal>\n" | ||
191 | "</compatibility-matrix>\n"; | ||
192 | |||
193 | auto manifest = [](size_t level) { | ||
194 | return "<manifest version=\"1.0\" type=\"device\" target-level=\"" + std::to_string(level) + | ||
195 | "\">\n" + | ||
196 | " <hal format=\"hidl\">\n" | ||
197 | " <name>android.hardware.foo</name>\n" | ||
198 | " <version>1.1</version>\n" | ||
199 | " <transport>hwbinder</transport>\n" | ||
200 | " <interface>\n" | ||
201 | " <name>IFoo</name>\n" | ||
202 | " <instance>default</instance>\n" | ||
203 | " </interface>\n" | ||
204 | " </hal>\n" | ||
205 | " <hal format=\"hidl\">\n" | ||
206 | " <name>android.hardware.foo</name>\n" | ||
207 | " <version>2.0</version>\n" | ||
208 | " <transport>hwbinder</transport>\n" | ||
209 | " <interface>\n" | ||
210 | " <name>IFoo</name>\n" | ||
211 | " <instance>default</instance>\n" | ||
212 | " </interface>\n" | ||
213 | " </hal>\n" | ||
214 | " <sepolicy>\n" | ||
215 | " <version>10000.0</version>\n" | ||
216 | " </sepolicy>\n" | ||
217 | "</manifest>\n"; | ||
218 | }; | ||
219 | |||
220 | addInput("compatibility_matrix.1.xml", xml1); | ||
221 | addInput("compatibility_matrix.2.xml", xml2); | ||
222 | addInput("compatibility_matrix.3.xml", xml3); | ||
223 | addInput("compatibility_matrix.empty.xml", xmlEmpty); | ||
224 | getInstance()->setFakeEnv("PRODUCT_ENFORCE_VINTF_MANIFEST", "true"); | ||
225 | |||
226 | resetOutput(); | ||
227 | getInstance()->setCheckInputStream(makeStream(manifest(1))); | ||
228 | EXPECT_TRUE(getInstance()->assemble()); | ||
229 | EXPECT_IN( | ||
230 | "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n" | ||
231 | " <hal format=\"hidl\" optional=\"true\">\n" | ||
232 | " <name>android.hardware.foo</name>\n" | ||
233 | " <version>1.0-1</version>\n" | ||
234 | " <interface>\n" | ||
235 | " <name>IFoo</name>\n" | ||
236 | " <instance>default</instance>\n" | ||
237 | " </interface>\n" | ||
238 | " </hal>\n" | ||
239 | " <hal format=\"hidl\" optional=\"true\">\n" | ||
240 | " <name>android.hardware.foo</name>\n" | ||
241 | " <version>2.0</version>\n" | ||
242 | " <interface>\n" | ||
243 | " <name>IFoo</name>\n" | ||
244 | " <instance>default</instance>\n" | ||
245 | " </interface>\n" | ||
246 | " </hal>\n" + | ||
247 | tail, | ||
248 | getOutput()); | ||
249 | |||
250 | resetOutput(); | ||
251 | getInstance()->setCheckInputStream(makeStream(manifest(2))); | ||
252 | EXPECT_TRUE(getInstance()->assemble()); | ||
253 | EXPECT_IN( | ||
254 | "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n" | ||
255 | " <hal format=\"hidl\" optional=\"true\">\n" | ||
256 | " <name>android.hardware.foo</name>\n" | ||
257 | " <version>1.0-1</version>\n" | ||
258 | " <interface>\n" | ||
259 | " <name>IFoo</name>\n" | ||
260 | " <instance>default</instance>\n" | ||
261 | " </interface>\n" | ||
262 | " </hal>\n" | ||
263 | " <hal format=\"hidl\" optional=\"true\">\n" | ||
264 | " <name>android.hardware.foo</name>\n" | ||
265 | " <version>2.0</version>\n" | ||
266 | " <interface>\n" | ||
267 | " <name>IFoo</name>\n" | ||
268 | " <instance>default</instance>\n" | ||
269 | " </interface>\n" | ||
270 | " </hal>\n" + | ||
271 | tail, | ||
272 | getOutput()); | ||
273 | |||
274 | resetOutput(); | ||
275 | getInstance()->setCheckInputStream(makeStream(manifest(3))); | ||
276 | EXPECT_TRUE(getInstance()->assemble()); | ||
277 | EXPECT_IN( | ||
278 | "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"3\">\n" | ||
279 | " <hal format=\"hidl\" optional=\"false\">\n" | ||
280 | " <name>android.hardware.foo</name>\n" | ||
281 | " <version>2.0</version>\n" | ||
282 | " <interface>\n" | ||
283 | " <name>IFoo</name>\n" | ||
284 | " <instance>default</instance>\n" | ||
285 | " </interface>\n" | ||
286 | " </hal>\n" + | ||
287 | tail, | ||
288 | getOutput()); | ||
289 | } | ||
290 | |||
291 | TEST_F(AssembleVintfTest, MatrixVendorNdk) { | ||
292 | addInput("compatibility_matrix.xml", | ||
293 | "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n"); | ||
294 | getInstance()->setFakeEnv("REQUIRED_VNDK_VERSION", "P"); | ||
295 | EXPECT_TRUE(getInstance()->assemble()); | ||
296 | EXPECT_IN( | ||
297 | "<compatibility-matrix version=\"1.0\" type=\"device\">\n" | ||
298 | " <vendor-ndk>\n" | ||
299 | " <version>P</version>\n" | ||
300 | " </vendor-ndk>\n" | ||
301 | "</compatibility-matrix>\n", | ||
302 | getOutput()); | ||
303 | } | ||
304 | |||
305 | TEST_F(AssembleVintfTest, ManifestVendorNdk) { | ||
306 | addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n"); | ||
307 | getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 "); | ||
308 | EXPECT_TRUE(getInstance()->assemble()); | ||
309 | EXPECT_IN( | ||
310 | "<manifest version=\"1.0\" type=\"framework\">\n" | ||
311 | " <vendor-ndk>\n" | ||
312 | " <version>P</version>\n" | ||
313 | " </vendor-ndk>\n" | ||
314 | " <vendor-ndk>\n" | ||
315 | " <version>26</version>\n" | ||
316 | " </vendor-ndk>\n" | ||
317 | " <vendor-ndk>\n" | ||
318 | " <version>27</version>\n" | ||
319 | " </vendor-ndk>\n" | ||
320 | "</manifest>\n", | ||
321 | getOutput()); | ||
322 | } | ||
323 | |||
324 | TEST_F(AssembleVintfTest, VendorNdkCheckEmpty) { | ||
325 | addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n"); | ||
326 | getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 "); | ||
327 | |||
328 | std::string matrix = "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n"; | ||
329 | getInstance()->setCheckInputStream(makeStream(matrix)); | ||
330 | EXPECT_TRUE(getInstance()->assemble()); | ||
331 | } | ||
332 | |||
333 | TEST_F(AssembleVintfTest, VendorNdkCheckIncompat) { | ||
334 | addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n"); | ||
335 | getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 "); | ||
336 | std::string matrix = | ||
337 | "<compatibility-matrix version=\"1.0\" type=\"device\">\n" | ||
338 | " <vendor-ndk>\n" | ||
339 | " <version>O</version>\n" | ||
340 | " </vendor-ndk>\n" | ||
341 | "</compatibility-matrix>\n"; | ||
342 | getInstance()->setCheckInputStream(makeStream(matrix)); | ||
343 | EXPECT_FALSE(getInstance()->assemble()); | ||
344 | } | ||
345 | |||
346 | TEST_F(AssembleVintfTest, VendorNdkCheckCompat) { | ||
347 | addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n"); | ||
348 | getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 "); | ||
349 | std::string matrix = | ||
350 | "<compatibility-matrix version=\"1.0\" type=\"device\">\n" | ||
351 | " <vendor-ndk>\n" | ||
352 | " <version>27</version>\n" | ||
353 | " </vendor-ndk>\n" | ||
354 | "</compatibility-matrix>\n"; | ||
355 | getInstance()->setCheckInputStream(makeStream(matrix)); | ||
356 | EXPECT_TRUE(getInstance()->assemble()); | ||
357 | } | ||
358 | |||
359 | } // namespace vintf | ||
360 | } // namespace android | ||