blob: 8ec02a8accaed97c2c8fdef2bf47c2fc62eb38bd [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 Honga67b2092017-10-09 13:24:54 -070042#ifdef LIBVINTF_HOST
Yifan Hongd9e46432017-08-15 17:14:52 -070043static bool Contains(const std::string& str, const std::string& sub) {
44 return str.find(sub) != std::string::npos;
45}
46#define EXPECT_CONTAINS(str, sub) \
47 EXPECT_TRUE(Contains((str), (sub))) << "Cannot find \"" << (sub) << "\" in \"" << (str) << "\""
Yifan Honga67b2092017-10-09 13:24:54 -070048#endif
Yifan Hongd9e46432017-08-15 17:14:52 -070049
Yifan Honga9993572017-01-24 19:33:15 -080050struct LibVintfTest : public ::testing::Test {
Yifan Hong676447a2016-11-15 12:57:23 -080051public:
52 virtual void SetUp() override {
53 }
54 virtual void TearDown() override {
55 }
Yifan Honga9993572017-01-24 19:33:15 -080056 bool add(CompatibilityMatrix &cm, MatrixHal &&hal) {
57 return cm.add(std::move(hal));
58 }
59 bool add(CompatibilityMatrix &cm, MatrixKernel &&kernel) {
60 return cm.add(std::move(kernel));
61 }
Yifan Hongd2b7e642017-02-17 10:15:32 -080062 bool add(HalManifest &vm, ManifestHal &&hal) {
Yifan Honga9993572017-01-24 19:33:15 -080063 return vm.add(std::move(hal));
64 }
Yifan Hongd4857902017-06-13 14:13:56 -070065 void addXmlFile(CompatibilityMatrix& cm, std::string name, VersionRange range) {
66 MatrixXmlFile f;
67 f.mName = name;
68 f.mVersionRange = range;
69 f.mFormat = XmlSchemaFormat::DTD;
70 f.mOptional = true;
71 cm.addXmlFile(std::move(f));
72 }
Yifan Hong558380a2017-02-09 15:37:32 -080073 void set(CompatibilityMatrix &cm, Sepolicy &&sepolicy) {
Yifan Hong7c7d7062017-04-04 16:26:51 -070074 cm.framework.mSepolicy = sepolicy;
Yifan Hong558380a2017-02-09 15:37:32 -080075 }
Yifan Hong03d2d4a2017-04-12 17:34:14 -070076 void set(CompatibilityMatrix &cm, SchemaType type) {
77 cm.mType = type;
78 }
79 void set(CompatibilityMatrix &cm, VndkVersionRange &&range, std::set<std::string> &&libs) {
80 cm.device.mVndk.mVersionRange = range;
81 cm.device.mVndk.mLibraries = libs;
82 }
Yifan Hong881a9e452017-04-27 19:31:13 -070083 void setAvb(RuntimeInfo &ki, Version vbmeta, Version boot) {
84 ki.mBootVbmetaAvbVersion = vbmeta;
85 ki.mBootAvbVersion = boot;
Yifan Hongf3029302017-04-12 17:23:49 -070086 }
87 void setAvb(CompatibilityMatrix &cm, Version &&avbVersion) {
88 cm.framework.mAvbMetaVersion = avbVersion;
89 }
Yifan Hong19e0a2a2017-04-14 17:30:53 -070090 Version getAvb(CompatibilityMatrix &cm) {
91 return cm.framework.mAvbMetaVersion;
92 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070093 const ManifestHal *getAnyHal(HalManifest &vm, const std::string &name) {
94 return vm.getAnyHal(name);
Yifan Honga9993572017-01-24 19:33:15 -080095 }
Yifan Hongd0cbf1f2017-04-12 19:47:06 -070096 MatrixHal *getAnyHal(CompatibilityMatrix &cm, const std::string &name) {
97 return cm.getAnyHal(name);
98 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070099 ConstMultiMapValueIterable<std::string, ManifestHal> getHals(HalManifest &vm) {
Yifan Honga9993572017-01-24 19:33:15 -0800100 return vm.getHals();
101 }
Yifan Hong5a06ef72017-01-24 19:54:24 -0800102 bool isValid(const ManifestHal &mh) {
103 return mh.isValid();
104 }
Yifan Hong5f996502017-08-23 14:46:44 -0700105 std::vector<MatrixKernel>& getKernels(CompatibilityMatrix& cm) { return cm.framework.mKernels; }
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700106
107 std::map<std::string, HalInterface> testHalInterfaces() {
108 HalInterface intf;
109 intf.name = "IFoo";
110 intf.instances.insert("default");
111 std::map<std::string, HalInterface> map;
112 map[intf.name] = intf;
113 return map;
114 }
115
Yifan Honga04e1472017-04-05 13:15:34 -0700116 HalManifest testDeviceManifest() {
Yifan Hongd2b7e642017-02-17 10:15:32 -0800117 HalManifest vm;
Yifan Hong7c7d7062017-04-04 16:26:51 -0700118 vm.mType = SchemaType::DEVICE;
Yifan Hong2a3dd082017-04-04 17:15:35 -0700119 vm.device.mSepolicyVersion = {25, 0};
Yifan Hong2059ffc2017-02-24 11:32:02 -0800120 vm.add(ManifestHal{
121 .format = HalFormat::HIDL,
122 .name = "android.hardware.camera",
123 .versions = {Version(2, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800124 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800125 .interfaces = {
126 {"ICamera", {"ICamera", {"legacy/0", "default"}}},
127 {"IBetterCamera", {"IBetterCamera", {"camera"}}}
128 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800129 });
130 vm.add(ManifestHal{
131 .format = HalFormat::HIDL,
132 .name = "android.hardware.nfc",
133 .versions = {Version(1, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800134 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800135 .interfaces = {
136 {"INfc", {"INfc", {"default"}}}
137 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800138 });
Yifan Honga9993572017-01-24 19:33:15 -0800139
140 return vm;
141 }
Yifan Hongd4857902017-06-13 14:13:56 -0700142 HalManifest testDeviceManifestWithXmlFile() {
143 HalManifest vm = testDeviceManifest();
144 ManifestXmlFile xmlFile;
145 xmlFile.mName = "media_profile";
146 xmlFile.mVersion = {1, 0};
147 vm.addXmlFile(std::move(xmlFile));
148 return vm;
149 }
Yifan Honga04e1472017-04-05 13:15:34 -0700150 HalManifest testFrameworkManfiest() {
151 HalManifest vm;
152 vm.mType = SchemaType::FRAMEWORK;
153 vm.add(ManifestHal{
154 .format = HalFormat::HIDL,
155 .name = "android.hidl.manager",
156 .versions = {Version(1, 0)},
157 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
158 .interfaces = {
159 {"IServiceManager", {"IServiceManager", {"default"}}},
160 }
161 });
162 Vndk vndk2505;
163 vndk2505.mVersionRange = {25, 0, 5};
164 vndk2505.mLibraries = { "libjpeg.so", "libbase.so" };
165 Vndk vndk2513;
166 vndk2513.mVersionRange = {25, 1, 3};
167 vndk2513.mLibraries = { "libjpeg.so", "libbase.so", "libtinyxml2.so" };
168 vm.framework.mVndks = { std::move(vndk2505), std::move(vndk2513) };
169
170 return vm;
171 }
Yifan Honga7201e72017-02-17 10:09:59 -0800172 RuntimeInfo testRuntimeInfo() {
173 RuntimeInfo info;
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800174 info.mOsName = "Linux";
175 info.mNodeName = "localhost";
176 info.mOsRelease = "3.18.31-g936f9a479d0f";
177 info.mKernelVersion = {3, 18, 31};
178 info.mOsVersion = "#4 SMP PREEMPT Wed Feb 1 18:10:52 PST 2017";
179 info.mHardwareId = "aarch64";
180 info.mKernelSepolicyVersion = 30;
Yifan Hongf1af7522017-02-16 18:00:55 -0800181 info.mKernelConfigs = {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800182 {"CONFIG_64BIT", "y"},
183 {"CONFIG_ANDROID_BINDER_DEVICES", "\"binder,hwbinder\""},
184 {"CONFIG_ARCH_MMAP_RND_BITS", "24"},
185 {"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", "\"\""},
186 {"CONFIG_ILLEGAL_POINTER_VALUE", "0xdead000000000000"}
187 };
Yifan Hong881a9e452017-04-27 19:31:13 -0700188 setAvb(info, {2, 1}, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800189 return info;
190 }
Yifan Hong676447a2016-11-15 12:57:23 -0800191};
192
Yifan Hongd5cd0482017-06-19 12:25:48 -0700193TEST_F(LibVintfTest, ArchOperatorOr) {
194 Arch a = Arch::ARCH_EMPTY;
195 a |= Arch::ARCH_32;
196 EXPECT_EQ(Arch::ARCH_32, a);
197
198 a |= Arch::ARCH_64;
199 EXPECT_EQ(Arch::ARCH_32_64, a);
200
201 a = Arch::ARCH_EMPTY;
202 a |= Arch::ARCH_64;
203 EXPECT_EQ(Arch::ARCH_64, a);
204}
Yifan Hongef6d4d32017-01-23 14:12:28 -0800205
206TEST_F(LibVintfTest, Stringify) {
Yifan Honga04e1472017-04-05 13:15:34 -0700207 HalManifest vm = testDeviceManifest();
Yifan Hong974ad9c2017-04-04 15:37:39 -0700208 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/2.0:"
209 "hidl/android.hardware.nfc/passthrough32+64/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -0800210
211 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
212 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
213
214 VersionRange v(1, 2, 3);
215 EXPECT_EQ(to_string(v), "1.2-3");
216 VersionRange v2;
217 EXPECT_TRUE(parse("1.2-3", &v2));
218 EXPECT_EQ(v, v2);
219}
220
Yifan Hong9bbdb282017-04-12 21:53:59 -0700221TEST_F(LibVintfTest, GetTransport) {
222 HalManifest vm = testDeviceManifest();
223 EXPECT_EQ(Transport::HWBINDER, vm.getTransport("android.hardware.camera",
224 {2, 0}, "ICamera", "default"));
225}
226
Yifan Hongd2b7e642017-02-17 10:15:32 -0800227TEST_F(LibVintfTest, HalManifestConverter) {
Yifan Honga04e1472017-04-05 13:15:34 -0700228 HalManifest vm = testDeviceManifest();
Yifan Hongd2b7e642017-02-17 10:15:32 -0800229 std::string xml = gHalManifestConverter(vm);
Yifan Hong676447a2016-11-15 12:57:23 -0800230 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700231 "<manifest version=\"1.0\" type=\"device\">\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800232 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800233 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800234 " <transport>hwbinder</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800235 " <version>2.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800236 " <interface>\n"
237 " <name>IBetterCamera</name>\n"
238 " <instance>camera</instance>\n"
239 " </interface>\n"
240 " <interface>\n"
241 " <name>ICamera</name>\n"
242 " <instance>default</instance>\n"
243 " <instance>legacy/0</instance>\n"
244 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800245 " </hal>\n"
246 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800247 " <name>android.hardware.nfc</name>\n"
Yifan Hongc54d32c2017-03-07 19:12:26 -0800248 " <transport arch=\"32+64\">passthrough</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800249 " <version>1.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800250 " <interface>\n"
251 " <name>INfc</name>\n"
252 " <instance>default</instance>\n"
253 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800254 " </hal>\n"
Yifan Hong2a3dd082017-04-04 17:15:35 -0700255 " <sepolicy>\n"
256 " <version>25.0</version>\n"
257 " </sepolicy>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800258 "</manifest>\n");
Yifan Hongfb7469c2017-04-05 19:15:21 -0700259 HalManifest vm2;
260 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
261 EXPECT_EQ(vm, vm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800262}
263
Yifan Honga04e1472017-04-05 13:15:34 -0700264TEST_F(LibVintfTest, HalManifestConverterFramework) {
265 HalManifest vm = testFrameworkManfiest();
266 std::string xml = gHalManifestConverter(vm);
267 EXPECT_EQ(xml,
268 "<manifest version=\"1.0\" type=\"framework\">\n"
269 " <hal format=\"hidl\">\n"
270 " <name>android.hidl.manager</name>\n"
271 " <transport>hwbinder</transport>\n"
272 " <version>1.0</version>\n"
273 " <interface>\n"
274 " <name>IServiceManager</name>\n"
275 " <instance>default</instance>\n"
276 " </interface>\n"
277 " </hal>\n"
278 " <vndk>\n"
279 " <version>25.0.5</version>\n"
280 " <library>libbase.so</library>\n"
281 " <library>libjpeg.so</library>\n"
282 " </vndk>\n"
283 " <vndk>\n"
284 " <version>25.1.3</version>\n"
285 " <library>libbase.so</library>\n"
286 " <library>libjpeg.so</library>\n"
287 " <library>libtinyxml2.so</library>\n"
288 " </vndk>\n"
289 "</manifest>\n");
290 HalManifest vm2;
291 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700292 EXPECT_EQ(vm, vm2);
Yifan Honga04e1472017-04-05 13:15:34 -0700293}
294
Yifan Hong8e9c6692017-02-28 14:07:42 -0800295TEST_F(LibVintfTest, HalManifestOptional) {
296 HalManifest vm;
297 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700298 "<manifest version=\"1.0\" type=\"device\"></manifest>"));
Yifan Hong8e9c6692017-02-28 14:07:42 -0800299 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700300 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800301 " <hal>"
302 " <name>android.hidl.manager</name>"
303 " <transport>hwbinder</transport>"
304 " <version>1.0</version>"
305 " </hal>"
306 "</manifest>"));
307 EXPECT_FALSE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700308 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800309 " <hal>"
310 " <name>android.hidl.manager</name>"
311 " <version>1.0</version>"
312 " </hal>"
313 "</manifest>"));
314}
315
Yifan Honge0bb98d2017-08-07 14:40:19 -0700316TEST_F(LibVintfTest, HalManifestNative) {
317 HalManifest vm;
318 EXPECT_TRUE(gHalManifestConverter(&vm,
319 "<manifest version=\"1.0\" type=\"device\">"
320 " <hal format=\"native\">"
321 " <name>foo</name>"
322 " <version>1.0</version>"
323 " </hal>"
324 "</manifest>"))
325 << gHalManifestConverter.lastError();
326 EXPECT_FALSE(gHalManifestConverter(&vm,
327 "<manifest version=\"1.0\" type=\"device\">"
328 " <hal format=\"native\">"
329 " <name>foo</name>"
330 " <version>1.0</version>"
331 " <transport>hwbinder</transport>"
332 " </hal>"
333 "</manifest>"));
334 EXPECT_TRUE(gHalManifestConverter.lastError().find(
335 "Native HAL 'foo' should not have <transport> defined") != std::string::npos);
336}
337
Yifan Hong79dcc1f2017-05-22 14:35:19 -0700338TEST_F(LibVintfTest, HalManifestDuplicate) {
339 HalManifest vm;
340 EXPECT_FALSE(gHalManifestConverter(&vm,
341 "<manifest version=\"1.0\" type=\"device\">"
342 " <hal>"
343 " <name>android.hidl.manager</name>"
344 " <transport>hwbinder</transport>"
345 " <version>1.0</version>"
346 " <version>1.1</version>"
347 " </hal>"
348 "</manifest>"))
349 << "Should not allow duplicated major version in <hal>";
350 EXPECT_FALSE(gHalManifestConverter(&vm,
351 "<manifest version=\"1.0\" type=\"device\">"
352 " <hal>"
353 " <name>android.hidl.manager</name>"
354 " <transport>hwbinder</transport>"
355 " <version>1.0</version>"
356 " </hal>"
357 " <hal>"
358 " <name>android.hidl.manager</name>"
359 " <transport arch=\"32+64\">passthrough</transport>"
360 " <version>1.1</version>"
361 " </hal>"
362 "</manifest>"))
363 << "Should not allow duplicated major version across <hal>";
364}
365
366TEST_F(LibVintfTest, HalManifestGetTransport) {
367 HalManifest vm;
368 EXPECT_TRUE(gHalManifestConverter(&vm,
369 "<manifest version=\"1.0\" type=\"device\">"
370 " <hal>"
371 " <name>android.hidl.manager</name>"
372 " <transport>hwbinder</transport>"
373 " <version>1.0</version>"
374 " <interface>"
375 " <name>IServiceManager</name>"
376 " <instance>default</instance>"
377 " </interface>"
378 " </hal>"
379 " <hal>"
380 " <name>android.hidl.manager</name>"
381 " <transport arch=\"32+64\">passthrough</transport>"
382 " <version>2.1</version>"
383 " <interface>"
384 " <name>IServiceManager</name>"
385 " <instance>default</instance>"
386 " </interface>"
387 " </hal>"
388 "</manifest>"));
389 EXPECT_EQ(Transport::PASSTHROUGH,
390 vm.getTransport("android.hidl.manager", {2, 1}, "IServiceManager", "default"));
391 EXPECT_EQ(Transport::PASSTHROUGH,
392 vm.getTransport("android.hidl.manager", {2, 0}, "IServiceManager", "default"));
393 EXPECT_EQ(Transport::EMPTY,
394 vm.getTransport("android.hidl.manager", {2, 2}, "IServiceManager", "default"));
395 EXPECT_EQ(Transport::HWBINDER,
396 vm.getTransport("android.hidl.manager", {1, 0}, "IServiceManager", "default"));
397}
398
Yifan Hongec3b9b72017-02-23 13:24:42 -0800399TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700400 HalManifest vm = testDeviceManifest();
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700401 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "ICamera"),
402 std::set<std::string>({"default", "legacy/0"}));
403 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "IBetterCamera"),
404 std::set<std::string>({"camera"}));
405 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "INotExist"),
406 std::set<std::string>({}));
407 EXPECT_EQ(vm.getInstances("android.hardware.nfc", {1, 0}, "INfc"),
408 std::set<std::string>({"default"}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800409
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700410 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "default"));
411 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "legacy/0"));
412 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "camera"));
413 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", {1, 0}, "INfc", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800414
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700415 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "INotExist", "default"));
416 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "notexist"));
417 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "default"));
418 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "INotExist", "notexist"));
419 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", {1, 0}, "INfc", "notexist"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800420}
421
Yifan Hong676447a2016-11-15 12:57:23 -0800422TEST_F(LibVintfTest, VersionConverter) {
423 Version v(3, 6);
424 std::string xml = gVersionConverter(v);
425 EXPECT_EQ(xml, "<version>3.6</version>\n");
426 Version v2;
427 EXPECT_TRUE(gVersionConverter(&v2, xml));
428 EXPECT_EQ(v, v2);
429}
430
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700431static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
432 std::string name{intf.name};
433 return map->emplace(std::move(name), std::move(intf)).second;
434}
435
Yifan Hong676447a2016-11-15 12:57:23 -0800436TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800437 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800438 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700439 false /* optional */, {}};
440 EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
441 EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800442 std::string xml = gMatrixHalConverter(mh);
443 EXPECT_EQ(xml,
444 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800445 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800446 " <version>1.2-3</version>\n"
447 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700448 " <interface>\n"
449 " <name>IBetterCamera</name>\n"
450 " <instance>default</instance>\n"
451 " <instance>great</instance>\n"
452 " </interface>\n"
453 " <interface>\n"
454 " <name>ICamera</name>\n"
455 " <instance>default</instance>\n"
456 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800457 "</hal>\n");
458 MatrixHal mh2;
459 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
460 EXPECT_EQ(mh, mh2);
461}
462
Yifan Hong3f5489a2017-02-08 11:14:21 -0800463TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
464
465 KernelConfigTypedValue converted;
466
467 auto testOne = [] (const KernelConfigTypedValue &original,
468 const std::string &expectXml) {
469 std::string xml;
470 KernelConfigTypedValue converted;
471 xml = gKernelConfigTypedValueConverter(original);
472 EXPECT_EQ(xml, expectXml);
473 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
474 EXPECT_EQ(original, converted);
475 };
476
477 auto testParse = [] (const KernelConfigTypedValue &original,
478 const std::string &xml) {
479 KernelConfigTypedValue converted;
480 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
481 EXPECT_EQ(original, converted);
482 };
483
484 testOne(KernelConfigTypedValue("stringvalue"),
485 "<value type=\"string\">stringvalue</value>\n");
486 testOne(KernelConfigTypedValue(""),
487 "<value type=\"string\"></value>\n");
488
489 testOne(KernelConfigTypedValue(Tristate::YES),
490 "<value type=\"tristate\">y</value>\n");
491 testOne(KernelConfigTypedValue(Tristate::NO),
492 "<value type=\"tristate\">n</value>\n");
493 testOne(KernelConfigTypedValue(Tristate::MODULE),
494 "<value type=\"tristate\">m</value>\n");
495 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
496 "<value type=\"tristate\">q</value>\n"));
497
498 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
499 "<value type=\"range\">4-20</value>\n");
500 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
501 "<value type=\"range\">0-18446744073709551615</value>\n");
502 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
503 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
504
505 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
506 "<value type=\"int\">-18446744073709551616</value>\n"));
507
508 testOne(KernelConfigTypedValue(INT64_MIN),
509 "<value type=\"int\">-9223372036854775808</value>\n");
510 testParse(KernelConfigTypedValue(INT64_MIN),
511 "<value type=\"int\">0x8000000000000000</value>\n");
512 testParse(KernelConfigTypedValue(INT64_MIN),
513 "<value type=\"int\">-0X8000000000000000</value>\n");
514
515 testParse(KernelConfigTypedValue(INT64_MIN + 1),
516 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
517
518 testParse(KernelConfigTypedValue(-0x50),
519 "<value type=\"int\">-0x50</value>\n");
520
521 testOne(KernelConfigTypedValue(0),
522 "<value type=\"int\">0</value>\n");
523
524 // Truncation for underflow.
525 testParse(KernelConfigTypedValue(1),
526 "<value type=\"int\">-0xffffffffffffffff</value>\n");
527 testParse(KernelConfigTypedValue(1),
528 "<value type=\"int\">-18446744073709551615</value>\n");
529
530 testOne(KernelConfigTypedValue(INT64_MAX),
531 "<value type=\"int\">9223372036854775807</value>\n");
532 testParse(KernelConfigTypedValue(INT64_MAX),
533 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
534 // Truncation for underflow.
535 testParse(KernelConfigTypedValue(INT64_MAX),
536 "<value type=\"int\">-9223372036854775809</value>\n");
537
538 testParse(KernelConfigTypedValue(-1),
539 "<value type=\"int\">18446744073709551615</value>\n");
540 testParse(KernelConfigTypedValue(-1),
541 "<value type=\"int\">0xffffffffffffffff</value>\n");
542
543 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
544 "<value type=\"int\">18446744073709551616</value>\n"));
545}
546
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700547TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
Yifan Hong676447a2016-11-15 12:57:23 -0800548 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800549 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800550 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700551 false /* optional */, testHalInterfaces()}));
Yifan Honga9993572017-01-24 19:33:15 -0800552 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800553 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700554 true /* optional */, testHalInterfaces()}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800555 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
556 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
557 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
558 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700559 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700560 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800561 std::string xml = gCompatibilityMatrixConverter(cm);
562 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700563 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800564 " <hal format=\"native\" optional=\"false\">\n"
565 " <name>android.hardware.camera</name>\n"
566 " <version>1.2-3</version>\n"
567 " <version>4.5-6</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"
573 " <hal format=\"native\" optional=\"true\">\n"
574 " <name>android.hardware.nfc</name>\n"
575 " <version>4.5-6</version>\n"
576 " <version>10.11-12</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700577 " <interface>\n"
578 " <name>IFoo</name>\n"
579 " <instance>default</instance>\n"
580 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800581 " </hal>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800582 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800583 " <config>\n"
584 " <key>CONFIG_FOO</key>\n"
585 " <value type=\"tristate\">y</value>\n"
586 " </config>\n"
587 " <config>\n"
588 " <key>CONFIG_BAR</key>\n"
589 " <value type=\"string\">stringvalue</value>\n"
590 " </config>\n"
591 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800592 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800593 " <config>\n"
594 " <key>CONFIG_BAZ</key>\n"
595 " <value type=\"int\">20</value>\n"
596 " </config>\n"
597 " <config>\n"
598 " <key>CONFIG_BAR</key>\n"
599 " <value type=\"range\">3-5</value>\n"
600 " </config>\n"
601 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800602 " <sepolicy>\n"
603 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700604 " <sepolicy-version>25.0</sepolicy-version>\n"
605 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800606 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700607 " <avb>\n"
608 " <vbmeta-version>2.1</vbmeta-version>\n"
609 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800610 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800611 CompatibilityMatrix cm2;
612 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700613 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800614}
615
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700616TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
617 CompatibilityMatrix cm;
618 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
619 {{VersionRange(1,0)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700620 false /* optional */, testHalInterfaces()}));
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700621 set(cm, SchemaType::DEVICE);
622 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
623 std::string xml = gCompatibilityMatrixConverter(cm);
624 EXPECT_EQ(xml,
625 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
626 " <hal format=\"native\" optional=\"false\">\n"
627 " <name>android.hidl.manager</name>\n"
628 " <version>1.0</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700629 " <interface>\n"
630 " <name>IFoo</name>\n"
631 " <instance>default</instance>\n"
632 " </interface>\n"
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700633 " </hal>\n"
634 " <vndk>\n"
635 " <version>25.0.1-5</version>\n"
636 " <library>libbase.so</library>\n"
637 " <library>libjpeg.so</library>\n"
638 " </vndk>\n"
639 "</compatibility-matrix>\n");
640 CompatibilityMatrix cm2;
641 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
642 EXPECT_EQ(cm, cm2);
643}
644
Yifan Hong676447a2016-11-15 12:57:23 -0800645TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800646 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800647
Yifan Hong2059ffc2017-02-24 11:32:02 -0800648 ManifestHal invalidHal{
649 .format = HalFormat::HIDL,
650 .name = "android.hardware.camera",
651 .versions = {{Version(2, 0), Version(2, 1)}},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800652 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64}
Yifan Hong2059ffc2017-02-24 11:32:02 -0800653 };
654
Yifan Hong5a06ef72017-01-24 19:54:24 -0800655 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800656 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800657 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800658}
659
Tri Vod0143942017-03-24 17:51:23 -0700660TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700661 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700662 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
663 {"android.hardware.camera", "android.hardware.nfc"}));
664}
665
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700666TEST_F(LibVintfTest, HalManifestGetAllHals) {
Yifan Honga04e1472017-04-05 13:15:34 -0700667 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700668 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
669 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800670
671 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
672 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800673 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800674 EXPECT_EQ(hal.name, arr[i++]);
675 }
676}
677
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700678TEST_F(LibVintfTest, HalManifestGetHals) {
679 HalManifest vm;
680 EXPECT_TRUE(
681 add(vm, ManifestHal{.format = HalFormat::HIDL,
682 .name = "android.hardware.camera",
683 .versions = {Version(1, 2)},
684 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
685 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
686 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}}));
687 EXPECT_TRUE(
688 add(vm, ManifestHal{.format = HalFormat::HIDL,
689 .name = "android.hardware.camera",
690 .versions = {Version(2, 0)},
691 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
692 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
693 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}}));
694 EXPECT_TRUE(add(vm, ManifestHal{.format = HalFormat::HIDL,
695 .name = "android.hardware.nfc",
696 .versions = {Version(1, 0), Version(2, 1)},
697 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
698 .interfaces = {{"INfc", {"INfc", {"default"}}}}}));
699 ManifestHal expectedCameraHalV1_2 =
700 ManifestHal{.format = HalFormat::HIDL,
701 .name = "android.hardware.camera",
702 .versions = {Version(1, 2)},
703 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
704 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
705 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}};
706 ManifestHal expectedCameraHalV2_0 =
707 ManifestHal{.format = HalFormat::HIDL,
708 .name = "android.hardware.camera",
709 .versions = {Version(2, 0)},
710 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
711 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
712 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}};
713 ManifestHal expectedNfcHal =
714 ManifestHal{.format = HalFormat::HIDL,
715 .name = "android.hardware.nfc",
716 .versions = {Version(1, 0), Version(2, 1)},
717 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
718 .interfaces = {{"INfc", {"INfc", {"default"}}}}};
719 auto cameraHals = vm.getHals("android.hardware.camera");
720 EXPECT_EQ((int)cameraHals.size(), 2);
721 EXPECT_EQ(*cameraHals[0], expectedCameraHalV1_2);
722 EXPECT_EQ(*cameraHals[1], expectedCameraHalV2_0);
723 auto nfcHals = vm.getHals("android.hardware.nfc");
724 EXPECT_EQ((int)nfcHals.size(), 1);
725 EXPECT_EQ(*nfcHals[0], expectedNfcHal);
726
727 EXPECT_EQ(*vm.getHal("android.hardware.camera", {1, 1}), expectedCameraHalV1_2);
728 EXPECT_EQ(*vm.getHal("android.hardware.camera", {2, 0}), expectedCameraHalV2_0);
729 EXPECT_EQ(*vm.getHal("android.hardware.nfc", {1, 0}), expectedNfcHal);
730 EXPECT_EQ(*vm.getHal("android.hardware.nfc", {2, 0}), expectedNfcHal);
731 EXPECT_EQ(*vm.getHal("android.hardware.nfc", {2, 1}), expectedNfcHal);
732
733 EXPECT_EQ(vm.getHal("non-existent", {1, 0}), nullptr);
734 EXPECT_EQ(vm.getHal("android.hardware.camera", {2, 1}), nullptr);
735 EXPECT_EQ(vm.getHal("android.hardware.camera", {1, 3}), nullptr);
736 EXPECT_EQ(vm.getHal("android.hardware.nfc", {1, 1}), nullptr);
737 EXPECT_EQ(vm.getHal("android.hardware.nfc", {3, 0}), nullptr);
738}
739
740TEST_F(LibVintfTest, CompatibilityMatrixGetHals) {
741 CompatibilityMatrix cm;
742 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
743 "android.hardware.camera",
744 {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
745 false /* optional */,
746 testHalInterfaces()}));
747 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
748 "android.hardware.nfc",
749 {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
750 true /* optional */,
751 testHalInterfaces()}));
752
753 MatrixHal expectedCameraHal = MatrixHal{
754 HalFormat::NATIVE,
755 "android.hardware.camera",
756 {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
757 false /* optional */,
758 testHalInterfaces(),
759 };
760 MatrixHal expectedNfcHal = MatrixHal{HalFormat::NATIVE,
761 "android.hardware.nfc",
762 {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
763 true /* optional */,
764 testHalInterfaces()};
765 auto cameraHals = cm.getHals("android.hardware.camera");
766 EXPECT_EQ((int)cameraHals.size(), 1);
767 EXPECT_EQ(*cameraHals[0], expectedCameraHal);
768 auto nfcHals = cm.getHals("android.hardware.nfc");
769 EXPECT_EQ((int)nfcHals.size(), 1);
770 EXPECT_EQ(*nfcHals[0], expectedNfcHal);
771
772 EXPECT_EQ(*cm.getHal("android.hardware.camera", {1, 2}), expectedCameraHal);
773 EXPECT_EQ(*cm.getHal("android.hardware.camera", {1, 3}), expectedCameraHal);
774 EXPECT_EQ(*cm.getHal("android.hardware.camera", {4, 5}), expectedCameraHal);
775 EXPECT_EQ(*cm.getHal("android.hardware.nfc", {4, 5}), expectedNfcHal);
776 EXPECT_EQ(*cm.getHal("android.hardware.nfc", {10, 12}), expectedNfcHal);
777
778 EXPECT_EQ(cm.getHal("non-existent", {1, 0}), nullptr);
779 EXPECT_EQ(cm.getHal("android.hardware.camera", {2, 1}), nullptr);
780 EXPECT_EQ(cm.getHal("android.hardware.camera", {1, 0}), nullptr);
781 EXPECT_EQ(cm.getHal("android.hardware.nfc", {3, 0}), nullptr);
782 EXPECT_EQ(cm.getHal("android.hardware.nfc", {4, 7}), nullptr);
783}
784
Yifan Honga7201e72017-02-17 10:09:59 -0800785TEST_F(LibVintfTest, RuntimeInfo) {
786 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800787 using KernelConfigs = std::vector<KernelConfig>;
788 const KernelConfigs configs {
789 KernelConfig{"CONFIG_64BIT", Tristate::YES},
790 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
791 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
792 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
793 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
794 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
795 };
796
797 auto testMatrix = [&] (MatrixKernel &&kernel) {
798 CompatibilityMatrix cm;
799 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700800 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700801 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800802 return cm;
803 };
804
805 std::string error;
806
807 {
808 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
809 CompatibilityMatrix cm = testMatrix(std::move(kernel));
810 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
811 }
812
813 {
Yifan Hong5f996502017-08-23 14:46:44 -0700814 MatrixKernel kernel(KernelVersion{3, 18, 60}, KernelConfigs(configs));
815 CompatibilityMatrix cm = testMatrix(std::move(kernel));
816 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
817 }
818
819 {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800820 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
821 CompatibilityMatrix cm = testMatrix(std::move(kernel));
822 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
823 }
824
825 {
826 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
827 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700828 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800829 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
830 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700831 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800832 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
833 << "kernel-sepolicy-version shouldn't match";
834 }
835
836 {
837 KernelConfigs newConfigs(configs);
838 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
839 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
840 CompatibilityMatrix cm = testMatrix(std::move(kernel));
841 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
842 }
843
844 {
845 KernelConfigs newConfigs(configs);
846 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
847 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
848 CompatibilityMatrix cm = testMatrix(std::move(kernel));
849 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
850 }
851
852 {
853 KernelConfigs newConfigs(configs);
854 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
855 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
856 CompatibilityMatrix cm = testMatrix(std::move(kernel));
857 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
858 }
859
860 {
861 KernelConfigs newConfigs(configs);
862 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
863 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
864 CompatibilityMatrix cm = testMatrix(std::move(kernel));
865 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
866 }
867
868 {
869 KernelConfigs newConfigs(configs);
870 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
871 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
872 CompatibilityMatrix cm = testMatrix(std::move(kernel));
873 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
874 }
Yifan Hongdb6423e2017-09-11 14:38:46 -0700875
Yifan Hongf3029302017-04-12 17:23:49 -0700876 RuntimeInfo badAvb = testRuntimeInfo();
877 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
878 {
879 setAvb(badAvb, {1, 0}, {2, 1});
880 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
Michael Schwartz5cfbc922017-05-08 14:06:49 -0700881 EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
Yifan Hongf3029302017-04-12 17:23:49 -0700882 }
883 {
884 setAvb(badAvb, {2, 1}, {3, 0});
885 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
886 }
887 {
888 setAvb(badAvb, {2, 1}, {2, 3});
889 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
890 }
891 {
892 setAvb(badAvb, {2, 3}, {2, 1});
893 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
894 }
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800895}
896
Yifan Hong19e0a2a2017-04-14 17:30:53 -0700897TEST_F(LibVintfTest, MissingAvb) {
898 std::string xml =
899 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
900 " <kernel version=\"3.18.31\"></kernel>"
901 " <sepolicy>\n"
902 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
903 " <sepolicy-version>25.5</sepolicy-version>\n"
904 " </sepolicy>\n"
905 "</compatibility-matrix>\n";
906 CompatibilityMatrix cm;
907 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
908 EXPECT_EQ(getAvb(cm), Version(0, 0));
909}
910
Yifan Hongdb6423e2017-09-11 14:38:46 -0700911TEST_F(LibVintfTest, DisableAvb) {
912 std::string xml =
913 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
914 " <kernel version=\"3.18.31\"></kernel>"
915 " <sepolicy>\n"
916 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
917 " <sepolicy-version>25.5</sepolicy-version>\n"
918 " </sepolicy>\n"
919 " <avb>\n"
920 " <vbmeta-version>1.0</vbmeta-version>\n"
921 " </avb>\n"
922 "</compatibility-matrix>\n";
923 CompatibilityMatrix cm;
924 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
925 RuntimeInfo ki = testRuntimeInfo();
926 std::string error;
927 EXPECT_FALSE(ki.checkCompatibility(cm, &error));
928 EXPECT_STREQ(error.c_str(), "AVB version 2.1 does not match framework matrix 1.0");
929 EXPECT_TRUE(ki.checkCompatibility(cm, &error, DISABLE_AVB_CHECK)) << error;
930}
931
Yifan Hong08e984c2017-05-18 12:50:04 -0700932// This is the test extracted from VINTF Object doc
933TEST_F(LibVintfTest, HalCompat) {
934 CompatibilityMatrix matrix;
935 std::string error;
936
937 std::string matrixXml =
938 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
939 " <hal format=\"hidl\" optional=\"false\">\n"
940 " <name>android.hardware.foo</name>\n"
941 " <version>1.0</version>\n"
942 " <version>3.1-2</version>\n"
943 " <interface>\n"
944 " <name>IFoo</name>\n"
945 " <instance>default</instance>\n"
946 " <instance>specific</instance>\n"
947 " </interface>\n"
948 " </hal>\n"
949 " <hal format=\"hidl\" optional=\"false\">\n"
950 " <name>android.hardware.foo</name>\n"
951 " <version>2.0</version>\n"
952 " <interface>\n"
953 " <name>IBar</name>\n"
954 " <instance>default</instance>\n"
955 " </interface>\n"
956 " </hal>\n"
957 " <sepolicy>\n"
958 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
959 " <sepolicy-version>25.5</sepolicy-version>\n"
960 " </sepolicy>\n"
961 "</compatibility-matrix>\n";
962 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
963 << gCompatibilityMatrixConverter.lastError();
964
965 {
966 std::string manifestXml =
967 "<manifest version=\"1.0\" type=\"device\">\n"
968 " <hal format=\"hidl\">\n"
969 " <name>android.hardware.foo</name>\n"
970 " <transport>hwbinder</transport>\n"
971 " <version>1.0</version>\n"
972 " <interface>\n"
973 " <name>IFoo</name>\n"
974 " <instance>default</instance>\n"
975 " <instance>specific</instance>\n"
976 " </interface>\n"
977 " </hal>\n"
978 " <hal format=\"hidl\">\n"
979 " <name>android.hardware.foo</name>\n"
980 " <transport>hwbinder</transport>\n"
981 " <version>2.0</version>\n"
982 " <interface>\n"
983 " <name>IBar</name>\n"
984 " <instance>default</instance>\n"
985 " </interface>\n"
986 " </hal>\n"
987 " <sepolicy>\n"
988 " <version>25.5</version>\n"
989 " </sepolicy>\n"
990 "</manifest>\n";
991
992 HalManifest manifest;
993 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
994 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
995 }
996
997 {
998 std::string manifestXml =
999 "<manifest version=\"1.0\" type=\"device\">\n"
1000 " <hal format=\"hidl\">\n"
1001 " <name>android.hardware.foo</name>\n"
1002 " <transport>hwbinder</transport>\n"
1003 " <version>1.0</version>\n"
1004 " <interface>\n"
1005 " <name>IFoo</name>\n"
1006 " <instance>default</instance>\n"
1007 " <instance>specific</instance>\n"
1008 " </interface>\n"
1009 " </hal>\n"
1010 " <sepolicy>\n"
1011 " <version>25.5</version>\n"
1012 " </sepolicy>\n"
1013 "</manifest>\n";
1014 HalManifest manifest;
1015 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1016 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1017 << "should not be compatible because IBar is missing";
1018 }
1019
1020 {
1021 std::string manifestXml =
1022 "<manifest version=\"1.0\" type=\"device\">\n"
1023 " <hal format=\"hidl\">\n"
1024 " <name>android.hardware.foo</name>\n"
1025 " <transport>hwbinder</transport>\n"
1026 " <version>1.0</version>\n"
1027 " <interface>\n"
1028 " <name>IFoo</name>\n"
1029 " <instance>default</instance>\n"
1030 " </interface>\n"
1031 " </hal>\n"
1032 " <hal format=\"hidl\">\n"
1033 " <name>android.hardware.foo</name>\n"
1034 " <transport>hwbinder</transport>\n"
1035 " <version>2.0</version>\n"
1036 " <interface>\n"
1037 " <name>IBar</name>\n"
1038 " <instance>default</instance>\n"
1039 " </interface>\n"
1040 " </hal>\n"
1041 " <sepolicy>\n"
1042 " <version>25.5</version>\n"
1043 " </sepolicy>\n"
1044 "</manifest>\n";
1045 HalManifest manifest;
1046 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1047 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1048 << "should not be compatible because IFoo/default is missing";
1049 }
1050
1051 {
1052 std::string manifestXml =
1053 "<manifest version=\"1.0\" type=\"device\">\n"
1054 " <hal format=\"hidl\">\n"
1055 " <name>android.hardware.foo</name>\n"
1056 " <transport>hwbinder</transport>\n"
1057 " <version>3.3</version>\n"
1058 " <interface>\n"
1059 " <name>IFoo</name>\n"
1060 " <instance>default</instance>\n"
1061 " <instance>specific</instance>\n"
1062 " </interface>\n"
1063 " </hal>\n"
1064 " <hal format=\"hidl\">\n"
1065 " <name>android.hardware.foo</name>\n"
1066 " <transport>hwbinder</transport>\n"
1067 " <version>2.0</version>\n"
1068 " <interface>\n"
1069 " <name>IBar</name>\n"
1070 " <instance>default</instance>\n"
1071 " </interface>\n"
1072 " </hal>\n"
1073 " <sepolicy>\n"
1074 " <version>25.5</version>\n"
1075 " </sepolicy>\n"
1076 "</manifest>\n";
1077 HalManifest manifest;
1078 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1079 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1080 }
1081
1082 {
1083 std::string manifestXml =
1084 "<manifest version=\"1.0\" type=\"device\">\n"
1085 " <hal format=\"hidl\">\n"
1086 " <name>android.hardware.foo</name>\n"
1087 " <transport>hwbinder</transport>\n"
1088 " <version>1.0</version>\n"
1089 " <interface>\n"
1090 " <name>IFoo</name>\n"
1091 " <instance>default</instance>\n"
1092 " </interface>\n"
1093 " </hal>\n"
1094 " <hal format=\"hidl\">\n"
1095 " <name>android.hardware.foo</name>\n"
1096 " <transport>hwbinder</transport>\n"
1097 " <version>3.2</version>\n"
1098 " <interface>\n"
1099 " <name>IFoo</name>\n"
1100 " <instance>specific</instance>\n"
1101 " </interface>\n"
1102 " </hal>\n"
1103 " <hal format=\"hidl\">\n"
1104 " <name>android.hardware.foo</name>\n"
1105 " <transport>hwbinder</transport>\n"
1106 " <version>2.0</version>\n"
1107 " <interface>\n"
1108 " <name>IBar</name>\n"
1109 " <instance>default</instance>\n"
1110 " </interface>\n"
1111 " </hal>\n"
1112 " <sepolicy>\n"
1113 " <version>25.5</version>\n"
1114 " </sepolicy>\n"
1115 "</manifest>\n";
1116 HalManifest manifest;
1117 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1118 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1119 << "should not be compatible even though @1.0::IFoo/default "
1120 << "and @3.2::IFoo/specific present";
1121 }
1122
1123 {
1124 std::string manifestXml =
1125 "<manifest version=\"1.0\" type=\"device\">\n"
1126 " <hal format=\"hidl\">\n"
1127 " <name>android.hardware.foo</name>\n"
1128 " <transport>hwbinder</transport>\n"
1129 " <version>1.0</version>\n"
1130 " <interface>\n"
1131 " <name>IFoo</name>\n"
1132 " <instance>default</instance>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001133 " <instance>specific</instance>\n"
1134 " </interface>\n"
1135 " </hal>\n"
1136 " <hal format=\"hidl\">\n"
1137 " <name>android.hardware.foo</name>\n"
1138 " <transport>hwbinder</transport>\n"
1139 " <version>2.0</version>\n"
1140 " <interface>\n"
1141 " <name>IBar</name>\n"
1142 " <instance>default</instance>\n"
1143 " </interface>\n"
1144 " </hal>\n"
1145 " <sepolicy>\n"
1146 " <version>25.5</version>\n"
1147 " </sepolicy>\n"
1148 "</manifest>\n";
1149 HalManifest manifest;
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001150 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml))
1151 << gHalManifestConverter.lastError();
1152 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
Yifan Hong08e984c2017-05-18 12:50:04 -07001153 }
1154}
1155
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001156TEST_F(LibVintfTest, Compat) {
1157 std::string manifestXml =
1158 "<manifest version=\"1.0\" type=\"device\">\n"
1159 " <hal format=\"hidl\">\n"
1160 " <name>android.hardware.camera</name>\n"
1161 " <transport>hwbinder</transport>\n"
1162 " <version>3.5</version>\n"
1163 " <interface>\n"
1164 " <name>IBetterCamera</name>\n"
1165 " <instance>camera</instance>\n"
1166 " </interface>\n"
1167 " <interface>\n"
1168 " <name>ICamera</name>\n"
1169 " <instance>default</instance>\n"
1170 " <instance>legacy/0</instance>\n"
1171 " </interface>\n"
1172 " </hal>\n"
1173 " <hal format=\"hidl\">\n"
1174 " <name>android.hardware.nfc</name>\n"
1175 " <transport>hwbinder</transport>\n"
1176 " <version>1.0</version>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001177 " <interface>\n"
1178 " <name>INfc</name>\n"
1179 " <instance>nfc_nci</instance>\n"
1180 " </interface>\n"
1181 " </hal>\n"
1182 " <hal format=\"hidl\">\n"
1183 " <name>android.hardware.nfc</name>\n"
1184 " <transport>hwbinder</transport>\n"
1185 " <version>2.0</version>\n"
1186 " <interface>\n"
1187 " <name>INfc</name>\n"
1188 " <instance>default</instance>\n"
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001189 " <instance>nfc_nci</instance>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001190 " </interface>\n"
1191 " </hal>\n"
1192 " <sepolicy>\n"
1193 " <version>25.5</version>\n"
1194 " </sepolicy>\n"
1195 "</manifest>\n";
1196
1197 std::string matrixXml =
1198 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1199 " <hal format=\"hidl\" optional=\"false\">\n"
1200 " <name>android.hardware.camera</name>\n"
1201 " <version>2.0-5</version>\n"
1202 " <version>3.4-16</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001203 " <interface>\n"
1204 " <name>IBetterCamera</name>\n"
1205 " <instance>camera</instance>\n"
1206 " </interface>\n"
1207 " <interface>\n"
1208 " <name>ICamera</name>\n"
1209 " <instance>default</instance>\n"
1210 " <instance>legacy/0</instance>\n"
1211 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001212 " </hal>\n"
1213 " <hal format=\"hidl\" optional=\"false\">\n"
1214 " <name>android.hardware.nfc</name>\n"
1215 " <version>1.0</version>\n"
1216 " <version>2.0</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001217 " <interface>\n"
1218 " <name>INfc</name>\n"
1219 " <instance>nfc_nci</instance>\n"
1220 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001221 " </hal>\n"
1222 " <hal format=\"hidl\" optional=\"true\">\n"
1223 " <name>android.hardware.foo</name>\n"
1224 " <version>1.0</version>\n"
1225 " </hal>\n"
1226 " <sepolicy>\n"
1227 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1228 " <sepolicy-version>25.5</sepolicy-version>\n"
1229 " <sepolicy-version>26.0-3</sepolicy-version>\n"
1230 " </sepolicy>\n"
1231 " <avb>\n"
1232 " <vbmeta-version>2.1</vbmeta-version>\n"
1233 " </avb>\n"
1234 "</compatibility-matrix>\n";
1235
1236 HalManifest manifest;
1237 CompatibilityMatrix matrix;
1238 std::string error;
1239 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1240 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1241 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1242
1243 // some smaller test cases
1244 matrixXml =
1245 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1246 " <hal format=\"hidl\" optional=\"false\">\n"
1247 " <name>android.hardware.camera</name>\n"
1248 " <version>3.4</version>\n"
1249 " </hal>\n"
1250 " <sepolicy>\n"
1251 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1252 " <sepolicy-version>25.5</sepolicy-version>\n"
1253 " </sepolicy>\n"
1254 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1255 "</compatibility-matrix>\n";
1256 matrix = {};
1257 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1258 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1259 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
1260 EXPECT_NE(camera, nullptr);
1261 camera->versionRanges[0] = {3, 5};
1262 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1263 camera->versionRanges[0] = {3, 6};
1264 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1265
1266 // reset it
1267 matrix = {};
1268 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1269 set(matrix, Sepolicy{30, {{26, 0}}});
1270 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1271 set(matrix, Sepolicy{30, {{25, 6}}});
1272 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1273 set(matrix, Sepolicy{30, {{25, 4}}});
1274 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1275}
1276
Yifan Hongd4857902017-06-13 14:13:56 -07001277/////////////////// xmlfile tests
1278
1279TEST_F(LibVintfTest, HalManifestConverterXmlFile) {
1280 HalManifest vm = testDeviceManifestWithXmlFile();
1281 std::string xml = gHalManifestConverter(vm);
1282 EXPECT_EQ(xml,
1283 "<manifest version=\"1.0\" type=\"device\">\n"
1284 " <hal format=\"hidl\">\n"
1285 " <name>android.hardware.camera</name>\n"
1286 " <transport>hwbinder</transport>\n"
1287 " <version>2.0</version>\n"
1288 " <interface>\n"
1289 " <name>IBetterCamera</name>\n"
1290 " <instance>camera</instance>\n"
1291 " </interface>\n"
1292 " <interface>\n"
1293 " <name>ICamera</name>\n"
1294 " <instance>default</instance>\n"
1295 " <instance>legacy/0</instance>\n"
1296 " </interface>\n"
1297 " </hal>\n"
1298 " <hal format=\"hidl\">\n"
1299 " <name>android.hardware.nfc</name>\n"
1300 " <transport arch=\"32+64\">passthrough</transport>\n"
1301 " <version>1.0</version>\n"
1302 " <interface>\n"
1303 " <name>INfc</name>\n"
1304 " <instance>default</instance>\n"
1305 " </interface>\n"
1306 " </hal>\n"
1307 " <sepolicy>\n"
1308 " <version>25.0</version>\n"
1309 " </sepolicy>\n"
1310 " <xmlfile>\n"
1311 " <name>media_profile</name>\n"
1312 " <version>1.0</version>\n"
1313 " </xmlfile>\n"
1314 "</manifest>\n");
1315 HalManifest vm2;
1316 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
1317 EXPECT_EQ(vm, vm2);
1318}
1319
1320TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile) {
1321 CompatibilityMatrix cm;
1322 addXmlFile(cm, "media_profile", {1, 0});
1323 std::string xml = gCompatibilityMatrixConverter(cm);
1324 EXPECT_EQ(xml,
1325 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1326 " <sepolicy>\n"
1327 " <kernel-sepolicy-version>0</kernel-sepolicy-version>\n"
1328 " </sepolicy>\n"
1329 " <avb>\n"
1330 " <vbmeta-version>0.0</vbmeta-version>\n"
1331 " </avb>\n"
1332 " <xmlfile format=\"dtd\" optional=\"true\">\n"
1333 " <name>media_profile</name>\n"
1334 " <version>1.0</version>\n"
1335 " </xmlfile>\n"
1336 "</compatibility-matrix>\n");
1337 CompatibilityMatrix cm2;
1338 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
1339 EXPECT_EQ(cm, cm2);
1340}
1341
1342TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile2) {
1343 std::string xml =
1344 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1345 " <xmlfile format=\"dtd\" optional=\"false\">\n"
1346 " <name>media_profile</name>\n"
1347 " <version>1.0</version>\n"
1348 " </xmlfile>\n"
1349 "</compatibility-matrix>\n";
1350 CompatibilityMatrix cm;
1351 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml));
1352 EXPECT_EQ(
1353 "compatibility-matrix.xmlfile entry media_profile has to be optional for "
1354 "compatibility matrix version 1.0",
1355 gCompatibilityMatrixConverter.lastError());
1356}
1357
Yifan Hongbbfff302017-06-06 17:10:13 -07001358TEST_F(LibVintfTest, ManifestXmlFilePathDevice) {
1359 std::string manifestXml =
1360 "<manifest version=\"1.0\" type=\"device\">"
1361 " <xmlfile>"
1362 " <name>media_profile</name>"
1363 " <version>1.0</version>"
1364 " </xmlfile>"
1365 "</manifest>";
1366 HalManifest manifest;
1367 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1368 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1369 "/vendor/etc/media_profile_V1_0.xml");
1370}
1371
1372TEST_F(LibVintfTest, ManifestXmlFilePathFramework) {
1373 std::string manifestXml =
1374 "<manifest version=\"1.0\" type=\"framework\">"
1375 " <xmlfile>"
1376 " <name>media_profile</name>"
1377 " <version>1.0</version>"
1378 " </xmlfile>"
1379 "</manifest>";
1380 HalManifest manifest;
1381 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1382 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1383 "/system/etc/media_profile_V1_0.xml");
1384}
1385
1386TEST_F(LibVintfTest, ManifestXmlFilePathOverride) {
1387 std::string manifestXml =
1388 "<manifest version=\"1.0\" type=\"device\">"
1389 " <xmlfile>"
1390 " <name>media_profile</name>"
1391 " <version>1.0</version>"
1392 " <path>/vendor/etc/foo.xml</path>"
1393 " </xmlfile>"
1394 "</manifest>";
1395 HalManifest manifest;
1396 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1397 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "/vendor/etc/foo.xml");
1398}
1399
1400TEST_F(LibVintfTest, ManifestXmlFilePathMissing) {
1401 std::string manifestXml =
1402 "<manifest version=\"1.0\" type=\"device\">"
1403 " <xmlfile>"
1404 " <name>media_profile</name>"
1405 " <version>1.1</version>"
1406 " </xmlfile>"
1407 "</manifest>";
1408 HalManifest manifest;
1409 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1410 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "");
1411}
1412
1413TEST_F(LibVintfTest, MatrixXmlFilePathFramework) {
1414 std::string matrixXml =
1415 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1416 " <xmlfile format=\"dtd\" optional=\"true\">"
1417 " <name>media_profile</name>"
1418 " <version>2.0-1</version>"
1419 " </xmlfile>"
1420 "</compatibility-matrix>";
1421 CompatibilityMatrix matrix;
1422 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1423 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 1}),
1424 "/system/etc/media_profile_V2_1.dtd");
1425}
1426
1427TEST_F(LibVintfTest, MatrixXmlFilePathDevice) {
1428 std::string matrixXml =
1429 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1430 " <xmlfile format=\"xsd\" optional=\"true\">"
1431 " <name>media_profile</name>"
1432 " <version>2.0-1</version>"
1433 " </xmlfile>"
1434 "</compatibility-matrix>";
1435 CompatibilityMatrix matrix;
1436 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1437 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}),
1438 "/vendor/etc/media_profile_V2_1.xsd");
1439}
1440
1441TEST_F(LibVintfTest, MatrixXmlFilePathOverride) {
1442 std::string matrixXml =
1443 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1444 " <xmlfile format=\"xsd\" optional=\"true\">"
1445 " <name>media_profile</name>"
1446 " <version>2.0-1</version>"
1447 " <path>/system/etc/foo.xsd</path>"
1448 " </xmlfile>"
1449 "</compatibility-matrix>";
1450 CompatibilityMatrix matrix;
1451 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1452 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "/system/etc/foo.xsd");
1453}
1454
1455TEST_F(LibVintfTest, MatrixXmlFilePathMissing) {
1456 std::string matrixXml =
1457 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1458 " <xmlfile format=\"dtd\" optional=\"true\">"
1459 " <name>media_profile</name>"
1460 " <version>2.1</version>"
1461 " </xmlfile>"
1462 "</compatibility-matrix>";
1463 CompatibilityMatrix matrix;
1464 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1465 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "");
1466}
1467
Yifan Hong02e94002017-07-10 15:41:56 -07001468std::pair<KernelConfigParser, status_t> processData(const std::string& data, bool processComments,
1469 bool relaxedFormat = false) {
1470 KernelConfigParser parser(processComments, relaxedFormat);
Yifan Hongd8cee082017-07-05 16:06:09 -07001471 const char* p = data.c_str();
1472 size_t n = 0;
1473 size_t chunkSize;
Yifan Hong6209d172017-07-07 16:18:19 -07001474 status_t status = OK;
Yifan Hongd8cee082017-07-05 16:06:09 -07001475 for (; n < data.size(); p += chunkSize, n += chunkSize) {
1476 chunkSize = std::min<size_t>(5, data.size() - n);
Yifan Hong6209d172017-07-07 16:18:19 -07001477 if ((status = parser.process(p, chunkSize)) != OK) {
1478 break;
1479 }
Yifan Hongd8cee082017-07-05 16:06:09 -07001480 }
Yifan Hong6209d172017-07-07 16:18:19 -07001481 return {std::move(parser), status};
Yifan Hongd8cee082017-07-05 16:06:09 -07001482}
1483
1484TEST_F(LibVintfTest, KernelConfigParser) {
1485 // usage in /proc/config.gz
1486 const std::string data =
1487 "# CONFIG_NOT_SET is not set\n"
1488 "CONFIG_ONE=1\n"
1489 "CONFIG_Y=y\n"
1490 "CONFIG_STR=\"string\"\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001491 auto pair = processData(data, false /* processComments */);
1492 ASSERT_EQ(OK, pair.second) << pair.first.error();
1493 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001494
1495 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1496 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1497 EXPECT_EQ(configs.find("CONFIG_STR")->second, "\"string\"");
1498 EXPECT_EQ(configs.find("CONFIG_NOT_SET"), configs.end());
1499}
1500
1501TEST_F(LibVintfTest, KernelConfigParser2) {
1502 // usage in android-base.cfg
1503 const std::string data =
1504 "# CONFIG_NOT_SET is not set\n"
1505 "CONFIG_ONE=1\n"
1506 "CONFIG_Y=y\n"
1507 "CONFIG_STR=string\n"
1508 "# ignore_thiscomment\n"
1509 "# CONFIG_NOT_SET2 is not set\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001510 auto pair = processData(data, true /* processComments */);
1511 ASSERT_EQ(OK, pair.second) << pair.first.error();
1512 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001513
1514 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1515 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1516 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1517 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1518 EXPECT_EQ(configs.find("CONFIG_NOT_SET2")->second, "n");
1519}
1520
Yifan Hongc1889722017-07-07 16:19:52 -07001521TEST_F(LibVintfTest, KernelConfigParserSpace) {
1522 // usage in android-base.cfg
1523 const std::string data =
1524 " # CONFIG_NOT_SET is not set \n"
1525 " CONFIG_ONE=1 # 'tis a one!\n"
1526 " CONFIG_TWO=2 #'tis a two! \n"
1527 " CONFIG_THREE=3#'tis a three! \n"
1528 " CONFIG_233=233#'tis a three! \n"
1529 "#yey! random comments\n"
1530 "CONFIG_Y=y \n"
1531 " CONFIG_YES=y#YES! \n"
1532 "CONFIG_STR=string\n"
1533 "CONFIG_HELLO=hello world! #still works\n"
1534 "CONFIG_WORLD=hello world! \n"
1535 "CONFIG_GOOD = good morning! #comments here\n"
1536 " CONFIG_MORNING = good morning! \n";
Yifan Hong02e94002017-07-10 15:41:56 -07001537 auto pair = processData(data, true /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07001538 ASSERT_EQ(OK, pair.second) << pair.first.error();
1539 const auto& configs = pair.first.configs();
1540
1541 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1542 EXPECT_EQ(configs.find("CONFIG_TWO")->second, "2");
1543 EXPECT_EQ(configs.find("CONFIG_THREE")->second, "3");
1544 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1545 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1546 EXPECT_EQ(configs.find("CONFIG_HELLO")->second, "hello world!")
1547 << "Value should be \"hello world!\" without trailing spaces";
1548 EXPECT_EQ(configs.find("CONFIG_WORLD")->second, "hello world!")
1549 << "Value should be \"hello world!\" without trailing spaces";
1550 EXPECT_EQ(configs.find("CONFIG_GOOD")->second, "good morning!")
1551 << "Value should be \"good morning!\" without leading or trailing spaces";
1552 EXPECT_EQ(configs.find("CONFIG_MORNING")->second, "good morning!")
1553 << "Value should be \"good morning!\" without leading or trailing spaces";
1554 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1555}
1556
Yifan Hongd9e46432017-08-15 17:14:52 -07001557TEST_F(LibVintfTest, NetutilsWrapperMatrix) {
1558 std::string matrixXml;
1559 CompatibilityMatrix matrix;
1560
1561 matrixXml =
1562 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1563 " <hal format=\"native\" optional=\"false\">"
1564 " <name>netutils-wrapper</name>"
1565 " <version>1.0</version>"
1566 " </hal>"
1567 "</compatibility-matrix>";
1568 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
1569 << gCompatibilityMatrixConverter.lastError();
1570
1571// only host libvintf hardcodes netutils-wrapper version requirements
1572#ifdef LIBVINTF_HOST
1573
1574 matrixXml =
1575 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1576 " <hal format=\"native\" optional=\"false\">"
1577 " <name>netutils-wrapper</name>"
1578 " <version>1.0-1</version>"
1579 " </hal>"
1580 "</compatibility-matrix>";
1581 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1582 EXPECT_CONTAINS(
1583 gCompatibilityMatrixConverter.lastError(),
1584 "netutils-wrapper HAL must specify exactly one version x.0, but a range is provided. "
1585 "Perhaps you mean '1.0'?");
1586
1587 matrixXml =
1588 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1589 " <hal format=\"native\" optional=\"false\">"
1590 " <name>netutils-wrapper</name>"
1591 " <version>1.1</version>"
1592 " </hal>"
1593 "</compatibility-matrix>";
1594 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1595 EXPECT_CONTAINS(
1596 gCompatibilityMatrixConverter.lastError(),
1597 "netutils-wrapper HAL must specify exactly one version x.0, but minor version is not 0. "
1598 "Perhaps you mean '1.0'?");
1599
1600 matrixXml =
1601 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1602 " <hal format=\"native\" optional=\"false\">"
1603 " <name>netutils-wrapper</name>"
1604 " <version>1.0</version>"
1605 " <version>2.0</version>"
1606 " </hal>"
1607 "</compatibility-matrix>";
1608 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1609 EXPECT_CONTAINS(
1610 gCompatibilityMatrixConverter.lastError(),
1611 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1612 "is specified.");
1613
1614#endif // LIBVINTF_HOST
1615}
1616
1617TEST_F(LibVintfTest, NetutilsWrapperManifest) {
1618 std::string manifestXml;
1619 HalManifest manifest;
1620
1621 manifestXml =
1622 "<manifest version=\"1.0\" type=\"framework\">"
1623 " <hal format=\"native\">"
1624 " <name>netutils-wrapper</name>"
1625 " <version>1.0</version>"
1626 " <version>2.0</version>"
1627 " </hal>"
1628 "</manifest>";
1629 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml)) << gHalManifestConverter.lastError();
1630
1631// only host libvintf hardcodes netutils-wrapper version requirements
1632#ifdef LIBVINTF_HOST
1633
1634 manifestXml =
1635 "<manifest version=\"1.0\" type=\"framework\">"
1636 " <hal format=\"native\">"
1637 " <name>netutils-wrapper</name>"
1638 " <version>1.1</version>"
1639 " </hal>"
1640 "</manifest>";
1641 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1642 EXPECT_CONTAINS(
1643 gCompatibilityMatrixConverter.lastError(),
1644 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1645 "is specified.");
1646
1647 manifestXml =
1648 "<manifest version=\"1.0\" type=\"framework\">"
1649 " <hal format=\"native\">"
1650 " <name>netutils-wrapper</name>"
1651 " <version>1.0</version>"
1652 " <version>2.1</version>"
1653 " </hal>"
1654 "</manifest>";
1655 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1656 EXPECT_CONTAINS(
1657 gCompatibilityMatrixConverter.lastError(),
1658 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1659 "is specified.");
1660
1661#endif // LIBVINTF_HOST
1662}
1663
Yifan Hong5f996502017-08-23 14:46:44 -07001664TEST_F(LibVintfTest, KernelConfigConditionTest) {
1665 std::string xml =
1666 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1667 " <kernel version=\"3.18.22\"/>\n"
1668 " <kernel version=\"3.18.22\">\n"
1669 " <conditions>\n"
1670 " <config>\n"
1671 " <key>CONFIG_ARM</key>\n"
1672 " <value type=\"tristate\">y</value>\n"
1673 " </config>\n"
1674 " </conditions>\n"
1675 " <config>\n"
1676 " <key>CONFIG_FOO</key>\n"
1677 " <value type=\"tristate\">y</value>\n"
1678 " </config>\n"
1679 " </kernel>\n"
1680 " <sepolicy>\n"
1681 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1682 " <sepolicy-version>25.0</sepolicy-version>\n"
1683 " </sepolicy>\n"
1684 " <avb>\n"
1685 " <vbmeta-version>2.1</vbmeta-version>\n"
1686 " </avb>\n"
1687 "</compatibility-matrix>\n";
1688
1689 CompatibilityMatrix cm;
1690 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1691 << gCompatibilityMatrixConverter.lastError();
1692 const auto& kernels = getKernels(cm);
1693 ASSERT_GE(kernels.size(), 2u);
1694 ASSERT_TRUE(kernels[0].conditions().empty());
1695 const auto& kernel = kernels[1];
1696 const auto& cond = kernel.conditions();
1697 ASSERT_FALSE(cond.empty());
1698 EXPECT_EQ("CONFIG_ARM", cond.begin()->first);
1699 EXPECT_EQ(KernelConfigTypedValue(Tristate::YES), cond.begin()->second);
1700 EXPECT_FALSE(kernel.configs().empty());
1701
1702 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
1703}
1704
1705TEST_F(LibVintfTest, KernelConfigConditionEmptyTest) {
1706 std::string xml =
1707 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1708 " <kernel version=\"4.4.0\"/>\n"
1709 " <kernel version=\"3.18.22\">\n"
1710 " <conditions>\n"
1711 " <config>\n"
1712 " <key>CONFIG_ARM</key>\n"
1713 " <value type=\"tristate\">y</value>\n"
1714 " </config>\n"
1715 " </conditions>\n"
1716 " </kernel>\n"
1717 "</compatibility-matrix>\n";
1718
1719 CompatibilityMatrix cm;
1720 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml))
1721 << "Should not accept first kernel version with non-empty conditions";
1722 EXPECT_EQ(
1723 "First <kernel> for version 3.18 must have empty <conditions> "
1724 "for backwards compatibility.",
1725 gCompatibilityMatrixConverter.lastError());
1726}
1727
1728TEST_F(LibVintfTest, KernelConfigConditionMatch) {
1729 RuntimeInfo runtime = testRuntimeInfo();
1730 std::string error;
1731 std::string xml;
1732 CompatibilityMatrix cm;
1733
1734 xml =
1735 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1736 " <kernel version=\"3.18.22\"/>\n"
1737 " <kernel version=\"3.18.22\">\n"
1738 " <conditions>\n"
1739 " <config>\n"
1740 " <key>CONFIG_64BIT</key>\n"
1741 " <value type=\"tristate\">y</value>\n"
1742 " </config>\n"
1743 " </conditions>\n"
1744 " <config>\n"
1745 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1746 " <value type=\"int\">24</value>\n"
1747 " </config>\n"
1748 " </kernel>\n"
1749 " <sepolicy>\n"
1750 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1751 " </sepolicy>\n"
1752 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1753 "</compatibility-matrix>\n";
1754
1755 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1756 << gCompatibilityMatrixConverter.lastError();
1757 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1758
1759 xml =
1760 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1761 " <kernel version=\"3.18.22\"/>\n"
1762 " <kernel version=\"3.18.22\">\n"
1763 " <conditions>\n"
1764 " <config>\n"
1765 " <key>CONFIG_64BIT</key>\n"
1766 " <value type=\"tristate\">y</value>\n"
1767 " </config>\n"
1768 " </conditions>\n"
1769 " <config>\n"
1770 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1771 " <value type=\"int\">26</value>\n"
1772 " </config>\n"
1773 " </kernel>\n"
1774 " <sepolicy>\n"
1775 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1776 " </sepolicy>\n"
1777 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1778 "</compatibility-matrix>\n";
1779
1780 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1781 << gCompatibilityMatrixConverter.lastError();
1782 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1783 << "conditions met, so CONFIG_ARCH_MMAP_RND_BITS should not match";
1784
1785 xml =
1786 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1787 " <kernel version=\"3.18.22\"/>\n"
1788 " <kernel version=\"3.18.22\">\n"
1789 " <conditions>\n"
1790 " <config>\n"
1791 " <key>CONFIG_64BIT</key>\n"
1792 " <value type=\"tristate\">n</value>\n"
1793 " </config>\n"
1794 " </conditions>\n"
1795 " <config>\n"
1796 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1797 " <value type=\"int\">26</value>\n"
1798 " </config>\n"
1799 " </kernel>\n"
1800 " <sepolicy>\n"
1801 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1802 " </sepolicy>\n"
1803 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1804 "</compatibility-matrix>\n";
1805
1806 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1807 << gCompatibilityMatrixConverter.lastError();
1808 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1809 xml =
1810 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1811 " <kernel version=\"3.18.22\"/>\n"
1812 " <kernel version=\"3.18.22\">\n"
1813 " <conditions>\n"
1814 " <config>\n"
1815 " <key>CONFIG_64BIT</key>\n"
1816 " <value type=\"tristate\">y</value>\n"
1817 " </config>\n"
1818 " <config>\n"
1819 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1820 " <value type=\"int\">24</value>\n"
1821 " </config>\n"
1822 " </conditions>\n"
1823 " <config>\n"
1824 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1825 " <value type=\"int\">0xdead000000000000</value>\n"
1826 " </config>\n"
1827 " </kernel>\n"
1828 " <sepolicy>\n"
1829 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1830 " </sepolicy>\n"
1831 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1832 "</compatibility-matrix>\n";
1833
1834 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1835 << gCompatibilityMatrixConverter.lastError();
1836 EXPECT_TRUE(runtime.checkCompatibility(cm, &error));
1837
1838 xml =
1839 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1840 " <kernel version=\"3.18.22\"/>\n"
1841 " <kernel version=\"3.18.22\">\n"
1842 " <conditions>\n"
1843 " <config>\n"
1844 " <key>CONFIG_64BIT</key>\n"
1845 " <value type=\"tristate\">y</value>\n"
1846 " </config>\n"
1847 " <config>\n"
1848 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1849 " <value type=\"int\">24</value>\n"
1850 " </config>\n"
1851 " </conditions>\n"
1852 " <config>\n"
1853 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1854 " <value type=\"int\">0xbeaf000000000000</value>\n"
1855 " </config>\n"
1856 " </kernel>\n"
1857 " <sepolicy>\n"
1858 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1859 " </sepolicy>\n"
1860 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1861 "</compatibility-matrix>\n";
1862
1863 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1864 << gCompatibilityMatrixConverter.lastError();
1865 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1866 << "conditions have 'and' relationship, so CONFIG_ILLEGAL_POINTER_VALUE should not match";
1867
1868 xml =
1869 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1870 " <kernel version=\"3.18.22\"/>\n"
1871 " <kernel version=\"3.18.22\">\n"
1872 " <conditions>\n"
1873 " <config>\n"
1874 " <key>CONFIG_64BIT</key>\n"
1875 " <value type=\"tristate\">y</value>\n"
1876 " </config>\n"
1877 " <config>\n"
1878 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1879 " <value type=\"int\">26</value>\n"
1880 " </config>\n"
1881 " </conditions>\n"
1882 " <config>\n"
1883 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1884 " <value type=\"int\">0xbeaf000000000000</value>\n"
1885 " </config>\n"
1886 " </kernel>\n"
1887 " <sepolicy>\n"
1888 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1889 " </sepolicy>\n"
1890 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1891 "</compatibility-matrix>\n";
1892
1893 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1894 << gCompatibilityMatrixConverter.lastError();
1895 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1896
1897 xml =
1898 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1899 " <kernel version=\"3.18.22\">\n"
1900 " <config>\n"
1901 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1902 " <value type=\"string\"/>\n"
1903 " </config>\n"
1904 " </kernel>\n"
1905 " <kernel version=\"3.18.22\">\n"
1906 " <conditions>\n"
1907 " <config>\n"
1908 " <key>CONFIG_64BIT</key>\n"
1909 " <value type=\"tristate\">y</value>\n"
1910 " </config>\n"
1911 " </conditions>\n"
1912 " <config>\n"
1913 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1914 " <value type=\"int\">0xdead000000000000</value>\n"
1915 " </config>\n"
1916 " </kernel>\n"
1917 " <kernel version=\"3.18.22\">\n"
1918 " <conditions>\n"
1919 " <config>\n"
1920 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1921 " <value type=\"int\">24</value>\n"
1922 " </config>\n"
1923 " </conditions>\n"
1924 " <config>\n"
1925 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1926 " <value type=\"string\">binder,hwbinder</value>\n"
1927 " </config>\n"
1928 " </kernel>\n"
1929 " <sepolicy>\n"
1930 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1931 " </sepolicy>\n"
1932 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1933 "</compatibility-matrix>\n";
1934
1935 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1936 << gCompatibilityMatrixConverter.lastError();
1937 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1938
1939 xml =
1940 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1941 " <kernel version=\"3.18.22\">\n"
1942 " <config>\n"
1943 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1944 " <value type=\"string\"/>\n"
1945 " </config>\n"
1946 " </kernel>\n"
1947 " <kernel version=\"3.18.22\">\n"
1948 " <conditions>\n"
1949 " <config>\n"
1950 " <key>CONFIG_64BIT</key>\n"
1951 " <value type=\"tristate\">y</value>\n"
1952 " </config>\n"
1953 " </conditions>\n"
1954 " <config>\n"
1955 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1956 " <value type=\"int\">0xbeaf000000000000</value>\n"
1957 " </config>\n"
1958 " </kernel>\n"
1959 " <kernel version=\"3.18.22\">\n"
1960 " <conditions>\n"
1961 " <config>\n"
1962 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1963 " <value type=\"int\">24</value>\n"
1964 " </config>\n"
1965 " </conditions>\n"
1966 " <config>\n"
1967 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1968 " <value type=\"string\">binder,hwbinder</value>\n"
1969 " </config>\n"
1970 " </kernel>\n"
1971 " <sepolicy>\n"
1972 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1973 " </sepolicy>\n"
1974 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1975 "</compatibility-matrix>\n";
1976
1977 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1978 << gCompatibilityMatrixConverter.lastError();
1979 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used.";
1980
1981 xml =
1982 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1983 " <kernel version=\"3.18.22\">\n"
1984 " <config>\n"
1985 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1986 " <value type=\"string\"/>\n"
1987 " </config>\n"
1988 " </kernel>\n"
1989 " <kernel version=\"3.18.22\">\n"
1990 " <conditions>\n"
1991 " <config>\n"
1992 " <key>CONFIG_64BIT</key>\n"
1993 " <value type=\"tristate\">y</value>\n"
1994 " </config>\n"
1995 " </conditions>\n"
1996 " <config>\n"
1997 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1998 " <value type=\"int\">0xdead000000000000</value>\n"
1999 " </config>\n"
2000 " </kernel>\n"
2001 " <kernel version=\"3.18.22\">\n"
2002 " <conditions>\n"
2003 " <config>\n"
2004 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
2005 " <value type=\"int\">24</value>\n"
2006 " </config>\n"
2007 " </conditions>\n"
2008 " <config>\n"
2009 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
2010 " <value type=\"string\">binder</value>\n"
2011 " </config>\n"
2012 " </kernel>\n"
2013 " <sepolicy>\n"
2014 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2015 " </sepolicy>\n"
2016 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2017 "</compatibility-matrix>\n";
2018
2019 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2020 << gCompatibilityMatrixConverter.lastError();
2021 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used";
2022}
2023
Yifan Hongc1889722017-07-07 16:19:52 -07002024// Run KernelConfigParserInvalidTest on processComments = {true, false}
2025class KernelConfigParserInvalidTest : public ::testing::TestWithParam<bool> {};
2026
2027TEST_P(KernelConfigParserInvalidTest, NonSet1) {
2028 const std::string data = "# CONFIG_NOT_EXIST is not sat\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002029 auto pair = processData(data, GetParam() /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07002030 ASSERT_EQ(OK, pair.second) << pair.first.error();
2031 const auto& configs = pair.first.configs();
2032 EXPECT_EQ(configs.find("CONFIG_NOT_EXIST"), configs.end())
2033 << "CONFIG_NOT_EXIST should not exist because of typo";
2034}
2035
2036TEST_P(KernelConfigParserInvalidTest, InvalidLine1) {
2037 const std::string data = "FOO_CONFIG=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002038 ASSERT_NE(OK,
2039 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07002040}
2041
2042TEST_P(KernelConfigParserInvalidTest, InvalidLine2) {
2043 const std::string data = "CONFIG_BAR-BAZ=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002044 ASSERT_NE(OK,
2045 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07002046}
2047
2048INSTANTIATE_TEST_CASE_P(KernelConfigParser, KernelConfigParserInvalidTest, ::testing::Bool());
2049
Yifan Honga9993572017-01-24 19:33:15 -08002050} // namespace vintf
2051} // namespace android
2052
Yifan Hong676447a2016-11-15 12:57:23 -08002053int main(int argc, char **argv) {
2054 ::testing::InitGoogleTest(&argc, argv);
2055 return RUN_ALL_TESTS();
2056}