• 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 <gtest/gtest.h>
21 #include <vintf/AssembleVintf.h>
22 #include <vintf/parse_string.h>
23 
24 namespace android {
25 namespace vintf {
26 
In(const std::string & sub,const std::string & str)27 static bool In(const std::string& sub, const std::string& str) {
28     return str.find(sub) != std::string::npos;
29 }
30 #define EXPECT_IN(sub, str) EXPECT_TRUE(In((sub), (str))) << (str);
31 
32 class AssembleVintfTest : public ::testing::Test {
33    public:
SetUp()34     virtual void SetUp() override {
35         mInstance = AssembleVintf::newInstance();
36         auto s = makeStream("");
37         mOutputStream = s.get();
38         mInstance->setOutputStream(std::move(s));
39 
40         getInstance()->setFakeEnv("PRODUCT_ENFORCE_VINTF_MANIFEST", "true");
41     }
TearDown()42     virtual void TearDown() override { mInstance = nullptr; }
43 
getInstance()44     const std::unique_ptr<AssembleVintf>& getInstance() { return mInstance; }
45 
getOutput()46     std::string getOutput() { return mOutputStream->str(); }
47 
resetOutput()48     void resetOutput() { mOutputStream->str(""); }
49 
setFakeEnvs(const std::map<std::string,std::string> & envs)50     void setFakeEnvs(const std::map<std::string, std::string>& envs) {
51         for (const auto& pair : envs) {
52             getInstance()->setFakeEnv(pair.first, pair.second);
53         }
54     }
55 
addInput(const std::string & name,const std::string & s)56     void addInput(const std::string& name, const std::string& s) {
57         getInstance()->addInputStream(name, makeStream(s));
58     }
59 
makeStream(const std::string & s)60     std::unique_ptr<std::stringstream> makeStream(const std::string& s) {
61         return std::make_unique<std::stringstream>(s);
62     }
63 
64     std::unique_ptr<AssembleVintf> mInstance;
65     // do not own this object.
66     std::stringstream* mOutputStream;
67 };
68 
TEST_F(AssembleVintfTest,FrameworkMatrixEmpty)69 TEST_F(AssembleVintfTest, FrameworkMatrixEmpty) {
70     std::string xmlEmpty = "<compatibility-matrix version=\"1.0\" type=\"framework\" />";
71     std::string kernel318 = "CONFIG_FOO=y\n";
72     std::string kernel318_64 = "CONFIG_BAR=y\n";
73     std::string kernel44 = "# CONFIG_FOO is not set\n";
74     std::string kernel44_64 = "CONFIG_BAR=y\n";
75 
76     addInput("compatibility_matrix.empty.xml", xmlEmpty);
77     setFakeEnvs({
78         {"POLICYVERS", "30"},
79         {"PLATFORM_SEPOLICY_VERSION", "10000.0"},
80         {"FRAMEWORK_VBMETA_VERSION", "1.0"},
81     });
82     getInstance()->addKernelConfigInputStream({3, 18, 0}, "android-base.cfg",
83                                               makeStream(kernel318));
84     getInstance()->addKernelConfigInputStream({3, 18, 0}, "android-base-arm64.cfg",
85                                               makeStream(kernel318_64));
86     getInstance()->addKernelConfigInputStream({4, 4, 0}, "android-base.cfg", makeStream(kernel44));
87     getInstance()->addKernelConfigInputStream({4, 4, 0}, "android-base-arm64.cfg",
88                                               makeStream(kernel44_64));
89 
90     EXPECT_TRUE(getInstance()->assemble());
91 
92     EXPECT_IN(
93         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
94         "    <kernel version=\"3.18.0\">\n"
95         "        <config>\n"
96         "            <key>CONFIG_FOO</key>\n"
97         "            <value type=\"tristate\">y</value>\n"
98         "        </config>\n"
99         "    </kernel>\n"
100         "    <kernel version=\"3.18.0\">\n"
101         "        <conditions>\n"
102         "            <config>\n"
103         "                <key>CONFIG_ARM64</key>\n"
104         "                <value type=\"tristate\">y</value>\n"
105         "            </config>\n"
106         "        </conditions>\n"
107         "        <config>\n"
108         "            <key>CONFIG_BAR</key>\n"
109         "            <value type=\"tristate\">y</value>\n"
110         "        </config>\n"
111         "    </kernel>\n"
112         "    <kernel version=\"4.4.0\">\n"
113         "        <config>\n"
114         "            <key>CONFIG_FOO</key>\n"
115         "            <value type=\"tristate\">n</value>\n"
116         "        </config>\n"
117         "    </kernel>\n"
118         "    <kernel version=\"4.4.0\">\n"
119         "        <conditions>\n"
120         "            <config>\n"
121         "                <key>CONFIG_ARM64</key>\n"
122         "                <value type=\"tristate\">y</value>\n"
123         "            </config>\n"
124         "        </conditions>\n"
125         "        <config>\n"
126         "            <key>CONFIG_BAR</key>\n"
127         "            <value type=\"tristate\">y</value>\n"
128         "        </config>\n"
129         "    </kernel>\n"
130         "    <sepolicy>\n"
131         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
132         "        <sepolicy-version>10000.0</sepolicy-version>\n"
133         "    </sepolicy>\n"
134         "    <avb>\n"
135         "        <vbmeta-version>1.0</vbmeta-version>\n"
136         "    </avb>\n"
137         "</compatibility-matrix>\n",
138         getOutput());
139 }
140 
TEST_F(AssembleVintfTest,FrameworkMatrix)141 TEST_F(AssembleVintfTest, FrameworkMatrix) {
142     std::string tail =
143         "    <kernel version=\"3.18.0\">\n"
144         "        <config>\n"
145         "            <key>CONFIG_FOO</key>\n"
146         "            <value type=\"tristate\">y</value>\n"
147         "        </config>\n"
148         "    </kernel>\n"
149         "    <sepolicy>\n"
150         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
151         "        <sepolicy-version>10000.0</sepolicy-version>\n"
152         "    </sepolicy>\n"
153         "    <avb>\n"
154         "        <vbmeta-version>1.0</vbmeta-version>\n"
155         "    </avb>\n"
156         "</compatibility-matrix>\n";
157 
158     std::string xmlEmpty = "<compatibility-matrix version=\"1.0\" type=\"framework\">\n" + tail;
159 
160     std::string xml1 =
161         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
162         "    <hal format=\"hidl\" optional=\"true\">\n"
163         "        <name>android.hardware.foo</name>\n"
164         "        <version>1.0</version>\n"
165         "        <interface>\n"
166         "            <name>IFoo</name>\n"
167         "            <instance>default</instance>\n"
168         "        </interface>\n"
169         "    </hal>\n"
170         "</compatibility-matrix>\n";
171 
172     std::string xml2 =
173         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
174         "    <hal format=\"hidl\" optional=\"true\">\n"
175         "        <name>android.hardware.foo</name>\n"
176         "        <version>1.0-1</version>\n"
177         "        <interface>\n"
178         "            <name>IFoo</name>\n"
179         "            <instance>default</instance>\n"
180         "        </interface>\n"
181         "    </hal>\n"
182         "</compatibility-matrix>\n";
183 
184     std::string xml3 =
185         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"3\">\n"
186         "    <hal format=\"hidl\" optional=\"false\">\n"
187         "        <name>android.hardware.foo</name>\n"
188         "        <version>2.0</version>\n"
189         "        <interface>\n"
190         "            <name>IFoo</name>\n"
191         "            <instance>default</instance>\n"
192         "        </interface>\n"
193         "    </hal>\n"
194         "</compatibility-matrix>\n";
195 
196     auto manifest = [](size_t level) {
197         return "<manifest version=\"1.0\" type=\"device\" target-level=\"" + std::to_string(level) +
198                "\">\n" +
199                "    <hal format=\"hidl\">\n"
200                "        <name>android.hardware.foo</name>\n"
201                "        <version>1.1</version>\n"
202                "        <transport>hwbinder</transport>\n"
203                "        <interface>\n"
204                "            <name>IFoo</name>\n"
205                "            <instance>default</instance>\n"
206                "        </interface>\n"
207                "    </hal>\n"
208                "    <hal format=\"hidl\">\n"
209                "        <name>android.hardware.foo</name>\n"
210                "        <version>2.0</version>\n"
211                "        <transport>hwbinder</transport>\n"
212                "        <interface>\n"
213                "            <name>IFoo</name>\n"
214                "            <instance>default</instance>\n"
215                "        </interface>\n"
216                "    </hal>\n"
217                "    <sepolicy>\n"
218                "        <version>10000.0</version>\n"
219                "    </sepolicy>\n"
220                "</manifest>\n";
221     };
222 
223     addInput("compatibility_matrix.1.xml", xml1);
224     addInput("compatibility_matrix.2.xml", xml2);
225     addInput("compatibility_matrix.3.xml", xml3);
226     addInput("compatibility_matrix.empty.xml", xmlEmpty);
227     getInstance()->setFakeEnv("PRODUCT_ENFORCE_VINTF_MANIFEST", "true");
228 
229     resetOutput();
230     getInstance()->setCheckInputStream(makeStream(manifest(1)));
231     EXPECT_TRUE(getInstance()->assemble());
232     EXPECT_IN(
233         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
234         "    <hal format=\"hidl\" optional=\"true\">\n"
235         "        <name>android.hardware.foo</name>\n"
236         "        <version>1.0-1</version>\n"
237         "        <version>2.0</version>\n"
238         "        <interface>\n"
239         "            <name>IFoo</name>\n"
240         "            <instance>default</instance>\n"
241         "        </interface>\n"
242         "    </hal>\n" +
243             tail,
244         getOutput());
245 
246     resetOutput();
247     getInstance()->setCheckInputStream(makeStream(manifest(2)));
248     EXPECT_TRUE(getInstance()->assemble());
249     EXPECT_IN(
250         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\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             tail,
261         getOutput());
262 
263     resetOutput();
264     getInstance()->setCheckInputStream(makeStream(manifest(3)));
265     EXPECT_TRUE(getInstance()->assemble());
266     EXPECT_IN(
267         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"3\">\n"
268         "    <hal format=\"hidl\" optional=\"false\">\n"
269         "        <name>android.hardware.foo</name>\n"
270         "        <version>2.0</version>\n"
271         "        <interface>\n"
272         "            <name>IFoo</name>\n"
273         "            <instance>default</instance>\n"
274         "        </interface>\n"
275         "    </hal>\n" +
276             tail,
277         getOutput());
278 }
279 
TEST_F(AssembleVintfTest,MatrixVendorNdk)280 TEST_F(AssembleVintfTest, MatrixVendorNdk) {
281     addInput("compatibility_matrix.xml",
282              "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n");
283     getInstance()->setFakeEnv("REQUIRED_VNDK_VERSION", "P");
284     EXPECT_TRUE(getInstance()->assemble());
285     EXPECT_IN(
286         "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
287         "    <vendor-ndk>\n"
288         "        <version>P</version>\n"
289         "    </vendor-ndk>\n"
290         "</compatibility-matrix>\n",
291         getOutput());
292 }
293 
TEST_F(AssembleVintfTest,ManifestVendorNdk)294 TEST_F(AssembleVintfTest, ManifestVendorNdk) {
295     addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n");
296     getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P  26 27   ");
297     EXPECT_TRUE(getInstance()->assemble());
298     EXPECT_IN(
299         "<manifest version=\"1.0\" type=\"framework\">\n"
300         "    <vendor-ndk>\n"
301         "        <version>P</version>\n"
302         "    </vendor-ndk>\n"
303         "    <vendor-ndk>\n"
304         "        <version>26</version>\n"
305         "    </vendor-ndk>\n"
306         "    <vendor-ndk>\n"
307         "        <version>27</version>\n"
308         "    </vendor-ndk>\n"
309         "</manifest>\n",
310         getOutput());
311 }
312 
TEST_F(AssembleVintfTest,VendorNdkCheckEmpty)313 TEST_F(AssembleVintfTest, VendorNdkCheckEmpty) {
314     addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n");
315     getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 ");
316 
317     std::string matrix = "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n";
318     getInstance()->setCheckInputStream(makeStream(matrix));
319     EXPECT_TRUE(getInstance()->assemble());
320 }
321 
TEST_F(AssembleVintfTest,VendorNdkCheckIncompat)322 TEST_F(AssembleVintfTest, VendorNdkCheckIncompat) {
323     addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n");
324     getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 ");
325     std::string matrix =
326         "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
327         "    <vendor-ndk>\n"
328         "        <version>O</version>\n"
329         "    </vendor-ndk>\n"
330         "</compatibility-matrix>\n";
331     getInstance()->setCheckInputStream(makeStream(matrix));
332     EXPECT_FALSE(getInstance()->assemble());
333 }
334 
TEST_F(AssembleVintfTest,VendorNdkCheckCompat)335 TEST_F(AssembleVintfTest, VendorNdkCheckCompat) {
336     addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n");
337     getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 ");
338     std::string matrix =
339         "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
340         "    <vendor-ndk>\n"
341         "        <version>27</version>\n"
342         "    </vendor-ndk>\n"
343         "</compatibility-matrix>\n";
344     getInstance()->setCheckInputStream(makeStream(matrix));
345     EXPECT_TRUE(getInstance()->assemble());
346 }
347 
TEST_F(AssembleVintfTest,MatrixSystemSdk)348 TEST_F(AssembleVintfTest, MatrixSystemSdk) {
349     addInput("compatibility_matrix.xml",
350              "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n");
351     getInstance()->setFakeEnv("BOARD_SYSTEMSDK_VERSIONS", "P 1 2 ");
352     EXPECT_TRUE(getInstance()->assemble());
353     EXPECT_IN(
354         "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
355         "    <system-sdk>\n"
356         "        <version>1</version>\n"
357         "        <version>2</version>\n"
358         "        <version>P</version>\n"
359         "    </system-sdk>\n"
360         "</compatibility-matrix>\n",
361         getOutput());
362 }
363 
TEST_F(AssembleVintfTest,ManifestSystemSdk)364 TEST_F(AssembleVintfTest, ManifestSystemSdk) {
365     addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n");
366     getInstance()->setFakeEnv("PLATFORM_SYSTEMSDK_VERSIONS", "P 1 2 ");
367     EXPECT_TRUE(getInstance()->assemble());
368     EXPECT_IN(
369         "<manifest version=\"1.0\" type=\"framework\">\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         "</manifest>\n",
376         getOutput());
377 }
378 
379 const std::string gEmptyOutManifest =
380     "<manifest version=\"1.0\" type=\"device\">\n"
381     "    <sepolicy>\n"
382     "        <version>10000.0</version>\n"
383     "    </sepolicy>\n"
384     "</manifest>\n";
385 
TEST_F(AssembleVintfTest,EmptyManifest)386 TEST_F(AssembleVintfTest, EmptyManifest) {
387     const std::string emptyManifest = "<manifest version=\"1.0\" type=\"device\" />";
388     setFakeEnvs({{"BOARD_SEPOLICY_VERS", "10000.0"}, {"IGNORE_TARGET_FCM_VERSION", "true"}});
389     addInput("manifest.empty.xml", emptyManifest);
390     EXPECT_TRUE(getInstance()->assemble());
391     EXPECT_IN(gEmptyOutManifest, getOutput());
392 }
393 
TEST_F(AssembleVintfTest,DeviceFrameworkMatrixOptional)394 TEST_F(AssembleVintfTest, DeviceFrameworkMatrixOptional) {
395     setFakeEnvs({{"POLICYVERS", "30"},
396                  {"PLATFORM_SEPOLICY_VERSION", "10000.0"},
397                  {"PLATFORM_SEPOLICY_COMPAT_VERSIONS", "26.0 27.0"},
398                  {"FRAMEWORK_VBMETA_VERSION", "1.0"},
399                  {"PRODUCT_ENFORCE_VINTF_MANIFEST", "true"}});
400     getInstance()->setCheckInputStream(makeStream(gEmptyOutManifest));
401 
402     addInput("compatibility_matrix.empty.xml",
403              "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
404              "    <hal format=\"hidl\" optional=\"true\">\n"
405              "        <name>vendor.foo.bar</name>\n"
406              "        <version>1.0</version>\n"
407              "        <interface>\n"
408              "            <name>IFoo</name>\n"
409              "            <instance>default</instance>\n"
410              "        </interface>\n"
411              "    </hal>\n"
412              "</compatibility-matrix>");
413 
414     EXPECT_TRUE(getInstance()->assemble());
415     EXPECT_IN(
416         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
417         "    <hal format=\"hidl\" optional=\"true\">\n"
418         "        <name>vendor.foo.bar</name>\n"
419         "        <version>1.0</version>\n"
420         "        <interface>\n"
421         "            <name>IFoo</name>\n"
422         "            <instance>default</instance>\n"
423         "        </interface>\n"
424         "    </hal>\n"
425         "    <sepolicy>\n"
426         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
427         "        <sepolicy-version>26.0</sepolicy-version>\n"
428         "        <sepolicy-version>27.0</sepolicy-version>\n"
429         "        <sepolicy-version>10000.0</sepolicy-version>\n"
430         "    </sepolicy>\n"
431         "    <avb>\n"
432         "        <vbmeta-version>1.0</vbmeta-version>\n"
433         "    </avb>\n"
434         "</compatibility-matrix>",
435         getOutput());
436 }
437 
TEST_F(AssembleVintfTest,DeviceFrameworkMatrixRequired)438 TEST_F(AssembleVintfTest, DeviceFrameworkMatrixRequired) {
439     setFakeEnvs({{"POLICYVERS", "30"},
440                  {"PLATFORM_SEPOLICY_VERSION", "10000.0"},
441                  {"PLATFORM_SEPOLICY_COMPAT_VERSIONS", "26.0 27.0"},
442                  {"FRAMEWORK_VBMETA_VERSION", "1.0"},
443                  {"PRODUCT_ENFORCE_VINTF_MANIFEST", "true"}});
444     getInstance()->setCheckInputStream(makeStream(gEmptyOutManifest));
445 
446     addInput("compatibility_matrix.empty.xml",
447              "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
448              "    <hal format=\"hidl\" optional=\"false\">\n"
449              "        <name>vendor.foo.bar</name>\n"
450              "        <version>1.0</version>\n"
451              "        <interface>\n"
452              "            <name>IFoo</name>\n"
453              "            <instance>default</instance>\n"
454              "        </interface>\n"
455              "    </hal>\n"
456              "</compatibility-matrix>");
457 
458     EXPECT_FALSE(getInstance()->assemble());
459 }
460 
461 }  // namespace vintf
462 }  // namespace android
463