blob: b33d0bce0321c4434a5aefaa9ae3bac640741003 [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
Yifan Honge4770332017-12-20 10:44:07 -080017#define LOG_TAG "LibVintfTest"
Yifan Hong676447a2016-11-15 12:57:23 -080018
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 Hongdbe9db32017-12-11 19:06:11 -0800106 bool addAllHalsAsOptional(CompatibilityMatrix* cm1, CompatibilityMatrix* cm2, std::string* e) {
107 return cm1->addAllHalsAsOptional(cm2, e);
108 }
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700109
110 std::map<std::string, HalInterface> testHalInterfaces() {
111 HalInterface intf;
112 intf.name = "IFoo";
113 intf.instances.insert("default");
114 std::map<std::string, HalInterface> map;
115 map[intf.name] = intf;
116 return map;
117 }
118
Yifan Honga04e1472017-04-05 13:15:34 -0700119 HalManifest testDeviceManifest() {
Yifan Hongd2b7e642017-02-17 10:15:32 -0800120 HalManifest vm;
Yifan Hong7c7d7062017-04-04 16:26:51 -0700121 vm.mType = SchemaType::DEVICE;
Yifan Hong2a3dd082017-04-04 17:15:35 -0700122 vm.device.mSepolicyVersion = {25, 0};
Yifan Hong2059ffc2017-02-24 11:32:02 -0800123 vm.add(ManifestHal{
124 .format = HalFormat::HIDL,
125 .name = "android.hardware.camera",
126 .versions = {Version(2, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800127 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800128 .interfaces = {
129 {"ICamera", {"ICamera", {"legacy/0", "default"}}},
130 {"IBetterCamera", {"IBetterCamera", {"camera"}}}
131 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800132 });
133 vm.add(ManifestHal{
134 .format = HalFormat::HIDL,
135 .name = "android.hardware.nfc",
136 .versions = {Version(1, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800137 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800138 .interfaces = {
139 {"INfc", {"INfc", {"default"}}}
140 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800141 });
Yifan Honga9993572017-01-24 19:33:15 -0800142
143 return vm;
144 }
Yifan Hongd4857902017-06-13 14:13:56 -0700145 HalManifest testDeviceManifestWithXmlFile() {
146 HalManifest vm = testDeviceManifest();
147 ManifestXmlFile xmlFile;
148 xmlFile.mName = "media_profile";
149 xmlFile.mVersion = {1, 0};
150 vm.addXmlFile(std::move(xmlFile));
151 return vm;
152 }
Yifan Honga04e1472017-04-05 13:15:34 -0700153 HalManifest testFrameworkManfiest() {
154 HalManifest vm;
155 vm.mType = SchemaType::FRAMEWORK;
156 vm.add(ManifestHal{
157 .format = HalFormat::HIDL,
158 .name = "android.hidl.manager",
159 .versions = {Version(1, 0)},
160 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
161 .interfaces = {
162 {"IServiceManager", {"IServiceManager", {"default"}}},
163 }
164 });
165 Vndk vndk2505;
166 vndk2505.mVersionRange = {25, 0, 5};
167 vndk2505.mLibraries = { "libjpeg.so", "libbase.so" };
168 Vndk vndk2513;
169 vndk2513.mVersionRange = {25, 1, 3};
170 vndk2513.mLibraries = { "libjpeg.so", "libbase.so", "libtinyxml2.so" };
171 vm.framework.mVndks = { std::move(vndk2505), std::move(vndk2513) };
172
173 return vm;
174 }
Yifan Honga7201e72017-02-17 10:09:59 -0800175 RuntimeInfo testRuntimeInfo() {
176 RuntimeInfo info;
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800177 info.mOsName = "Linux";
178 info.mNodeName = "localhost";
179 info.mOsRelease = "3.18.31-g936f9a479d0f";
180 info.mKernelVersion = {3, 18, 31};
181 info.mOsVersion = "#4 SMP PREEMPT Wed Feb 1 18:10:52 PST 2017";
182 info.mHardwareId = "aarch64";
183 info.mKernelSepolicyVersion = 30;
Yifan Hongf1af7522017-02-16 18:00:55 -0800184 info.mKernelConfigs = {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800185 {"CONFIG_64BIT", "y"},
186 {"CONFIG_ANDROID_BINDER_DEVICES", "\"binder,hwbinder\""},
187 {"CONFIG_ARCH_MMAP_RND_BITS", "24"},
188 {"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", "\"\""},
189 {"CONFIG_ILLEGAL_POINTER_VALUE", "0xdead000000000000"}
190 };
Yifan Hong881a9e452017-04-27 19:31:13 -0700191 setAvb(info, {2, 1}, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800192 return info;
193 }
Yifan Hong676447a2016-11-15 12:57:23 -0800194};
195
Yifan Hongd5cd0482017-06-19 12:25:48 -0700196TEST_F(LibVintfTest, ArchOperatorOr) {
197 Arch a = Arch::ARCH_EMPTY;
198 a |= Arch::ARCH_32;
199 EXPECT_EQ(Arch::ARCH_32, a);
200
201 a |= Arch::ARCH_64;
202 EXPECT_EQ(Arch::ARCH_32_64, a);
203
204 a = Arch::ARCH_EMPTY;
205 a |= Arch::ARCH_64;
206 EXPECT_EQ(Arch::ARCH_64, a);
207}
Yifan Hongef6d4d32017-01-23 14:12:28 -0800208
209TEST_F(LibVintfTest, Stringify) {
Yifan Honga04e1472017-04-05 13:15:34 -0700210 HalManifest vm = testDeviceManifest();
Yifan Hong974ad9c2017-04-04 15:37:39 -0700211 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/2.0:"
212 "hidl/android.hardware.nfc/passthrough32+64/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -0800213
214 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
215 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
216
217 VersionRange v(1, 2, 3);
218 EXPECT_EQ(to_string(v), "1.2-3");
219 VersionRange v2;
220 EXPECT_TRUE(parse("1.2-3", &v2));
221 EXPECT_EQ(v, v2);
222}
223
Yifan Hong9bbdb282017-04-12 21:53:59 -0700224TEST_F(LibVintfTest, GetTransport) {
225 HalManifest vm = testDeviceManifest();
226 EXPECT_EQ(Transport::HWBINDER, vm.getTransport("android.hardware.camera",
227 {2, 0}, "ICamera", "default"));
228}
229
Yifan Hongd2b7e642017-02-17 10:15:32 -0800230TEST_F(LibVintfTest, HalManifestConverter) {
Yifan Honga04e1472017-04-05 13:15:34 -0700231 HalManifest vm = testDeviceManifest();
Yifan Hongd2b7e642017-02-17 10:15:32 -0800232 std::string xml = gHalManifestConverter(vm);
Yifan Hong676447a2016-11-15 12:57:23 -0800233 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700234 "<manifest version=\"1.0\" type=\"device\">\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800235 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800236 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800237 " <transport>hwbinder</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800238 " <version>2.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800239 " <interface>\n"
240 " <name>IBetterCamera</name>\n"
241 " <instance>camera</instance>\n"
242 " </interface>\n"
243 " <interface>\n"
244 " <name>ICamera</name>\n"
245 " <instance>default</instance>\n"
246 " <instance>legacy/0</instance>\n"
247 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800248 " </hal>\n"
249 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800250 " <name>android.hardware.nfc</name>\n"
Yifan Hongc54d32c2017-03-07 19:12:26 -0800251 " <transport arch=\"32+64\">passthrough</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800252 " <version>1.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800253 " <interface>\n"
254 " <name>INfc</name>\n"
255 " <instance>default</instance>\n"
256 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800257 " </hal>\n"
Yifan Hong2a3dd082017-04-04 17:15:35 -0700258 " <sepolicy>\n"
259 " <version>25.0</version>\n"
260 " </sepolicy>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800261 "</manifest>\n");
Yifan Hongfb7469c2017-04-05 19:15:21 -0700262 HalManifest vm2;
263 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
264 EXPECT_EQ(vm, vm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800265}
266
Yifan Honga04e1472017-04-05 13:15:34 -0700267TEST_F(LibVintfTest, HalManifestConverterFramework) {
268 HalManifest vm = testFrameworkManfiest();
269 std::string xml = gHalManifestConverter(vm);
270 EXPECT_EQ(xml,
271 "<manifest version=\"1.0\" type=\"framework\">\n"
272 " <hal format=\"hidl\">\n"
273 " <name>android.hidl.manager</name>\n"
274 " <transport>hwbinder</transport>\n"
275 " <version>1.0</version>\n"
276 " <interface>\n"
277 " <name>IServiceManager</name>\n"
278 " <instance>default</instance>\n"
279 " </interface>\n"
280 " </hal>\n"
281 " <vndk>\n"
282 " <version>25.0.5</version>\n"
283 " <library>libbase.so</library>\n"
284 " <library>libjpeg.so</library>\n"
285 " </vndk>\n"
286 " <vndk>\n"
287 " <version>25.1.3</version>\n"
288 " <library>libbase.so</library>\n"
289 " <library>libjpeg.so</library>\n"
290 " <library>libtinyxml2.so</library>\n"
291 " </vndk>\n"
292 "</manifest>\n");
293 HalManifest vm2;
294 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700295 EXPECT_EQ(vm, vm2);
Yifan Honga04e1472017-04-05 13:15:34 -0700296}
297
Yifan Hong8e9c6692017-02-28 14:07:42 -0800298TEST_F(LibVintfTest, HalManifestOptional) {
299 HalManifest vm;
300 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700301 "<manifest version=\"1.0\" type=\"device\"></manifest>"));
Yifan Hong8e9c6692017-02-28 14:07:42 -0800302 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700303 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800304 " <hal>"
305 " <name>android.hidl.manager</name>"
306 " <transport>hwbinder</transport>"
307 " <version>1.0</version>"
308 " </hal>"
309 "</manifest>"));
310 EXPECT_FALSE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700311 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800312 " <hal>"
313 " <name>android.hidl.manager</name>"
314 " <version>1.0</version>"
315 " </hal>"
316 "</manifest>"));
317}
318
Yifan Honge0bb98d2017-08-07 14:40:19 -0700319TEST_F(LibVintfTest, HalManifestNative) {
320 HalManifest vm;
321 EXPECT_TRUE(gHalManifestConverter(&vm,
322 "<manifest version=\"1.0\" type=\"device\">"
323 " <hal format=\"native\">"
324 " <name>foo</name>"
325 " <version>1.0</version>"
326 " </hal>"
327 "</manifest>"))
328 << gHalManifestConverter.lastError();
329 EXPECT_FALSE(gHalManifestConverter(&vm,
330 "<manifest version=\"1.0\" type=\"device\">"
331 " <hal format=\"native\">"
332 " <name>foo</name>"
333 " <version>1.0</version>"
334 " <transport>hwbinder</transport>"
335 " </hal>"
336 "</manifest>"));
337 EXPECT_TRUE(gHalManifestConverter.lastError().find(
338 "Native HAL 'foo' should not have <transport> defined") != std::string::npos);
339}
340
Yifan Hong79dcc1f2017-05-22 14:35:19 -0700341TEST_F(LibVintfTest, HalManifestDuplicate) {
342 HalManifest vm;
343 EXPECT_FALSE(gHalManifestConverter(&vm,
344 "<manifest version=\"1.0\" type=\"device\">"
345 " <hal>"
346 " <name>android.hidl.manager</name>"
347 " <transport>hwbinder</transport>"
348 " <version>1.0</version>"
349 " <version>1.1</version>"
350 " </hal>"
351 "</manifest>"))
352 << "Should not allow duplicated major version in <hal>";
353 EXPECT_FALSE(gHalManifestConverter(&vm,
354 "<manifest version=\"1.0\" type=\"device\">"
355 " <hal>"
356 " <name>android.hidl.manager</name>"
357 " <transport>hwbinder</transport>"
358 " <version>1.0</version>"
359 " </hal>"
360 " <hal>"
361 " <name>android.hidl.manager</name>"
362 " <transport arch=\"32+64\">passthrough</transport>"
363 " <version>1.1</version>"
364 " </hal>"
365 "</manifest>"))
366 << "Should not allow duplicated major version across <hal>";
367}
368
369TEST_F(LibVintfTest, HalManifestGetTransport) {
370 HalManifest vm;
371 EXPECT_TRUE(gHalManifestConverter(&vm,
372 "<manifest version=\"1.0\" type=\"device\">"
373 " <hal>"
374 " <name>android.hidl.manager</name>"
375 " <transport>hwbinder</transport>"
376 " <version>1.0</version>"
377 " <interface>"
378 " <name>IServiceManager</name>"
379 " <instance>default</instance>"
380 " </interface>"
381 " </hal>"
382 " <hal>"
383 " <name>android.hidl.manager</name>"
384 " <transport arch=\"32+64\">passthrough</transport>"
385 " <version>2.1</version>"
386 " <interface>"
387 " <name>IServiceManager</name>"
388 " <instance>default</instance>"
389 " </interface>"
390 " </hal>"
391 "</manifest>"));
392 EXPECT_EQ(Transport::PASSTHROUGH,
393 vm.getTransport("android.hidl.manager", {2, 1}, "IServiceManager", "default"));
394 EXPECT_EQ(Transport::PASSTHROUGH,
395 vm.getTransport("android.hidl.manager", {2, 0}, "IServiceManager", "default"));
396 EXPECT_EQ(Transport::EMPTY,
397 vm.getTransport("android.hidl.manager", {2, 2}, "IServiceManager", "default"));
398 EXPECT_EQ(Transport::HWBINDER,
399 vm.getTransport("android.hidl.manager", {1, 0}, "IServiceManager", "default"));
400}
401
Yifan Hongec3b9b72017-02-23 13:24:42 -0800402TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700403 HalManifest vm = testDeviceManifest();
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700404 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "ICamera"),
405 std::set<std::string>({"default", "legacy/0"}));
406 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "IBetterCamera"),
407 std::set<std::string>({"camera"}));
408 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "INotExist"),
409 std::set<std::string>({}));
410 EXPECT_EQ(vm.getInstances("android.hardware.nfc", {1, 0}, "INfc"),
411 std::set<std::string>({"default"}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800412
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700413 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "default"));
414 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "legacy/0"));
415 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "camera"));
416 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", {1, 0}, "INfc", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800417
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700418 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "INotExist", "default"));
419 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "notexist"));
420 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "default"));
421 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "INotExist", "notexist"));
422 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", {1, 0}, "INfc", "notexist"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800423}
424
Yifan Hong676447a2016-11-15 12:57:23 -0800425TEST_F(LibVintfTest, VersionConverter) {
426 Version v(3, 6);
427 std::string xml = gVersionConverter(v);
428 EXPECT_EQ(xml, "<version>3.6</version>\n");
429 Version v2;
430 EXPECT_TRUE(gVersionConverter(&v2, xml));
431 EXPECT_EQ(v, v2);
432}
433
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700434static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
435 std::string name{intf.name};
436 return map->emplace(std::move(name), std::move(intf)).second;
437}
438
Yifan Hong676447a2016-11-15 12:57:23 -0800439TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800440 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800441 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700442 false /* optional */, {}};
443 EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
444 EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800445 std::string xml = gMatrixHalConverter(mh);
446 EXPECT_EQ(xml,
447 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800448 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800449 " <version>1.2-3</version>\n"
450 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700451 " <interface>\n"
452 " <name>IBetterCamera</name>\n"
453 " <instance>default</instance>\n"
454 " <instance>great</instance>\n"
455 " </interface>\n"
456 " <interface>\n"
457 " <name>ICamera</name>\n"
458 " <instance>default</instance>\n"
459 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800460 "</hal>\n");
461 MatrixHal mh2;
462 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
463 EXPECT_EQ(mh, mh2);
464}
465
Yifan Hong3f5489a2017-02-08 11:14:21 -0800466TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
467
468 KernelConfigTypedValue converted;
469
470 auto testOne = [] (const KernelConfigTypedValue &original,
471 const std::string &expectXml) {
472 std::string xml;
473 KernelConfigTypedValue converted;
474 xml = gKernelConfigTypedValueConverter(original);
475 EXPECT_EQ(xml, expectXml);
476 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
477 EXPECT_EQ(original, converted);
478 };
479
480 auto testParse = [] (const KernelConfigTypedValue &original,
481 const std::string &xml) {
482 KernelConfigTypedValue converted;
483 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
484 EXPECT_EQ(original, converted);
485 };
486
487 testOne(KernelConfigTypedValue("stringvalue"),
488 "<value type=\"string\">stringvalue</value>\n");
489 testOne(KernelConfigTypedValue(""),
490 "<value type=\"string\"></value>\n");
491
492 testOne(KernelConfigTypedValue(Tristate::YES),
493 "<value type=\"tristate\">y</value>\n");
494 testOne(KernelConfigTypedValue(Tristate::NO),
495 "<value type=\"tristate\">n</value>\n");
496 testOne(KernelConfigTypedValue(Tristate::MODULE),
497 "<value type=\"tristate\">m</value>\n");
498 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
499 "<value type=\"tristate\">q</value>\n"));
500
501 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
502 "<value type=\"range\">4-20</value>\n");
503 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
504 "<value type=\"range\">0-18446744073709551615</value>\n");
505 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
506 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
507
508 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
509 "<value type=\"int\">-18446744073709551616</value>\n"));
510
511 testOne(KernelConfigTypedValue(INT64_MIN),
512 "<value type=\"int\">-9223372036854775808</value>\n");
513 testParse(KernelConfigTypedValue(INT64_MIN),
514 "<value type=\"int\">0x8000000000000000</value>\n");
515 testParse(KernelConfigTypedValue(INT64_MIN),
516 "<value type=\"int\">-0X8000000000000000</value>\n");
517
518 testParse(KernelConfigTypedValue(INT64_MIN + 1),
519 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
520
521 testParse(KernelConfigTypedValue(-0x50),
522 "<value type=\"int\">-0x50</value>\n");
523
524 testOne(KernelConfigTypedValue(0),
525 "<value type=\"int\">0</value>\n");
526
527 // Truncation for underflow.
528 testParse(KernelConfigTypedValue(1),
529 "<value type=\"int\">-0xffffffffffffffff</value>\n");
530 testParse(KernelConfigTypedValue(1),
531 "<value type=\"int\">-18446744073709551615</value>\n");
532
533 testOne(KernelConfigTypedValue(INT64_MAX),
534 "<value type=\"int\">9223372036854775807</value>\n");
535 testParse(KernelConfigTypedValue(INT64_MAX),
536 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
537 // Truncation for underflow.
538 testParse(KernelConfigTypedValue(INT64_MAX),
539 "<value type=\"int\">-9223372036854775809</value>\n");
540
541 testParse(KernelConfigTypedValue(-1),
542 "<value type=\"int\">18446744073709551615</value>\n");
543 testParse(KernelConfigTypedValue(-1),
544 "<value type=\"int\">0xffffffffffffffff</value>\n");
545
546 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
547 "<value type=\"int\">18446744073709551616</value>\n"));
548}
549
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700550TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
Yifan Hong676447a2016-11-15 12:57:23 -0800551 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800552 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800553 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700554 false /* optional */, testHalInterfaces()}));
Yifan Honga9993572017-01-24 19:33:15 -0800555 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800556 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700557 true /* optional */, testHalInterfaces()}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800558 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
559 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
560 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
561 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700562 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700563 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800564 std::string xml = gCompatibilityMatrixConverter(cm);
565 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700566 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800567 " <hal format=\"native\" optional=\"false\">\n"
568 " <name>android.hardware.camera</name>\n"
569 " <version>1.2-3</version>\n"
570 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700571 " <interface>\n"
572 " <name>IFoo</name>\n"
573 " <instance>default</instance>\n"
574 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800575 " </hal>\n"
576 " <hal format=\"native\" optional=\"true\">\n"
577 " <name>android.hardware.nfc</name>\n"
578 " <version>4.5-6</version>\n"
579 " <version>10.11-12</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700580 " <interface>\n"
581 " <name>IFoo</name>\n"
582 " <instance>default</instance>\n"
583 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800584 " </hal>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800585 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800586 " <config>\n"
587 " <key>CONFIG_FOO</key>\n"
588 " <value type=\"tristate\">y</value>\n"
589 " </config>\n"
590 " <config>\n"
591 " <key>CONFIG_BAR</key>\n"
592 " <value type=\"string\">stringvalue</value>\n"
593 " </config>\n"
594 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800595 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800596 " <config>\n"
597 " <key>CONFIG_BAZ</key>\n"
598 " <value type=\"int\">20</value>\n"
599 " </config>\n"
600 " <config>\n"
601 " <key>CONFIG_BAR</key>\n"
602 " <value type=\"range\">3-5</value>\n"
603 " </config>\n"
604 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800605 " <sepolicy>\n"
606 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700607 " <sepolicy-version>25.0</sepolicy-version>\n"
608 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800609 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700610 " <avb>\n"
611 " <vbmeta-version>2.1</vbmeta-version>\n"
612 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800613 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800614 CompatibilityMatrix cm2;
615 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700616 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800617}
618
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700619TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
620 CompatibilityMatrix cm;
621 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
622 {{VersionRange(1,0)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700623 false /* optional */, testHalInterfaces()}));
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700624 set(cm, SchemaType::DEVICE);
625 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
626 std::string xml = gCompatibilityMatrixConverter(cm);
627 EXPECT_EQ(xml,
628 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
629 " <hal format=\"native\" optional=\"false\">\n"
630 " <name>android.hidl.manager</name>\n"
631 " <version>1.0</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700632 " <interface>\n"
633 " <name>IFoo</name>\n"
634 " <instance>default</instance>\n"
635 " </interface>\n"
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700636 " </hal>\n"
637 " <vndk>\n"
638 " <version>25.0.1-5</version>\n"
639 " <library>libbase.so</library>\n"
640 " <library>libjpeg.so</library>\n"
641 " </vndk>\n"
642 "</compatibility-matrix>\n");
643 CompatibilityMatrix cm2;
644 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
645 EXPECT_EQ(cm, cm2);
646}
647
Yifan Hong676447a2016-11-15 12:57:23 -0800648TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800649 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800650
Yifan Hong2059ffc2017-02-24 11:32:02 -0800651 ManifestHal invalidHal{
652 .format = HalFormat::HIDL,
653 .name = "android.hardware.camera",
654 .versions = {{Version(2, 0), Version(2, 1)}},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800655 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64}
Yifan Hong2059ffc2017-02-24 11:32:02 -0800656 };
657
Yifan Hong5a06ef72017-01-24 19:54:24 -0800658 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800659 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800660 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800661}
662
Tri Vod0143942017-03-24 17:51:23 -0700663TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700664 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700665 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
666 {"android.hardware.camera", "android.hardware.nfc"}));
667}
668
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700669TEST_F(LibVintfTest, HalManifestGetAllHals) {
Yifan Honga04e1472017-04-05 13:15:34 -0700670 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700671 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
672 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800673
674 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
675 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800676 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800677 EXPECT_EQ(hal.name, arr[i++]);
678 }
679}
680
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700681TEST_F(LibVintfTest, HalManifestGetHals) {
682 HalManifest vm;
683 EXPECT_TRUE(
684 add(vm, ManifestHal{.format = HalFormat::HIDL,
685 .name = "android.hardware.camera",
686 .versions = {Version(1, 2)},
687 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
688 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
689 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}}));
690 EXPECT_TRUE(
691 add(vm, ManifestHal{.format = HalFormat::HIDL,
692 .name = "android.hardware.camera",
693 .versions = {Version(2, 0)},
694 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
695 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
696 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}}));
697 EXPECT_TRUE(add(vm, ManifestHal{.format = HalFormat::HIDL,
698 .name = "android.hardware.nfc",
699 .versions = {Version(1, 0), Version(2, 1)},
700 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
701 .interfaces = {{"INfc", {"INfc", {"default"}}}}}));
702 ManifestHal expectedCameraHalV1_2 =
703 ManifestHal{.format = HalFormat::HIDL,
704 .name = "android.hardware.camera",
705 .versions = {Version(1, 2)},
706 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
707 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
708 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}};
709 ManifestHal expectedCameraHalV2_0 =
710 ManifestHal{.format = HalFormat::HIDL,
711 .name = "android.hardware.camera",
712 .versions = {Version(2, 0)},
713 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
714 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
715 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}};
716 ManifestHal expectedNfcHal =
717 ManifestHal{.format = HalFormat::HIDL,
718 .name = "android.hardware.nfc",
719 .versions = {Version(1, 0), Version(2, 1)},
720 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
721 .interfaces = {{"INfc", {"INfc", {"default"}}}}};
722 auto cameraHals = vm.getHals("android.hardware.camera");
723 EXPECT_EQ((int)cameraHals.size(), 2);
724 EXPECT_EQ(*cameraHals[0], expectedCameraHalV1_2);
725 EXPECT_EQ(*cameraHals[1], expectedCameraHalV2_0);
726 auto nfcHals = vm.getHals("android.hardware.nfc");
727 EXPECT_EQ((int)nfcHals.size(), 1);
728 EXPECT_EQ(*nfcHals[0], expectedNfcHal);
729
730 EXPECT_EQ(*vm.getHal("android.hardware.camera", {1, 1}), expectedCameraHalV1_2);
731 EXPECT_EQ(*vm.getHal("android.hardware.camera", {2, 0}), expectedCameraHalV2_0);
732 EXPECT_EQ(*vm.getHal("android.hardware.nfc", {1, 0}), expectedNfcHal);
733 EXPECT_EQ(*vm.getHal("android.hardware.nfc", {2, 0}), expectedNfcHal);
734 EXPECT_EQ(*vm.getHal("android.hardware.nfc", {2, 1}), expectedNfcHal);
735
736 EXPECT_EQ(vm.getHal("non-existent", {1, 0}), nullptr);
737 EXPECT_EQ(vm.getHal("android.hardware.camera", {2, 1}), nullptr);
738 EXPECT_EQ(vm.getHal("android.hardware.camera", {1, 3}), nullptr);
739 EXPECT_EQ(vm.getHal("android.hardware.nfc", {1, 1}), nullptr);
740 EXPECT_EQ(vm.getHal("android.hardware.nfc", {3, 0}), nullptr);
741}
742
743TEST_F(LibVintfTest, CompatibilityMatrixGetHals) {
744 CompatibilityMatrix cm;
745 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
746 "android.hardware.camera",
747 {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
748 false /* optional */,
749 testHalInterfaces()}));
750 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
751 "android.hardware.nfc",
752 {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
753 true /* optional */,
754 testHalInterfaces()}));
755
756 MatrixHal expectedCameraHal = MatrixHal{
757 HalFormat::NATIVE,
758 "android.hardware.camera",
759 {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
760 false /* optional */,
761 testHalInterfaces(),
762 };
763 MatrixHal expectedNfcHal = MatrixHal{HalFormat::NATIVE,
764 "android.hardware.nfc",
765 {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
766 true /* optional */,
767 testHalInterfaces()};
768 auto cameraHals = cm.getHals("android.hardware.camera");
769 EXPECT_EQ((int)cameraHals.size(), 1);
770 EXPECT_EQ(*cameraHals[0], expectedCameraHal);
771 auto nfcHals = cm.getHals("android.hardware.nfc");
772 EXPECT_EQ((int)nfcHals.size(), 1);
773 EXPECT_EQ(*nfcHals[0], expectedNfcHal);
774
775 EXPECT_EQ(*cm.getHal("android.hardware.camera", {1, 2}), expectedCameraHal);
776 EXPECT_EQ(*cm.getHal("android.hardware.camera", {1, 3}), expectedCameraHal);
777 EXPECT_EQ(*cm.getHal("android.hardware.camera", {4, 5}), expectedCameraHal);
778 EXPECT_EQ(*cm.getHal("android.hardware.nfc", {4, 5}), expectedNfcHal);
779 EXPECT_EQ(*cm.getHal("android.hardware.nfc", {10, 12}), expectedNfcHal);
780
781 EXPECT_EQ(cm.getHal("non-existent", {1, 0}), nullptr);
782 EXPECT_EQ(cm.getHal("android.hardware.camera", {2, 1}), nullptr);
783 EXPECT_EQ(cm.getHal("android.hardware.camera", {1, 0}), nullptr);
784 EXPECT_EQ(cm.getHal("android.hardware.nfc", {3, 0}), nullptr);
785 EXPECT_EQ(cm.getHal("android.hardware.nfc", {4, 7}), nullptr);
786}
787
Yifan Honga7201e72017-02-17 10:09:59 -0800788TEST_F(LibVintfTest, RuntimeInfo) {
789 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800790 using KernelConfigs = std::vector<KernelConfig>;
791 const KernelConfigs configs {
792 KernelConfig{"CONFIG_64BIT", Tristate::YES},
793 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
794 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
795 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
796 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
797 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
798 };
799
800 auto testMatrix = [&] (MatrixKernel &&kernel) {
801 CompatibilityMatrix cm;
802 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700803 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700804 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800805 return cm;
806 };
807
808 std::string error;
809
810 {
811 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
812 CompatibilityMatrix cm = testMatrix(std::move(kernel));
813 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
814 }
815
816 {
Yifan Hong5f996502017-08-23 14:46:44 -0700817 MatrixKernel kernel(KernelVersion{3, 18, 60}, KernelConfigs(configs));
818 CompatibilityMatrix cm = testMatrix(std::move(kernel));
819 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
820 }
821
822 {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800823 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
824 CompatibilityMatrix cm = testMatrix(std::move(kernel));
825 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
826 }
827
828 {
829 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
830 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700831 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800832 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
833 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700834 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800835 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
836 << "kernel-sepolicy-version shouldn't match";
837 }
838
839 {
840 KernelConfigs newConfigs(configs);
841 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
842 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
843 CompatibilityMatrix cm = testMatrix(std::move(kernel));
844 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
845 }
846
847 {
848 KernelConfigs newConfigs(configs);
849 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
850 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
851 CompatibilityMatrix cm = testMatrix(std::move(kernel));
852 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
853 }
854
855 {
856 KernelConfigs newConfigs(configs);
857 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
858 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
859 CompatibilityMatrix cm = testMatrix(std::move(kernel));
860 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
861 }
862
863 {
864 KernelConfigs newConfigs(configs);
865 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
866 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
867 CompatibilityMatrix cm = testMatrix(std::move(kernel));
868 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
869 }
870
871 {
872 KernelConfigs newConfigs(configs);
873 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
874 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
875 CompatibilityMatrix cm = testMatrix(std::move(kernel));
876 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
877 }
Yifan Hongdb6423e2017-09-11 14:38:46 -0700878
Yifan Hongf3029302017-04-12 17:23:49 -0700879 RuntimeInfo badAvb = testRuntimeInfo();
880 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
881 {
882 setAvb(badAvb, {1, 0}, {2, 1});
883 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
Michael Schwartz5cfbc922017-05-08 14:06:49 -0700884 EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
Yifan Hongf3029302017-04-12 17:23:49 -0700885 }
886 {
887 setAvb(badAvb, {2, 1}, {3, 0});
888 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
889 }
890 {
891 setAvb(badAvb, {2, 1}, {2, 3});
892 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
893 }
894 {
895 setAvb(badAvb, {2, 3}, {2, 1});
896 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
897 }
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800898}
899
Yifan Hong19e0a2a2017-04-14 17:30:53 -0700900TEST_F(LibVintfTest, MissingAvb) {
901 std::string xml =
902 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
903 " <kernel version=\"3.18.31\"></kernel>"
904 " <sepolicy>\n"
905 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
906 " <sepolicy-version>25.5</sepolicy-version>\n"
907 " </sepolicy>\n"
908 "</compatibility-matrix>\n";
909 CompatibilityMatrix cm;
910 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
911 EXPECT_EQ(getAvb(cm), Version(0, 0));
912}
913
Yifan Hongdb6423e2017-09-11 14:38:46 -0700914TEST_F(LibVintfTest, DisableAvb) {
915 std::string xml =
916 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
917 " <kernel version=\"3.18.31\"></kernel>"
918 " <sepolicy>\n"
919 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
920 " <sepolicy-version>25.5</sepolicy-version>\n"
921 " </sepolicy>\n"
922 " <avb>\n"
923 " <vbmeta-version>1.0</vbmeta-version>\n"
924 " </avb>\n"
925 "</compatibility-matrix>\n";
926 CompatibilityMatrix cm;
927 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
928 RuntimeInfo ki = testRuntimeInfo();
929 std::string error;
930 EXPECT_FALSE(ki.checkCompatibility(cm, &error));
931 EXPECT_STREQ(error.c_str(), "AVB version 2.1 does not match framework matrix 1.0");
932 EXPECT_TRUE(ki.checkCompatibility(cm, &error, DISABLE_AVB_CHECK)) << error;
933}
934
Yifan Hong08e984c2017-05-18 12:50:04 -0700935// This is the test extracted from VINTF Object doc
936TEST_F(LibVintfTest, HalCompat) {
937 CompatibilityMatrix matrix;
938 std::string error;
939
940 std::string matrixXml =
941 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
942 " <hal format=\"hidl\" optional=\"false\">\n"
943 " <name>android.hardware.foo</name>\n"
944 " <version>1.0</version>\n"
945 " <version>3.1-2</version>\n"
946 " <interface>\n"
947 " <name>IFoo</name>\n"
948 " <instance>default</instance>\n"
949 " <instance>specific</instance>\n"
950 " </interface>\n"
951 " </hal>\n"
952 " <hal format=\"hidl\" optional=\"false\">\n"
953 " <name>android.hardware.foo</name>\n"
954 " <version>2.0</version>\n"
955 " <interface>\n"
956 " <name>IBar</name>\n"
957 " <instance>default</instance>\n"
958 " </interface>\n"
959 " </hal>\n"
960 " <sepolicy>\n"
961 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
962 " <sepolicy-version>25.5</sepolicy-version>\n"
963 " </sepolicy>\n"
964 "</compatibility-matrix>\n";
965 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
966 << gCompatibilityMatrixConverter.lastError();
967
968 {
969 std::string manifestXml =
970 "<manifest version=\"1.0\" type=\"device\">\n"
971 " <hal format=\"hidl\">\n"
972 " <name>android.hardware.foo</name>\n"
973 " <transport>hwbinder</transport>\n"
974 " <version>1.0</version>\n"
975 " <interface>\n"
976 " <name>IFoo</name>\n"
977 " <instance>default</instance>\n"
978 " <instance>specific</instance>\n"
979 " </interface>\n"
980 " </hal>\n"
981 " <hal format=\"hidl\">\n"
982 " <name>android.hardware.foo</name>\n"
983 " <transport>hwbinder</transport>\n"
984 " <version>2.0</version>\n"
985 " <interface>\n"
986 " <name>IBar</name>\n"
987 " <instance>default</instance>\n"
988 " </interface>\n"
989 " </hal>\n"
990 " <sepolicy>\n"
991 " <version>25.5</version>\n"
992 " </sepolicy>\n"
993 "</manifest>\n";
994
995 HalManifest manifest;
996 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
997 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
998 }
999
1000 {
1001 std::string manifestXml =
1002 "<manifest version=\"1.0\" type=\"device\">\n"
1003 " <hal format=\"hidl\">\n"
1004 " <name>android.hardware.foo</name>\n"
1005 " <transport>hwbinder</transport>\n"
1006 " <version>1.0</version>\n"
1007 " <interface>\n"
1008 " <name>IFoo</name>\n"
1009 " <instance>default</instance>\n"
1010 " <instance>specific</instance>\n"
1011 " </interface>\n"
1012 " </hal>\n"
1013 " <sepolicy>\n"
1014 " <version>25.5</version>\n"
1015 " </sepolicy>\n"
1016 "</manifest>\n";
1017 HalManifest manifest;
1018 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1019 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1020 << "should not be compatible because IBar is missing";
1021 }
1022
1023 {
1024 std::string manifestXml =
1025 "<manifest version=\"1.0\" type=\"device\">\n"
1026 " <hal format=\"hidl\">\n"
1027 " <name>android.hardware.foo</name>\n"
1028 " <transport>hwbinder</transport>\n"
1029 " <version>1.0</version>\n"
1030 " <interface>\n"
1031 " <name>IFoo</name>\n"
1032 " <instance>default</instance>\n"
1033 " </interface>\n"
1034 " </hal>\n"
1035 " <hal format=\"hidl\">\n"
1036 " <name>android.hardware.foo</name>\n"
1037 " <transport>hwbinder</transport>\n"
1038 " <version>2.0</version>\n"
1039 " <interface>\n"
1040 " <name>IBar</name>\n"
1041 " <instance>default</instance>\n"
1042 " </interface>\n"
1043 " </hal>\n"
1044 " <sepolicy>\n"
1045 " <version>25.5</version>\n"
1046 " </sepolicy>\n"
1047 "</manifest>\n";
1048 HalManifest manifest;
1049 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1050 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1051 << "should not be compatible because IFoo/default is missing";
1052 }
1053
1054 {
1055 std::string manifestXml =
1056 "<manifest version=\"1.0\" type=\"device\">\n"
1057 " <hal format=\"hidl\">\n"
1058 " <name>android.hardware.foo</name>\n"
1059 " <transport>hwbinder</transport>\n"
1060 " <version>3.3</version>\n"
1061 " <interface>\n"
1062 " <name>IFoo</name>\n"
1063 " <instance>default</instance>\n"
1064 " <instance>specific</instance>\n"
1065 " </interface>\n"
1066 " </hal>\n"
1067 " <hal format=\"hidl\">\n"
1068 " <name>android.hardware.foo</name>\n"
1069 " <transport>hwbinder</transport>\n"
1070 " <version>2.0</version>\n"
1071 " <interface>\n"
1072 " <name>IBar</name>\n"
1073 " <instance>default</instance>\n"
1074 " </interface>\n"
1075 " </hal>\n"
1076 " <sepolicy>\n"
1077 " <version>25.5</version>\n"
1078 " </sepolicy>\n"
1079 "</manifest>\n";
1080 HalManifest manifest;
1081 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1082 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1083 }
1084
1085 {
1086 std::string manifestXml =
1087 "<manifest version=\"1.0\" type=\"device\">\n"
1088 " <hal format=\"hidl\">\n"
1089 " <name>android.hardware.foo</name>\n"
1090 " <transport>hwbinder</transport>\n"
1091 " <version>1.0</version>\n"
1092 " <interface>\n"
1093 " <name>IFoo</name>\n"
1094 " <instance>default</instance>\n"
1095 " </interface>\n"
1096 " </hal>\n"
1097 " <hal format=\"hidl\">\n"
1098 " <name>android.hardware.foo</name>\n"
1099 " <transport>hwbinder</transport>\n"
1100 " <version>3.2</version>\n"
1101 " <interface>\n"
1102 " <name>IFoo</name>\n"
1103 " <instance>specific</instance>\n"
1104 " </interface>\n"
1105 " </hal>\n"
1106 " <hal format=\"hidl\">\n"
1107 " <name>android.hardware.foo</name>\n"
1108 " <transport>hwbinder</transport>\n"
1109 " <version>2.0</version>\n"
1110 " <interface>\n"
1111 " <name>IBar</name>\n"
1112 " <instance>default</instance>\n"
1113 " </interface>\n"
1114 " </hal>\n"
1115 " <sepolicy>\n"
1116 " <version>25.5</version>\n"
1117 " </sepolicy>\n"
1118 "</manifest>\n";
1119 HalManifest manifest;
1120 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1121 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1122 << "should not be compatible even though @1.0::IFoo/default "
1123 << "and @3.2::IFoo/specific present";
1124 }
1125
1126 {
1127 std::string manifestXml =
1128 "<manifest version=\"1.0\" type=\"device\">\n"
1129 " <hal format=\"hidl\">\n"
1130 " <name>android.hardware.foo</name>\n"
1131 " <transport>hwbinder</transport>\n"
1132 " <version>1.0</version>\n"
1133 " <interface>\n"
1134 " <name>IFoo</name>\n"
1135 " <instance>default</instance>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001136 " <instance>specific</instance>\n"
1137 " </interface>\n"
1138 " </hal>\n"
1139 " <hal format=\"hidl\">\n"
1140 " <name>android.hardware.foo</name>\n"
1141 " <transport>hwbinder</transport>\n"
1142 " <version>2.0</version>\n"
1143 " <interface>\n"
1144 " <name>IBar</name>\n"
1145 " <instance>default</instance>\n"
1146 " </interface>\n"
1147 " </hal>\n"
1148 " <sepolicy>\n"
1149 " <version>25.5</version>\n"
1150 " </sepolicy>\n"
1151 "</manifest>\n";
1152 HalManifest manifest;
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001153 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml))
1154 << gHalManifestConverter.lastError();
1155 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
Yifan Hong08e984c2017-05-18 12:50:04 -07001156 }
1157}
1158
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001159TEST_F(LibVintfTest, Compat) {
1160 std::string manifestXml =
1161 "<manifest version=\"1.0\" type=\"device\">\n"
1162 " <hal format=\"hidl\">\n"
1163 " <name>android.hardware.camera</name>\n"
1164 " <transport>hwbinder</transport>\n"
1165 " <version>3.5</version>\n"
1166 " <interface>\n"
1167 " <name>IBetterCamera</name>\n"
1168 " <instance>camera</instance>\n"
1169 " </interface>\n"
1170 " <interface>\n"
1171 " <name>ICamera</name>\n"
1172 " <instance>default</instance>\n"
1173 " <instance>legacy/0</instance>\n"
1174 " </interface>\n"
1175 " </hal>\n"
1176 " <hal format=\"hidl\">\n"
1177 " <name>android.hardware.nfc</name>\n"
1178 " <transport>hwbinder</transport>\n"
1179 " <version>1.0</version>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001180 " <interface>\n"
1181 " <name>INfc</name>\n"
1182 " <instance>nfc_nci</instance>\n"
1183 " </interface>\n"
1184 " </hal>\n"
1185 " <hal format=\"hidl\">\n"
1186 " <name>android.hardware.nfc</name>\n"
1187 " <transport>hwbinder</transport>\n"
1188 " <version>2.0</version>\n"
1189 " <interface>\n"
1190 " <name>INfc</name>\n"
1191 " <instance>default</instance>\n"
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001192 " <instance>nfc_nci</instance>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001193 " </interface>\n"
1194 " </hal>\n"
1195 " <sepolicy>\n"
1196 " <version>25.5</version>\n"
1197 " </sepolicy>\n"
1198 "</manifest>\n";
1199
1200 std::string matrixXml =
1201 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1202 " <hal format=\"hidl\" optional=\"false\">\n"
1203 " <name>android.hardware.camera</name>\n"
1204 " <version>2.0-5</version>\n"
1205 " <version>3.4-16</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001206 " <interface>\n"
1207 " <name>IBetterCamera</name>\n"
1208 " <instance>camera</instance>\n"
1209 " </interface>\n"
1210 " <interface>\n"
1211 " <name>ICamera</name>\n"
1212 " <instance>default</instance>\n"
1213 " <instance>legacy/0</instance>\n"
1214 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001215 " </hal>\n"
1216 " <hal format=\"hidl\" optional=\"false\">\n"
1217 " <name>android.hardware.nfc</name>\n"
1218 " <version>1.0</version>\n"
1219 " <version>2.0</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001220 " <interface>\n"
1221 " <name>INfc</name>\n"
1222 " <instance>nfc_nci</instance>\n"
1223 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001224 " </hal>\n"
1225 " <hal format=\"hidl\" optional=\"true\">\n"
1226 " <name>android.hardware.foo</name>\n"
1227 " <version>1.0</version>\n"
1228 " </hal>\n"
1229 " <sepolicy>\n"
1230 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1231 " <sepolicy-version>25.5</sepolicy-version>\n"
1232 " <sepolicy-version>26.0-3</sepolicy-version>\n"
1233 " </sepolicy>\n"
1234 " <avb>\n"
1235 " <vbmeta-version>2.1</vbmeta-version>\n"
1236 " </avb>\n"
1237 "</compatibility-matrix>\n";
1238
1239 HalManifest manifest;
1240 CompatibilityMatrix matrix;
1241 std::string error;
1242 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1243 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1244 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1245
1246 // some smaller test cases
1247 matrixXml =
1248 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1249 " <hal format=\"hidl\" optional=\"false\">\n"
1250 " <name>android.hardware.camera</name>\n"
1251 " <version>3.4</version>\n"
1252 " </hal>\n"
1253 " <sepolicy>\n"
1254 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1255 " <sepolicy-version>25.5</sepolicy-version>\n"
1256 " </sepolicy>\n"
1257 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1258 "</compatibility-matrix>\n";
1259 matrix = {};
1260 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1261 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1262 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
1263 EXPECT_NE(camera, nullptr);
1264 camera->versionRanges[0] = {3, 5};
1265 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1266 camera->versionRanges[0] = {3, 6};
1267 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1268
1269 // reset it
1270 matrix = {};
1271 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1272 set(matrix, Sepolicy{30, {{26, 0}}});
1273 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1274 set(matrix, Sepolicy{30, {{25, 6}}});
1275 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1276 set(matrix, Sepolicy{30, {{25, 4}}});
1277 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1278}
1279
Yifan Hongd4857902017-06-13 14:13:56 -07001280/////////////////// xmlfile tests
1281
1282TEST_F(LibVintfTest, HalManifestConverterXmlFile) {
1283 HalManifest vm = testDeviceManifestWithXmlFile();
1284 std::string xml = gHalManifestConverter(vm);
1285 EXPECT_EQ(xml,
1286 "<manifest version=\"1.0\" type=\"device\">\n"
1287 " <hal format=\"hidl\">\n"
1288 " <name>android.hardware.camera</name>\n"
1289 " <transport>hwbinder</transport>\n"
1290 " <version>2.0</version>\n"
1291 " <interface>\n"
1292 " <name>IBetterCamera</name>\n"
1293 " <instance>camera</instance>\n"
1294 " </interface>\n"
1295 " <interface>\n"
1296 " <name>ICamera</name>\n"
1297 " <instance>default</instance>\n"
1298 " <instance>legacy/0</instance>\n"
1299 " </interface>\n"
1300 " </hal>\n"
1301 " <hal format=\"hidl\">\n"
1302 " <name>android.hardware.nfc</name>\n"
1303 " <transport arch=\"32+64\">passthrough</transport>\n"
1304 " <version>1.0</version>\n"
1305 " <interface>\n"
1306 " <name>INfc</name>\n"
1307 " <instance>default</instance>\n"
1308 " </interface>\n"
1309 " </hal>\n"
1310 " <sepolicy>\n"
1311 " <version>25.0</version>\n"
1312 " </sepolicy>\n"
1313 " <xmlfile>\n"
1314 " <name>media_profile</name>\n"
1315 " <version>1.0</version>\n"
1316 " </xmlfile>\n"
1317 "</manifest>\n");
1318 HalManifest vm2;
1319 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
1320 EXPECT_EQ(vm, vm2);
1321}
1322
1323TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile) {
1324 CompatibilityMatrix cm;
1325 addXmlFile(cm, "media_profile", {1, 0});
1326 std::string xml = gCompatibilityMatrixConverter(cm);
1327 EXPECT_EQ(xml,
1328 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1329 " <sepolicy>\n"
1330 " <kernel-sepolicy-version>0</kernel-sepolicy-version>\n"
1331 " </sepolicy>\n"
1332 " <avb>\n"
1333 " <vbmeta-version>0.0</vbmeta-version>\n"
1334 " </avb>\n"
1335 " <xmlfile format=\"dtd\" optional=\"true\">\n"
1336 " <name>media_profile</name>\n"
1337 " <version>1.0</version>\n"
1338 " </xmlfile>\n"
1339 "</compatibility-matrix>\n");
1340 CompatibilityMatrix cm2;
1341 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
1342 EXPECT_EQ(cm, cm2);
1343}
1344
1345TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile2) {
1346 std::string xml =
1347 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1348 " <xmlfile format=\"dtd\" optional=\"false\">\n"
1349 " <name>media_profile</name>\n"
1350 " <version>1.0</version>\n"
1351 " </xmlfile>\n"
1352 "</compatibility-matrix>\n";
1353 CompatibilityMatrix cm;
1354 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml));
1355 EXPECT_EQ(
1356 "compatibility-matrix.xmlfile entry media_profile has to be optional for "
1357 "compatibility matrix version 1.0",
1358 gCompatibilityMatrixConverter.lastError());
1359}
1360
Yifan Hongbbfff302017-06-06 17:10:13 -07001361TEST_F(LibVintfTest, ManifestXmlFilePathDevice) {
1362 std::string manifestXml =
1363 "<manifest version=\"1.0\" type=\"device\">"
1364 " <xmlfile>"
1365 " <name>media_profile</name>"
1366 " <version>1.0</version>"
1367 " </xmlfile>"
1368 "</manifest>";
1369 HalManifest manifest;
1370 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1371 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1372 "/vendor/etc/media_profile_V1_0.xml");
1373}
1374
1375TEST_F(LibVintfTest, ManifestXmlFilePathFramework) {
1376 std::string manifestXml =
1377 "<manifest version=\"1.0\" type=\"framework\">"
1378 " <xmlfile>"
1379 " <name>media_profile</name>"
1380 " <version>1.0</version>"
1381 " </xmlfile>"
1382 "</manifest>";
1383 HalManifest manifest;
1384 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1385 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1386 "/system/etc/media_profile_V1_0.xml");
1387}
1388
1389TEST_F(LibVintfTest, ManifestXmlFilePathOverride) {
1390 std::string manifestXml =
1391 "<manifest version=\"1.0\" type=\"device\">"
1392 " <xmlfile>"
1393 " <name>media_profile</name>"
1394 " <version>1.0</version>"
1395 " <path>/vendor/etc/foo.xml</path>"
1396 " </xmlfile>"
1397 "</manifest>";
1398 HalManifest manifest;
1399 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1400 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "/vendor/etc/foo.xml");
1401}
1402
1403TEST_F(LibVintfTest, ManifestXmlFilePathMissing) {
1404 std::string manifestXml =
1405 "<manifest version=\"1.0\" type=\"device\">"
1406 " <xmlfile>"
1407 " <name>media_profile</name>"
1408 " <version>1.1</version>"
1409 " </xmlfile>"
1410 "</manifest>";
1411 HalManifest manifest;
1412 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1413 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "");
1414}
1415
1416TEST_F(LibVintfTest, MatrixXmlFilePathFramework) {
1417 std::string matrixXml =
1418 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1419 " <xmlfile format=\"dtd\" optional=\"true\">"
1420 " <name>media_profile</name>"
1421 " <version>2.0-1</version>"
1422 " </xmlfile>"
1423 "</compatibility-matrix>";
1424 CompatibilityMatrix matrix;
1425 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1426 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 1}),
1427 "/system/etc/media_profile_V2_1.dtd");
1428}
1429
1430TEST_F(LibVintfTest, MatrixXmlFilePathDevice) {
1431 std::string matrixXml =
1432 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1433 " <xmlfile format=\"xsd\" optional=\"true\">"
1434 " <name>media_profile</name>"
1435 " <version>2.0-1</version>"
1436 " </xmlfile>"
1437 "</compatibility-matrix>";
1438 CompatibilityMatrix matrix;
1439 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1440 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}),
1441 "/vendor/etc/media_profile_V2_1.xsd");
1442}
1443
1444TEST_F(LibVintfTest, MatrixXmlFilePathOverride) {
1445 std::string matrixXml =
1446 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1447 " <xmlfile format=\"xsd\" optional=\"true\">"
1448 " <name>media_profile</name>"
1449 " <version>2.0-1</version>"
1450 " <path>/system/etc/foo.xsd</path>"
1451 " </xmlfile>"
1452 "</compatibility-matrix>";
1453 CompatibilityMatrix matrix;
1454 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1455 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "/system/etc/foo.xsd");
1456}
1457
1458TEST_F(LibVintfTest, MatrixXmlFilePathMissing) {
1459 std::string matrixXml =
1460 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1461 " <xmlfile format=\"dtd\" optional=\"true\">"
1462 " <name>media_profile</name>"
1463 " <version>2.1</version>"
1464 " </xmlfile>"
1465 "</compatibility-matrix>";
1466 CompatibilityMatrix matrix;
1467 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1468 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "");
1469}
1470
Yifan Hong02e94002017-07-10 15:41:56 -07001471std::pair<KernelConfigParser, status_t> processData(const std::string& data, bool processComments,
1472 bool relaxedFormat = false) {
1473 KernelConfigParser parser(processComments, relaxedFormat);
Yifan Hongd8cee082017-07-05 16:06:09 -07001474 const char* p = data.c_str();
1475 size_t n = 0;
1476 size_t chunkSize;
Yifan Hong6209d172017-07-07 16:18:19 -07001477 status_t status = OK;
Yifan Hongd8cee082017-07-05 16:06:09 -07001478 for (; n < data.size(); p += chunkSize, n += chunkSize) {
1479 chunkSize = std::min<size_t>(5, data.size() - n);
Yifan Hong6209d172017-07-07 16:18:19 -07001480 if ((status = parser.process(p, chunkSize)) != OK) {
1481 break;
1482 }
Yifan Hongd8cee082017-07-05 16:06:09 -07001483 }
Yifan Hong6209d172017-07-07 16:18:19 -07001484 return {std::move(parser), status};
Yifan Hongd8cee082017-07-05 16:06:09 -07001485}
1486
1487TEST_F(LibVintfTest, KernelConfigParser) {
1488 // usage in /proc/config.gz
1489 const std::string data =
1490 "# CONFIG_NOT_SET is not set\n"
1491 "CONFIG_ONE=1\n"
1492 "CONFIG_Y=y\n"
1493 "CONFIG_STR=\"string\"\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001494 auto pair = processData(data, false /* processComments */);
1495 ASSERT_EQ(OK, pair.second) << pair.first.error();
1496 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001497
1498 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1499 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1500 EXPECT_EQ(configs.find("CONFIG_STR")->second, "\"string\"");
1501 EXPECT_EQ(configs.find("CONFIG_NOT_SET"), configs.end());
1502}
1503
1504TEST_F(LibVintfTest, KernelConfigParser2) {
1505 // usage in android-base.cfg
1506 const std::string data =
1507 "# CONFIG_NOT_SET is not set\n"
1508 "CONFIG_ONE=1\n"
1509 "CONFIG_Y=y\n"
1510 "CONFIG_STR=string\n"
1511 "# ignore_thiscomment\n"
1512 "# CONFIG_NOT_SET2 is not set\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001513 auto pair = processData(data, true /* processComments */);
1514 ASSERT_EQ(OK, pair.second) << pair.first.error();
1515 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001516
1517 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1518 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1519 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1520 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1521 EXPECT_EQ(configs.find("CONFIG_NOT_SET2")->second, "n");
1522}
1523
Yifan Hongc1889722017-07-07 16:19:52 -07001524TEST_F(LibVintfTest, KernelConfigParserSpace) {
1525 // usage in android-base.cfg
1526 const std::string data =
1527 " # CONFIG_NOT_SET is not set \n"
1528 " CONFIG_ONE=1 # 'tis a one!\n"
1529 " CONFIG_TWO=2 #'tis a two! \n"
1530 " CONFIG_THREE=3#'tis a three! \n"
1531 " CONFIG_233=233#'tis a three! \n"
1532 "#yey! random comments\n"
1533 "CONFIG_Y=y \n"
1534 " CONFIG_YES=y#YES! \n"
1535 "CONFIG_STR=string\n"
1536 "CONFIG_HELLO=hello world! #still works\n"
1537 "CONFIG_WORLD=hello world! \n"
1538 "CONFIG_GOOD = good morning! #comments here\n"
1539 " CONFIG_MORNING = good morning! \n";
Yifan Hong02e94002017-07-10 15:41:56 -07001540 auto pair = processData(data, true /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07001541 ASSERT_EQ(OK, pair.second) << pair.first.error();
1542 const auto& configs = pair.first.configs();
1543
1544 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1545 EXPECT_EQ(configs.find("CONFIG_TWO")->second, "2");
1546 EXPECT_EQ(configs.find("CONFIG_THREE")->second, "3");
1547 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1548 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1549 EXPECT_EQ(configs.find("CONFIG_HELLO")->second, "hello world!")
1550 << "Value should be \"hello world!\" without trailing spaces";
1551 EXPECT_EQ(configs.find("CONFIG_WORLD")->second, "hello world!")
1552 << "Value should be \"hello world!\" without trailing spaces";
1553 EXPECT_EQ(configs.find("CONFIG_GOOD")->second, "good morning!")
1554 << "Value should be \"good morning!\" without leading or trailing spaces";
1555 EXPECT_EQ(configs.find("CONFIG_MORNING")->second, "good morning!")
1556 << "Value should be \"good morning!\" without leading or trailing spaces";
1557 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1558}
1559
Yifan Hongd9e46432017-08-15 17:14:52 -07001560TEST_F(LibVintfTest, NetutilsWrapperMatrix) {
1561 std::string matrixXml;
1562 CompatibilityMatrix matrix;
1563
1564 matrixXml =
1565 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1566 " <hal format=\"native\" optional=\"false\">"
1567 " <name>netutils-wrapper</name>"
1568 " <version>1.0</version>"
1569 " </hal>"
1570 "</compatibility-matrix>";
1571 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
1572 << gCompatibilityMatrixConverter.lastError();
1573
1574// only host libvintf hardcodes netutils-wrapper version requirements
1575#ifdef LIBVINTF_HOST
1576
1577 matrixXml =
1578 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1579 " <hal format=\"native\" optional=\"false\">"
1580 " <name>netutils-wrapper</name>"
1581 " <version>1.0-1</version>"
1582 " </hal>"
1583 "</compatibility-matrix>";
1584 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1585 EXPECT_CONTAINS(
1586 gCompatibilityMatrixConverter.lastError(),
1587 "netutils-wrapper HAL must specify exactly one version x.0, but a range is provided. "
1588 "Perhaps you mean '1.0'?");
1589
1590 matrixXml =
1591 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1592 " <hal format=\"native\" optional=\"false\">"
1593 " <name>netutils-wrapper</name>"
1594 " <version>1.1</version>"
1595 " </hal>"
1596 "</compatibility-matrix>";
1597 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1598 EXPECT_CONTAINS(
1599 gCompatibilityMatrixConverter.lastError(),
1600 "netutils-wrapper HAL must specify exactly one version x.0, but minor version is not 0. "
1601 "Perhaps you mean '1.0'?");
1602
1603 matrixXml =
1604 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1605 " <hal format=\"native\" optional=\"false\">"
1606 " <name>netutils-wrapper</name>"
1607 " <version>1.0</version>"
1608 " <version>2.0</version>"
1609 " </hal>"
1610 "</compatibility-matrix>";
1611 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1612 EXPECT_CONTAINS(
1613 gCompatibilityMatrixConverter.lastError(),
1614 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1615 "is specified.");
1616
1617#endif // LIBVINTF_HOST
1618}
1619
1620TEST_F(LibVintfTest, NetutilsWrapperManifest) {
1621 std::string manifestXml;
1622 HalManifest manifest;
1623
1624 manifestXml =
1625 "<manifest version=\"1.0\" type=\"framework\">"
1626 " <hal format=\"native\">"
1627 " <name>netutils-wrapper</name>"
1628 " <version>1.0</version>"
1629 " <version>2.0</version>"
1630 " </hal>"
1631 "</manifest>";
1632 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml)) << gHalManifestConverter.lastError();
1633
1634// only host libvintf hardcodes netutils-wrapper version requirements
1635#ifdef LIBVINTF_HOST
1636
1637 manifestXml =
1638 "<manifest version=\"1.0\" type=\"framework\">"
1639 " <hal format=\"native\">"
1640 " <name>netutils-wrapper</name>"
1641 " <version>1.1</version>"
1642 " </hal>"
1643 "</manifest>";
1644 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1645 EXPECT_CONTAINS(
1646 gCompatibilityMatrixConverter.lastError(),
1647 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1648 "is specified.");
1649
1650 manifestXml =
1651 "<manifest version=\"1.0\" type=\"framework\">"
1652 " <hal format=\"native\">"
1653 " <name>netutils-wrapper</name>"
1654 " <version>1.0</version>"
1655 " <version>2.1</version>"
1656 " </hal>"
1657 "</manifest>";
1658 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1659 EXPECT_CONTAINS(
1660 gCompatibilityMatrixConverter.lastError(),
1661 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1662 "is specified.");
1663
1664#endif // LIBVINTF_HOST
1665}
1666
Yifan Hong5f996502017-08-23 14:46:44 -07001667TEST_F(LibVintfTest, KernelConfigConditionTest) {
1668 std::string xml =
1669 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1670 " <kernel version=\"3.18.22\"/>\n"
1671 " <kernel version=\"3.18.22\">\n"
1672 " <conditions>\n"
1673 " <config>\n"
1674 " <key>CONFIG_ARM</key>\n"
1675 " <value type=\"tristate\">y</value>\n"
1676 " </config>\n"
1677 " </conditions>\n"
1678 " <config>\n"
1679 " <key>CONFIG_FOO</key>\n"
1680 " <value type=\"tristate\">y</value>\n"
1681 " </config>\n"
1682 " </kernel>\n"
1683 " <sepolicy>\n"
1684 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1685 " <sepolicy-version>25.0</sepolicy-version>\n"
1686 " </sepolicy>\n"
1687 " <avb>\n"
1688 " <vbmeta-version>2.1</vbmeta-version>\n"
1689 " </avb>\n"
1690 "</compatibility-matrix>\n";
1691
1692 CompatibilityMatrix cm;
1693 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1694 << gCompatibilityMatrixConverter.lastError();
1695 const auto& kernels = getKernels(cm);
1696 ASSERT_GE(kernels.size(), 2u);
1697 ASSERT_TRUE(kernels[0].conditions().empty());
1698 const auto& kernel = kernels[1];
1699 const auto& cond = kernel.conditions();
1700 ASSERT_FALSE(cond.empty());
1701 EXPECT_EQ("CONFIG_ARM", cond.begin()->first);
1702 EXPECT_EQ(KernelConfigTypedValue(Tristate::YES), cond.begin()->second);
1703 EXPECT_FALSE(kernel.configs().empty());
1704
1705 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
1706}
1707
1708TEST_F(LibVintfTest, KernelConfigConditionEmptyTest) {
1709 std::string xml =
1710 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1711 " <kernel version=\"4.4.0\"/>\n"
1712 " <kernel version=\"3.18.22\">\n"
1713 " <conditions>\n"
1714 " <config>\n"
1715 " <key>CONFIG_ARM</key>\n"
1716 " <value type=\"tristate\">y</value>\n"
1717 " </config>\n"
1718 " </conditions>\n"
1719 " </kernel>\n"
1720 "</compatibility-matrix>\n";
1721
1722 CompatibilityMatrix cm;
1723 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml))
1724 << "Should not accept first kernel version with non-empty conditions";
1725 EXPECT_EQ(
1726 "First <kernel> for version 3.18 must have empty <conditions> "
1727 "for backwards compatibility.",
1728 gCompatibilityMatrixConverter.lastError());
1729}
1730
1731TEST_F(LibVintfTest, KernelConfigConditionMatch) {
1732 RuntimeInfo runtime = testRuntimeInfo();
1733 std::string error;
1734 std::string xml;
1735 CompatibilityMatrix cm;
1736
1737 xml =
1738 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1739 " <kernel version=\"3.18.22\"/>\n"
1740 " <kernel version=\"3.18.22\">\n"
1741 " <conditions>\n"
1742 " <config>\n"
1743 " <key>CONFIG_64BIT</key>\n"
1744 " <value type=\"tristate\">y</value>\n"
1745 " </config>\n"
1746 " </conditions>\n"
1747 " <config>\n"
1748 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1749 " <value type=\"int\">24</value>\n"
1750 " </config>\n"
1751 " </kernel>\n"
1752 " <sepolicy>\n"
1753 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1754 " </sepolicy>\n"
1755 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1756 "</compatibility-matrix>\n";
1757
1758 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1759 << gCompatibilityMatrixConverter.lastError();
1760 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1761
1762 xml =
1763 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1764 " <kernel version=\"3.18.22\"/>\n"
1765 " <kernel version=\"3.18.22\">\n"
1766 " <conditions>\n"
1767 " <config>\n"
1768 " <key>CONFIG_64BIT</key>\n"
1769 " <value type=\"tristate\">y</value>\n"
1770 " </config>\n"
1771 " </conditions>\n"
1772 " <config>\n"
1773 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1774 " <value type=\"int\">26</value>\n"
1775 " </config>\n"
1776 " </kernel>\n"
1777 " <sepolicy>\n"
1778 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1779 " </sepolicy>\n"
1780 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1781 "</compatibility-matrix>\n";
1782
1783 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1784 << gCompatibilityMatrixConverter.lastError();
1785 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1786 << "conditions met, so CONFIG_ARCH_MMAP_RND_BITS should not match";
1787
1788 xml =
1789 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1790 " <kernel version=\"3.18.22\"/>\n"
1791 " <kernel version=\"3.18.22\">\n"
1792 " <conditions>\n"
1793 " <config>\n"
1794 " <key>CONFIG_64BIT</key>\n"
1795 " <value type=\"tristate\">n</value>\n"
1796 " </config>\n"
1797 " </conditions>\n"
1798 " <config>\n"
1799 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1800 " <value type=\"int\">26</value>\n"
1801 " </config>\n"
1802 " </kernel>\n"
1803 " <sepolicy>\n"
1804 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1805 " </sepolicy>\n"
1806 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1807 "</compatibility-matrix>\n";
1808
1809 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1810 << gCompatibilityMatrixConverter.lastError();
1811 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1812 xml =
1813 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1814 " <kernel version=\"3.18.22\"/>\n"
1815 " <kernel version=\"3.18.22\">\n"
1816 " <conditions>\n"
1817 " <config>\n"
1818 " <key>CONFIG_64BIT</key>\n"
1819 " <value type=\"tristate\">y</value>\n"
1820 " </config>\n"
1821 " <config>\n"
1822 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1823 " <value type=\"int\">24</value>\n"
1824 " </config>\n"
1825 " </conditions>\n"
1826 " <config>\n"
1827 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1828 " <value type=\"int\">0xdead000000000000</value>\n"
1829 " </config>\n"
1830 " </kernel>\n"
1831 " <sepolicy>\n"
1832 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1833 " </sepolicy>\n"
1834 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1835 "</compatibility-matrix>\n";
1836
1837 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1838 << gCompatibilityMatrixConverter.lastError();
1839 EXPECT_TRUE(runtime.checkCompatibility(cm, &error));
1840
1841 xml =
1842 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1843 " <kernel version=\"3.18.22\"/>\n"
1844 " <kernel version=\"3.18.22\">\n"
1845 " <conditions>\n"
1846 " <config>\n"
1847 " <key>CONFIG_64BIT</key>\n"
1848 " <value type=\"tristate\">y</value>\n"
1849 " </config>\n"
1850 " <config>\n"
1851 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1852 " <value type=\"int\">24</value>\n"
1853 " </config>\n"
1854 " </conditions>\n"
1855 " <config>\n"
1856 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1857 " <value type=\"int\">0xbeaf000000000000</value>\n"
1858 " </config>\n"
1859 " </kernel>\n"
1860 " <sepolicy>\n"
1861 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1862 " </sepolicy>\n"
1863 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1864 "</compatibility-matrix>\n";
1865
1866 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1867 << gCompatibilityMatrixConverter.lastError();
1868 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1869 << "conditions have 'and' relationship, so CONFIG_ILLEGAL_POINTER_VALUE should not match";
1870
1871 xml =
1872 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1873 " <kernel version=\"3.18.22\"/>\n"
1874 " <kernel version=\"3.18.22\">\n"
1875 " <conditions>\n"
1876 " <config>\n"
1877 " <key>CONFIG_64BIT</key>\n"
1878 " <value type=\"tristate\">y</value>\n"
1879 " </config>\n"
1880 " <config>\n"
1881 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1882 " <value type=\"int\">26</value>\n"
1883 " </config>\n"
1884 " </conditions>\n"
1885 " <config>\n"
1886 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1887 " <value type=\"int\">0xbeaf000000000000</value>\n"
1888 " </config>\n"
1889 " </kernel>\n"
1890 " <sepolicy>\n"
1891 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1892 " </sepolicy>\n"
1893 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1894 "</compatibility-matrix>\n";
1895
1896 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1897 << gCompatibilityMatrixConverter.lastError();
1898 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1899
1900 xml =
1901 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1902 " <kernel version=\"3.18.22\">\n"
1903 " <config>\n"
1904 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1905 " <value type=\"string\"/>\n"
1906 " </config>\n"
1907 " </kernel>\n"
1908 " <kernel version=\"3.18.22\">\n"
1909 " <conditions>\n"
1910 " <config>\n"
1911 " <key>CONFIG_64BIT</key>\n"
1912 " <value type=\"tristate\">y</value>\n"
1913 " </config>\n"
1914 " </conditions>\n"
1915 " <config>\n"
1916 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1917 " <value type=\"int\">0xdead000000000000</value>\n"
1918 " </config>\n"
1919 " </kernel>\n"
1920 " <kernel version=\"3.18.22\">\n"
1921 " <conditions>\n"
1922 " <config>\n"
1923 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1924 " <value type=\"int\">24</value>\n"
1925 " </config>\n"
1926 " </conditions>\n"
1927 " <config>\n"
1928 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1929 " <value type=\"string\">binder,hwbinder</value>\n"
1930 " </config>\n"
1931 " </kernel>\n"
1932 " <sepolicy>\n"
1933 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1934 " </sepolicy>\n"
1935 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1936 "</compatibility-matrix>\n";
1937
1938 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1939 << gCompatibilityMatrixConverter.lastError();
1940 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1941
1942 xml =
1943 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1944 " <kernel version=\"3.18.22\">\n"
1945 " <config>\n"
1946 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1947 " <value type=\"string\"/>\n"
1948 " </config>\n"
1949 " </kernel>\n"
1950 " <kernel version=\"3.18.22\">\n"
1951 " <conditions>\n"
1952 " <config>\n"
1953 " <key>CONFIG_64BIT</key>\n"
1954 " <value type=\"tristate\">y</value>\n"
1955 " </config>\n"
1956 " </conditions>\n"
1957 " <config>\n"
1958 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1959 " <value type=\"int\">0xbeaf000000000000</value>\n"
1960 " </config>\n"
1961 " </kernel>\n"
1962 " <kernel version=\"3.18.22\">\n"
1963 " <conditions>\n"
1964 " <config>\n"
1965 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1966 " <value type=\"int\">24</value>\n"
1967 " </config>\n"
1968 " </conditions>\n"
1969 " <config>\n"
1970 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1971 " <value type=\"string\">binder,hwbinder</value>\n"
1972 " </config>\n"
1973 " </kernel>\n"
1974 " <sepolicy>\n"
1975 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1976 " </sepolicy>\n"
1977 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1978 "</compatibility-matrix>\n";
1979
1980 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1981 << gCompatibilityMatrixConverter.lastError();
1982 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used.";
1983
1984 xml =
1985 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1986 " <kernel version=\"3.18.22\">\n"
1987 " <config>\n"
1988 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1989 " <value type=\"string\"/>\n"
1990 " </config>\n"
1991 " </kernel>\n"
1992 " <kernel version=\"3.18.22\">\n"
1993 " <conditions>\n"
1994 " <config>\n"
1995 " <key>CONFIG_64BIT</key>\n"
1996 " <value type=\"tristate\">y</value>\n"
1997 " </config>\n"
1998 " </conditions>\n"
1999 " <config>\n"
2000 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
2001 " <value type=\"int\">0xdead000000000000</value>\n"
2002 " </config>\n"
2003 " </kernel>\n"
2004 " <kernel version=\"3.18.22\">\n"
2005 " <conditions>\n"
2006 " <config>\n"
2007 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
2008 " <value type=\"int\">24</value>\n"
2009 " </config>\n"
2010 " </conditions>\n"
2011 " <config>\n"
2012 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
2013 " <value type=\"string\">binder</value>\n"
2014 " </config>\n"
2015 " </kernel>\n"
2016 " <sepolicy>\n"
2017 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2018 " </sepolicy>\n"
2019 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2020 "</compatibility-matrix>\n";
2021
2022 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2023 << gCompatibilityMatrixConverter.lastError();
2024 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used";
2025}
2026
Yifan Hongc1889722017-07-07 16:19:52 -07002027// Run KernelConfigParserInvalidTest on processComments = {true, false}
2028class KernelConfigParserInvalidTest : public ::testing::TestWithParam<bool> {};
2029
2030TEST_P(KernelConfigParserInvalidTest, NonSet1) {
2031 const std::string data = "# CONFIG_NOT_EXIST is not sat\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002032 auto pair = processData(data, GetParam() /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07002033 ASSERT_EQ(OK, pair.second) << pair.first.error();
2034 const auto& configs = pair.first.configs();
2035 EXPECT_EQ(configs.find("CONFIG_NOT_EXIST"), configs.end())
2036 << "CONFIG_NOT_EXIST should not exist because of typo";
2037}
2038
2039TEST_P(KernelConfigParserInvalidTest, InvalidLine1) {
2040 const std::string data = "FOO_CONFIG=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002041 ASSERT_NE(OK,
2042 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07002043}
2044
2045TEST_P(KernelConfigParserInvalidTest, InvalidLine2) {
2046 const std::string data = "CONFIG_BAR-BAZ=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002047 ASSERT_NE(OK,
2048 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07002049}
2050
2051INSTANTIATE_TEST_CASE_P(KernelConfigParser, KernelConfigParserInvalidTest, ::testing::Bool());
2052
Yifan Hong2027a492017-12-11 15:21:19 -08002053TEST_F(LibVintfTest, MatrixLevel) {
2054 CompatibilityMatrix cm;
2055 std::string xml;
2056
2057 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\"/>";
2058 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2059 << gCompatibilityMatrixConverter.lastError();
2060 EXPECT_EQ(Level::UNSPECIFIED, cm.level());
2061
2062 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"legacy\"/>";
2063 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2064 << gCompatibilityMatrixConverter.lastError();
2065 EXPECT_EQ(Level::LEGACY, cm.level());
2066
2067 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
2068 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2069 << gCompatibilityMatrixConverter.lastError();
2070 EXPECT_EQ(1u, cm.level());
2071}
2072
2073TEST_F(LibVintfTest, ManifestLevel) {
2074 HalManifest manifest;
2075 std::string xml;
2076
2077 xml = "<manifest version=\"1.0\" type=\"device\"/>";
2078 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2079 EXPECT_EQ(Level::UNSPECIFIED, manifest.level());
2080
2081 xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"legacy\"/>";
2082 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2083 EXPECT_EQ(Level::LEGACY, manifest.level());
2084
2085 xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"1\"/>";
2086 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2087 EXPECT_EQ(1u, manifest.level());
2088}
2089
Yifan Hongdbe9db32017-12-11 19:06:11 -08002090TEST_F(LibVintfTest, AddOptionalHal) {
2091 CompatibilityMatrix cm1;
2092 CompatibilityMatrix cm2;
2093 std::string error;
2094 std::string xml;
2095
2096 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
2097 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2098 << gCompatibilityMatrixConverter.lastError();
2099
2100 xml =
2101 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2102 " <hal format=\"hidl\" optional=\"false\">\n"
2103 " <name>android.hardware.foo</name>\n"
2104 " <version>1.0-1</version>\n"
2105 " <interface>\n"
2106 " <name>IFoo</name>\n"
2107 " <instance>default</instance>\n"
2108 " </interface>\n"
2109 " </hal>\n"
2110 "</compatibility-matrix>\n";
2111 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2112 << gCompatibilityMatrixConverter.lastError();
2113
2114 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2115 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2116 EXPECT_EQ(xml,
2117 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2118 " <hal format=\"hidl\" optional=\"true\">\n"
2119 " <name>android.hardware.foo</name>\n"
2120 " <version>1.0-1</version>\n"
2121 " <interface>\n"
2122 " <name>IFoo</name>\n"
2123 " <instance>default</instance>\n"
2124 " </interface>\n"
2125 " </hal>\n"
2126 "</compatibility-matrix>\n");
2127}
2128
2129TEST_F(LibVintfTest, AddOptionalHalMinorVersion) {
2130 CompatibilityMatrix cm1;
2131 CompatibilityMatrix cm2;
2132 std::string error;
2133 std::string xml;
2134
2135 xml =
2136 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2137 " <hal format=\"hidl\" optional=\"false\">\n"
2138 " <name>android.hardware.foo</name>\n"
2139 " <version>1.2-3</version>\n"
2140 " <interface>\n"
2141 " <name>IFoo</name>\n"
2142 " <instance>default</instance>\n"
2143 " </interface>\n"
2144 " </hal>\n"
2145 "</compatibility-matrix>\n";
2146 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2147 << gCompatibilityMatrixConverter.lastError();
2148
2149 xml =
2150 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2151 " <hal format=\"hidl\" optional=\"false\">\n"
2152 " <name>android.hardware.foo</name>\n"
2153 " <version>1.0-4</version>\n"
2154 " <interface>\n"
2155 " <name>IFoo</name>\n"
2156 " <instance>default</instance>\n"
2157 " </interface>\n"
2158 " </hal>\n"
2159 "</compatibility-matrix>\n";
2160 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2161 << gCompatibilityMatrixConverter.lastError();
2162
2163 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2164 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2165 EXPECT_EQ(xml,
2166 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2167 " <hal format=\"hidl\" optional=\"false\">\n"
2168 " <name>android.hardware.foo</name>\n"
2169 " <version>1.2-4</version>\n"
2170 " <interface>\n"
2171 " <name>IFoo</name>\n"
2172 " <instance>default</instance>\n"
2173 " </interface>\n"
2174 " </hal>\n"
2175 "</compatibility-matrix>\n");
2176}
2177
2178TEST_F(LibVintfTest, AddOptionalHalMajorVersion) {
2179 CompatibilityMatrix cm1;
2180 CompatibilityMatrix cm2;
2181 std::string error;
2182 std::string xml;
2183
2184 xml =
2185 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2186 " <hal format=\"hidl\" optional=\"false\">\n"
2187 " <name>android.hardware.foo</name>\n"
2188 " <version>1.2-3</version>\n"
2189 " <interface>\n"
2190 " <name>IFoo</name>\n"
2191 " <instance>default</instance>\n"
2192 " </interface>\n"
2193 " </hal>\n"
2194 "</compatibility-matrix>\n";
2195 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2196 << gCompatibilityMatrixConverter.lastError();
2197
2198 xml =
2199 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2200 " <hal format=\"hidl\" optional=\"false\">\n"
2201 " <name>android.hardware.foo</name>\n"
2202 " <version>2.0-4</version>\n"
2203 " <interface>\n"
2204 " <name>IFoo</name>\n"
2205 " <instance>default</instance>\n"
2206 " </interface>\n"
2207 " </hal>\n"
2208 "</compatibility-matrix>\n";
2209 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2210 << gCompatibilityMatrixConverter.lastError();
2211
2212 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2213 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2214 EXPECT_EQ(xml,
2215 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2216 " <hal format=\"hidl\" optional=\"false\">\n"
2217 " <name>android.hardware.foo</name>\n"
2218 " <version>1.2-3</version>\n"
2219 " <interface>\n"
2220 " <name>IFoo</name>\n"
2221 " <instance>default</instance>\n"
2222 " </interface>\n"
2223 " </hal>\n"
2224 " <hal format=\"hidl\" optional=\"true\">\n"
2225 " <name>android.hardware.foo</name>\n"
2226 " <version>2.0-4</version>\n"
2227 " <interface>\n"
2228 " <name>IFoo</name>\n"
2229 " <instance>default</instance>\n"
2230 " </interface>\n"
2231 " </hal>\n"
2232 "</compatibility-matrix>\n");
2233}
2234
Yifan Honga9993572017-01-24 19:33:15 -08002235} // namespace vintf
2236} // namespace android
2237
Yifan Hong676447a2016-11-15 12:57:23 -08002238int main(int argc, char **argv) {
2239 ::testing::InitGoogleTest(&argc, argv);
2240 return RUN_ALL_TESTS();
2241}