blob: d8cfaf395f8424924a26651acb878482af5ed697 [file] [log] [blame]
Yifan Hong676447a2016-11-15 12:57:23 -08001/*
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 "LibHidlTest"
18
Yifan Hongd8cee082017-07-05 16:06:09 -070019#include <algorithm>
Yifan Hong398f4c72017-04-13 20:18:01 -070020#include <functional>
21
Yifan Hongd8cee082017-07-05 16:06:09 -070022#include <vintf/CompatibilityMatrix.h>
23#include <vintf/KernelConfigParser.h>
24#include <vintf/VintfObject.h>
Yifan Hong676447a2016-11-15 12:57:23 -080025#include <vintf/parse_string.h>
26#include <vintf/parse_xml.h>
Yifan Hong676447a2016-11-15 12:57:23 -080027
28#include <android-base/logging.h>
Yifan Hong3f5489a2017-02-08 11:14:21 -080029#include <android-base/parseint.h>
Yifan Hong676447a2016-11-15 12:57:23 -080030#include <gtest/gtest.h>
31
Yifan Honga9993572017-01-24 19:33:15 -080032namespace android {
33namespace vintf {
Yifan Hong676447a2016-11-15 12:57:23 -080034
Yifan Hong4a5eb7b2017-02-16 18:19:26 -080035extern const XmlConverter<Version> &gVersionConverter;
Yifan Hong037f12a2017-03-06 19:11:48 -080036extern const XmlConverter<ManifestHal> &gManifestHalConverter;
Yifan Hong4a5eb7b2017-02-16 18:19:26 -080037extern const XmlConverter<MatrixHal> &gMatrixHalConverter;
38extern const XmlConverter<KernelConfigTypedValue> &gKernelConfigTypedValueConverter;
Yifan Hongd2b7e642017-02-17 10:15:32 -080039extern const XmlConverter<HalManifest> &gHalManifestConverter;
Yifan Hong4a5eb7b2017-02-16 18:19:26 -080040extern const XmlConverter<CompatibilityMatrix> &gCompatibilityMatrixConverter;
41
Yifan Hongd9e46432017-08-15 17:14:52 -070042static bool Contains(const std::string& str, const std::string& sub) {
43 return str.find(sub) != std::string::npos;
44}
45#define EXPECT_CONTAINS(str, sub) \
46 EXPECT_TRUE(Contains((str), (sub))) << "Cannot find \"" << (sub) << "\" in \"" << (str) << "\""
47
Yifan Honga9993572017-01-24 19:33:15 -080048struct LibVintfTest : public ::testing::Test {
Yifan Hong676447a2016-11-15 12:57:23 -080049public:
50 virtual void SetUp() override {
51 }
52 virtual void TearDown() override {
53 }
Yifan Honga9993572017-01-24 19:33:15 -080054 bool add(CompatibilityMatrix &cm, MatrixHal &&hal) {
55 return cm.add(std::move(hal));
56 }
57 bool add(CompatibilityMatrix &cm, MatrixKernel &&kernel) {
58 return cm.add(std::move(kernel));
59 }
Yifan Hongd2b7e642017-02-17 10:15:32 -080060 bool add(HalManifest &vm, ManifestHal &&hal) {
Yifan Honga9993572017-01-24 19:33:15 -080061 return vm.add(std::move(hal));
62 }
Yifan Hongd4857902017-06-13 14:13:56 -070063 void addXmlFile(CompatibilityMatrix& cm, std::string name, VersionRange range) {
64 MatrixXmlFile f;
65 f.mName = name;
66 f.mVersionRange = range;
67 f.mFormat = XmlSchemaFormat::DTD;
68 f.mOptional = true;
69 cm.addXmlFile(std::move(f));
70 }
Yifan Hong558380a2017-02-09 15:37:32 -080071 void set(CompatibilityMatrix &cm, Sepolicy &&sepolicy) {
Yifan Hong7c7d7062017-04-04 16:26:51 -070072 cm.framework.mSepolicy = sepolicy;
Yifan Hong558380a2017-02-09 15:37:32 -080073 }
Yifan Hong03d2d4a2017-04-12 17:34:14 -070074 void set(CompatibilityMatrix &cm, SchemaType type) {
75 cm.mType = type;
76 }
77 void set(CompatibilityMatrix &cm, VndkVersionRange &&range, std::set<std::string> &&libs) {
78 cm.device.mVndk.mVersionRange = range;
79 cm.device.mVndk.mLibraries = libs;
80 }
Yifan Hong881a9e452017-04-27 19:31:13 -070081 void setAvb(RuntimeInfo &ki, Version vbmeta, Version boot) {
82 ki.mBootVbmetaAvbVersion = vbmeta;
83 ki.mBootAvbVersion = boot;
Yifan Hongf3029302017-04-12 17:23:49 -070084 }
85 void setAvb(CompatibilityMatrix &cm, Version &&avbVersion) {
86 cm.framework.mAvbMetaVersion = avbVersion;
87 }
Yifan Hong19e0a2a2017-04-14 17:30:53 -070088 Version getAvb(CompatibilityMatrix &cm) {
89 return cm.framework.mAvbMetaVersion;
90 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070091 const ManifestHal *getAnyHal(HalManifest &vm, const std::string &name) {
92 return vm.getAnyHal(name);
Yifan Honga9993572017-01-24 19:33:15 -080093 }
Yifan Hongd0cbf1f2017-04-12 19:47:06 -070094 MatrixHal *getAnyHal(CompatibilityMatrix &cm, const std::string &name) {
95 return cm.getAnyHal(name);
96 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070097 ConstMultiMapValueIterable<std::string, ManifestHal> getHals(HalManifest &vm) {
Yifan Honga9993572017-01-24 19:33:15 -080098 return vm.getHals();
99 }
Yifan Hong5a06ef72017-01-24 19:54:24 -0800100 bool isValid(const ManifestHal &mh) {
101 return mh.isValid();
102 }
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700103
104 std::map<std::string, HalInterface> testHalInterfaces() {
105 HalInterface intf;
106 intf.name = "IFoo";
107 intf.instances.insert("default");
108 std::map<std::string, HalInterface> map;
109 map[intf.name] = intf;
110 return map;
111 }
112
Yifan Honga04e1472017-04-05 13:15:34 -0700113 HalManifest testDeviceManifest() {
Yifan Hongd2b7e642017-02-17 10:15:32 -0800114 HalManifest vm;
Yifan Hong7c7d7062017-04-04 16:26:51 -0700115 vm.mType = SchemaType::DEVICE;
Yifan Hong2a3dd082017-04-04 17:15:35 -0700116 vm.device.mSepolicyVersion = {25, 0};
Yifan Hong2059ffc2017-02-24 11:32:02 -0800117 vm.add(ManifestHal{
118 .format = HalFormat::HIDL,
119 .name = "android.hardware.camera",
120 .versions = {Version(2, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800121 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800122 .interfaces = {
123 {"ICamera", {"ICamera", {"legacy/0", "default"}}},
124 {"IBetterCamera", {"IBetterCamera", {"camera"}}}
125 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800126 });
127 vm.add(ManifestHal{
128 .format = HalFormat::HIDL,
129 .name = "android.hardware.nfc",
130 .versions = {Version(1, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800131 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800132 .interfaces = {
133 {"INfc", {"INfc", {"default"}}}
134 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800135 });
Yifan Honga9993572017-01-24 19:33:15 -0800136
137 return vm;
138 }
Yifan Hongd4857902017-06-13 14:13:56 -0700139 HalManifest testDeviceManifestWithXmlFile() {
140 HalManifest vm = testDeviceManifest();
141 ManifestXmlFile xmlFile;
142 xmlFile.mName = "media_profile";
143 xmlFile.mVersion = {1, 0};
144 vm.addXmlFile(std::move(xmlFile));
145 return vm;
146 }
Yifan Honga04e1472017-04-05 13:15:34 -0700147 HalManifest testFrameworkManfiest() {
148 HalManifest vm;
149 vm.mType = SchemaType::FRAMEWORK;
150 vm.add(ManifestHal{
151 .format = HalFormat::HIDL,
152 .name = "android.hidl.manager",
153 .versions = {Version(1, 0)},
154 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
155 .interfaces = {
156 {"IServiceManager", {"IServiceManager", {"default"}}},
157 }
158 });
159 Vndk vndk2505;
160 vndk2505.mVersionRange = {25, 0, 5};
161 vndk2505.mLibraries = { "libjpeg.so", "libbase.so" };
162 Vndk vndk2513;
163 vndk2513.mVersionRange = {25, 1, 3};
164 vndk2513.mLibraries = { "libjpeg.so", "libbase.so", "libtinyxml2.so" };
165 vm.framework.mVndks = { std::move(vndk2505), std::move(vndk2513) };
166
167 return vm;
168 }
Yifan Honga7201e72017-02-17 10:09:59 -0800169 RuntimeInfo testRuntimeInfo() {
170 RuntimeInfo info;
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800171 info.mOsName = "Linux";
172 info.mNodeName = "localhost";
173 info.mOsRelease = "3.18.31-g936f9a479d0f";
174 info.mKernelVersion = {3, 18, 31};
175 info.mOsVersion = "#4 SMP PREEMPT Wed Feb 1 18:10:52 PST 2017";
176 info.mHardwareId = "aarch64";
177 info.mKernelSepolicyVersion = 30;
Yifan Hongf1af7522017-02-16 18:00:55 -0800178 info.mKernelConfigs = {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800179 {"CONFIG_64BIT", "y"},
180 {"CONFIG_ANDROID_BINDER_DEVICES", "\"binder,hwbinder\""},
181 {"CONFIG_ARCH_MMAP_RND_BITS", "24"},
182 {"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", "\"\""},
183 {"CONFIG_ILLEGAL_POINTER_VALUE", "0xdead000000000000"}
184 };
Yifan Hong881a9e452017-04-27 19:31:13 -0700185 setAvb(info, {2, 1}, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800186 return info;
187 }
Yifan Hong676447a2016-11-15 12:57:23 -0800188};
189
Yifan Hongd5cd0482017-06-19 12:25:48 -0700190TEST_F(LibVintfTest, ArchOperatorOr) {
191 Arch a = Arch::ARCH_EMPTY;
192 a |= Arch::ARCH_32;
193 EXPECT_EQ(Arch::ARCH_32, a);
194
195 a |= Arch::ARCH_64;
196 EXPECT_EQ(Arch::ARCH_32_64, a);
197
198 a = Arch::ARCH_EMPTY;
199 a |= Arch::ARCH_64;
200 EXPECT_EQ(Arch::ARCH_64, a);
201}
Yifan Hongef6d4d32017-01-23 14:12:28 -0800202
203TEST_F(LibVintfTest, Stringify) {
Yifan Honga04e1472017-04-05 13:15:34 -0700204 HalManifest vm = testDeviceManifest();
Yifan Hong974ad9c2017-04-04 15:37:39 -0700205 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/2.0:"
206 "hidl/android.hardware.nfc/passthrough32+64/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -0800207
208 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
209 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
210
211 VersionRange v(1, 2, 3);
212 EXPECT_EQ(to_string(v), "1.2-3");
213 VersionRange v2;
214 EXPECT_TRUE(parse("1.2-3", &v2));
215 EXPECT_EQ(v, v2);
216}
217
Yifan Hong9bbdb282017-04-12 21:53:59 -0700218TEST_F(LibVintfTest, GetTransport) {
219 HalManifest vm = testDeviceManifest();
220 EXPECT_EQ(Transport::HWBINDER, vm.getTransport("android.hardware.camera",
221 {2, 0}, "ICamera", "default"));
222}
223
Yifan Hongd2b7e642017-02-17 10:15:32 -0800224TEST_F(LibVintfTest, HalManifestConverter) {
Yifan Honga04e1472017-04-05 13:15:34 -0700225 HalManifest vm = testDeviceManifest();
Yifan Hongd2b7e642017-02-17 10:15:32 -0800226 std::string xml = gHalManifestConverter(vm);
Yifan Hong676447a2016-11-15 12:57:23 -0800227 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700228 "<manifest version=\"1.0\" type=\"device\">\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800229 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800230 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800231 " <transport>hwbinder</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800232 " <version>2.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800233 " <interface>\n"
234 " <name>IBetterCamera</name>\n"
235 " <instance>camera</instance>\n"
236 " </interface>\n"
237 " <interface>\n"
238 " <name>ICamera</name>\n"
239 " <instance>default</instance>\n"
240 " <instance>legacy/0</instance>\n"
241 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800242 " </hal>\n"
243 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800244 " <name>android.hardware.nfc</name>\n"
Yifan Hongc54d32c2017-03-07 19:12:26 -0800245 " <transport arch=\"32+64\">passthrough</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800246 " <version>1.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800247 " <interface>\n"
248 " <name>INfc</name>\n"
249 " <instance>default</instance>\n"
250 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800251 " </hal>\n"
Yifan Hong2a3dd082017-04-04 17:15:35 -0700252 " <sepolicy>\n"
253 " <version>25.0</version>\n"
254 " </sepolicy>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800255 "</manifest>\n");
Yifan Hongfb7469c2017-04-05 19:15:21 -0700256 HalManifest vm2;
257 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
258 EXPECT_EQ(vm, vm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800259}
260
Yifan Honga04e1472017-04-05 13:15:34 -0700261TEST_F(LibVintfTest, HalManifestConverterFramework) {
262 HalManifest vm = testFrameworkManfiest();
263 std::string xml = gHalManifestConverter(vm);
264 EXPECT_EQ(xml,
265 "<manifest version=\"1.0\" type=\"framework\">\n"
266 " <hal format=\"hidl\">\n"
267 " <name>android.hidl.manager</name>\n"
268 " <transport>hwbinder</transport>\n"
269 " <version>1.0</version>\n"
270 " <interface>\n"
271 " <name>IServiceManager</name>\n"
272 " <instance>default</instance>\n"
273 " </interface>\n"
274 " </hal>\n"
275 " <vndk>\n"
276 " <version>25.0.5</version>\n"
277 " <library>libbase.so</library>\n"
278 " <library>libjpeg.so</library>\n"
279 " </vndk>\n"
280 " <vndk>\n"
281 " <version>25.1.3</version>\n"
282 " <library>libbase.so</library>\n"
283 " <library>libjpeg.so</library>\n"
284 " <library>libtinyxml2.so</library>\n"
285 " </vndk>\n"
286 "</manifest>\n");
287 HalManifest vm2;
288 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700289 EXPECT_EQ(vm, vm2);
Yifan Honga04e1472017-04-05 13:15:34 -0700290}
291
Yifan Hong8e9c6692017-02-28 14:07:42 -0800292TEST_F(LibVintfTest, HalManifestOptional) {
293 HalManifest vm;
294 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700295 "<manifest version=\"1.0\" type=\"device\"></manifest>"));
Yifan Hong8e9c6692017-02-28 14:07:42 -0800296 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700297 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800298 " <hal>"
299 " <name>android.hidl.manager</name>"
300 " <transport>hwbinder</transport>"
301 " <version>1.0</version>"
302 " </hal>"
303 "</manifest>"));
304 EXPECT_FALSE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700305 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800306 " <hal>"
307 " <name>android.hidl.manager</name>"
308 " <version>1.0</version>"
309 " </hal>"
310 "</manifest>"));
311}
312
Yifan Honge0bb98d2017-08-07 14:40:19 -0700313TEST_F(LibVintfTest, HalManifestNative) {
314 HalManifest vm;
315 EXPECT_TRUE(gHalManifestConverter(&vm,
316 "<manifest version=\"1.0\" type=\"device\">"
317 " <hal format=\"native\">"
318 " <name>foo</name>"
319 " <version>1.0</version>"
320 " </hal>"
321 "</manifest>"))
322 << gHalManifestConverter.lastError();
323 EXPECT_FALSE(gHalManifestConverter(&vm,
324 "<manifest version=\"1.0\" type=\"device\">"
325 " <hal format=\"native\">"
326 " <name>foo</name>"
327 " <version>1.0</version>"
328 " <transport>hwbinder</transport>"
329 " </hal>"
330 "</manifest>"));
331 EXPECT_TRUE(gHalManifestConverter.lastError().find(
332 "Native HAL 'foo' should not have <transport> defined") != std::string::npos);
333}
334
Yifan Hong79dcc1f2017-05-22 14:35:19 -0700335TEST_F(LibVintfTest, HalManifestDuplicate) {
336 HalManifest vm;
337 EXPECT_FALSE(gHalManifestConverter(&vm,
338 "<manifest version=\"1.0\" type=\"device\">"
339 " <hal>"
340 " <name>android.hidl.manager</name>"
341 " <transport>hwbinder</transport>"
342 " <version>1.0</version>"
343 " <version>1.1</version>"
344 " </hal>"
345 "</manifest>"))
346 << "Should not allow duplicated major version in <hal>";
347 EXPECT_FALSE(gHalManifestConverter(&vm,
348 "<manifest version=\"1.0\" type=\"device\">"
349 " <hal>"
350 " <name>android.hidl.manager</name>"
351 " <transport>hwbinder</transport>"
352 " <version>1.0</version>"
353 " </hal>"
354 " <hal>"
355 " <name>android.hidl.manager</name>"
356 " <transport arch=\"32+64\">passthrough</transport>"
357 " <version>1.1</version>"
358 " </hal>"
359 "</manifest>"))
360 << "Should not allow duplicated major version across <hal>";
361}
362
363TEST_F(LibVintfTest, HalManifestGetTransport) {
364 HalManifest vm;
365 EXPECT_TRUE(gHalManifestConverter(&vm,
366 "<manifest version=\"1.0\" type=\"device\">"
367 " <hal>"
368 " <name>android.hidl.manager</name>"
369 " <transport>hwbinder</transport>"
370 " <version>1.0</version>"
371 " <interface>"
372 " <name>IServiceManager</name>"
373 " <instance>default</instance>"
374 " </interface>"
375 " </hal>"
376 " <hal>"
377 " <name>android.hidl.manager</name>"
378 " <transport arch=\"32+64\">passthrough</transport>"
379 " <version>2.1</version>"
380 " <interface>"
381 " <name>IServiceManager</name>"
382 " <instance>default</instance>"
383 " </interface>"
384 " </hal>"
385 "</manifest>"));
386 EXPECT_EQ(Transport::PASSTHROUGH,
387 vm.getTransport("android.hidl.manager", {2, 1}, "IServiceManager", "default"));
388 EXPECT_EQ(Transport::PASSTHROUGH,
389 vm.getTransport("android.hidl.manager", {2, 0}, "IServiceManager", "default"));
390 EXPECT_EQ(Transport::EMPTY,
391 vm.getTransport("android.hidl.manager", {2, 2}, "IServiceManager", "default"));
392 EXPECT_EQ(Transport::HWBINDER,
393 vm.getTransport("android.hidl.manager", {1, 0}, "IServiceManager", "default"));
394}
395
Yifan Hongec3b9b72017-02-23 13:24:42 -0800396TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700397 HalManifest vm = testDeviceManifest();
Yifan Hongec3b9b72017-02-23 13:24:42 -0800398 EXPECT_EQ(vm.getInstances("android.hardware.camera", "ICamera"),
399 std::set<std::string>({"default", "legacy/0"}));
400 EXPECT_EQ(vm.getInstances("android.hardware.camera", "IBetterCamera"),
401 std::set<std::string>({"camera"}));
402 EXPECT_EQ(vm.getInstances("android.hardware.camera", "INotExist"),
Yifan Hong9bbdb282017-04-12 21:53:59 -0700403 std::set<std::string>({}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800404 EXPECT_EQ(vm.getInstances("android.hardware.nfc", "INfc"),
405 std::set<std::string>({"default"}));
406
407 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "default"));
408 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "legacy/0"));
409 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "camera"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800410 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", "INfc", "default"));
411
Yifan Hong9bbdb282017-04-12 21:53:59 -0700412 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800413 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "ICamera", "notexist"));
414 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "default"));
415 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "notexist"));
416 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", "INfc", "notexist"));
417}
418
Yifan Hong676447a2016-11-15 12:57:23 -0800419TEST_F(LibVintfTest, VersionConverter) {
420 Version v(3, 6);
421 std::string xml = gVersionConverter(v);
422 EXPECT_EQ(xml, "<version>3.6</version>\n");
423 Version v2;
424 EXPECT_TRUE(gVersionConverter(&v2, xml));
425 EXPECT_EQ(v, v2);
426}
427
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700428static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
429 std::string name{intf.name};
430 return map->emplace(std::move(name), std::move(intf)).second;
431}
432
Yifan Hong676447a2016-11-15 12:57:23 -0800433TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800434 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800435 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700436 false /* optional */, {}};
437 EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
438 EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800439 std::string xml = gMatrixHalConverter(mh);
440 EXPECT_EQ(xml,
441 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800442 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800443 " <version>1.2-3</version>\n"
444 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700445 " <interface>\n"
446 " <name>IBetterCamera</name>\n"
447 " <instance>default</instance>\n"
448 " <instance>great</instance>\n"
449 " </interface>\n"
450 " <interface>\n"
451 " <name>ICamera</name>\n"
452 " <instance>default</instance>\n"
453 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800454 "</hal>\n");
455 MatrixHal mh2;
456 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
457 EXPECT_EQ(mh, mh2);
458}
459
Yifan Hong3f5489a2017-02-08 11:14:21 -0800460TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
461
462 KernelConfigTypedValue converted;
463
464 auto testOne = [] (const KernelConfigTypedValue &original,
465 const std::string &expectXml) {
466 std::string xml;
467 KernelConfigTypedValue converted;
468 xml = gKernelConfigTypedValueConverter(original);
469 EXPECT_EQ(xml, expectXml);
470 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
471 EXPECT_EQ(original, converted);
472 };
473
474 auto testParse = [] (const KernelConfigTypedValue &original,
475 const std::string &xml) {
476 KernelConfigTypedValue converted;
477 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
478 EXPECT_EQ(original, converted);
479 };
480
481 testOne(KernelConfigTypedValue("stringvalue"),
482 "<value type=\"string\">stringvalue</value>\n");
483 testOne(KernelConfigTypedValue(""),
484 "<value type=\"string\"></value>\n");
485
486 testOne(KernelConfigTypedValue(Tristate::YES),
487 "<value type=\"tristate\">y</value>\n");
488 testOne(KernelConfigTypedValue(Tristate::NO),
489 "<value type=\"tristate\">n</value>\n");
490 testOne(KernelConfigTypedValue(Tristate::MODULE),
491 "<value type=\"tristate\">m</value>\n");
492 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
493 "<value type=\"tristate\">q</value>\n"));
494
495 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
496 "<value type=\"range\">4-20</value>\n");
497 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
498 "<value type=\"range\">0-18446744073709551615</value>\n");
499 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
500 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
501
502 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
503 "<value type=\"int\">-18446744073709551616</value>\n"));
504
505 testOne(KernelConfigTypedValue(INT64_MIN),
506 "<value type=\"int\">-9223372036854775808</value>\n");
507 testParse(KernelConfigTypedValue(INT64_MIN),
508 "<value type=\"int\">0x8000000000000000</value>\n");
509 testParse(KernelConfigTypedValue(INT64_MIN),
510 "<value type=\"int\">-0X8000000000000000</value>\n");
511
512 testParse(KernelConfigTypedValue(INT64_MIN + 1),
513 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
514
515 testParse(KernelConfigTypedValue(-0x50),
516 "<value type=\"int\">-0x50</value>\n");
517
518 testOne(KernelConfigTypedValue(0),
519 "<value type=\"int\">0</value>\n");
520
521 // Truncation for underflow.
522 testParse(KernelConfigTypedValue(1),
523 "<value type=\"int\">-0xffffffffffffffff</value>\n");
524 testParse(KernelConfigTypedValue(1),
525 "<value type=\"int\">-18446744073709551615</value>\n");
526
527 testOne(KernelConfigTypedValue(INT64_MAX),
528 "<value type=\"int\">9223372036854775807</value>\n");
529 testParse(KernelConfigTypedValue(INT64_MAX),
530 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
531 // Truncation for underflow.
532 testParse(KernelConfigTypedValue(INT64_MAX),
533 "<value type=\"int\">-9223372036854775809</value>\n");
534
535 testParse(KernelConfigTypedValue(-1),
536 "<value type=\"int\">18446744073709551615</value>\n");
537 testParse(KernelConfigTypedValue(-1),
538 "<value type=\"int\">0xffffffffffffffff</value>\n");
539
540 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
541 "<value type=\"int\">18446744073709551616</value>\n"));
542}
543
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700544TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
Yifan Hong676447a2016-11-15 12:57:23 -0800545 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800546 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800547 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700548 false /* optional */, testHalInterfaces()}));
Yifan Honga9993572017-01-24 19:33:15 -0800549 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800550 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700551 true /* optional */, testHalInterfaces()}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800552 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
553 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
554 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
555 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700556 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700557 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800558 std::string xml = gCompatibilityMatrixConverter(cm);
559 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700560 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800561 " <hal format=\"native\" optional=\"false\">\n"
562 " <name>android.hardware.camera</name>\n"
563 " <version>1.2-3</version>\n"
564 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700565 " <interface>\n"
566 " <name>IFoo</name>\n"
567 " <instance>default</instance>\n"
568 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800569 " </hal>\n"
570 " <hal format=\"native\" optional=\"true\">\n"
571 " <name>android.hardware.nfc</name>\n"
572 " <version>4.5-6</version>\n"
573 " <version>10.11-12</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700574 " <interface>\n"
575 " <name>IFoo</name>\n"
576 " <instance>default</instance>\n"
577 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800578 " </hal>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800579 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800580 " <config>\n"
581 " <key>CONFIG_FOO</key>\n"
582 " <value type=\"tristate\">y</value>\n"
583 " </config>\n"
584 " <config>\n"
585 " <key>CONFIG_BAR</key>\n"
586 " <value type=\"string\">stringvalue</value>\n"
587 " </config>\n"
588 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800589 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800590 " <config>\n"
591 " <key>CONFIG_BAZ</key>\n"
592 " <value type=\"int\">20</value>\n"
593 " </config>\n"
594 " <config>\n"
595 " <key>CONFIG_BAR</key>\n"
596 " <value type=\"range\">3-5</value>\n"
597 " </config>\n"
598 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800599 " <sepolicy>\n"
600 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700601 " <sepolicy-version>25.0</sepolicy-version>\n"
602 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800603 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700604 " <avb>\n"
605 " <vbmeta-version>2.1</vbmeta-version>\n"
606 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800607 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800608 CompatibilityMatrix cm2;
609 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700610 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800611}
612
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700613TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
614 CompatibilityMatrix cm;
615 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
616 {{VersionRange(1,0)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700617 false /* optional */, testHalInterfaces()}));
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700618 set(cm, SchemaType::DEVICE);
619 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
620 std::string xml = gCompatibilityMatrixConverter(cm);
621 EXPECT_EQ(xml,
622 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
623 " <hal format=\"native\" optional=\"false\">\n"
624 " <name>android.hidl.manager</name>\n"
625 " <version>1.0</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700626 " <interface>\n"
627 " <name>IFoo</name>\n"
628 " <instance>default</instance>\n"
629 " </interface>\n"
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700630 " </hal>\n"
631 " <vndk>\n"
632 " <version>25.0.1-5</version>\n"
633 " <library>libbase.so</library>\n"
634 " <library>libjpeg.so</library>\n"
635 " </vndk>\n"
636 "</compatibility-matrix>\n");
637 CompatibilityMatrix cm2;
638 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
639 EXPECT_EQ(cm, cm2);
640}
641
Yifan Hong676447a2016-11-15 12:57:23 -0800642TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800643 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800644
Yifan Hong2059ffc2017-02-24 11:32:02 -0800645 ManifestHal invalidHal{
646 .format = HalFormat::HIDL,
647 .name = "android.hardware.camera",
648 .versions = {{Version(2, 0), Version(2, 1)}},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800649 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64}
Yifan Hong2059ffc2017-02-24 11:32:02 -0800650 };
651
Yifan Hong5a06ef72017-01-24 19:54:24 -0800652 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800653 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800654 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800655}
656
Tri Vod0143942017-03-24 17:51:23 -0700657TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700658 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700659 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
660 {"android.hardware.camera", "android.hardware.nfc"}));
661}
662
663TEST_F(LibVintfTest, HalManifestGetInterfaceNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700664 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700665 EXPECT_EQ(vm.getInterfaceNames("android.hardware.camera"),
666 std::set<std::string>({"ICamera", "IBetterCamera"}));
667 EXPECT_EQ(vm.getInterfaceNames("android.hardware.nfc"),
668 std::set<std::string>({"INfc"}));
669}
670
Yifan Hongd2b7e642017-02-17 10:15:32 -0800671TEST_F(LibVintfTest, HalManifestGetHal) {
Yifan Honga04e1472017-04-05 13:15:34 -0700672 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700673 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
674 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800675
676 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
677 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800678 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800679 EXPECT_EQ(hal.name, arr[i++]);
680 }
681}
682
Yifan Honga7201e72017-02-17 10:09:59 -0800683TEST_F(LibVintfTest, RuntimeInfo) {
684 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800685 using KernelConfigs = std::vector<KernelConfig>;
686 const KernelConfigs configs {
687 KernelConfig{"CONFIG_64BIT", Tristate::YES},
688 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
689 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
690 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
691 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
692 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
693 };
694
695 auto testMatrix = [&] (MatrixKernel &&kernel) {
696 CompatibilityMatrix cm;
697 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700698 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700699 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800700 return cm;
701 };
702
703 std::string error;
704
705 {
706 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
707 CompatibilityMatrix cm = testMatrix(std::move(kernel));
708 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
709 }
710
711 {
712 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
713 CompatibilityMatrix cm = testMatrix(std::move(kernel));
714 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
715 }
716
717 {
718 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
719 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700720 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800721 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
722 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700723 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800724 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
725 << "kernel-sepolicy-version shouldn't match";
726 }
727
728 {
729 KernelConfigs newConfigs(configs);
730 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
731 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
732 CompatibilityMatrix cm = testMatrix(std::move(kernel));
733 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
734 }
735
736 {
737 KernelConfigs newConfigs(configs);
738 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
739 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
740 CompatibilityMatrix cm = testMatrix(std::move(kernel));
741 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
742 }
743
744 {
745 KernelConfigs newConfigs(configs);
746 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
747 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
748 CompatibilityMatrix cm = testMatrix(std::move(kernel));
749 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
750 }
751
752 {
753 KernelConfigs newConfigs(configs);
754 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
755 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
756 CompatibilityMatrix cm = testMatrix(std::move(kernel));
757 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
758 }
759
760 {
761 KernelConfigs newConfigs(configs);
762 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
763 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
764 CompatibilityMatrix cm = testMatrix(std::move(kernel));
765 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
766 }
Yifan Hongb4233162017-05-24 15:17:40 -0700767// TODO(b/38325029) enable avb check when avb version is injected to fwk matrix.
768#if 0
Yifan Hongf3029302017-04-12 17:23:49 -0700769 RuntimeInfo badAvb = testRuntimeInfo();
770 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
771 {
772 setAvb(badAvb, {1, 0}, {2, 1});
773 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
Michael Schwartz5cfbc922017-05-08 14:06:49 -0700774 EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
Yifan Hongf3029302017-04-12 17:23:49 -0700775 }
776 {
777 setAvb(badAvb, {2, 1}, {3, 0});
778 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
779 }
780 {
781 setAvb(badAvb, {2, 1}, {2, 3});
782 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
783 }
784 {
785 setAvb(badAvb, {2, 3}, {2, 1});
786 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
787 }
Yifan Hongb4233162017-05-24 15:17:40 -0700788#endif
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800789}
790
Yifan Hong19e0a2a2017-04-14 17:30:53 -0700791TEST_F(LibVintfTest, MissingAvb) {
792 std::string xml =
793 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
794 " <kernel version=\"3.18.31\"></kernel>"
795 " <sepolicy>\n"
796 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
797 " <sepolicy-version>25.5</sepolicy-version>\n"
798 " </sepolicy>\n"
799 "</compatibility-matrix>\n";
800 CompatibilityMatrix cm;
801 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
802 EXPECT_EQ(getAvb(cm), Version(0, 0));
803}
804
Yifan Hong08e984c2017-05-18 12:50:04 -0700805// This is the test extracted from VINTF Object doc
806TEST_F(LibVintfTest, HalCompat) {
807 CompatibilityMatrix matrix;
808 std::string error;
809
810 std::string matrixXml =
811 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
812 " <hal format=\"hidl\" optional=\"false\">\n"
813 " <name>android.hardware.foo</name>\n"
814 " <version>1.0</version>\n"
815 " <version>3.1-2</version>\n"
816 " <interface>\n"
817 " <name>IFoo</name>\n"
818 " <instance>default</instance>\n"
819 " <instance>specific</instance>\n"
820 " </interface>\n"
821 " </hal>\n"
822 " <hal format=\"hidl\" optional=\"false\">\n"
823 " <name>android.hardware.foo</name>\n"
824 " <version>2.0</version>\n"
825 " <interface>\n"
826 " <name>IBar</name>\n"
827 " <instance>default</instance>\n"
828 " </interface>\n"
829 " </hal>\n"
830 " <sepolicy>\n"
831 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
832 " <sepolicy-version>25.5</sepolicy-version>\n"
833 " </sepolicy>\n"
834 "</compatibility-matrix>\n";
835 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
836 << gCompatibilityMatrixConverter.lastError();
837
838 {
839 std::string manifestXml =
840 "<manifest version=\"1.0\" type=\"device\">\n"
841 " <hal format=\"hidl\">\n"
842 " <name>android.hardware.foo</name>\n"
843 " <transport>hwbinder</transport>\n"
844 " <version>1.0</version>\n"
845 " <interface>\n"
846 " <name>IFoo</name>\n"
847 " <instance>default</instance>\n"
848 " <instance>specific</instance>\n"
849 " </interface>\n"
850 " </hal>\n"
851 " <hal format=\"hidl\">\n"
852 " <name>android.hardware.foo</name>\n"
853 " <transport>hwbinder</transport>\n"
854 " <version>2.0</version>\n"
855 " <interface>\n"
856 " <name>IBar</name>\n"
857 " <instance>default</instance>\n"
858 " </interface>\n"
859 " </hal>\n"
860 " <sepolicy>\n"
861 " <version>25.5</version>\n"
862 " </sepolicy>\n"
863 "</manifest>\n";
864
865 HalManifest manifest;
866 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
867 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
868 }
869
870 {
871 std::string manifestXml =
872 "<manifest version=\"1.0\" type=\"device\">\n"
873 " <hal format=\"hidl\">\n"
874 " <name>android.hardware.foo</name>\n"
875 " <transport>hwbinder</transport>\n"
876 " <version>1.0</version>\n"
877 " <interface>\n"
878 " <name>IFoo</name>\n"
879 " <instance>default</instance>\n"
880 " <instance>specific</instance>\n"
881 " </interface>\n"
882 " </hal>\n"
883 " <sepolicy>\n"
884 " <version>25.5</version>\n"
885 " </sepolicy>\n"
886 "</manifest>\n";
887 HalManifest manifest;
888 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
889 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
890 << "should not be compatible because IBar is missing";
891 }
892
893 {
894 std::string manifestXml =
895 "<manifest version=\"1.0\" type=\"device\">\n"
896 " <hal format=\"hidl\">\n"
897 " <name>android.hardware.foo</name>\n"
898 " <transport>hwbinder</transport>\n"
899 " <version>1.0</version>\n"
900 " <interface>\n"
901 " <name>IFoo</name>\n"
902 " <instance>default</instance>\n"
903 " </interface>\n"
904 " </hal>\n"
905 " <hal format=\"hidl\">\n"
906 " <name>android.hardware.foo</name>\n"
907 " <transport>hwbinder</transport>\n"
908 " <version>2.0</version>\n"
909 " <interface>\n"
910 " <name>IBar</name>\n"
911 " <instance>default</instance>\n"
912 " </interface>\n"
913 " </hal>\n"
914 " <sepolicy>\n"
915 " <version>25.5</version>\n"
916 " </sepolicy>\n"
917 "</manifest>\n";
918 HalManifest manifest;
919 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
920 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
921 << "should not be compatible because IFoo/default is missing";
922 }
923
924 {
925 std::string manifestXml =
926 "<manifest version=\"1.0\" type=\"device\">\n"
927 " <hal format=\"hidl\">\n"
928 " <name>android.hardware.foo</name>\n"
929 " <transport>hwbinder</transport>\n"
930 " <version>3.3</version>\n"
931 " <interface>\n"
932 " <name>IFoo</name>\n"
933 " <instance>default</instance>\n"
934 " <instance>specific</instance>\n"
935 " </interface>\n"
936 " </hal>\n"
937 " <hal format=\"hidl\">\n"
938 " <name>android.hardware.foo</name>\n"
939 " <transport>hwbinder</transport>\n"
940 " <version>2.0</version>\n"
941 " <interface>\n"
942 " <name>IBar</name>\n"
943 " <instance>default</instance>\n"
944 " </interface>\n"
945 " </hal>\n"
946 " <sepolicy>\n"
947 " <version>25.5</version>\n"
948 " </sepolicy>\n"
949 "</manifest>\n";
950 HalManifest manifest;
951 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
952 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
953 }
954
955 {
956 std::string manifestXml =
957 "<manifest version=\"1.0\" type=\"device\">\n"
958 " <hal format=\"hidl\">\n"
959 " <name>android.hardware.foo</name>\n"
960 " <transport>hwbinder</transport>\n"
961 " <version>1.0</version>\n"
962 " <interface>\n"
963 " <name>IFoo</name>\n"
964 " <instance>default</instance>\n"
965 " </interface>\n"
966 " </hal>\n"
967 " <hal format=\"hidl\">\n"
968 " <name>android.hardware.foo</name>\n"
969 " <transport>hwbinder</transport>\n"
970 " <version>3.2</version>\n"
971 " <interface>\n"
972 " <name>IFoo</name>\n"
973 " <instance>specific</instance>\n"
974 " </interface>\n"
975 " </hal>\n"
976 " <hal format=\"hidl\">\n"
977 " <name>android.hardware.foo</name>\n"
978 " <transport>hwbinder</transport>\n"
979 " <version>2.0</version>\n"
980 " <interface>\n"
981 " <name>IBar</name>\n"
982 " <instance>default</instance>\n"
983 " </interface>\n"
984 " </hal>\n"
985 " <sepolicy>\n"
986 " <version>25.5</version>\n"
987 " </sepolicy>\n"
988 "</manifest>\n";
989 HalManifest manifest;
990 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
991 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
992 << "should not be compatible even though @1.0::IFoo/default "
993 << "and @3.2::IFoo/specific present";
994 }
995
996 {
997 std::string manifestXml =
998 "<manifest version=\"1.0\" type=\"device\">\n"
999 " <hal format=\"hidl\">\n"
1000 " <name>android.hardware.foo</name>\n"
1001 " <transport>hwbinder</transport>\n"
1002 " <version>1.0</version>\n"
1003 " <interface>\n"
1004 " <name>IFoo</name>\n"
1005 " <instance>default</instance>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001006 " <instance>specific</instance>\n"
1007 " </interface>\n"
1008 " </hal>\n"
1009 " <hal format=\"hidl\">\n"
1010 " <name>android.hardware.foo</name>\n"
1011 " <transport>hwbinder</transport>\n"
1012 " <version>2.0</version>\n"
1013 " <interface>\n"
1014 " <name>IBar</name>\n"
1015 " <instance>default</instance>\n"
1016 " </interface>\n"
1017 " </hal>\n"
1018 " <sepolicy>\n"
1019 " <version>25.5</version>\n"
1020 " </sepolicy>\n"
1021 "</manifest>\n";
1022 HalManifest manifest;
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001023 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml))
1024 << gHalManifestConverter.lastError();
1025 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
Yifan Hong08e984c2017-05-18 12:50:04 -07001026 }
1027}
1028
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001029TEST_F(LibVintfTest, Compat) {
1030 std::string manifestXml =
1031 "<manifest version=\"1.0\" type=\"device\">\n"
1032 " <hal format=\"hidl\">\n"
1033 " <name>android.hardware.camera</name>\n"
1034 " <transport>hwbinder</transport>\n"
1035 " <version>3.5</version>\n"
1036 " <interface>\n"
1037 " <name>IBetterCamera</name>\n"
1038 " <instance>camera</instance>\n"
1039 " </interface>\n"
1040 " <interface>\n"
1041 " <name>ICamera</name>\n"
1042 " <instance>default</instance>\n"
1043 " <instance>legacy/0</instance>\n"
1044 " </interface>\n"
1045 " </hal>\n"
1046 " <hal format=\"hidl\">\n"
1047 " <name>android.hardware.nfc</name>\n"
1048 " <transport>hwbinder</transport>\n"
1049 " <version>1.0</version>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001050 " <interface>\n"
1051 " <name>INfc</name>\n"
1052 " <instance>nfc_nci</instance>\n"
1053 " </interface>\n"
1054 " </hal>\n"
1055 " <hal format=\"hidl\">\n"
1056 " <name>android.hardware.nfc</name>\n"
1057 " <transport>hwbinder</transport>\n"
1058 " <version>2.0</version>\n"
1059 " <interface>\n"
1060 " <name>INfc</name>\n"
1061 " <instance>default</instance>\n"
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001062 " <instance>nfc_nci</instance>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001063 " </interface>\n"
1064 " </hal>\n"
1065 " <sepolicy>\n"
1066 " <version>25.5</version>\n"
1067 " </sepolicy>\n"
1068 "</manifest>\n";
1069
1070 std::string matrixXml =
1071 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1072 " <hal format=\"hidl\" optional=\"false\">\n"
1073 " <name>android.hardware.camera</name>\n"
1074 " <version>2.0-5</version>\n"
1075 " <version>3.4-16</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001076 " <interface>\n"
1077 " <name>IBetterCamera</name>\n"
1078 " <instance>camera</instance>\n"
1079 " </interface>\n"
1080 " <interface>\n"
1081 " <name>ICamera</name>\n"
1082 " <instance>default</instance>\n"
1083 " <instance>legacy/0</instance>\n"
1084 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001085 " </hal>\n"
1086 " <hal format=\"hidl\" optional=\"false\">\n"
1087 " <name>android.hardware.nfc</name>\n"
1088 " <version>1.0</version>\n"
1089 " <version>2.0</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001090 " <interface>\n"
1091 " <name>INfc</name>\n"
1092 " <instance>nfc_nci</instance>\n"
1093 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001094 " </hal>\n"
1095 " <hal format=\"hidl\" optional=\"true\">\n"
1096 " <name>android.hardware.foo</name>\n"
1097 " <version>1.0</version>\n"
1098 " </hal>\n"
1099 " <sepolicy>\n"
1100 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1101 " <sepolicy-version>25.5</sepolicy-version>\n"
1102 " <sepolicy-version>26.0-3</sepolicy-version>\n"
1103 " </sepolicy>\n"
1104 " <avb>\n"
1105 " <vbmeta-version>2.1</vbmeta-version>\n"
1106 " </avb>\n"
1107 "</compatibility-matrix>\n";
1108
1109 HalManifest manifest;
1110 CompatibilityMatrix matrix;
1111 std::string error;
1112 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1113 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1114 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1115
1116 // some smaller test cases
1117 matrixXml =
1118 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1119 " <hal format=\"hidl\" optional=\"false\">\n"
1120 " <name>android.hardware.camera</name>\n"
1121 " <version>3.4</version>\n"
1122 " </hal>\n"
1123 " <sepolicy>\n"
1124 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1125 " <sepolicy-version>25.5</sepolicy-version>\n"
1126 " </sepolicy>\n"
1127 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1128 "</compatibility-matrix>\n";
1129 matrix = {};
1130 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1131 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1132 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
1133 EXPECT_NE(camera, nullptr);
1134 camera->versionRanges[0] = {3, 5};
1135 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1136 camera->versionRanges[0] = {3, 6};
1137 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1138
1139 // reset it
1140 matrix = {};
1141 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1142 set(matrix, Sepolicy{30, {{26, 0}}});
1143 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1144 set(matrix, Sepolicy{30, {{25, 6}}});
1145 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1146 set(matrix, Sepolicy{30, {{25, 4}}});
1147 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1148}
1149
Yifan Hongd4857902017-06-13 14:13:56 -07001150/////////////////// xmlfile tests
1151
1152TEST_F(LibVintfTest, HalManifestConverterXmlFile) {
1153 HalManifest vm = testDeviceManifestWithXmlFile();
1154 std::string xml = gHalManifestConverter(vm);
1155 EXPECT_EQ(xml,
1156 "<manifest version=\"1.0\" type=\"device\">\n"
1157 " <hal format=\"hidl\">\n"
1158 " <name>android.hardware.camera</name>\n"
1159 " <transport>hwbinder</transport>\n"
1160 " <version>2.0</version>\n"
1161 " <interface>\n"
1162 " <name>IBetterCamera</name>\n"
1163 " <instance>camera</instance>\n"
1164 " </interface>\n"
1165 " <interface>\n"
1166 " <name>ICamera</name>\n"
1167 " <instance>default</instance>\n"
1168 " <instance>legacy/0</instance>\n"
1169 " </interface>\n"
1170 " </hal>\n"
1171 " <hal format=\"hidl\">\n"
1172 " <name>android.hardware.nfc</name>\n"
1173 " <transport arch=\"32+64\">passthrough</transport>\n"
1174 " <version>1.0</version>\n"
1175 " <interface>\n"
1176 " <name>INfc</name>\n"
1177 " <instance>default</instance>\n"
1178 " </interface>\n"
1179 " </hal>\n"
1180 " <sepolicy>\n"
1181 " <version>25.0</version>\n"
1182 " </sepolicy>\n"
1183 " <xmlfile>\n"
1184 " <name>media_profile</name>\n"
1185 " <version>1.0</version>\n"
1186 " </xmlfile>\n"
1187 "</manifest>\n");
1188 HalManifest vm2;
1189 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
1190 EXPECT_EQ(vm, vm2);
1191}
1192
1193TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile) {
1194 CompatibilityMatrix cm;
1195 addXmlFile(cm, "media_profile", {1, 0});
1196 std::string xml = gCompatibilityMatrixConverter(cm);
1197 EXPECT_EQ(xml,
1198 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1199 " <sepolicy>\n"
1200 " <kernel-sepolicy-version>0</kernel-sepolicy-version>\n"
1201 " </sepolicy>\n"
1202 " <avb>\n"
1203 " <vbmeta-version>0.0</vbmeta-version>\n"
1204 " </avb>\n"
1205 " <xmlfile format=\"dtd\" optional=\"true\">\n"
1206 " <name>media_profile</name>\n"
1207 " <version>1.0</version>\n"
1208 " </xmlfile>\n"
1209 "</compatibility-matrix>\n");
1210 CompatibilityMatrix cm2;
1211 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
1212 EXPECT_EQ(cm, cm2);
1213}
1214
1215TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile2) {
1216 std::string xml =
1217 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1218 " <xmlfile format=\"dtd\" optional=\"false\">\n"
1219 " <name>media_profile</name>\n"
1220 " <version>1.0</version>\n"
1221 " </xmlfile>\n"
1222 "</compatibility-matrix>\n";
1223 CompatibilityMatrix cm;
1224 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml));
1225 EXPECT_EQ(
1226 "compatibility-matrix.xmlfile entry media_profile has to be optional for "
1227 "compatibility matrix version 1.0",
1228 gCompatibilityMatrixConverter.lastError());
1229}
1230
Yifan Hongbbfff302017-06-06 17:10:13 -07001231TEST_F(LibVintfTest, ManifestXmlFilePathDevice) {
1232 std::string manifestXml =
1233 "<manifest version=\"1.0\" type=\"device\">"
1234 " <xmlfile>"
1235 " <name>media_profile</name>"
1236 " <version>1.0</version>"
1237 " </xmlfile>"
1238 "</manifest>";
1239 HalManifest manifest;
1240 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1241 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1242 "/vendor/etc/media_profile_V1_0.xml");
1243}
1244
1245TEST_F(LibVintfTest, ManifestXmlFilePathFramework) {
1246 std::string manifestXml =
1247 "<manifest version=\"1.0\" type=\"framework\">"
1248 " <xmlfile>"
1249 " <name>media_profile</name>"
1250 " <version>1.0</version>"
1251 " </xmlfile>"
1252 "</manifest>";
1253 HalManifest manifest;
1254 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1255 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1256 "/system/etc/media_profile_V1_0.xml");
1257}
1258
1259TEST_F(LibVintfTest, ManifestXmlFilePathOverride) {
1260 std::string manifestXml =
1261 "<manifest version=\"1.0\" type=\"device\">"
1262 " <xmlfile>"
1263 " <name>media_profile</name>"
1264 " <version>1.0</version>"
1265 " <path>/vendor/etc/foo.xml</path>"
1266 " </xmlfile>"
1267 "</manifest>";
1268 HalManifest manifest;
1269 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1270 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "/vendor/etc/foo.xml");
1271}
1272
1273TEST_F(LibVintfTest, ManifestXmlFilePathMissing) {
1274 std::string manifestXml =
1275 "<manifest version=\"1.0\" type=\"device\">"
1276 " <xmlfile>"
1277 " <name>media_profile</name>"
1278 " <version>1.1</version>"
1279 " </xmlfile>"
1280 "</manifest>";
1281 HalManifest manifest;
1282 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1283 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "");
1284}
1285
1286TEST_F(LibVintfTest, MatrixXmlFilePathFramework) {
1287 std::string matrixXml =
1288 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1289 " <xmlfile format=\"dtd\" optional=\"true\">"
1290 " <name>media_profile</name>"
1291 " <version>2.0-1</version>"
1292 " </xmlfile>"
1293 "</compatibility-matrix>";
1294 CompatibilityMatrix matrix;
1295 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1296 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 1}),
1297 "/system/etc/media_profile_V2_1.dtd");
1298}
1299
1300TEST_F(LibVintfTest, MatrixXmlFilePathDevice) {
1301 std::string matrixXml =
1302 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1303 " <xmlfile format=\"xsd\" optional=\"true\">"
1304 " <name>media_profile</name>"
1305 " <version>2.0-1</version>"
1306 " </xmlfile>"
1307 "</compatibility-matrix>";
1308 CompatibilityMatrix matrix;
1309 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1310 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}),
1311 "/vendor/etc/media_profile_V2_1.xsd");
1312}
1313
1314TEST_F(LibVintfTest, MatrixXmlFilePathOverride) {
1315 std::string matrixXml =
1316 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1317 " <xmlfile format=\"xsd\" optional=\"true\">"
1318 " <name>media_profile</name>"
1319 " <version>2.0-1</version>"
1320 " <path>/system/etc/foo.xsd</path>"
1321 " </xmlfile>"
1322 "</compatibility-matrix>";
1323 CompatibilityMatrix matrix;
1324 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1325 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "/system/etc/foo.xsd");
1326}
1327
1328TEST_F(LibVintfTest, MatrixXmlFilePathMissing) {
1329 std::string matrixXml =
1330 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1331 " <xmlfile format=\"dtd\" optional=\"true\">"
1332 " <name>media_profile</name>"
1333 " <version>2.1</version>"
1334 " </xmlfile>"
1335 "</compatibility-matrix>";
1336 CompatibilityMatrix matrix;
1337 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1338 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "");
1339}
1340
Yifan Hong02e94002017-07-10 15:41:56 -07001341std::pair<KernelConfigParser, status_t> processData(const std::string& data, bool processComments,
1342 bool relaxedFormat = false) {
1343 KernelConfigParser parser(processComments, relaxedFormat);
Yifan Hongd8cee082017-07-05 16:06:09 -07001344 const char* p = data.c_str();
1345 size_t n = 0;
1346 size_t chunkSize;
Yifan Hong6209d172017-07-07 16:18:19 -07001347 status_t status = OK;
Yifan Hongd8cee082017-07-05 16:06:09 -07001348 for (; n < data.size(); p += chunkSize, n += chunkSize) {
1349 chunkSize = std::min<size_t>(5, data.size() - n);
Yifan Hong6209d172017-07-07 16:18:19 -07001350 if ((status = parser.process(p, chunkSize)) != OK) {
1351 break;
1352 }
Yifan Hongd8cee082017-07-05 16:06:09 -07001353 }
Yifan Hong6209d172017-07-07 16:18:19 -07001354 return {std::move(parser), status};
Yifan Hongd8cee082017-07-05 16:06:09 -07001355}
1356
1357TEST_F(LibVintfTest, KernelConfigParser) {
1358 // usage in /proc/config.gz
1359 const std::string data =
1360 "# CONFIG_NOT_SET is not set\n"
1361 "CONFIG_ONE=1\n"
1362 "CONFIG_Y=y\n"
1363 "CONFIG_STR=\"string\"\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001364 auto pair = processData(data, false /* processComments */);
1365 ASSERT_EQ(OK, pair.second) << pair.first.error();
1366 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001367
1368 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1369 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1370 EXPECT_EQ(configs.find("CONFIG_STR")->second, "\"string\"");
1371 EXPECT_EQ(configs.find("CONFIG_NOT_SET"), configs.end());
1372}
1373
1374TEST_F(LibVintfTest, KernelConfigParser2) {
1375 // usage in android-base.cfg
1376 const std::string data =
1377 "# CONFIG_NOT_SET is not set\n"
1378 "CONFIG_ONE=1\n"
1379 "CONFIG_Y=y\n"
1380 "CONFIG_STR=string\n"
1381 "# ignore_thiscomment\n"
1382 "# CONFIG_NOT_SET2 is not set\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001383 auto pair = processData(data, true /* processComments */);
1384 ASSERT_EQ(OK, pair.second) << pair.first.error();
1385 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001386
1387 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1388 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1389 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1390 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1391 EXPECT_EQ(configs.find("CONFIG_NOT_SET2")->second, "n");
1392}
1393
Yifan Hongc1889722017-07-07 16:19:52 -07001394TEST_F(LibVintfTest, KernelConfigParserSpace) {
1395 // usage in android-base.cfg
1396 const std::string data =
1397 " # CONFIG_NOT_SET is not set \n"
1398 " CONFIG_ONE=1 # 'tis a one!\n"
1399 " CONFIG_TWO=2 #'tis a two! \n"
1400 " CONFIG_THREE=3#'tis a three! \n"
1401 " CONFIG_233=233#'tis a three! \n"
1402 "#yey! random comments\n"
1403 "CONFIG_Y=y \n"
1404 " CONFIG_YES=y#YES! \n"
1405 "CONFIG_STR=string\n"
1406 "CONFIG_HELLO=hello world! #still works\n"
1407 "CONFIG_WORLD=hello world! \n"
1408 "CONFIG_GOOD = good morning! #comments here\n"
1409 " CONFIG_MORNING = good morning! \n";
Yifan Hong02e94002017-07-10 15:41:56 -07001410 auto pair = processData(data, true /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07001411 ASSERT_EQ(OK, pair.second) << pair.first.error();
1412 const auto& configs = pair.first.configs();
1413
1414 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1415 EXPECT_EQ(configs.find("CONFIG_TWO")->second, "2");
1416 EXPECT_EQ(configs.find("CONFIG_THREE")->second, "3");
1417 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1418 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1419 EXPECT_EQ(configs.find("CONFIG_HELLO")->second, "hello world!")
1420 << "Value should be \"hello world!\" without trailing spaces";
1421 EXPECT_EQ(configs.find("CONFIG_WORLD")->second, "hello world!")
1422 << "Value should be \"hello world!\" without trailing spaces";
1423 EXPECT_EQ(configs.find("CONFIG_GOOD")->second, "good morning!")
1424 << "Value should be \"good morning!\" without leading or trailing spaces";
1425 EXPECT_EQ(configs.find("CONFIG_MORNING")->second, "good morning!")
1426 << "Value should be \"good morning!\" without leading or trailing spaces";
1427 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1428}
1429
Yifan Hongd9e46432017-08-15 17:14:52 -07001430TEST_F(LibVintfTest, NetutilsWrapperMatrix) {
1431 std::string matrixXml;
1432 CompatibilityMatrix matrix;
1433
1434 matrixXml =
1435 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1436 " <hal format=\"native\" optional=\"false\">"
1437 " <name>netutils-wrapper</name>"
1438 " <version>1.0</version>"
1439 " </hal>"
1440 "</compatibility-matrix>";
1441 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
1442 << gCompatibilityMatrixConverter.lastError();
1443
1444// only host libvintf hardcodes netutils-wrapper version requirements
1445#ifdef LIBVINTF_HOST
1446
1447 matrixXml =
1448 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1449 " <hal format=\"native\" optional=\"false\">"
1450 " <name>netutils-wrapper</name>"
1451 " <version>1.0-1</version>"
1452 " </hal>"
1453 "</compatibility-matrix>";
1454 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1455 EXPECT_CONTAINS(
1456 gCompatibilityMatrixConverter.lastError(),
1457 "netutils-wrapper HAL must specify exactly one version x.0, but a range is provided. "
1458 "Perhaps you mean '1.0'?");
1459
1460 matrixXml =
1461 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1462 " <hal format=\"native\" optional=\"false\">"
1463 " <name>netutils-wrapper</name>"
1464 " <version>1.1</version>"
1465 " </hal>"
1466 "</compatibility-matrix>";
1467 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1468 EXPECT_CONTAINS(
1469 gCompatibilityMatrixConverter.lastError(),
1470 "netutils-wrapper HAL must specify exactly one version x.0, but minor version is not 0. "
1471 "Perhaps you mean '1.0'?");
1472
1473 matrixXml =
1474 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1475 " <hal format=\"native\" optional=\"false\">"
1476 " <name>netutils-wrapper</name>"
1477 " <version>1.0</version>"
1478 " <version>2.0</version>"
1479 " </hal>"
1480 "</compatibility-matrix>";
1481 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1482 EXPECT_CONTAINS(
1483 gCompatibilityMatrixConverter.lastError(),
1484 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1485 "is specified.");
1486
1487#endif // LIBVINTF_HOST
1488}
1489
1490TEST_F(LibVintfTest, NetutilsWrapperManifest) {
1491 std::string manifestXml;
1492 HalManifest manifest;
1493
1494 manifestXml =
1495 "<manifest version=\"1.0\" type=\"framework\">"
1496 " <hal format=\"native\">"
1497 " <name>netutils-wrapper</name>"
1498 " <version>1.0</version>"
1499 " <version>2.0</version>"
1500 " </hal>"
1501 "</manifest>";
1502 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml)) << gHalManifestConverter.lastError();
1503
1504// only host libvintf hardcodes netutils-wrapper version requirements
1505#ifdef LIBVINTF_HOST
1506
1507 manifestXml =
1508 "<manifest version=\"1.0\" type=\"framework\">"
1509 " <hal format=\"native\">"
1510 " <name>netutils-wrapper</name>"
1511 " <version>1.1</version>"
1512 " </hal>"
1513 "</manifest>";
1514 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1515 EXPECT_CONTAINS(
1516 gCompatibilityMatrixConverter.lastError(),
1517 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1518 "is specified.");
1519
1520 manifestXml =
1521 "<manifest version=\"1.0\" type=\"framework\">"
1522 " <hal format=\"native\">"
1523 " <name>netutils-wrapper</name>"
1524 " <version>1.0</version>"
1525 " <version>2.1</version>"
1526 " </hal>"
1527 "</manifest>";
1528 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1529 EXPECT_CONTAINS(
1530 gCompatibilityMatrixConverter.lastError(),
1531 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1532 "is specified.");
1533
1534#endif // LIBVINTF_HOST
1535}
1536
Yifan Hongc1889722017-07-07 16:19:52 -07001537// Run KernelConfigParserInvalidTest on processComments = {true, false}
1538class KernelConfigParserInvalidTest : public ::testing::TestWithParam<bool> {};
1539
1540TEST_P(KernelConfigParserInvalidTest, NonSet1) {
1541 const std::string data = "# CONFIG_NOT_EXIST is not sat\n";
Yifan Hong02e94002017-07-10 15:41:56 -07001542 auto pair = processData(data, GetParam() /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07001543 ASSERT_EQ(OK, pair.second) << pair.first.error();
1544 const auto& configs = pair.first.configs();
1545 EXPECT_EQ(configs.find("CONFIG_NOT_EXIST"), configs.end())
1546 << "CONFIG_NOT_EXIST should not exist because of typo";
1547}
1548
1549TEST_P(KernelConfigParserInvalidTest, InvalidLine1) {
1550 const std::string data = "FOO_CONFIG=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07001551 ASSERT_NE(OK,
1552 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07001553}
1554
1555TEST_P(KernelConfigParserInvalidTest, InvalidLine2) {
1556 const std::string data = "CONFIG_BAR-BAZ=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07001557 ASSERT_NE(OK,
1558 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07001559}
1560
1561INSTANTIATE_TEST_CASE_P(KernelConfigParser, KernelConfigParserInvalidTest, ::testing::Bool());
1562
Yifan Honga9993572017-01-24 19:33:15 -08001563} // namespace vintf
1564} // namespace android
1565
Yifan Hong676447a2016-11-15 12:57:23 -08001566int main(int argc, char **argv) {
1567 ::testing::InitGoogleTest(&argc, argv);
1568 return RUN_ALL_TESTS();
1569}