blob: 42932e59f3b0d539b1abed0e0b2c43a95980fbd6 [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 Honga9993572017-01-24 19:33:15 -080042struct LibVintfTest : public ::testing::Test {
Yifan Hong676447a2016-11-15 12:57:23 -080043public:
44 virtual void SetUp() override {
45 }
46 virtual void TearDown() override {
47 }
Yifan Honga9993572017-01-24 19:33:15 -080048 bool add(CompatibilityMatrix &cm, MatrixHal &&hal) {
49 return cm.add(std::move(hal));
50 }
51 bool add(CompatibilityMatrix &cm, MatrixKernel &&kernel) {
52 return cm.add(std::move(kernel));
53 }
Yifan Hongd2b7e642017-02-17 10:15:32 -080054 bool add(HalManifest &vm, ManifestHal &&hal) {
Yifan Honga9993572017-01-24 19:33:15 -080055 return vm.add(std::move(hal));
56 }
Yifan Hongd4857902017-06-13 14:13:56 -070057 void addXmlFile(CompatibilityMatrix& cm, std::string name, VersionRange range) {
58 MatrixXmlFile f;
59 f.mName = name;
60 f.mVersionRange = range;
61 f.mFormat = XmlSchemaFormat::DTD;
62 f.mOptional = true;
63 cm.addXmlFile(std::move(f));
64 }
Yifan Hong558380a2017-02-09 15:37:32 -080065 void set(CompatibilityMatrix &cm, Sepolicy &&sepolicy) {
Yifan Hong7c7d7062017-04-04 16:26:51 -070066 cm.framework.mSepolicy = sepolicy;
Yifan Hong558380a2017-02-09 15:37:32 -080067 }
Yifan Hong03d2d4a2017-04-12 17:34:14 -070068 void set(CompatibilityMatrix &cm, SchemaType type) {
69 cm.mType = type;
70 }
71 void set(CompatibilityMatrix &cm, VndkVersionRange &&range, std::set<std::string> &&libs) {
72 cm.device.mVndk.mVersionRange = range;
73 cm.device.mVndk.mLibraries = libs;
74 }
Yifan Hong881a9e452017-04-27 19:31:13 -070075 void setAvb(RuntimeInfo &ki, Version vbmeta, Version boot) {
76 ki.mBootVbmetaAvbVersion = vbmeta;
77 ki.mBootAvbVersion = boot;
Yifan Hongf3029302017-04-12 17:23:49 -070078 }
79 void setAvb(CompatibilityMatrix &cm, Version &&avbVersion) {
80 cm.framework.mAvbMetaVersion = avbVersion;
81 }
Yifan Hong19e0a2a2017-04-14 17:30:53 -070082 Version getAvb(CompatibilityMatrix &cm) {
83 return cm.framework.mAvbMetaVersion;
84 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070085 const ManifestHal *getAnyHal(HalManifest &vm, const std::string &name) {
86 return vm.getAnyHal(name);
Yifan Honga9993572017-01-24 19:33:15 -080087 }
Yifan Hongd0cbf1f2017-04-12 19:47:06 -070088 MatrixHal *getAnyHal(CompatibilityMatrix &cm, const std::string &name) {
89 return cm.getAnyHal(name);
90 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070091 ConstMultiMapValueIterable<std::string, ManifestHal> getHals(HalManifest &vm) {
Yifan Honga9993572017-01-24 19:33:15 -080092 return vm.getHals();
93 }
Yifan Hong5a06ef72017-01-24 19:54:24 -080094 bool isValid(const ManifestHal &mh) {
95 return mh.isValid();
96 }
Yifan Hong9cd9eb02017-05-17 18:36:08 -070097
98 std::map<std::string, HalInterface> testHalInterfaces() {
99 HalInterface intf;
100 intf.name = "IFoo";
101 intf.instances.insert("default");
102 std::map<std::string, HalInterface> map;
103 map[intf.name] = intf;
104 return map;
105 }
106
Yifan Honga04e1472017-04-05 13:15:34 -0700107 HalManifest testDeviceManifest() {
Yifan Hongd2b7e642017-02-17 10:15:32 -0800108 HalManifest vm;
Yifan Hong7c7d7062017-04-04 16:26:51 -0700109 vm.mType = SchemaType::DEVICE;
Yifan Hong2a3dd082017-04-04 17:15:35 -0700110 vm.device.mSepolicyVersion = {25, 0};
Yifan Hong2059ffc2017-02-24 11:32:02 -0800111 vm.add(ManifestHal{
112 .format = HalFormat::HIDL,
113 .name = "android.hardware.camera",
114 .versions = {Version(2, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800115 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800116 .interfaces = {
117 {"ICamera", {"ICamera", {"legacy/0", "default"}}},
118 {"IBetterCamera", {"IBetterCamera", {"camera"}}}
119 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800120 });
121 vm.add(ManifestHal{
122 .format = HalFormat::HIDL,
123 .name = "android.hardware.nfc",
124 .versions = {Version(1, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800125 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800126 .interfaces = {
127 {"INfc", {"INfc", {"default"}}}
128 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800129 });
Yifan Honga9993572017-01-24 19:33:15 -0800130
131 return vm;
132 }
Yifan Hongd4857902017-06-13 14:13:56 -0700133 HalManifest testDeviceManifestWithXmlFile() {
134 HalManifest vm = testDeviceManifest();
135 ManifestXmlFile xmlFile;
136 xmlFile.mName = "media_profile";
137 xmlFile.mVersion = {1, 0};
138 vm.addXmlFile(std::move(xmlFile));
139 return vm;
140 }
Yifan Honga04e1472017-04-05 13:15:34 -0700141 HalManifest testFrameworkManfiest() {
142 HalManifest vm;
143 vm.mType = SchemaType::FRAMEWORK;
144 vm.add(ManifestHal{
145 .format = HalFormat::HIDL,
146 .name = "android.hidl.manager",
147 .versions = {Version(1, 0)},
148 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
149 .interfaces = {
150 {"IServiceManager", {"IServiceManager", {"default"}}},
151 }
152 });
153 Vndk vndk2505;
154 vndk2505.mVersionRange = {25, 0, 5};
155 vndk2505.mLibraries = { "libjpeg.so", "libbase.so" };
156 Vndk vndk2513;
157 vndk2513.mVersionRange = {25, 1, 3};
158 vndk2513.mLibraries = { "libjpeg.so", "libbase.so", "libtinyxml2.so" };
159 vm.framework.mVndks = { std::move(vndk2505), std::move(vndk2513) };
160
161 return vm;
162 }
Yifan Honga7201e72017-02-17 10:09:59 -0800163 RuntimeInfo testRuntimeInfo() {
164 RuntimeInfo info;
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800165 info.mOsName = "Linux";
166 info.mNodeName = "localhost";
167 info.mOsRelease = "3.18.31-g936f9a479d0f";
168 info.mKernelVersion = {3, 18, 31};
169 info.mOsVersion = "#4 SMP PREEMPT Wed Feb 1 18:10:52 PST 2017";
170 info.mHardwareId = "aarch64";
171 info.mKernelSepolicyVersion = 30;
Yifan Hongf1af7522017-02-16 18:00:55 -0800172 info.mKernelConfigs = {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800173 {"CONFIG_64BIT", "y"},
174 {"CONFIG_ANDROID_BINDER_DEVICES", "\"binder,hwbinder\""},
175 {"CONFIG_ARCH_MMAP_RND_BITS", "24"},
176 {"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", "\"\""},
177 {"CONFIG_ILLEGAL_POINTER_VALUE", "0xdead000000000000"}
178 };
Yifan Hong881a9e452017-04-27 19:31:13 -0700179 setAvb(info, {2, 1}, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800180 return info;
181 }
Yifan Hong676447a2016-11-15 12:57:23 -0800182};
183
Yifan Hongd5cd0482017-06-19 12:25:48 -0700184TEST_F(LibVintfTest, ArchOperatorOr) {
185 Arch a = Arch::ARCH_EMPTY;
186 a |= Arch::ARCH_32;
187 EXPECT_EQ(Arch::ARCH_32, a);
188
189 a |= Arch::ARCH_64;
190 EXPECT_EQ(Arch::ARCH_32_64, a);
191
192 a = Arch::ARCH_EMPTY;
193 a |= Arch::ARCH_64;
194 EXPECT_EQ(Arch::ARCH_64, a);
195}
Yifan Hongef6d4d32017-01-23 14:12:28 -0800196
197TEST_F(LibVintfTest, Stringify) {
Yifan Honga04e1472017-04-05 13:15:34 -0700198 HalManifest vm = testDeviceManifest();
Yifan Hong974ad9c2017-04-04 15:37:39 -0700199 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/2.0:"
200 "hidl/android.hardware.nfc/passthrough32+64/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -0800201
202 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
203 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
204
205 VersionRange v(1, 2, 3);
206 EXPECT_EQ(to_string(v), "1.2-3");
207 VersionRange v2;
208 EXPECT_TRUE(parse("1.2-3", &v2));
209 EXPECT_EQ(v, v2);
210}
211
Yifan Hong9bbdb282017-04-12 21:53:59 -0700212TEST_F(LibVintfTest, GetTransport) {
213 HalManifest vm = testDeviceManifest();
214 EXPECT_EQ(Transport::HWBINDER, vm.getTransport("android.hardware.camera",
215 {2, 0}, "ICamera", "default"));
216}
217
Yifan Hongd2b7e642017-02-17 10:15:32 -0800218TEST_F(LibVintfTest, HalManifestConverter) {
Yifan Honga04e1472017-04-05 13:15:34 -0700219 HalManifest vm = testDeviceManifest();
Yifan Hongd2b7e642017-02-17 10:15:32 -0800220 std::string xml = gHalManifestConverter(vm);
Yifan Hong676447a2016-11-15 12:57:23 -0800221 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700222 "<manifest version=\"1.0\" type=\"device\">\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800223 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800224 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800225 " <transport>hwbinder</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800226 " <version>2.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800227 " <interface>\n"
228 " <name>IBetterCamera</name>\n"
229 " <instance>camera</instance>\n"
230 " </interface>\n"
231 " <interface>\n"
232 " <name>ICamera</name>\n"
233 " <instance>default</instance>\n"
234 " <instance>legacy/0</instance>\n"
235 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800236 " </hal>\n"
237 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800238 " <name>android.hardware.nfc</name>\n"
Yifan Hongc54d32c2017-03-07 19:12:26 -0800239 " <transport arch=\"32+64\">passthrough</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800240 " <version>1.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800241 " <interface>\n"
242 " <name>INfc</name>\n"
243 " <instance>default</instance>\n"
244 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800245 " </hal>\n"
Yifan Hong2a3dd082017-04-04 17:15:35 -0700246 " <sepolicy>\n"
247 " <version>25.0</version>\n"
248 " </sepolicy>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800249 "</manifest>\n");
Yifan Hongfb7469c2017-04-05 19:15:21 -0700250 HalManifest vm2;
251 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
252 EXPECT_EQ(vm, vm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800253}
254
Yifan Honga04e1472017-04-05 13:15:34 -0700255TEST_F(LibVintfTest, HalManifestConverterFramework) {
256 HalManifest vm = testFrameworkManfiest();
257 std::string xml = gHalManifestConverter(vm);
258 EXPECT_EQ(xml,
259 "<manifest version=\"1.0\" type=\"framework\">\n"
260 " <hal format=\"hidl\">\n"
261 " <name>android.hidl.manager</name>\n"
262 " <transport>hwbinder</transport>\n"
263 " <version>1.0</version>\n"
264 " <interface>\n"
265 " <name>IServiceManager</name>\n"
266 " <instance>default</instance>\n"
267 " </interface>\n"
268 " </hal>\n"
269 " <vndk>\n"
270 " <version>25.0.5</version>\n"
271 " <library>libbase.so</library>\n"
272 " <library>libjpeg.so</library>\n"
273 " </vndk>\n"
274 " <vndk>\n"
275 " <version>25.1.3</version>\n"
276 " <library>libbase.so</library>\n"
277 " <library>libjpeg.so</library>\n"
278 " <library>libtinyxml2.so</library>\n"
279 " </vndk>\n"
280 "</manifest>\n");
281 HalManifest vm2;
282 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700283 EXPECT_EQ(vm, vm2);
Yifan Honga04e1472017-04-05 13:15:34 -0700284}
285
Yifan Hong8e9c6692017-02-28 14:07:42 -0800286TEST_F(LibVintfTest, HalManifestOptional) {
287 HalManifest vm;
288 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700289 "<manifest version=\"1.0\" type=\"device\"></manifest>"));
Yifan Hong8e9c6692017-02-28 14:07:42 -0800290 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700291 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800292 " <hal>"
293 " <name>android.hidl.manager</name>"
294 " <transport>hwbinder</transport>"
295 " <version>1.0</version>"
296 " </hal>"
297 "</manifest>"));
298 EXPECT_FALSE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700299 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800300 " <hal>"
301 " <name>android.hidl.manager</name>"
302 " <version>1.0</version>"
303 " </hal>"
304 "</manifest>"));
305}
306
Yifan Honge0bb98d2017-08-07 14:40:19 -0700307TEST_F(LibVintfTest, HalManifestNative) {
308 HalManifest vm;
309 EXPECT_TRUE(gHalManifestConverter(&vm,
310 "<manifest version=\"1.0\" type=\"device\">"
311 " <hal format=\"native\">"
312 " <name>foo</name>"
313 " <version>1.0</version>"
314 " </hal>"
315 "</manifest>"))
316 << gHalManifestConverter.lastError();
317 EXPECT_FALSE(gHalManifestConverter(&vm,
318 "<manifest version=\"1.0\" type=\"device\">"
319 " <hal format=\"native\">"
320 " <name>foo</name>"
321 " <version>1.0</version>"
322 " <transport>hwbinder</transport>"
323 " </hal>"
324 "</manifest>"));
325 EXPECT_TRUE(gHalManifestConverter.lastError().find(
326 "Native HAL 'foo' should not have <transport> defined") != std::string::npos);
327}
328
Yifan Hong79dcc1f2017-05-22 14:35:19 -0700329TEST_F(LibVintfTest, HalManifestDuplicate) {
330 HalManifest vm;
331 EXPECT_FALSE(gHalManifestConverter(&vm,
332 "<manifest version=\"1.0\" type=\"device\">"
333 " <hal>"
334 " <name>android.hidl.manager</name>"
335 " <transport>hwbinder</transport>"
336 " <version>1.0</version>"
337 " <version>1.1</version>"
338 " </hal>"
339 "</manifest>"))
340 << "Should not allow duplicated major version in <hal>";
341 EXPECT_FALSE(gHalManifestConverter(&vm,
342 "<manifest version=\"1.0\" type=\"device\">"
343 " <hal>"
344 " <name>android.hidl.manager</name>"
345 " <transport>hwbinder</transport>"
346 " <version>1.0</version>"
347 " </hal>"
348 " <hal>"
349 " <name>android.hidl.manager</name>"
350 " <transport arch=\"32+64\">passthrough</transport>"
351 " <version>1.1</version>"
352 " </hal>"
353 "</manifest>"))
354 << "Should not allow duplicated major version across <hal>";
355}
356
357TEST_F(LibVintfTest, HalManifestGetTransport) {
358 HalManifest vm;
359 EXPECT_TRUE(gHalManifestConverter(&vm,
360 "<manifest version=\"1.0\" type=\"device\">"
361 " <hal>"
362 " <name>android.hidl.manager</name>"
363 " <transport>hwbinder</transport>"
364 " <version>1.0</version>"
365 " <interface>"
366 " <name>IServiceManager</name>"
367 " <instance>default</instance>"
368 " </interface>"
369 " </hal>"
370 " <hal>"
371 " <name>android.hidl.manager</name>"
372 " <transport arch=\"32+64\">passthrough</transport>"
373 " <version>2.1</version>"
374 " <interface>"
375 " <name>IServiceManager</name>"
376 " <instance>default</instance>"
377 " </interface>"
378 " </hal>"
379 "</manifest>"));
380 EXPECT_EQ(Transport::PASSTHROUGH,
381 vm.getTransport("android.hidl.manager", {2, 1}, "IServiceManager", "default"));
382 EXPECT_EQ(Transport::PASSTHROUGH,
383 vm.getTransport("android.hidl.manager", {2, 0}, "IServiceManager", "default"));
384 EXPECT_EQ(Transport::EMPTY,
385 vm.getTransport("android.hidl.manager", {2, 2}, "IServiceManager", "default"));
386 EXPECT_EQ(Transport::HWBINDER,
387 vm.getTransport("android.hidl.manager", {1, 0}, "IServiceManager", "default"));
388}
389
Yifan Hongec3b9b72017-02-23 13:24:42 -0800390TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700391 HalManifest vm = testDeviceManifest();
Yifan Hongec3b9b72017-02-23 13:24:42 -0800392 EXPECT_EQ(vm.getInstances("android.hardware.camera", "ICamera"),
393 std::set<std::string>({"default", "legacy/0"}));
394 EXPECT_EQ(vm.getInstances("android.hardware.camera", "IBetterCamera"),
395 std::set<std::string>({"camera"}));
396 EXPECT_EQ(vm.getInstances("android.hardware.camera", "INotExist"),
Yifan Hong9bbdb282017-04-12 21:53:59 -0700397 std::set<std::string>({}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800398 EXPECT_EQ(vm.getInstances("android.hardware.nfc", "INfc"),
399 std::set<std::string>({"default"}));
400
401 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "default"));
402 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "legacy/0"));
403 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "camera"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800404 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", "INfc", "default"));
405
Yifan Hong9bbdb282017-04-12 21:53:59 -0700406 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800407 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "ICamera", "notexist"));
408 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "default"));
409 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "notexist"));
410 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", "INfc", "notexist"));
411}
412
Yifan Hong676447a2016-11-15 12:57:23 -0800413TEST_F(LibVintfTest, VersionConverter) {
414 Version v(3, 6);
415 std::string xml = gVersionConverter(v);
416 EXPECT_EQ(xml, "<version>3.6</version>\n");
417 Version v2;
418 EXPECT_TRUE(gVersionConverter(&v2, xml));
419 EXPECT_EQ(v, v2);
420}
421
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700422static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
423 std::string name{intf.name};
424 return map->emplace(std::move(name), std::move(intf)).second;
425}
426
Yifan Hong676447a2016-11-15 12:57:23 -0800427TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800428 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800429 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700430 false /* optional */, {}};
431 EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
432 EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800433 std::string xml = gMatrixHalConverter(mh);
434 EXPECT_EQ(xml,
435 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800436 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800437 " <version>1.2-3</version>\n"
438 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700439 " <interface>\n"
440 " <name>IBetterCamera</name>\n"
441 " <instance>default</instance>\n"
442 " <instance>great</instance>\n"
443 " </interface>\n"
444 " <interface>\n"
445 " <name>ICamera</name>\n"
446 " <instance>default</instance>\n"
447 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800448 "</hal>\n");
449 MatrixHal mh2;
450 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
451 EXPECT_EQ(mh, mh2);
452}
453
Yifan Hong3f5489a2017-02-08 11:14:21 -0800454TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
455
456 KernelConfigTypedValue converted;
457
458 auto testOne = [] (const KernelConfigTypedValue &original,
459 const std::string &expectXml) {
460 std::string xml;
461 KernelConfigTypedValue converted;
462 xml = gKernelConfigTypedValueConverter(original);
463 EXPECT_EQ(xml, expectXml);
464 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
465 EXPECT_EQ(original, converted);
466 };
467
468 auto testParse = [] (const KernelConfigTypedValue &original,
469 const std::string &xml) {
470 KernelConfigTypedValue converted;
471 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
472 EXPECT_EQ(original, converted);
473 };
474
475 testOne(KernelConfigTypedValue("stringvalue"),
476 "<value type=\"string\">stringvalue</value>\n");
477 testOne(KernelConfigTypedValue(""),
478 "<value type=\"string\"></value>\n");
479
480 testOne(KernelConfigTypedValue(Tristate::YES),
481 "<value type=\"tristate\">y</value>\n");
482 testOne(KernelConfigTypedValue(Tristate::NO),
483 "<value type=\"tristate\">n</value>\n");
484 testOne(KernelConfigTypedValue(Tristate::MODULE),
485 "<value type=\"tristate\">m</value>\n");
486 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
487 "<value type=\"tristate\">q</value>\n"));
488
489 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
490 "<value type=\"range\">4-20</value>\n");
491 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
492 "<value type=\"range\">0-18446744073709551615</value>\n");
493 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
494 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
495
496 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
497 "<value type=\"int\">-18446744073709551616</value>\n"));
498
499 testOne(KernelConfigTypedValue(INT64_MIN),
500 "<value type=\"int\">-9223372036854775808</value>\n");
501 testParse(KernelConfigTypedValue(INT64_MIN),
502 "<value type=\"int\">0x8000000000000000</value>\n");
503 testParse(KernelConfigTypedValue(INT64_MIN),
504 "<value type=\"int\">-0X8000000000000000</value>\n");
505
506 testParse(KernelConfigTypedValue(INT64_MIN + 1),
507 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
508
509 testParse(KernelConfigTypedValue(-0x50),
510 "<value type=\"int\">-0x50</value>\n");
511
512 testOne(KernelConfigTypedValue(0),
513 "<value type=\"int\">0</value>\n");
514
515 // Truncation for underflow.
516 testParse(KernelConfigTypedValue(1),
517 "<value type=\"int\">-0xffffffffffffffff</value>\n");
518 testParse(KernelConfigTypedValue(1),
519 "<value type=\"int\">-18446744073709551615</value>\n");
520
521 testOne(KernelConfigTypedValue(INT64_MAX),
522 "<value type=\"int\">9223372036854775807</value>\n");
523 testParse(KernelConfigTypedValue(INT64_MAX),
524 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
525 // Truncation for underflow.
526 testParse(KernelConfigTypedValue(INT64_MAX),
527 "<value type=\"int\">-9223372036854775809</value>\n");
528
529 testParse(KernelConfigTypedValue(-1),
530 "<value type=\"int\">18446744073709551615</value>\n");
531 testParse(KernelConfigTypedValue(-1),
532 "<value type=\"int\">0xffffffffffffffff</value>\n");
533
534 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
535 "<value type=\"int\">18446744073709551616</value>\n"));
536}
537
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700538TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
Yifan Hong676447a2016-11-15 12:57:23 -0800539 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800540 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800541 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700542 false /* optional */, testHalInterfaces()}));
Yifan Honga9993572017-01-24 19:33:15 -0800543 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800544 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700545 true /* optional */, testHalInterfaces()}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800546 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
547 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
548 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
549 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700550 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700551 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800552 std::string xml = gCompatibilityMatrixConverter(cm);
553 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700554 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800555 " <hal format=\"native\" optional=\"false\">\n"
556 " <name>android.hardware.camera</name>\n"
557 " <version>1.2-3</version>\n"
558 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700559 " <interface>\n"
560 " <name>IFoo</name>\n"
561 " <instance>default</instance>\n"
562 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800563 " </hal>\n"
564 " <hal format=\"native\" optional=\"true\">\n"
565 " <name>android.hardware.nfc</name>\n"
566 " <version>4.5-6</version>\n"
567 " <version>10.11-12</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700568 " <interface>\n"
569 " <name>IFoo</name>\n"
570 " <instance>default</instance>\n"
571 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800572 " </hal>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800573 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800574 " <config>\n"
575 " <key>CONFIG_FOO</key>\n"
576 " <value type=\"tristate\">y</value>\n"
577 " </config>\n"
578 " <config>\n"
579 " <key>CONFIG_BAR</key>\n"
580 " <value type=\"string\">stringvalue</value>\n"
581 " </config>\n"
582 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800583 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800584 " <config>\n"
585 " <key>CONFIG_BAZ</key>\n"
586 " <value type=\"int\">20</value>\n"
587 " </config>\n"
588 " <config>\n"
589 " <key>CONFIG_BAR</key>\n"
590 " <value type=\"range\">3-5</value>\n"
591 " </config>\n"
592 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800593 " <sepolicy>\n"
594 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700595 " <sepolicy-version>25.0</sepolicy-version>\n"
596 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800597 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700598 " <avb>\n"
599 " <vbmeta-version>2.1</vbmeta-version>\n"
600 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800601 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800602 CompatibilityMatrix cm2;
603 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700604 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800605}
606
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700607TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
608 CompatibilityMatrix cm;
609 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
610 {{VersionRange(1,0)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700611 false /* optional */, testHalInterfaces()}));
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700612 set(cm, SchemaType::DEVICE);
613 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
614 std::string xml = gCompatibilityMatrixConverter(cm);
615 EXPECT_EQ(xml,
616 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
617 " <hal format=\"native\" optional=\"false\">\n"
618 " <name>android.hidl.manager</name>\n"
619 " <version>1.0</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700620 " <interface>\n"
621 " <name>IFoo</name>\n"
622 " <instance>default</instance>\n"
623 " </interface>\n"
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700624 " </hal>\n"
625 " <vndk>\n"
626 " <version>25.0.1-5</version>\n"
627 " <library>libbase.so</library>\n"
628 " <library>libjpeg.so</library>\n"
629 " </vndk>\n"
630 "</compatibility-matrix>\n");
631 CompatibilityMatrix cm2;
632 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
633 EXPECT_EQ(cm, cm2);
634}
635
Yifan Hong676447a2016-11-15 12:57:23 -0800636TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800637 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800638
Yifan Hong2059ffc2017-02-24 11:32:02 -0800639 ManifestHal invalidHal{
640 .format = HalFormat::HIDL,
641 .name = "android.hardware.camera",
642 .versions = {{Version(2, 0), Version(2, 1)}},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800643 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64}
Yifan Hong2059ffc2017-02-24 11:32:02 -0800644 };
645
Yifan Hong5a06ef72017-01-24 19:54:24 -0800646 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800647 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800648 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800649}
650
Tri Vod0143942017-03-24 17:51:23 -0700651TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700652 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700653 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
654 {"android.hardware.camera", "android.hardware.nfc"}));
655}
656
657TEST_F(LibVintfTest, HalManifestGetInterfaceNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700658 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700659 EXPECT_EQ(vm.getInterfaceNames("android.hardware.camera"),
660 std::set<std::string>({"ICamera", "IBetterCamera"}));
661 EXPECT_EQ(vm.getInterfaceNames("android.hardware.nfc"),
662 std::set<std::string>({"INfc"}));
663}
664
Yifan Hongd2b7e642017-02-17 10:15:32 -0800665TEST_F(LibVintfTest, HalManifestGetHal) {
Yifan Honga04e1472017-04-05 13:15:34 -0700666 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700667 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
668 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800669
670 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
671 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800672 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800673 EXPECT_EQ(hal.name, arr[i++]);
674 }
675}
676
Yifan Honga7201e72017-02-17 10:09:59 -0800677TEST_F(LibVintfTest, RuntimeInfo) {
678 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800679 using KernelConfigs = std::vector<KernelConfig>;
680 const KernelConfigs configs {
681 KernelConfig{"CONFIG_64BIT", Tristate::YES},
682 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
683 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
684 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
685 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
686 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
687 };
688
689 auto testMatrix = [&] (MatrixKernel &&kernel) {
690 CompatibilityMatrix cm;
691 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700692 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700693 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800694 return cm;
695 };
696
697 std::string error;
698
699 {
700 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
701 CompatibilityMatrix cm = testMatrix(std::move(kernel));
702 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
703 }
704
705 {
706 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
707 CompatibilityMatrix cm = testMatrix(std::move(kernel));
708 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
709 }
710
711 {
712 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
713 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700714 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800715 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
716 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700717 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800718 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
719 << "kernel-sepolicy-version shouldn't match";
720 }
721
722 {
723 KernelConfigs newConfigs(configs);
724 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
725 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
726 CompatibilityMatrix cm = testMatrix(std::move(kernel));
727 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
728 }
729
730 {
731 KernelConfigs newConfigs(configs);
732 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
733 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
734 CompatibilityMatrix cm = testMatrix(std::move(kernel));
735 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
736 }
737
738 {
739 KernelConfigs newConfigs(configs);
740 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
741 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
742 CompatibilityMatrix cm = testMatrix(std::move(kernel));
743 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
744 }
745
746 {
747 KernelConfigs newConfigs(configs);
748 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
749 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
750 CompatibilityMatrix cm = testMatrix(std::move(kernel));
751 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
752 }
753
754 {
755 KernelConfigs newConfigs(configs);
756 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
757 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
758 CompatibilityMatrix cm = testMatrix(std::move(kernel));
759 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
760 }
Yifan Hongb4233162017-05-24 15:17:40 -0700761// TODO(b/38325029) enable avb check when avb version is injected to fwk matrix.
762#if 0
Yifan Hongf3029302017-04-12 17:23:49 -0700763 RuntimeInfo badAvb = testRuntimeInfo();
764 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
765 {
766 setAvb(badAvb, {1, 0}, {2, 1});
767 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
Michael Schwartz5cfbc922017-05-08 14:06:49 -0700768 EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
Yifan Hongf3029302017-04-12 17:23:49 -0700769 }
770 {
771 setAvb(badAvb, {2, 1}, {3, 0});
772 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
773 }
774 {
775 setAvb(badAvb, {2, 1}, {2, 3});
776 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
777 }
778 {
779 setAvb(badAvb, {2, 3}, {2, 1});
780 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
781 }
Yifan Hongb4233162017-05-24 15:17:40 -0700782#endif
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800783}
784
Yifan Hong19e0a2a2017-04-14 17:30:53 -0700785TEST_F(LibVintfTest, MissingAvb) {
786 std::string xml =
787 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
788 " <kernel version=\"3.18.31\"></kernel>"
789 " <sepolicy>\n"
790 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
791 " <sepolicy-version>25.5</sepolicy-version>\n"
792 " </sepolicy>\n"
793 "</compatibility-matrix>\n";
794 CompatibilityMatrix cm;
795 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
796 EXPECT_EQ(getAvb(cm), Version(0, 0));
797}
798
Yifan Hong08e984c2017-05-18 12:50:04 -0700799// This is the test extracted from VINTF Object doc
800TEST_F(LibVintfTest, HalCompat) {
801 CompatibilityMatrix matrix;
802 std::string error;
803
804 std::string matrixXml =
805 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
806 " <hal format=\"hidl\" optional=\"false\">\n"
807 " <name>android.hardware.foo</name>\n"
808 " <version>1.0</version>\n"
809 " <version>3.1-2</version>\n"
810 " <interface>\n"
811 " <name>IFoo</name>\n"
812 " <instance>default</instance>\n"
813 " <instance>specific</instance>\n"
814 " </interface>\n"
815 " </hal>\n"
816 " <hal format=\"hidl\" optional=\"false\">\n"
817 " <name>android.hardware.foo</name>\n"
818 " <version>2.0</version>\n"
819 " <interface>\n"
820 " <name>IBar</name>\n"
821 " <instance>default</instance>\n"
822 " </interface>\n"
823 " </hal>\n"
824 " <sepolicy>\n"
825 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
826 " <sepolicy-version>25.5</sepolicy-version>\n"
827 " </sepolicy>\n"
828 "</compatibility-matrix>\n";
829 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
830 << gCompatibilityMatrixConverter.lastError();
831
832 {
833 std::string manifestXml =
834 "<manifest version=\"1.0\" type=\"device\">\n"
835 " <hal format=\"hidl\">\n"
836 " <name>android.hardware.foo</name>\n"
837 " <transport>hwbinder</transport>\n"
838 " <version>1.0</version>\n"
839 " <interface>\n"
840 " <name>IFoo</name>\n"
841 " <instance>default</instance>\n"
842 " <instance>specific</instance>\n"
843 " </interface>\n"
844 " </hal>\n"
845 " <hal format=\"hidl\">\n"
846 " <name>android.hardware.foo</name>\n"
847 " <transport>hwbinder</transport>\n"
848 " <version>2.0</version>\n"
849 " <interface>\n"
850 " <name>IBar</name>\n"
851 " <instance>default</instance>\n"
852 " </interface>\n"
853 " </hal>\n"
854 " <sepolicy>\n"
855 " <version>25.5</version>\n"
856 " </sepolicy>\n"
857 "</manifest>\n";
858
859 HalManifest manifest;
860 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
861 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
862 }
863
864 {
865 std::string manifestXml =
866 "<manifest version=\"1.0\" type=\"device\">\n"
867 " <hal format=\"hidl\">\n"
868 " <name>android.hardware.foo</name>\n"
869 " <transport>hwbinder</transport>\n"
870 " <version>1.0</version>\n"
871 " <interface>\n"
872 " <name>IFoo</name>\n"
873 " <instance>default</instance>\n"
874 " <instance>specific</instance>\n"
875 " </interface>\n"
876 " </hal>\n"
877 " <sepolicy>\n"
878 " <version>25.5</version>\n"
879 " </sepolicy>\n"
880 "</manifest>\n";
881 HalManifest manifest;
882 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
883 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
884 << "should not be compatible because IBar is missing";
885 }
886
887 {
888 std::string manifestXml =
889 "<manifest version=\"1.0\" type=\"device\">\n"
890 " <hal format=\"hidl\">\n"
891 " <name>android.hardware.foo</name>\n"
892 " <transport>hwbinder</transport>\n"
893 " <version>1.0</version>\n"
894 " <interface>\n"
895 " <name>IFoo</name>\n"
896 " <instance>default</instance>\n"
897 " </interface>\n"
898 " </hal>\n"
899 " <hal format=\"hidl\">\n"
900 " <name>android.hardware.foo</name>\n"
901 " <transport>hwbinder</transport>\n"
902 " <version>2.0</version>\n"
903 " <interface>\n"
904 " <name>IBar</name>\n"
905 " <instance>default</instance>\n"
906 " </interface>\n"
907 " </hal>\n"
908 " <sepolicy>\n"
909 " <version>25.5</version>\n"
910 " </sepolicy>\n"
911 "</manifest>\n";
912 HalManifest manifest;
913 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
914 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
915 << "should not be compatible because IFoo/default is missing";
916 }
917
918 {
919 std::string manifestXml =
920 "<manifest version=\"1.0\" type=\"device\">\n"
921 " <hal format=\"hidl\">\n"
922 " <name>android.hardware.foo</name>\n"
923 " <transport>hwbinder</transport>\n"
924 " <version>3.3</version>\n"
925 " <interface>\n"
926 " <name>IFoo</name>\n"
927 " <instance>default</instance>\n"
928 " <instance>specific</instance>\n"
929 " </interface>\n"
930 " </hal>\n"
931 " <hal format=\"hidl\">\n"
932 " <name>android.hardware.foo</name>\n"
933 " <transport>hwbinder</transport>\n"
934 " <version>2.0</version>\n"
935 " <interface>\n"
936 " <name>IBar</name>\n"
937 " <instance>default</instance>\n"
938 " </interface>\n"
939 " </hal>\n"
940 " <sepolicy>\n"
941 " <version>25.5</version>\n"
942 " </sepolicy>\n"
943 "</manifest>\n";
944 HalManifest manifest;
945 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
946 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
947 }
948
949 {
950 std::string manifestXml =
951 "<manifest version=\"1.0\" type=\"device\">\n"
952 " <hal format=\"hidl\">\n"
953 " <name>android.hardware.foo</name>\n"
954 " <transport>hwbinder</transport>\n"
955 " <version>1.0</version>\n"
956 " <interface>\n"
957 " <name>IFoo</name>\n"
958 " <instance>default</instance>\n"
959 " </interface>\n"
960 " </hal>\n"
961 " <hal format=\"hidl\">\n"
962 " <name>android.hardware.foo</name>\n"
963 " <transport>hwbinder</transport>\n"
964 " <version>3.2</version>\n"
965 " <interface>\n"
966 " <name>IFoo</name>\n"
967 " <instance>specific</instance>\n"
968 " </interface>\n"
969 " </hal>\n"
970 " <hal format=\"hidl\">\n"
971 " <name>android.hardware.foo</name>\n"
972 " <transport>hwbinder</transport>\n"
973 " <version>2.0</version>\n"
974 " <interface>\n"
975 " <name>IBar</name>\n"
976 " <instance>default</instance>\n"
977 " </interface>\n"
978 " </hal>\n"
979 " <sepolicy>\n"
980 " <version>25.5</version>\n"
981 " </sepolicy>\n"
982 "</manifest>\n";
983 HalManifest manifest;
984 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
985 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
986 << "should not be compatible even though @1.0::IFoo/default "
987 << "and @3.2::IFoo/specific present";
988 }
989
990 {
991 std::string manifestXml =
992 "<manifest version=\"1.0\" type=\"device\">\n"
993 " <hal format=\"hidl\">\n"
994 " <name>android.hardware.foo</name>\n"
995 " <transport>hwbinder</transport>\n"
996 " <version>1.0</version>\n"
997 " <interface>\n"
998 " <name>IFoo</name>\n"
999 " <instance>default</instance>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001000 " <instance>specific</instance>\n"
1001 " </interface>\n"
1002 " </hal>\n"
1003 " <hal format=\"hidl\">\n"
1004 " <name>android.hardware.foo</name>\n"
1005 " <transport>hwbinder</transport>\n"
1006 " <version>2.0</version>\n"
1007 " <interface>\n"
1008 " <name>IBar</name>\n"
1009 " <instance>default</instance>\n"
1010 " </interface>\n"
1011 " </hal>\n"
1012 " <sepolicy>\n"
1013 " <version>25.5</version>\n"
1014 " </sepolicy>\n"
1015 "</manifest>\n";
1016 HalManifest manifest;
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001017 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml))
1018 << gHalManifestConverter.lastError();
1019 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
Yifan Hong08e984c2017-05-18 12:50:04 -07001020 }
1021}
1022
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001023TEST_F(LibVintfTest, Compat) {
1024 std::string manifestXml =
1025 "<manifest version=\"1.0\" type=\"device\">\n"
1026 " <hal format=\"hidl\">\n"
1027 " <name>android.hardware.camera</name>\n"
1028 " <transport>hwbinder</transport>\n"
1029 " <version>3.5</version>\n"
1030 " <interface>\n"
1031 " <name>IBetterCamera</name>\n"
1032 " <instance>camera</instance>\n"
1033 " </interface>\n"
1034 " <interface>\n"
1035 " <name>ICamera</name>\n"
1036 " <instance>default</instance>\n"
1037 " <instance>legacy/0</instance>\n"
1038 " </interface>\n"
1039 " </hal>\n"
1040 " <hal format=\"hidl\">\n"
1041 " <name>android.hardware.nfc</name>\n"
1042 " <transport>hwbinder</transport>\n"
1043 " <version>1.0</version>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001044 " <interface>\n"
1045 " <name>INfc</name>\n"
1046 " <instance>nfc_nci</instance>\n"
1047 " </interface>\n"
1048 " </hal>\n"
1049 " <hal format=\"hidl\">\n"
1050 " <name>android.hardware.nfc</name>\n"
1051 " <transport>hwbinder</transport>\n"
1052 " <version>2.0</version>\n"
1053 " <interface>\n"
1054 " <name>INfc</name>\n"
1055 " <instance>default</instance>\n"
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001056 " <instance>nfc_nci</instance>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001057 " </interface>\n"
1058 " </hal>\n"
1059 " <sepolicy>\n"
1060 " <version>25.5</version>\n"
1061 " </sepolicy>\n"
1062 "</manifest>\n";
1063
1064 std::string matrixXml =
1065 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1066 " <hal format=\"hidl\" optional=\"false\">\n"
1067 " <name>android.hardware.camera</name>\n"
1068 " <version>2.0-5</version>\n"
1069 " <version>3.4-16</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001070 " <interface>\n"
1071 " <name>IBetterCamera</name>\n"
1072 " <instance>camera</instance>\n"
1073 " </interface>\n"
1074 " <interface>\n"
1075 " <name>ICamera</name>\n"
1076 " <instance>default</instance>\n"
1077 " <instance>legacy/0</instance>\n"
1078 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001079 " </hal>\n"
1080 " <hal format=\"hidl\" optional=\"false\">\n"
1081 " <name>android.hardware.nfc</name>\n"
1082 " <version>1.0</version>\n"
1083 " <version>2.0</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001084 " <interface>\n"
1085 " <name>INfc</name>\n"
1086 " <instance>nfc_nci</instance>\n"
1087 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001088 " </hal>\n"
1089 " <hal format=\"hidl\" optional=\"true\">\n"
1090 " <name>android.hardware.foo</name>\n"
1091 " <version>1.0</version>\n"
1092 " </hal>\n"
1093 " <sepolicy>\n"
1094 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1095 " <sepolicy-version>25.5</sepolicy-version>\n"
1096 " <sepolicy-version>26.0-3</sepolicy-version>\n"
1097 " </sepolicy>\n"
1098 " <avb>\n"
1099 " <vbmeta-version>2.1</vbmeta-version>\n"
1100 " </avb>\n"
1101 "</compatibility-matrix>\n";
1102
1103 HalManifest manifest;
1104 CompatibilityMatrix matrix;
1105 std::string error;
1106 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1107 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1108 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1109
1110 // some smaller test cases
1111 matrixXml =
1112 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1113 " <hal format=\"hidl\" optional=\"false\">\n"
1114 " <name>android.hardware.camera</name>\n"
1115 " <version>3.4</version>\n"
1116 " </hal>\n"
1117 " <sepolicy>\n"
1118 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1119 " <sepolicy-version>25.5</sepolicy-version>\n"
1120 " </sepolicy>\n"
1121 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1122 "</compatibility-matrix>\n";
1123 matrix = {};
1124 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1125 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1126 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
1127 EXPECT_NE(camera, nullptr);
1128 camera->versionRanges[0] = {3, 5};
1129 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1130 camera->versionRanges[0] = {3, 6};
1131 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1132
1133 // reset it
1134 matrix = {};
1135 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1136 set(matrix, Sepolicy{30, {{26, 0}}});
1137 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1138 set(matrix, Sepolicy{30, {{25, 6}}});
1139 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1140 set(matrix, Sepolicy{30, {{25, 4}}});
1141 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1142}
1143
Yifan Hongd4857902017-06-13 14:13:56 -07001144/////////////////// xmlfile tests
1145
1146TEST_F(LibVintfTest, HalManifestConverterXmlFile) {
1147 HalManifest vm = testDeviceManifestWithXmlFile();
1148 std::string xml = gHalManifestConverter(vm);
1149 EXPECT_EQ(xml,
1150 "<manifest version=\"1.0\" type=\"device\">\n"
1151 " <hal format=\"hidl\">\n"
1152 " <name>android.hardware.camera</name>\n"
1153 " <transport>hwbinder</transport>\n"
1154 " <version>2.0</version>\n"
1155 " <interface>\n"
1156 " <name>IBetterCamera</name>\n"
1157 " <instance>camera</instance>\n"
1158 " </interface>\n"
1159 " <interface>\n"
1160 " <name>ICamera</name>\n"
1161 " <instance>default</instance>\n"
1162 " <instance>legacy/0</instance>\n"
1163 " </interface>\n"
1164 " </hal>\n"
1165 " <hal format=\"hidl\">\n"
1166 " <name>android.hardware.nfc</name>\n"
1167 " <transport arch=\"32+64\">passthrough</transport>\n"
1168 " <version>1.0</version>\n"
1169 " <interface>\n"
1170 " <name>INfc</name>\n"
1171 " <instance>default</instance>\n"
1172 " </interface>\n"
1173 " </hal>\n"
1174 " <sepolicy>\n"
1175 " <version>25.0</version>\n"
1176 " </sepolicy>\n"
1177 " <xmlfile>\n"
1178 " <name>media_profile</name>\n"
1179 " <version>1.0</version>\n"
1180 " </xmlfile>\n"
1181 "</manifest>\n");
1182 HalManifest vm2;
1183 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
1184 EXPECT_EQ(vm, vm2);
1185}
1186
1187TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile) {
1188 CompatibilityMatrix cm;
1189 addXmlFile(cm, "media_profile", {1, 0});
1190 std::string xml = gCompatibilityMatrixConverter(cm);
1191 EXPECT_EQ(xml,
1192 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1193 " <sepolicy>\n"
1194 " <kernel-sepolicy-version>0</kernel-sepolicy-version>\n"
1195 " </sepolicy>\n"
1196 " <avb>\n"
1197 " <vbmeta-version>0.0</vbmeta-version>\n"
1198 " </avb>\n"
1199 " <xmlfile format=\"dtd\" optional=\"true\">\n"
1200 " <name>media_profile</name>\n"
1201 " <version>1.0</version>\n"
1202 " </xmlfile>\n"
1203 "</compatibility-matrix>\n");
1204 CompatibilityMatrix cm2;
1205 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
1206 EXPECT_EQ(cm, cm2);
1207}
1208
1209TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile2) {
1210 std::string xml =
1211 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1212 " <xmlfile format=\"dtd\" optional=\"false\">\n"
1213 " <name>media_profile</name>\n"
1214 " <version>1.0</version>\n"
1215 " </xmlfile>\n"
1216 "</compatibility-matrix>\n";
1217 CompatibilityMatrix cm;
1218 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml));
1219 EXPECT_EQ(
1220 "compatibility-matrix.xmlfile entry media_profile has to be optional for "
1221 "compatibility matrix version 1.0",
1222 gCompatibilityMatrixConverter.lastError());
1223}
1224
Yifan Hongbbfff302017-06-06 17:10:13 -07001225TEST_F(LibVintfTest, ManifestXmlFilePathDevice) {
1226 std::string manifestXml =
1227 "<manifest version=\"1.0\" type=\"device\">"
1228 " <xmlfile>"
1229 " <name>media_profile</name>"
1230 " <version>1.0</version>"
1231 " </xmlfile>"
1232 "</manifest>";
1233 HalManifest manifest;
1234 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1235 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1236 "/vendor/etc/media_profile_V1_0.xml");
1237}
1238
1239TEST_F(LibVintfTest, ManifestXmlFilePathFramework) {
1240 std::string manifestXml =
1241 "<manifest version=\"1.0\" type=\"framework\">"
1242 " <xmlfile>"
1243 " <name>media_profile</name>"
1244 " <version>1.0</version>"
1245 " </xmlfile>"
1246 "</manifest>";
1247 HalManifest manifest;
1248 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1249 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1250 "/system/etc/media_profile_V1_0.xml");
1251}
1252
1253TEST_F(LibVintfTest, ManifestXmlFilePathOverride) {
1254 std::string manifestXml =
1255 "<manifest version=\"1.0\" type=\"device\">"
1256 " <xmlfile>"
1257 " <name>media_profile</name>"
1258 " <version>1.0</version>"
1259 " <path>/vendor/etc/foo.xml</path>"
1260 " </xmlfile>"
1261 "</manifest>";
1262 HalManifest manifest;
1263 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1264 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "/vendor/etc/foo.xml");
1265}
1266
1267TEST_F(LibVintfTest, ManifestXmlFilePathMissing) {
1268 std::string manifestXml =
1269 "<manifest version=\"1.0\" type=\"device\">"
1270 " <xmlfile>"
1271 " <name>media_profile</name>"
1272 " <version>1.1</version>"
1273 " </xmlfile>"
1274 "</manifest>";
1275 HalManifest manifest;
1276 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1277 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "");
1278}
1279
1280TEST_F(LibVintfTest, MatrixXmlFilePathFramework) {
1281 std::string matrixXml =
1282 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1283 " <xmlfile format=\"dtd\" optional=\"true\">"
1284 " <name>media_profile</name>"
1285 " <version>2.0-1</version>"
1286 " </xmlfile>"
1287 "</compatibility-matrix>";
1288 CompatibilityMatrix matrix;
1289 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1290 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 1}),
1291 "/system/etc/media_profile_V2_1.dtd");
1292}
1293
1294TEST_F(LibVintfTest, MatrixXmlFilePathDevice) {
1295 std::string matrixXml =
1296 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1297 " <xmlfile format=\"xsd\" optional=\"true\">"
1298 " <name>media_profile</name>"
1299 " <version>2.0-1</version>"
1300 " </xmlfile>"
1301 "</compatibility-matrix>";
1302 CompatibilityMatrix matrix;
1303 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1304 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}),
1305 "/vendor/etc/media_profile_V2_1.xsd");
1306}
1307
1308TEST_F(LibVintfTest, MatrixXmlFilePathOverride) {
1309 std::string matrixXml =
1310 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1311 " <xmlfile format=\"xsd\" optional=\"true\">"
1312 " <name>media_profile</name>"
1313 " <version>2.0-1</version>"
1314 " <path>/system/etc/foo.xsd</path>"
1315 " </xmlfile>"
1316 "</compatibility-matrix>";
1317 CompatibilityMatrix matrix;
1318 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1319 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "/system/etc/foo.xsd");
1320}
1321
1322TEST_F(LibVintfTest, MatrixXmlFilePathMissing) {
1323 std::string matrixXml =
1324 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1325 " <xmlfile format=\"dtd\" optional=\"true\">"
1326 " <name>media_profile</name>"
1327 " <version>2.1</version>"
1328 " </xmlfile>"
1329 "</compatibility-matrix>";
1330 CompatibilityMatrix matrix;
1331 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1332 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "");
1333}
1334
Yifan Hong02e94002017-07-10 15:41:56 -07001335std::pair<KernelConfigParser, status_t> processData(const std::string& data, bool processComments,
1336 bool relaxedFormat = false) {
1337 KernelConfigParser parser(processComments, relaxedFormat);
Yifan Hongd8cee082017-07-05 16:06:09 -07001338 const char* p = data.c_str();
1339 size_t n = 0;
1340 size_t chunkSize;
Yifan Hong6209d172017-07-07 16:18:19 -07001341 status_t status = OK;
Yifan Hongd8cee082017-07-05 16:06:09 -07001342 for (; n < data.size(); p += chunkSize, n += chunkSize) {
1343 chunkSize = std::min<size_t>(5, data.size() - n);
Yifan Hong6209d172017-07-07 16:18:19 -07001344 if ((status = parser.process(p, chunkSize)) != OK) {
1345 break;
1346 }
Yifan Hongd8cee082017-07-05 16:06:09 -07001347 }
Yifan Hong6209d172017-07-07 16:18:19 -07001348 return {std::move(parser), status};
Yifan Hongd8cee082017-07-05 16:06:09 -07001349}
1350
1351TEST_F(LibVintfTest, KernelConfigParser) {
1352 // usage in /proc/config.gz
1353 const std::string data =
1354 "# CONFIG_NOT_SET is not set\n"
1355 "CONFIG_ONE=1\n"
1356 "CONFIG_Y=y\n"
1357 "CONFIG_STR=\"string\"\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001358 auto pair = processData(data, false /* processComments */);
1359 ASSERT_EQ(OK, pair.second) << pair.first.error();
1360 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001361
1362 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1363 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1364 EXPECT_EQ(configs.find("CONFIG_STR")->second, "\"string\"");
1365 EXPECT_EQ(configs.find("CONFIG_NOT_SET"), configs.end());
1366}
1367
1368TEST_F(LibVintfTest, KernelConfigParser2) {
1369 // usage in android-base.cfg
1370 const std::string data =
1371 "# CONFIG_NOT_SET is not set\n"
1372 "CONFIG_ONE=1\n"
1373 "CONFIG_Y=y\n"
1374 "CONFIG_STR=string\n"
1375 "# ignore_thiscomment\n"
1376 "# CONFIG_NOT_SET2 is not set\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001377 auto pair = processData(data, true /* processComments */);
1378 ASSERT_EQ(OK, pair.second) << pair.first.error();
1379 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001380
1381 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1382 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1383 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1384 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1385 EXPECT_EQ(configs.find("CONFIG_NOT_SET2")->second, "n");
1386}
1387
Yifan Hongc1889722017-07-07 16:19:52 -07001388TEST_F(LibVintfTest, KernelConfigParserSpace) {
1389 // usage in android-base.cfg
1390 const std::string data =
1391 " # CONFIG_NOT_SET is not set \n"
1392 " CONFIG_ONE=1 # 'tis a one!\n"
1393 " CONFIG_TWO=2 #'tis a two! \n"
1394 " CONFIG_THREE=3#'tis a three! \n"
1395 " CONFIG_233=233#'tis a three! \n"
1396 "#yey! random comments\n"
1397 "CONFIG_Y=y \n"
1398 " CONFIG_YES=y#YES! \n"
1399 "CONFIG_STR=string\n"
1400 "CONFIG_HELLO=hello world! #still works\n"
1401 "CONFIG_WORLD=hello world! \n"
1402 "CONFIG_GOOD = good morning! #comments here\n"
1403 " CONFIG_MORNING = good morning! \n";
Yifan Hong02e94002017-07-10 15:41:56 -07001404 auto pair = processData(data, true /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07001405 ASSERT_EQ(OK, pair.second) << pair.first.error();
1406 const auto& configs = pair.first.configs();
1407
1408 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1409 EXPECT_EQ(configs.find("CONFIG_TWO")->second, "2");
1410 EXPECT_EQ(configs.find("CONFIG_THREE")->second, "3");
1411 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1412 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1413 EXPECT_EQ(configs.find("CONFIG_HELLO")->second, "hello world!")
1414 << "Value should be \"hello world!\" without trailing spaces";
1415 EXPECT_EQ(configs.find("CONFIG_WORLD")->second, "hello world!")
1416 << "Value should be \"hello world!\" without trailing spaces";
1417 EXPECT_EQ(configs.find("CONFIG_GOOD")->second, "good morning!")
1418 << "Value should be \"good morning!\" without leading or trailing spaces";
1419 EXPECT_EQ(configs.find("CONFIG_MORNING")->second, "good morning!")
1420 << "Value should be \"good morning!\" without leading or trailing spaces";
1421 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1422}
1423
1424// Run KernelConfigParserInvalidTest on processComments = {true, false}
1425class KernelConfigParserInvalidTest : public ::testing::TestWithParam<bool> {};
1426
1427TEST_P(KernelConfigParserInvalidTest, NonSet1) {
1428 const std::string data = "# CONFIG_NOT_EXIST is not sat\n";
Yifan Hong02e94002017-07-10 15:41:56 -07001429 auto pair = processData(data, GetParam() /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07001430 ASSERT_EQ(OK, pair.second) << pair.first.error();
1431 const auto& configs = pair.first.configs();
1432 EXPECT_EQ(configs.find("CONFIG_NOT_EXIST"), configs.end())
1433 << "CONFIG_NOT_EXIST should not exist because of typo";
1434}
1435
1436TEST_P(KernelConfigParserInvalidTest, InvalidLine1) {
1437 const std::string data = "FOO_CONFIG=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07001438 ASSERT_NE(OK,
1439 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07001440}
1441
1442TEST_P(KernelConfigParserInvalidTest, InvalidLine2) {
1443 const std::string data = "CONFIG_BAR-BAZ=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07001444 ASSERT_NE(OK,
1445 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07001446}
1447
1448INSTANTIATE_TEST_CASE_P(KernelConfigParser, KernelConfigParserInvalidTest, ::testing::Bool());
1449
Yifan Honga9993572017-01-24 19:33:15 -08001450} // namespace vintf
1451} // namespace android
1452
Yifan Hong676447a2016-11-15 12:57:23 -08001453int main(int argc, char **argv) {
1454 ::testing::InitGoogleTest(&argc, argv);
1455 return RUN_ALL_TESTS();
1456}