summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'test/AssembleVintfTest.cpp')
-rw-r--r--test/AssembleVintfTest.cpp360
1 files changed, 360 insertions, 0 deletions
diff --git a/test/AssembleVintfTest.cpp b/test/AssembleVintfTest.cpp
new file mode 100644
index 0000000..53a1d0d
--- /dev/null
+++ b/test/AssembleVintfTest.cpp
@@ -0,0 +1,360 @@
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
24namespace android {
25namespace vintf {
26
27static 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
32class AssembleVintfTest : public ::testing::Test {
33 public:
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 virtual void TearDown() override { mInstance = nullptr; }
41
42 const std::unique_ptr<AssembleVintf>& getInstance() { return mInstance; }
43
44 std::string getOutput() { return mOutputStream->str(); }
45
46 void resetOutput() { mOutputStream->str(""); }
47
48 void setFakeEnvs(const std::map<std::string, std::string>& envs) {
49 for (const auto& pair : envs) {
50 getInstance()->setFakeEnv(pair.first, pair.second);
51 }
52 }
53
54 void addInput(const std::string& name, const std::string& s) {
55 getInstance()->addInputStream(name, makeStream(s));
56 }
57
58 std::unique_ptr<std::stringstream> makeStream(const std::string& s) {
59 return std::make_unique<std::stringstream>(s);
60 }
61
62 std::unique_ptr<AssembleVintf> mInstance;
63 // do not own this object.
64 std::stringstream* mOutputStream;
65};
66
67TEST_F(AssembleVintfTest, FrameworkMatrixEmpty) {
68 std::string xmlEmpty = "<compatibility-matrix version=\"1.0\" type=\"framework\" />";
69 std::string kernel318 = "CONFIG_FOO=y\n";
70 std::string kernel318_64 = "CONFIG_BAR=y\n";
71 std::string kernel44 = "# CONFIG_FOO is not set\n";
72 std::string kernel44_64 = "CONFIG_BAR=y\n";
73
74 addInput("compatibility_matrix.empty.xml", xmlEmpty);
75 setFakeEnvs({
76 {"POLICYVERS", "30"},
77 {"BOARD_SEPOLICY_VERS", "10000.0"},
78 {"FRAMEWORK_VBMETA_VERSION", "1.0"},
79 });
80 getInstance()->addKernelConfigInputStream({3, 18}, "android-base.cfg", makeStream(kernel318));
81 getInstance()->addKernelConfigInputStream({3, 18}, "android-base-arm64.cfg",
82 makeStream(kernel318_64));
83 getInstance()->addKernelConfigInputStream({4, 4}, "android-base.cfg", makeStream(kernel44));
84 getInstance()->addKernelConfigInputStream({4, 4}, "android-base-arm64.cfg",
85 makeStream(kernel44_64));
86
87 EXPECT_TRUE(getInstance()->assemble());
88
89 EXPECT_IN(
90 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
91 " <kernel version=\"3.18.0\">\n"
92 " <config>\n"
93 " <key>CONFIG_FOO</key>\n"
94 " <value type=\"tristate\">y</value>\n"
95 " </config>\n"
96 " </kernel>\n"
97 " <kernel version=\"3.18.0\">\n"
98 " <conditions>\n"
99 " <config>\n"
100 " <key>CONFIG_ARM64</key>\n"
101 " <value type=\"tristate\">y</value>\n"
102 " </config>\n"
103 " </conditions>\n"
104 " <config>\n"
105 " <key>CONFIG_BAR</key>\n"
106 " <value type=\"tristate\">y</value>\n"
107 " </config>\n"
108 " </kernel>\n"
109 " <kernel version=\"4.4.0\">\n"
110 " <config>\n"
111 " <key>CONFIG_FOO</key>\n"
112 " <value type=\"tristate\">n</value>\n"
113 " </config>\n"
114 " </kernel>\n"
115 " <kernel version=\"4.4.0\">\n"
116 " <conditions>\n"
117 " <config>\n"
118 " <key>CONFIG_ARM64</key>\n"
119 " <value type=\"tristate\">y</value>\n"
120 " </config>\n"
121 " </conditions>\n"
122 " <config>\n"
123 " <key>CONFIG_BAR</key>\n"
124 " <value type=\"tristate\">y</value>\n"
125 " </config>\n"
126 " </kernel>\n"
127 " <sepolicy>\n"
128 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
129 " <sepolicy-version>10000.0</sepolicy-version>\n"
130 " </sepolicy>\n"
131 " <avb>\n"
132 " <vbmeta-version>1.0</vbmeta-version>\n"
133 " </avb>\n"
134 "</compatibility-matrix>\n",
135 getOutput());
136}
137
138TEST_F(AssembleVintfTest, FrameworkMatrix) {
139 std::string tail =
140 " <kernel version=\"3.18.0\">\n"
141 " <config>\n"
142 " <key>CONFIG_FOO</key>\n"
143 " <value type=\"tristate\">y</value>\n"
144 " </config>\n"
145 " </kernel>\n"
146 " <sepolicy>\n"
147 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
148 " <sepolicy-version>10000.0</sepolicy-version>\n"
149 " </sepolicy>\n"
150 " <avb>\n"
151 " <vbmeta-version>1.0</vbmeta-version>\n"
152 " </avb>\n"
153 "</compatibility-matrix>\n";
154
155 std::string xmlEmpty = "<compatibility-matrix version=\"1.0\" type=\"framework\">\n" + tail;
156
157 std::string xml1 =
158 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
159 " <hal format=\"hidl\" optional=\"true\">\n"
160 " <name>android.hardware.foo</name>\n"
161 " <version>1.0</version>\n"
162 " <interface>\n"
163 " <name>IFoo</name>\n"
164 " <instance>default</instance>\n"
165 " </interface>\n"
166 " </hal>\n"
167 "</compatibility-matrix>\n";
168
169 std::string xml2 =
170 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
171 " <hal format=\"hidl\" optional=\"true\">\n"
172 " <name>android.hardware.foo</name>\n"
173 " <version>1.0-1</version>\n"
174 " <interface>\n"
175 " <name>IFoo</name>\n"
176 " <instance>default</instance>\n"
177 " </interface>\n"
178 " </hal>\n"
179 "</compatibility-matrix>\n";
180
181 std::string xml3 =
182 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"3\">\n"
183 " <hal format=\"hidl\" optional=\"false\">\n"
184 " <name>android.hardware.foo</name>\n"
185 " <version>2.0</version>\n"
186 " <interface>\n"
187 " <name>IFoo</name>\n"
188 " <instance>default</instance>\n"
189 " </interface>\n"
190 " </hal>\n"
191 "</compatibility-matrix>\n";
192
193 auto manifest = [](size_t level) {
194 return "<manifest version=\"1.0\" type=\"device\" target-level=\"" + std::to_string(level) +
195 "\">\n" +
196 " <hal format=\"hidl\">\n"
197 " <name>android.hardware.foo</name>\n"
198 " <version>1.1</version>\n"
199 " <transport>hwbinder</transport>\n"
200 " <interface>\n"
201 " <name>IFoo</name>\n"
202 " <instance>default</instance>\n"
203 " </interface>\n"
204 " </hal>\n"
205 " <hal format=\"hidl\">\n"
206 " <name>android.hardware.foo</name>\n"
207 " <version>2.0</version>\n"
208 " <transport>hwbinder</transport>\n"
209 " <interface>\n"
210 " <name>IFoo</name>\n"
211 " <instance>default</instance>\n"
212 " </interface>\n"
213 " </hal>\n"
214 " <sepolicy>\n"
215 " <version>10000.0</version>\n"
216 " </sepolicy>\n"
217 "</manifest>\n";
218 };
219
220 addInput("compatibility_matrix.1.xml", xml1);
221 addInput("compatibility_matrix.2.xml", xml2);
222 addInput("compatibility_matrix.3.xml", xml3);
223 addInput("compatibility_matrix.empty.xml", xmlEmpty);
224 getInstance()->setFakeEnv("PRODUCT_ENFORCE_VINTF_MANIFEST", "true");
225
226 resetOutput();
227 getInstance()->setCheckInputStream(makeStream(manifest(1)));
228 EXPECT_TRUE(getInstance()->assemble());
229 EXPECT_IN(
230 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
231 " <hal format=\"hidl\" optional=\"true\">\n"
232 " <name>android.hardware.foo</name>\n"
233 " <version>1.0-1</version>\n"
234 " <interface>\n"
235 " <name>IFoo</name>\n"
236 " <instance>default</instance>\n"
237 " </interface>\n"
238 " </hal>\n"
239 " <hal format=\"hidl\" optional=\"true\">\n"
240 " <name>android.hardware.foo</name>\n"
241 " <version>2.0</version>\n"
242 " <interface>\n"
243 " <name>IFoo</name>\n"
244 " <instance>default</instance>\n"
245 " </interface>\n"
246 " </hal>\n" +
247 tail,
248 getOutput());
249
250 resetOutput();
251 getInstance()->setCheckInputStream(makeStream(manifest(2)));
252 EXPECT_TRUE(getInstance()->assemble());
253 EXPECT_IN(
254 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
255 " <hal format=\"hidl\" optional=\"true\">\n"
256 " <name>android.hardware.foo</name>\n"
257 " <version>1.0-1</version>\n"
258 " <interface>\n"
259 " <name>IFoo</name>\n"
260 " <instance>default</instance>\n"
261 " </interface>\n"
262 " </hal>\n"
263 " <hal format=\"hidl\" optional=\"true\">\n"
264 " <name>android.hardware.foo</name>\n"
265 " <version>2.0</version>\n"
266 " <interface>\n"
267 " <name>IFoo</name>\n"
268 " <instance>default</instance>\n"
269 " </interface>\n"
270 " </hal>\n" +
271 tail,
272 getOutput());
273
274 resetOutput();
275 getInstance()->setCheckInputStream(makeStream(manifest(3)));
276 EXPECT_TRUE(getInstance()->assemble());
277 EXPECT_IN(
278 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"3\">\n"
279 " <hal format=\"hidl\" optional=\"false\">\n"
280 " <name>android.hardware.foo</name>\n"
281 " <version>2.0</version>\n"
282 " <interface>\n"
283 " <name>IFoo</name>\n"
284 " <instance>default</instance>\n"
285 " </interface>\n"
286 " </hal>\n" +
287 tail,
288 getOutput());
289}
290
291TEST_F(AssembleVintfTest, MatrixVendorNdk) {
292 addInput("compatibility_matrix.xml",
293 "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n");
294 getInstance()->setFakeEnv("REQUIRED_VNDK_VERSION", "P");
295 EXPECT_TRUE(getInstance()->assemble());
296 EXPECT_IN(
297 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
298 " <vendor-ndk>\n"
299 " <version>P</version>\n"
300 " </vendor-ndk>\n"
301 "</compatibility-matrix>\n",
302 getOutput());
303}
304
305TEST_F(AssembleVintfTest, ManifestVendorNdk) {
306 addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n");
307 getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 ");
308 EXPECT_TRUE(getInstance()->assemble());
309 EXPECT_IN(
310 "<manifest version=\"1.0\" type=\"framework\">\n"
311 " <vendor-ndk>\n"
312 " <version>P</version>\n"
313 " </vendor-ndk>\n"
314 " <vendor-ndk>\n"
315 " <version>26</version>\n"
316 " </vendor-ndk>\n"
317 " <vendor-ndk>\n"
318 " <version>27</version>\n"
319 " </vendor-ndk>\n"
320 "</manifest>\n",
321 getOutput());
322}
323
324TEST_F(AssembleVintfTest, VendorNdkCheckEmpty) {
325 addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n");
326 getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 ");
327
328 std::string matrix = "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n";
329 getInstance()->setCheckInputStream(makeStream(matrix));
330 EXPECT_TRUE(getInstance()->assemble());
331}
332
333TEST_F(AssembleVintfTest, VendorNdkCheckIncompat) {
334 addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n");
335 getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 ");
336 std::string matrix =
337 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
338 " <vendor-ndk>\n"
339 " <version>O</version>\n"
340 " </vendor-ndk>\n"
341 "</compatibility-matrix>\n";
342 getInstance()->setCheckInputStream(makeStream(matrix));
343 EXPECT_FALSE(getInstance()->assemble());
344}
345
346TEST_F(AssembleVintfTest, VendorNdkCheckCompat) {
347 addInput("manifest.xml", "<manifest version=\"1.0\" type=\"framework\"/>\n");
348 getInstance()->setFakeEnv("PROVIDED_VNDK_VERSIONS", "P 26 27 ");
349 std::string matrix =
350 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
351 " <vendor-ndk>\n"
352 " <version>27</version>\n"
353 " </vendor-ndk>\n"
354 "</compatibility-matrix>\n";
355 getInstance()->setCheckInputStream(makeStream(matrix));
356 EXPECT_TRUE(getInstance()->assemble());
357}
358
359} // namespace vintf
360} // namespace android