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
In(const std::string & sub,const std::string & str)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:
SetUp()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 getInstance()->setFakeEnv("PRODUCT_ENFORCE_VINTF_MANIFEST", "true");
41 }
TearDown()42 virtual void TearDown() override { mInstance = nullptr; }
43
getInstance()44 const std::unique_ptr<AssembleVintf>& getInstance() { return mInstance; }
45
getOutput()46 std::string getOutput() { return mOutputStream->str(); }
47
resetOutput()48 void resetOutput() { mOutputStream->str(""); }
49
setFakeEnvs(const std::map<std::string,std::string> & envs)50 void setFakeEnvs(const std::map<std::string, std::string>& envs) {
51 for (const auto& pair : envs) {
52 getInstance()->setFakeEnv(pair.first, pair.second);
53 }
54 }
55
addInput(const std::string & name,const std::string & s)56 void addInput(const std::string& name, const std::string& s) {
57 getInstance()->addInputStream(name, makeStream(s));
58 }
59
makeStream(const std::string & s)60 std::unique_ptr<std::stringstream> makeStream(const std::string& s) {
61 return std::make_unique<std::stringstream>(s);
62 }
63
64 std::unique_ptr<AssembleVintf> mInstance;
65 // do not own this object.
66 std::stringstream* mOutputStream;
67 };
68
TEST_F(AssembleVintfTest,FrameworkMatrixEmpty)69 TEST_F(AssembleVintfTest, FrameworkMatrixEmpty) {
70 std::string xmlEmpty = "<compatibility-matrix version=\"1.0\" type=\"framework\" />";
71 std::string kernel318 = "CONFIG_FOO=y\n";
72 std::string kernel318_64 = "CONFIG_BAR=y\n";
73 std::string kernel44 = "# CONFIG_FOO is not set\n";
74 std::string kernel44_64 = "CONFIG_BAR=y\n";
75
76 addInput("compatibility_matrix.empty.xml", xmlEmpty);
77 setFakeEnvs({
78 {"POLICYVERS", "30"},
79 {"PLATFORM_SEPOLICY_VERSION", "10000.0"},
80 {"FRAMEWORK_VBMETA_VERSION", "1.0"},
81 });
82 getInstance()->addKernelConfigInputStream({3, 18, 0}, "android-base.cfg",
83 makeStream(kernel318));
84 getInstance()->addKernelConfigInputStream({3, 18, 0}, "android-base-arm64.cfg",
85 makeStream(kernel318_64));
86 getInstance()->addKernelConfigInputStream({4, 4, 0}, "android-base.cfg", makeStream(kernel44));
87 getInstance()->addKernelConfigInputStream({4, 4, 0}, "android-base-arm64.cfg",
88 makeStream(kernel44_64));
89
90 EXPECT_TRUE(getInstance()->assemble());
91
92 EXPECT_IN(
93 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
94 " <kernel version=\"3.18.0\">\n"
95 " <config>\n"
96 " <key>CONFIG_FOO</key>\n"
97 " <value type=\"tristate\">y</value>\n"
98 " </config>\n"
99 " </kernel>\n"
100 " <kernel version=\"3.18.0\">\n"
101 " <conditions>\n"
102 " <config>\n"
103 " <key>CONFIG_ARM64</key>\n"
104 " <value type=\"tristate\">y</value>\n"
105 " </config>\n"
106 " </conditions>\n"
107 " <config>\n"
108 " <key>CONFIG_BAR</key>\n"
109 " <value type=\"tristate\">y</value>\n"
110 " </config>\n"
111 " </kernel>\n"
112 " <kernel version=\"4.4.0\">\n"
113 " <config>\n"
114 " <key>CONFIG_FOO</key>\n"
115 " <value type=\"tristate\">n</value>\n"
116 " </config>\n"
117 " </kernel>\n"
118 " <kernel version=\"4.4.0\">\n"
119 " <conditions>\n"
120 " <config>\n"
121 " <key>CONFIG_ARM64</key>\n"
122 " <value type=\"tristate\">y</value>\n"
123 " </config>\n"
124 " </conditions>\n"
125 " <config>\n"
126 " <key>CONFIG_BAR</key>\n"
127 " <value type=\"tristate\">y</value>\n"
128 " </config>\n"
129 " </kernel>\n"
130 " <sepolicy>\n"
131 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
132 " <sepolicy-version>10000.0</sepolicy-version>\n"
133 " </sepolicy>\n"
134 " <avb>\n"
135 " <vbmeta-version>1.0</vbmeta-version>\n"
136 " </avb>\n"
137 "</compatibility-matrix>\n",
138 getOutput());
139 }
140
TEST_F(AssembleVintfTest,FrameworkMatrix)141 TEST_F(AssembleVintfTest, FrameworkMatrix) {
142 std::string tail =
143 " <kernel version=\"3.18.0\">\n"
144 " <config>\n"
145 " <key>CONFIG_FOO</key>\n"
146 " <value type=\"tristate\">y</value>\n"
147 " </config>\n"
148 " </kernel>\n"
149 " <sepolicy>\n"
150 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
151 " <sepolicy-version>10000.0</sepolicy-version>\n"
152 " </sepolicy>\n"
153 " <avb>\n"
154 " <vbmeta-version>1.0</vbmeta-version>\n"
155 " </avb>\n"
156 "</compatibility-matrix>\n";
157
158 std::string xmlEmpty = "<compatibility-matrix version=\"1.0\" type=\"framework\">\n" + tail;
159
160 std::string xml1 =
161 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
162 " <hal format=\"hidl\" optional=\"true\">\n"
163 " <name>android.hardware.foo</name>\n"
164 " <version>1.0</version>\n"
165 " <interface>\n"
166 " <name>IFoo</name>\n"
167 " <instance>default</instance>\n"
168 " </interface>\n"
169 " </hal>\n"
170 "</compatibility-matrix>\n";
171
172 std::string xml2 =
173 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
174 " <hal format=\"hidl\" optional=\"true\">\n"
175 " <name>android.hardware.foo</name>\n"
176 " <version>1.0-1</version>\n"
177 " <interface>\n"
178 " <name>IFoo</name>\n"
179 " <instance>default</instance>\n"
180 " </interface>\n"
181 " </hal>\n"
182 "</compatibility-matrix>\n";
183
184 std::string xml3 =
185 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"3\">\n"
186 " <hal format=\"hidl\" optional=\"false\">\n"
187 " <name>android.hardware.foo</name>\n"
188 " <version>2.0</version>\n"
189 " <interface>\n"
190 " <name>IFoo</name>\n"
191 " <instance>default</instance>\n"
192 " </interface>\n"
193 " </hal>\n"
194 "</compatibility-matrix>\n";
195
196 auto manifest = [](size_t level) {
197 return "<manifest version=\"1.0\" type=\"device\" target-level=\"" + std::to_string(level) +
198 "\">\n" +
199 " <hal format=\"hidl\">\n"
200 " <name>android.hardware.foo</name>\n"
201 " <version>1.1</version>\n"
202 " <transport>hwbinder</transport>\n"
203 " <interface>\n"
204 " <name>IFoo</name>\n"
205 " <instance>default</instance>\n"
206 " </interface>\n"
207 " </hal>\n"
208 " <hal format=\"hidl\">\n"
209 " <name>android.hardware.foo</name>\n"
210 " <version>2.0</version>\n"
211 " <transport>hwbinder</transport>\n"
212 " <interface>\n"
213 " <name>IFoo</name>\n"
214 " <instance>default</instance>\n"
215 " </interface>\n"
216 " </hal>\n"
217 " <sepolicy>\n"
218 " <version>10000.0</version>\n"
219 " </sepolicy>\n"
220 "</manifest>\n";
221 };
222
223 addInput("compatibility_matrix.1.xml", xml1);
224 addInput("compatibility_matrix.2.xml", xml2);
225 addInput("compatibility_matrix.3.xml", xml3);
226 addInput("compatibility_matrix.empty.xml", xmlEmpty);
227 getInstance()->setFakeEnv("PRODUCT_ENFORCE_VINTF_MANIFEST", "true");
228
229 resetOutput();
230 getInstance()->setCheckInputStream(makeStream(manifest(1)));
231 EXPECT_TRUE(getInstance()->assemble());
232 EXPECT_IN(
233 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
234 " <hal format=\"hidl\" optional=\"true\">\n"
235 " <name>android.hardware.foo</name>\n"
236 " <version>1.0-1</version>\n"
237 " <version>2.0</version>\n"
238 " <interface>\n"
239 " <name>IFoo</name>\n"
240 " <instance>default</instance>\n"
241 " </interface>\n"
242 " </hal>\n" +
243 tail,
244 getOutput());
245
246 resetOutput();
247 getInstance()->setCheckInputStream(makeStream(manifest(2)));
248 EXPECT_TRUE(getInstance()->assemble());
249 EXPECT_IN(
250 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
251 " <hal format=\"hidl\" optional=\"true\">\n"
252 " <name>android.hardware.foo</name>\n"
253 " <version>1.0-1</version>\n"
254 " <version>2.0</version>\n"
255 " <interface>\n"
256 " <name>IFoo</name>\n"
257 " <instance>default</instance>\n"
258 " </interface>\n"
259 " </hal>\n" +
260 tail,
261 getOutput());
262
263 resetOutput();
264 getInstance()->setCheckInputStream(makeStream(manifest(3)));
265 EXPECT_TRUE(getInstance()->assemble());
266 EXPECT_IN(
267 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"3\">\n"
268 " <hal format=\"hidl\" optional=\"false\">\n"
269 " <name>android.hardware.foo</name>\n"
270 " <version>2.0</version>\n"
271 " <interface>\n"
272 " <name>IFoo</name>\n"
273 " <instance>default</instance>\n"
274 " </interface>\n"
275 " </hal>\n" +
276 tail,
277 getOutput());
278 }
279
TEST_F(AssembleVintfTest,MatrixVendorNdk)280 TEST_F(AssembleVintfTest, MatrixVendorNdk) {
281 addInput("compatibility_matrix.xml",
282 "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n");
283 getInstance()->setFakeEnv("REQUIRED_VNDK_VERSION", "P");
284 EXPECT_TRUE(getInstance()->assemble());
285 EXPECT_IN(
286 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
287 " <vendor-ndk>\n"
288 " <version>P</version>\n"
289 " </vendor-ndk>\n"
290 "</compatibility-matrix>\n",
291 getOutput());
292 }
293
TEST_F(AssembleVintfTest,ManifestVendorNdk)294 TEST_F(AssembleVintfTest, ManifestVendorNdk) {
295 addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n");
296 getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 ");
297 EXPECT_TRUE(getInstance()->assemble());
298 EXPECT_IN(
299 "<manifest version=\"1.0\" type=\"framework\">\n"
300 " <vendor-ndk>\n"
301 " <version>P</version>\n"
302 " </vendor-ndk>\n"
303 " <vendor-ndk>\n"
304 " <version>26</version>\n"
305 " </vendor-ndk>\n"
306 " <vendor-ndk>\n"
307 " <version>27</version>\n"
308 " </vendor-ndk>\n"
309 "</manifest>\n",
310 getOutput());
311 }
312
TEST_F(AssembleVintfTest,VendorNdkCheckEmpty)313 TEST_F(AssembleVintfTest, VendorNdkCheckEmpty) {
314 addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n");
315 getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 ");
316
317 std::string matrix = "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n";
318 getInstance()->setCheckInputStream(makeStream(matrix));
319 EXPECT_TRUE(getInstance()->assemble());
320 }
321
TEST_F(AssembleVintfTest,VendorNdkCheckIncompat)322 TEST_F(AssembleVintfTest, VendorNdkCheckIncompat) {
323 addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n");
324 getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 ");
325 std::string matrix =
326 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
327 " <vendor-ndk>\n"
328 " <version>O</version>\n"
329 " </vendor-ndk>\n"
330 "</compatibility-matrix>\n";
331 getInstance()->setCheckInputStream(makeStream(matrix));
332 EXPECT_FALSE(getInstance()->assemble());
333 }
334
TEST_F(AssembleVintfTest,VendorNdkCheckCompat)335 TEST_F(AssembleVintfTest, VendorNdkCheckCompat) {
336 addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n");
337 getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 ");
338 std::string matrix =
339 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
340 " <vendor-ndk>\n"
341 " <version>27</version>\n"
342 " </vendor-ndk>\n"
343 "</compatibility-matrix>\n";
344 getInstance()->setCheckInputStream(makeStream(matrix));
345 EXPECT_TRUE(getInstance()->assemble());
346 }
347
TEST_F(AssembleVintfTest,MatrixSystemSdk)348 TEST_F(AssembleVintfTest, MatrixSystemSdk) {
349 addInput("compatibility_matrix.xml",
350 "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n");
351 getInstance()->setFakeEnv("BOARD_SYSTEMSDK_VERSIONS", "P 1 2 ");
352 EXPECT_TRUE(getInstance()->assemble());
353 EXPECT_IN(
354 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
355 " <system-sdk>\n"
356 " <version>1</version>\n"
357 " <version>2</version>\n"
358 " <version>P</version>\n"
359 " </system-sdk>\n"
360 "</compatibility-matrix>\n",
361 getOutput());
362 }
363
TEST_F(AssembleVintfTest,ManifestSystemSdk)364 TEST_F(AssembleVintfTest, ManifestSystemSdk) {
365 addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n");
366 getInstance()->setFakeEnv("PLATFORM_SYSTEMSDK_VERSIONS", "P 1 2 ");
367 EXPECT_TRUE(getInstance()->assemble());
368 EXPECT_IN(
369 "<manifest version=\"1.0\" type=\"framework\">\n"
370 " <system-sdk>\n"
371 " <version>1</version>\n"
372 " <version>2</version>\n"
373 " <version>P</version>\n"
374 " </system-sdk>\n"
375 "</manifest>\n",
376 getOutput());
377 }
378
379 const std::string gEmptyOutManifest =
380 "<manifest version=\"1.0\" type=\"device\">\n"
381 " <sepolicy>\n"
382 " <version>10000.0</version>\n"
383 " </sepolicy>\n"
384 "</manifest>\n";
385
TEST_F(AssembleVintfTest,EmptyManifest)386 TEST_F(AssembleVintfTest, EmptyManifest) {
387 const std::string emptyManifest = "<manifest version=\"1.0\" type=\"device\" />";
388 setFakeEnvs({{"BOARD_SEPOLICY_VERS", "10000.0"}, {"IGNORE_TARGET_FCM_VERSION", "true"}});
389 addInput("manifest.empty.xml", emptyManifest);
390 EXPECT_TRUE(getInstance()->assemble());
391 EXPECT_IN(gEmptyOutManifest, getOutput());
392 }
393
TEST_F(AssembleVintfTest,DeviceFrameworkMatrixOptional)394 TEST_F(AssembleVintfTest, DeviceFrameworkMatrixOptional) {
395 setFakeEnvs({{"POLICYVERS", "30"},
396 {"PLATFORM_SEPOLICY_VERSION", "10000.0"},
397 {"PLATFORM_SEPOLICY_COMPAT_VERSIONS", "26.0 27.0"},
398 {"FRAMEWORK_VBMETA_VERSION", "1.0"},
399 {"PRODUCT_ENFORCE_VINTF_MANIFEST", "true"}});
400 getInstance()->setCheckInputStream(makeStream(gEmptyOutManifest));
401
402 addInput("compatibility_matrix.empty.xml",
403 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
404 " <hal format=\"hidl\" optional=\"true\">\n"
405 " <name>vendor.foo.bar</name>\n"
406 " <version>1.0</version>\n"
407 " <interface>\n"
408 " <name>IFoo</name>\n"
409 " <instance>default</instance>\n"
410 " </interface>\n"
411 " </hal>\n"
412 "</compatibility-matrix>");
413
414 EXPECT_TRUE(getInstance()->assemble());
415 EXPECT_IN(
416 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
417 " <hal format=\"hidl\" optional=\"true\">\n"
418 " <name>vendor.foo.bar</name>\n"
419 " <version>1.0</version>\n"
420 " <interface>\n"
421 " <name>IFoo</name>\n"
422 " <instance>default</instance>\n"
423 " </interface>\n"
424 " </hal>\n"
425 " <sepolicy>\n"
426 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
427 " <sepolicy-version>26.0</sepolicy-version>\n"
428 " <sepolicy-version>27.0</sepolicy-version>\n"
429 " <sepolicy-version>10000.0</sepolicy-version>\n"
430 " </sepolicy>\n"
431 " <avb>\n"
432 " <vbmeta-version>1.0</vbmeta-version>\n"
433 " </avb>\n"
434 "</compatibility-matrix>",
435 getOutput());
436 }
437
TEST_F(AssembleVintfTest,DeviceFrameworkMatrixRequired)438 TEST_F(AssembleVintfTest, DeviceFrameworkMatrixRequired) {
439 setFakeEnvs({{"POLICYVERS", "30"},
440 {"PLATFORM_SEPOLICY_VERSION", "10000.0"},
441 {"PLATFORM_SEPOLICY_COMPAT_VERSIONS", "26.0 27.0"},
442 {"FRAMEWORK_VBMETA_VERSION", "1.0"},
443 {"PRODUCT_ENFORCE_VINTF_MANIFEST", "true"}});
444 getInstance()->setCheckInputStream(makeStream(gEmptyOutManifest));
445
446 addInput("compatibility_matrix.empty.xml",
447 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
448 " <hal format=\"hidl\" optional=\"false\">\n"
449 " <name>vendor.foo.bar</name>\n"
450 " <version>1.0</version>\n"
451 " <interface>\n"
452 " <name>IFoo</name>\n"
453 " <instance>default</instance>\n"
454 " </interface>\n"
455 " </hal>\n"
456 "</compatibility-matrix>");
457
458 EXPECT_FALSE(getInstance()->assemble());
459 }
460
461 } // namespace vintf
462 } // namespace android
463