• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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