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 <android-base/stringprintf.h>
21 #include <gtest/gtest.h>
22
23 #include <vintf/AssembleVintf.h>
24 #include <vintf/parse_string.h>
25 #include "constants-private.h"
26 #include "test_constants.h"
27
28 using android::base::StringPrintf;
29
30 namespace android {
31 namespace vintf {
32
In(const std::string & sub,const std::string & str)33 static bool In(const std::string& sub, const std::string& str) {
34 return str.find(sub) != std::string::npos;
35 }
36 #define EXPECT_IN(sub, str) EXPECT_TRUE(In((sub), (str))) << (str);
37
38 class AssembleVintfTest : public ::testing::Test {
39 public:
SetUp()40 virtual void SetUp() override {
41 mInstance = AssembleVintf::newInstance();
42 auto s = makeStream("");
43 mOutputStream = s.get();
44 mInstance->setOutputStream(std::move(s));
45
46 getInstance()->setFakeEnv("PRODUCT_ENFORCE_VINTF_MANIFEST", "true");
47 }
TearDown()48 virtual void TearDown() override { mInstance = nullptr; }
49
getInstance()50 const std::unique_ptr<AssembleVintf>& getInstance() { return mInstance; }
51
getOutput()52 std::string getOutput() { return mOutputStream->str(); }
53
resetOutput()54 void resetOutput() { mOutputStream->str(""); }
55
setFakeEnvs(const std::map<std::string,std::string> & envs)56 void setFakeEnvs(const std::map<std::string, std::string>& envs) {
57 for (const auto& pair : envs) {
58 getInstance()->setFakeEnv(pair.first, pair.second);
59 }
60 }
61
addInput(const std::string & name,const std::string & s)62 void addInput(const std::string& name, const std::string& s) {
63 getInstance()->addInputStream(name, makeStream(s));
64 }
65
makeStream(const std::string & s)66 std::unique_ptr<std::stringstream> makeStream(const std::string& s) {
67 return std::make_unique<std::stringstream>(s);
68 }
69
70 std::unique_ptr<AssembleVintf> mInstance;
71 // do not own this object.
72 std::stringstream* mOutputStream;
73 };
74
75 // clang-format off
76
TEST_F(AssembleVintfTest,FrameworkMatrixEmpty)77 TEST_F(AssembleVintfTest, FrameworkMatrixEmpty) {
78 std::string xmlEmpty = "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" />";
79 std::string kernel318 = "CONFIG_FOO=y\n";
80 std::string kernel318_64 = "CONFIG_BAR=y\n";
81 std::string kernel44 = "# CONFIG_FOO is not set\n";
82 std::string kernel44_64 = "CONFIG_BAR=y\n";
83
84 addInput("compatibility_matrix.empty.xml", xmlEmpty);
85 setFakeEnvs({
86 {"POLICYVERS", "30"},
87 {"PLATFORM_SEPOLICY_VERSION", "10000.0"},
88 {"FRAMEWORK_VBMETA_VERSION", "1.0"},
89 });
90 getInstance()->addKernelConfigInputStream({3, 18, 0}, "android-base.config",
91 makeStream(kernel318));
92 getInstance()->addKernelConfigInputStream({3, 18, 0}, "android-base-arm64.config",
93 makeStream(kernel318_64));
94 getInstance()->addKernelConfigInputStream({4, 4, 0}, "android-base.config", makeStream(kernel44));
95 getInstance()->addKernelConfigInputStream({4, 4, 0}, "android-base-arm64.config",
96 makeStream(kernel44_64));
97
98 EXPECT_TRUE(getInstance()->assemble());
99
100 EXPECT_IN(
101 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
102 " <kernel version=\"3.18.0\">\n"
103 " <config>\n"
104 " <key>CONFIG_FOO</key>\n"
105 " <value type=\"tristate\">y</value>\n"
106 " </config>\n"
107 " </kernel>\n"
108 " <kernel version=\"3.18.0\">\n"
109 " <conditions>\n"
110 " <config>\n"
111 " <key>CONFIG_ARM64</key>\n"
112 " <value type=\"tristate\">y</value>\n"
113 " </config>\n"
114 " </conditions>\n"
115 " <config>\n"
116 " <key>CONFIG_BAR</key>\n"
117 " <value type=\"tristate\">y</value>\n"
118 " </config>\n"
119 " </kernel>\n"
120 " <kernel version=\"4.4.0\">\n"
121 " <config>\n"
122 " <key>CONFIG_FOO</key>\n"
123 " <value type=\"tristate\">n</value>\n"
124 " </config>\n"
125 " </kernel>\n"
126 " <kernel version=\"4.4.0\">\n"
127 " <conditions>\n"
128 " <config>\n"
129 " <key>CONFIG_ARM64</key>\n"
130 " <value type=\"tristate\">y</value>\n"
131 " </config>\n"
132 " </conditions>\n"
133 " <config>\n"
134 " <key>CONFIG_BAR</key>\n"
135 " <value type=\"tristate\">y</value>\n"
136 " </config>\n"
137 " </kernel>\n"
138 " <sepolicy>\n"
139 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
140 " <sepolicy-version>10000.0</sepolicy-version>\n"
141 " </sepolicy>\n"
142 " <avb>\n"
143 " <vbmeta-version>1.0</vbmeta-version>\n"
144 " </avb>\n"
145 "</compatibility-matrix>\n",
146 getOutput());
147 }
148
TEST_F(AssembleVintfTest,FrameworkMatrix)149 TEST_F(AssembleVintfTest, FrameworkMatrix) {
150 std::string tail =
151 " <config>\n"
152 " <key>CONFIG_FOO</key>\n"
153 " <value type=\"tristate\">y</value>\n"
154 " </config>\n"
155 " </kernel>\n"
156 " <sepolicy>\n"
157 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
158 " <sepolicy-version>10000.0</sepolicy-version>\n"
159 " </sepolicy>\n"
160 " <avb>\n"
161 " <vbmeta-version>1.0</vbmeta-version>\n"
162 " </avb>\n"
163 "</compatibility-matrix>\n";
164
165 std::string xmlEmpty =
166 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
167 " <kernel version=\"3.18.0\">\n" +
168 tail;
169
170 std::string xml1 =
171 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
172 " <hal format=\"hidl\" optional=\"true\">\n"
173 " <name>android.hardware.foo</name>\n"
174 " <version>1.0</version>\n"
175 " <interface>\n"
176 " <name>IFoo</name>\n"
177 " <instance>default</instance>\n"
178 " </interface>\n"
179 " </hal>\n"
180 "</compatibility-matrix>\n";
181
182 std::string xml2 =
183 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
184 " <hal format=\"hidl\" optional=\"true\">\n"
185 " <name>android.hardware.foo</name>\n"
186 " <version>1.0-1</version>\n"
187 " <interface>\n"
188 " <name>IFoo</name>\n"
189 " <instance>default</instance>\n"
190 " </interface>\n"
191 " </hal>\n"
192 "</compatibility-matrix>\n";
193
194 std::string xml3 =
195 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"3\">\n"
196 " <hal format=\"hidl\" optional=\"false\">\n"
197 " <name>android.hardware.foo</name>\n"
198 " <version>2.0</version>\n"
199 " <interface>\n"
200 " <name>IFoo</name>\n"
201 " <instance>default</instance>\n"
202 " </interface>\n"
203 " </hal>\n"
204 "</compatibility-matrix>\n";
205
206 auto manifest = [](size_t level) {
207 return "<manifest " +
208 kMetaVersionStr +
209 " type=\"device\"" +
210 " target-level=\"" + std::to_string(level) + "\">\n" +
211 " <hal format=\"hidl\">\n"
212 " <name>android.hardware.foo</name>\n"
213 " <version>1.1</version>\n"
214 " <transport>hwbinder</transport>\n"
215 " <interface>\n"
216 " <name>IFoo</name>\n"
217 " <instance>default</instance>\n"
218 " </interface>\n"
219 " </hal>\n"
220 " <hal format=\"hidl\">\n"
221 " <name>android.hardware.foo</name>\n"
222 " <version>2.0</version>\n"
223 " <transport>hwbinder</transport>\n"
224 " <interface>\n"
225 " <name>IFoo</name>\n"
226 " <instance>default</instance>\n"
227 " </interface>\n"
228 " </hal>\n"
229 " <sepolicy>\n"
230 " <version>10000.0</version>\n"
231 " </sepolicy>\n"
232 "</manifest>\n";
233 };
234
235 addInput("compatibility_matrix.1.xml", xml1);
236 addInput("compatibility_matrix.2.xml", xml2);
237 addInput("compatibility_matrix.3.xml", xml3);
238 addInput("compatibility_matrix.empty.xml", xmlEmpty);
239 getInstance()->setFakeEnv("PRODUCT_ENFORCE_VINTF_MANIFEST", "true");
240
241 resetOutput();
242 getInstance()->setCheckInputStream("check.xml", makeStream(manifest(1)));
243 EXPECT_TRUE(getInstance()->assemble());
244 EXPECT_IN(
245 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
246 " <hal format=\"hidl\" optional=\"true\">\n"
247 " <name>android.hardware.foo</name>\n"
248 " <version>1.0-1</version>\n"
249 " <version>2.0</version>\n"
250 " <interface>\n"
251 " <name>IFoo</name>\n"
252 " <instance>default</instance>\n"
253 " </interface>\n"
254 " </hal>\n"
255 " <kernel version=\"3.18.0\" level=\"1\">\n" +
256 tail,
257 getOutput());
258
259 resetOutput();
260 getInstance()->setCheckInputStream("check.xml", makeStream(manifest(2)));
261 EXPECT_TRUE(getInstance()->assemble());
262 EXPECT_IN(
263 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
264 " <hal format=\"hidl\" optional=\"true\">\n"
265 " <name>android.hardware.foo</name>\n"
266 " <version>1.0-1</version>\n"
267 " <version>2.0</version>\n"
268 " <interface>\n"
269 " <name>IFoo</name>\n"
270 " <instance>default</instance>\n"
271 " </interface>\n"
272 " </hal>\n"
273 " <kernel version=\"3.18.0\" level=\"2\">\n" +
274 tail,
275 getOutput());
276
277 resetOutput();
278 getInstance()->setCheckInputStream("check.xml", makeStream(manifest(3)));
279 EXPECT_TRUE(getInstance()->assemble());
280 EXPECT_IN(
281 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"3\">\n"
282 " <hal format=\"hidl\" optional=\"false\">\n"
283 " <name>android.hardware.foo</name>\n"
284 " <version>2.0</version>\n"
285 " <interface>\n"
286 " <name>IFoo</name>\n"
287 " <instance>default</instance>\n"
288 " </interface>\n"
289 " </hal>\n"
290 " <kernel version=\"3.18.0\" level=\"3\">\n" +
291 tail,
292 getOutput());
293 }
294
TEST_F(AssembleVintfTest,MatrixVendorNdk)295 TEST_F(AssembleVintfTest, MatrixVendorNdk) {
296 addInput("compatibility_matrix.xml",
297 "<compatibility-matrix " + kMetaVersionStr + " type=\"device\"/>\n");
298 getInstance()->setFakeEnv("REQUIRED_VNDK_VERSION", "P");
299 EXPECT_TRUE(getInstance()->assemble());
300 EXPECT_IN(
301 "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\n"
302 " <vendor-ndk>\n"
303 " <version>P</version>\n"
304 " </vendor-ndk>\n"
305 "</compatibility-matrix>\n",
306 getOutput());
307 }
308
TEST_F(AssembleVintfTest,ManifestVendorNdk)309 TEST_F(AssembleVintfTest, ManifestVendorNdk) {
310 addInput("manifest.xml", "<manifest " + kMetaVersionStr + " type=\"framework\"/>\n");
311 getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 ");
312 EXPECT_TRUE(getInstance()->assemble());
313 EXPECT_IN(
314 "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
315 " <vendor-ndk>\n"
316 " <version>P</version>\n"
317 " </vendor-ndk>\n"
318 " <vendor-ndk>\n"
319 " <version>26</version>\n"
320 " </vendor-ndk>\n"
321 " <vendor-ndk>\n"
322 " <version>27</version>\n"
323 " </vendor-ndk>\n"
324 "</manifest>\n",
325 getOutput());
326 }
327
TEST_F(AssembleVintfTest,VendorNdkCheckEmpty)328 TEST_F(AssembleVintfTest, VendorNdkCheckEmpty) {
329 addInput("manifest.xml", "<manifest " + kMetaVersionStr + " type=\"framework\"/>\n");
330 getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 ");
331
332 std::string matrix = "<compatibility-matrix " + kMetaVersionStr + " type=\"device\"/>\n";
333 getInstance()->setCheckInputStream("check.xml", makeStream(matrix));
334 EXPECT_TRUE(getInstance()->assemble());
335 }
336
TEST_F(AssembleVintfTest,VendorNdkCheckIncompat)337 TEST_F(AssembleVintfTest, VendorNdkCheckIncompat) {
338 addInput("manifest.xml", "<manifest " + kMetaVersionStr + " type=\"framework\"/>\n");
339 getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 ");
340 std::string matrix =
341 "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\n"
342 " <vendor-ndk>\n"
343 " <version>O</version>\n"
344 " </vendor-ndk>\n"
345 "</compatibility-matrix>\n";
346 getInstance()->setCheckInputStream("check.xml", makeStream(matrix));
347 EXPECT_FALSE(getInstance()->assemble());
348 }
349
TEST_F(AssembleVintfTest,VendorNdkCheckCompat)350 TEST_F(AssembleVintfTest, VendorNdkCheckCompat) {
351 addInput("manifest.xml", "<manifest " + kMetaVersionStr + " type=\"framework\"/>\n");
352 getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 ");
353 std::string matrix =
354 "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\n"
355 " <vendor-ndk>\n"
356 " <version>27</version>\n"
357 " </vendor-ndk>\n"
358 "</compatibility-matrix>\n";
359 getInstance()->setCheckInputStream("check.xml", makeStream(matrix));
360 EXPECT_TRUE(getInstance()->assemble());
361 }
362
TEST_F(AssembleVintfTest,MatrixSystemSdk)363 TEST_F(AssembleVintfTest, MatrixSystemSdk) {
364 addInput("compatibility_matrix.xml",
365 "<compatibility-matrix " + kMetaVersionStr + " type=\"device\"/>\n");
366 getInstance()->setFakeEnv("BOARD_SYSTEMSDK_VERSIONS", "P 1 2 ");
367 EXPECT_TRUE(getInstance()->assemble());
368 EXPECT_IN(
369 "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\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 "</compatibility-matrix>\n",
376 getOutput());
377 }
378
TEST_F(AssembleVintfTest,ManifestSystemSdk)379 TEST_F(AssembleVintfTest, ManifestSystemSdk) {
380 addInput("manifest.xml", "<manifest " + kMetaVersionStr + " type=\"framework\"/>\n");
381 getInstance()->setFakeEnv("PLATFORM_SYSTEMSDK_VERSIONS", "P 1 2 ");
382 EXPECT_TRUE(getInstance()->assemble());
383 EXPECT_IN(
384 "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
385 " <system-sdk>\n"
386 " <version>1</version>\n"
387 " <version>2</version>\n"
388 " <version>P</version>\n"
389 " </system-sdk>\n"
390 "</manifest>\n",
391 getOutput());
392 }
393
394 const std::string gEmptyOutManifest =
395 "<manifest " + kMetaVersionStr + " type=\"device\">\n"
396 " <sepolicy>\n"
397 " <version>10000.0</version>\n"
398 " </sepolicy>\n"
399 "</manifest>\n";
400
TEST_F(AssembleVintfTest,EmptyManifest)401 TEST_F(AssembleVintfTest, EmptyManifest) {
402 const std::string emptyManifest = "<manifest " + kMetaVersionStr + " type=\"device\" />";
403 setFakeEnvs({{"BOARD_SEPOLICY_VERS", "10000.0"}, {"IGNORE_TARGET_FCM_VERSION", "true"}});
404 addInput("manifest.empty.xml", emptyManifest);
405 EXPECT_TRUE(getInstance()->assemble());
406 EXPECT_IN(gEmptyOutManifest, getOutput());
407 }
408
TEST_F(AssembleVintfTest,DeviceFrameworkMatrixOptional)409 TEST_F(AssembleVintfTest, DeviceFrameworkMatrixOptional) {
410 setFakeEnvs({{"POLICYVERS", "30"},
411 {"PLATFORM_SEPOLICY_VERSION", "10000.0"},
412 {"PLATFORM_SEPOLICY_COMPAT_VERSIONS", "26.0 27.0"},
413 {"FRAMEWORK_VBMETA_VERSION", "1.0"},
414 {"PRODUCT_ENFORCE_VINTF_MANIFEST", "true"}});
415 getInstance()->setCheckInputStream("check.xml", makeStream(gEmptyOutManifest));
416
417 addInput("compatibility_matrix.empty.xml",
418 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
419 " <hal format=\"hidl\" optional=\"true\">\n"
420 " <name>vendor.foo.bar</name>\n"
421 " <version>1.0</version>\n"
422 " <interface>\n"
423 " <name>IFoo</name>\n"
424 " <instance>default</instance>\n"
425 " </interface>\n"
426 " </hal>\n"
427 "</compatibility-matrix>");
428
429 EXPECT_TRUE(getInstance()->assemble());
430 EXPECT_IN(
431 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
432 " <hal format=\"hidl\" optional=\"true\">\n"
433 " <name>vendor.foo.bar</name>\n"
434 " <version>1.0</version>\n"
435 " <interface>\n"
436 " <name>IFoo</name>\n"
437 " <instance>default</instance>\n"
438 " </interface>\n"
439 " </hal>\n"
440 " <sepolicy>\n"
441 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
442 " <sepolicy-version>26.0</sepolicy-version>\n"
443 " <sepolicy-version>27.0</sepolicy-version>\n"
444 " <sepolicy-version>10000.0</sepolicy-version>\n"
445 " </sepolicy>\n"
446 " <avb>\n"
447 " <vbmeta-version>1.0</vbmeta-version>\n"
448 " </avb>\n"
449 "</compatibility-matrix>",
450 getOutput());
451 }
452
TEST_F(AssembleVintfTest,DeviceFrameworkMatrixRequired)453 TEST_F(AssembleVintfTest, DeviceFrameworkMatrixRequired) {
454 setFakeEnvs({{"POLICYVERS", "30"},
455 {"PLATFORM_SEPOLICY_VERSION", "10000.0"},
456 {"PLATFORM_SEPOLICY_COMPAT_VERSIONS", "26.0 27.0"},
457 {"FRAMEWORK_VBMETA_VERSION", "1.0"},
458 {"PRODUCT_ENFORCE_VINTF_MANIFEST", "true"}});
459 getInstance()->setCheckInputStream("check.xml", makeStream(gEmptyOutManifest));
460
461 addInput("compatibility_matrix.empty.xml",
462 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
463 " <hal format=\"hidl\" optional=\"false\">\n"
464 " <name>vendor.foo.bar</name>\n"
465 " <version>1.0</version>\n"
466 " <interface>\n"
467 " <name>IFoo</name>\n"
468 " <instance>default</instance>\n"
469 " </interface>\n"
470 " </hal>\n"
471 "</compatibility-matrix>");
472
473 EXPECT_FALSE(getInstance()->assemble());
474 }
475
TEST_F(AssembleVintfTest,DeviceFrameworkMatrixMultiple)476 TEST_F(AssembleVintfTest, DeviceFrameworkMatrixMultiple) {
477 setFakeEnvs({{"POLICYVERS", "30"},
478 {"PLATFORM_SEPOLICY_VERSION", "10000.0"},
479 {"PLATFORM_SEPOLICY_COMPAT_VERSIONS", "26.0 27.0"},
480 {"FRAMEWORK_VBMETA_VERSION", "1.0"},
481 {"PRODUCT_ENFORCE_VINTF_MANIFEST", "true"}});
482 getInstance()->setCheckInputStream("check.xml", makeStream(gEmptyOutManifest));
483
484 addInput("compatibility_matrix.foobar.xml",
485 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
486 " <hal format=\"hidl\" optional=\"true\">\n"
487 " <name>vendor.foo.bar</name>\n"
488 " <version>1.0</version>\n"
489 " <interface>\n"
490 " <name>IFoo</name>\n"
491 " <instance>default</instance>\n"
492 " </interface>\n"
493 " </hal>\n"
494 "</compatibility-matrix>");
495
496 addInput("compatibility_matrix.bazquux.xml",
497 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
498 " <hal format=\"hidl\" optional=\"true\">\n"
499 " <name>vendor.baz.quux</name>\n"
500 " <version>1.0</version>\n"
501 " <interface>\n"
502 " <name>IBaz</name>\n"
503 " <instance>default</instance>\n"
504 " </interface>\n"
505 " </hal>\n"
506 "</compatibility-matrix>");
507
508 EXPECT_TRUE(getInstance()->assemble());
509 EXPECT_IN(
510 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
511 " <hal format=\"hidl\" optional=\"true\">\n"
512 " <name>vendor.baz.quux</name>\n"
513 " <version>1.0</version>\n"
514 " <interface>\n"
515 " <name>IBaz</name>\n"
516 " <instance>default</instance>\n"
517 " </interface>\n"
518 " </hal>\n"
519 " <hal format=\"hidl\" optional=\"true\">\n"
520 " <name>vendor.foo.bar</name>\n"
521 " <version>1.0</version>\n"
522 " <interface>\n"
523 " <name>IFoo</name>\n"
524 " <instance>default</instance>\n"
525 " </interface>\n"
526 " </hal>\n"
527 " <sepolicy>\n"
528 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
529 " <sepolicy-version>26.0</sepolicy-version>\n"
530 " <sepolicy-version>27.0</sepolicy-version>\n"
531 " <sepolicy-version>10000.0</sepolicy-version>\n"
532 " </sepolicy>\n"
533 " <avb>\n"
534 " <vbmeta-version>1.0</vbmeta-version>\n"
535 " </avb>\n"
536 "</compatibility-matrix>",
537 getOutput());
538 }
539
TEST_F(AssembleVintfTest,OutputFileMatrixTest)540 TEST_F(AssembleVintfTest, OutputFileMatrixTest) {
541 const std::string kFile = "file_name_1.xml";
542 const std::string kMatrix =
543 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\"/>";
544 addInput(kFile, kMatrix);
545 EXPECT_TRUE(getInstance()->assemble());
546 EXPECT_IN(kFile, getOutput());
547 }
548
TEST_F(AssembleVintfTest,OutputFileManifestTest)549 TEST_F(AssembleVintfTest, OutputFileManifestTest) {
550 const std::string kFile = "file_name_1.xml";
551 std::string kManifest = "<manifest " + kMetaVersionStr + " type=\"device\" target-level=\"1\"/>";
552 addInput(kFile, kManifest);
553 EXPECT_TRUE(getInstance()->assemble());
554 EXPECT_IN(kFile, getOutput());
555 }
556
TEST_F(AssembleVintfTest,AidlAndHidlNames)557 TEST_F(AssembleVintfTest, AidlAndHidlNames) {
558 addInput("manifest1.xml",
559 "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
560 " <hal format=\"aidl\">\n"
561 " <name>android.system.foo</name>\n"
562 " <fqname>IFoo/default</fqname>\n"
563 " </hal>\n"
564 "</manifest>\n");
565 addInput("manifest2.xml",
566 "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
567 " <hal format=\"hidl\">\n"
568 " <name>android.system.foo</name>\n"
569 " <transport>hwbinder</transport>\n"
570 " <fqname>@1.0::IFoo/default</fqname>\n"
571 " </hal>\n"
572 "</manifest>\n");
573 EXPECT_TRUE(getInstance()->assemble());
574 EXPECT_IN(
575 " <hal format=\"aidl\">\n"
576 " <name>android.system.foo</name>\n"
577 " <fqname>IFoo/default</fqname>\n"
578 " </hal>\n",
579 getOutput());
580 EXPECT_IN(
581 " <hal format=\"hidl\">\n"
582 " <name>android.system.foo</name>\n"
583 " <transport>hwbinder</transport>\n"
584 " <fqname>@1.0::IFoo/default</fqname>\n"
585 " </hal>\n",
586 getOutput());
587 }
588
589 // Merge kernel FCM from manually written device manifest and <config> from
590 // parsing kernel prebuilt.
TEST_F(AssembleVintfTest,MergeKernelFcmAndConfigs)591 TEST_F(AssembleVintfTest, MergeKernelFcmAndConfigs) {
592 addInput("manifest.xml",
593 "<manifest " + kMetaVersionStr + " type=\"device\" target-level=\"1\">\n"
594 " <kernel target-level=\"2\"/>\n"
595 "</manifest>\n");
596 getInstance()->addKernelConfigInputStream({3, 18, 10}, "android-base.config",
597 makeStream("CONFIG_FOO=y"));
598 EXPECT_TRUE(getInstance()->assemble());
599 EXPECT_IN("<kernel version=\"3.18.10\" target-level=\"2\">", getOutput());
600 }
601
TEST_F(AssembleVintfTest,NoAutoSetKernelFcm)602 TEST_F(AssembleVintfTest, NoAutoSetKernelFcm) {
603 addInput("manifest.xml",
604 "<manifest " + kMetaVersionStr + " type=\"device\" target-level=\"1\">\n"
605 " <kernel version=\"3.18.10\"/>\n"
606 "</manifest>\n");
607 EXPECT_TRUE(getInstance()->assemble());
608 EXPECT_IN("<kernel version=\"3.18.10\"/>", getOutput());
609 }
610
TEST_F(AssembleVintfTest,NoAutoSetKernelFcmWithConfig)611 TEST_F(AssembleVintfTest, NoAutoSetKernelFcmWithConfig) {
612 addInput("manifest.xml",
613 "<manifest " + kMetaVersionStr + " type=\"device\" target-level=\"1\" />\n");
614 getInstance()->addKernelConfigInputStream({3, 18, 10}, "android-base.config",
615 makeStream("CONFIG_FOO=y"));
616 EXPECT_TRUE(getInstance()->assemble());
617 EXPECT_IN("<kernel version=\"3.18.10\">", getOutput());
618 }
619
TEST_F(AssembleVintfTest,NoKernelFcmT)620 TEST_F(AssembleVintfTest, NoKernelFcmT) {
621 addInput("manifest.xml",
622 StringPrintf(R"(<manifest %s type="device" target-level="%s">
623 <kernel target-level="10"/>
624 </manifest>)", kMetaVersionStr.c_str(),
625 to_string(details::kEnforceDeviceManifestNoKernelLevel).c_str()));
626 EXPECT_FALSE(getInstance()->assemble());
627 }
628
629 // Automatically add kernel FCM when parsing framework matrix for a single FCM version.
TEST_F(AssembleVintfTest,AutoSetMatrixKernelFcm)630 TEST_F(AssembleVintfTest, AutoSetMatrixKernelFcm) {
631 addInput("compatibility_matrix.xml",
632 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\"/>\n"
633 );
634 getInstance()->addKernelConfigInputStream({3, 18, 10}, "android-base.config",
635 makeStream(""));
636 EXPECT_TRUE(getInstance()->assemble());
637 EXPECT_IN("<kernel version=\"3.18.10\" level=\"1\"/>", getOutput());
638 }
639
640
TEST_F(AssembleVintfTest,WithKernelRequirements)641 TEST_F(AssembleVintfTest, WithKernelRequirements) {
642 setFakeEnvs({{"POLICYVERS", "30"},
643 {"PLATFORM_SEPOLICY_VERSION", "10000.0"},
644 {"PRODUCT_ENFORCE_VINTF_MANIFEST", "true"}});
645 addInput("compatibility_matrix.xml",
646 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
647 " <kernel version=\"3.18.1\" level=\"1\">\n"
648 " <config>\n"
649 " <key>CONFIG_FOO</key>\n"
650 " <value type=\"tristate\">y</value>\n"
651 " </config>\n"
652 " </kernel>\n"
653 "</compatibility-matrix>\n");
654 getInstance()->setCheckInputStream("check.xml", makeStream(
655 "<manifest " + kMetaVersionStr + " type=\"device\" target-level=\"1\">\n"
656 " <kernel target-level=\"1\" version=\"3.18.0\"/>\n"
657 " <sepolicy>\n"
658 " <version>10000.0</version>\n"
659 " </sepolicy>\n"
660 "</manifest>\n"));
661
662 EXPECT_FALSE(getInstance()->assemble());
663 }
664
TEST_F(AssembleVintfTest,NoKernelRequirements)665 TEST_F(AssembleVintfTest, NoKernelRequirements) {
666 setFakeEnvs({{"POLICYVERS", "30"},
667 {"PLATFORM_SEPOLICY_VERSION", "10000.0"},
668 {"PRODUCT_ENFORCE_VINTF_MANIFEST", "true"}});
669 addInput("compatibility_matrix.xml",
670 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
671 " <kernel version=\"3.18.0\" level=\"1\"/>\n"
672 "</compatibility-matrix>\n");
673 getInstance()->setCheckInputStream("check.xml", makeStream(
674 "<manifest " + kMetaVersionStr + " type=\"device\" target-level=\"1\">\n"
675 " <kernel target-level=\"1\"/>\n"
676 " <sepolicy>\n"
677 " <version>10000.0</version>\n"
678 " </sepolicy>\n"
679 "</manifest>\n"));
680
681 EXPECT_TRUE(getInstance()->setNoKernelRequirements());
682 EXPECT_TRUE(getInstance()->assemble());
683 }
684
685 // clang-format on
686
687 } // namespace vintf
688 } // namespace android
689