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