• 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         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