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