blob: 63d0bf5e200dd3c916d81b89d712ef1d76c75767 [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 Hong398f4c72017-04-13 20:18:01 -070019#include <functional>
20
Yifan Hong676447a2016-11-15 12:57:23 -080021#include <vintf/parse_string.h>
22#include <vintf/parse_xml.h>
23#include <vintf/CompatibilityMatrix.h>
Yifan Hong398f4c72017-04-13 20:18:01 -070024#include <vintf/VintfObject.h>
Yifan Hong676447a2016-11-15 12:57:23 -080025
26#include <android-base/logging.h>
Yifan Hong3f5489a2017-02-08 11:14:21 -080027#include <android-base/parseint.h>
Yifan Hong676447a2016-11-15 12:57:23 -080028#include <gtest/gtest.h>
29
Yifan Honga9993572017-01-24 19:33:15 -080030namespace android {
31namespace vintf {
Yifan Hong676447a2016-11-15 12:57:23 -080032
Yifan Hong4a5eb7b2017-02-16 18:19:26 -080033extern const XmlConverter<Version> &gVersionConverter;
Yifan Hong037f12a2017-03-06 19:11:48 -080034extern const XmlConverter<ManifestHal> &gManifestHalConverter;
Yifan Hong4a5eb7b2017-02-16 18:19:26 -080035extern const XmlConverter<MatrixHal> &gMatrixHalConverter;
36extern const XmlConverter<KernelConfigTypedValue> &gKernelConfigTypedValueConverter;
Yifan Hongd2b7e642017-02-17 10:15:32 -080037extern const XmlConverter<HalManifest> &gHalManifestConverter;
Yifan Hong4a5eb7b2017-02-16 18:19:26 -080038extern const XmlConverter<CompatibilityMatrix> &gCompatibilityMatrixConverter;
39
Yifan Honga9993572017-01-24 19:33:15 -080040struct LibVintfTest : public ::testing::Test {
Yifan Hong676447a2016-11-15 12:57:23 -080041public:
42 virtual void SetUp() override {
43 }
44 virtual void TearDown() override {
45 }
Yifan Honga9993572017-01-24 19:33:15 -080046 bool add(CompatibilityMatrix &cm, MatrixHal &&hal) {
47 return cm.add(std::move(hal));
48 }
49 bool add(CompatibilityMatrix &cm, MatrixKernel &&kernel) {
50 return cm.add(std::move(kernel));
51 }
Yifan Hongd2b7e642017-02-17 10:15:32 -080052 bool add(HalManifest &vm, ManifestHal &&hal) {
Yifan Honga9993572017-01-24 19:33:15 -080053 return vm.add(std::move(hal));
54 }
Yifan Hong558380a2017-02-09 15:37:32 -080055 void set(CompatibilityMatrix &cm, Sepolicy &&sepolicy) {
Yifan Hong7c7d7062017-04-04 16:26:51 -070056 cm.framework.mSepolicy = sepolicy;
Yifan Hong558380a2017-02-09 15:37:32 -080057 }
Yifan Hong03d2d4a2017-04-12 17:34:14 -070058 void set(CompatibilityMatrix &cm, SchemaType type) {
59 cm.mType = type;
60 }
61 void set(CompatibilityMatrix &cm, VndkVersionRange &&range, std::set<std::string> &&libs) {
62 cm.device.mVndk.mVersionRange = range;
63 cm.device.mVndk.mLibraries = libs;
64 }
Yifan Hong881a9e452017-04-27 19:31:13 -070065 void setAvb(RuntimeInfo &ki, Version vbmeta, Version boot) {
66 ki.mBootVbmetaAvbVersion = vbmeta;
67 ki.mBootAvbVersion = boot;
Yifan Hongf3029302017-04-12 17:23:49 -070068 }
69 void setAvb(CompatibilityMatrix &cm, Version &&avbVersion) {
70 cm.framework.mAvbMetaVersion = avbVersion;
71 }
Yifan Hong19e0a2a2017-04-14 17:30:53 -070072 Version getAvb(CompatibilityMatrix &cm) {
73 return cm.framework.mAvbMetaVersion;
74 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070075 const ManifestHal *getAnyHal(HalManifest &vm, const std::string &name) {
76 return vm.getAnyHal(name);
Yifan Honga9993572017-01-24 19:33:15 -080077 }
Yifan Hongd0cbf1f2017-04-12 19:47:06 -070078 MatrixHal *getAnyHal(CompatibilityMatrix &cm, const std::string &name) {
79 return cm.getAnyHal(name);
80 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070081 ConstMultiMapValueIterable<std::string, ManifestHal> getHals(HalManifest &vm) {
Yifan Honga9993572017-01-24 19:33:15 -080082 return vm.getHals();
83 }
Yifan Hong5a06ef72017-01-24 19:54:24 -080084 bool isValid(const ManifestHal &mh) {
85 return mh.isValid();
86 }
Yifan Hong9cd9eb02017-05-17 18:36:08 -070087
88 std::map<std::string, HalInterface> testHalInterfaces() {
89 HalInterface intf;
90 intf.name = "IFoo";
91 intf.instances.insert("default");
92 std::map<std::string, HalInterface> map;
93 map[intf.name] = intf;
94 return map;
95 }
96
Yifan Honga04e1472017-04-05 13:15:34 -070097 HalManifest testDeviceManifest() {
Yifan Hongd2b7e642017-02-17 10:15:32 -080098 HalManifest vm;
Yifan Hong7c7d7062017-04-04 16:26:51 -070099 vm.mType = SchemaType::DEVICE;
Yifan Hong2a3dd082017-04-04 17:15:35 -0700100 vm.device.mSepolicyVersion = {25, 0};
Yifan Hong2059ffc2017-02-24 11:32:02 -0800101 vm.add(ManifestHal{
102 .format = HalFormat::HIDL,
103 .name = "android.hardware.camera",
104 .versions = {Version(2, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800105 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800106 .interfaces = {
107 {"ICamera", {"ICamera", {"legacy/0", "default"}}},
108 {"IBetterCamera", {"IBetterCamera", {"camera"}}}
109 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800110 });
111 vm.add(ManifestHal{
112 .format = HalFormat::HIDL,
113 .name = "android.hardware.nfc",
114 .versions = {Version(1, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800115 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800116 .interfaces = {
117 {"INfc", {"INfc", {"default"}}}
118 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800119 });
Yifan Honga9993572017-01-24 19:33:15 -0800120
121 return vm;
122 }
Yifan Honga04e1472017-04-05 13:15:34 -0700123 HalManifest testFrameworkManfiest() {
124 HalManifest vm;
125 vm.mType = SchemaType::FRAMEWORK;
126 vm.add(ManifestHal{
127 .format = HalFormat::HIDL,
128 .name = "android.hidl.manager",
129 .versions = {Version(1, 0)},
130 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
131 .interfaces = {
132 {"IServiceManager", {"IServiceManager", {"default"}}},
133 }
134 });
135 Vndk vndk2505;
136 vndk2505.mVersionRange = {25, 0, 5};
137 vndk2505.mLibraries = { "libjpeg.so", "libbase.so" };
138 Vndk vndk2513;
139 vndk2513.mVersionRange = {25, 1, 3};
140 vndk2513.mLibraries = { "libjpeg.so", "libbase.so", "libtinyxml2.so" };
141 vm.framework.mVndks = { std::move(vndk2505), std::move(vndk2513) };
142
143 return vm;
144 }
Yifan Honga7201e72017-02-17 10:09:59 -0800145 RuntimeInfo testRuntimeInfo() {
146 RuntimeInfo info;
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800147 info.mOsName = "Linux";
148 info.mNodeName = "localhost";
149 info.mOsRelease = "3.18.31-g936f9a479d0f";
150 info.mKernelVersion = {3, 18, 31};
151 info.mOsVersion = "#4 SMP PREEMPT Wed Feb 1 18:10:52 PST 2017";
152 info.mHardwareId = "aarch64";
153 info.mKernelSepolicyVersion = 30;
Yifan Hongf1af7522017-02-16 18:00:55 -0800154 info.mKernelConfigs = {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800155 {"CONFIG_64BIT", "y"},
156 {"CONFIG_ANDROID_BINDER_DEVICES", "\"binder,hwbinder\""},
157 {"CONFIG_ARCH_MMAP_RND_BITS", "24"},
158 {"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", "\"\""},
159 {"CONFIG_ILLEGAL_POINTER_VALUE", "0xdead000000000000"}
160 };
Yifan Hong881a9e452017-04-27 19:31:13 -0700161 setAvb(info, {2, 1}, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800162 return info;
163 }
Yifan Hong676447a2016-11-15 12:57:23 -0800164};
165
Yifan Hongef6d4d32017-01-23 14:12:28 -0800166
167TEST_F(LibVintfTest, Stringify) {
Yifan Honga04e1472017-04-05 13:15:34 -0700168 HalManifest vm = testDeviceManifest();
Yifan Hong974ad9c2017-04-04 15:37:39 -0700169 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/2.0:"
170 "hidl/android.hardware.nfc/passthrough32+64/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -0800171
172 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
173 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
174
175 VersionRange v(1, 2, 3);
176 EXPECT_EQ(to_string(v), "1.2-3");
177 VersionRange v2;
178 EXPECT_TRUE(parse("1.2-3", &v2));
179 EXPECT_EQ(v, v2);
180}
181
Yifan Hong9bbdb282017-04-12 21:53:59 -0700182TEST_F(LibVintfTest, GetTransport) {
183 HalManifest vm = testDeviceManifest();
184 EXPECT_EQ(Transport::HWBINDER, vm.getTransport("android.hardware.camera",
185 {2, 0}, "ICamera", "default"));
186}
187
Yifan Hongd2b7e642017-02-17 10:15:32 -0800188TEST_F(LibVintfTest, HalManifestConverter) {
Yifan Honga04e1472017-04-05 13:15:34 -0700189 HalManifest vm = testDeviceManifest();
Yifan Hongd2b7e642017-02-17 10:15:32 -0800190 std::string xml = gHalManifestConverter(vm);
Yifan Hong676447a2016-11-15 12:57:23 -0800191 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700192 "<manifest version=\"1.0\" type=\"device\">\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800193 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800194 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800195 " <transport>hwbinder</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800196 " <version>2.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800197 " <interface>\n"
198 " <name>IBetterCamera</name>\n"
199 " <instance>camera</instance>\n"
200 " </interface>\n"
201 " <interface>\n"
202 " <name>ICamera</name>\n"
203 " <instance>default</instance>\n"
204 " <instance>legacy/0</instance>\n"
205 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800206 " </hal>\n"
207 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800208 " <name>android.hardware.nfc</name>\n"
Yifan Hongc54d32c2017-03-07 19:12:26 -0800209 " <transport arch=\"32+64\">passthrough</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800210 " <version>1.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800211 " <interface>\n"
212 " <name>INfc</name>\n"
213 " <instance>default</instance>\n"
214 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800215 " </hal>\n"
Yifan Hong2a3dd082017-04-04 17:15:35 -0700216 " <sepolicy>\n"
217 " <version>25.0</version>\n"
218 " </sepolicy>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800219 "</manifest>\n");
Yifan Hongfb7469c2017-04-05 19:15:21 -0700220 HalManifest vm2;
221 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
222 EXPECT_EQ(vm, vm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800223}
224
Yifan Honga04e1472017-04-05 13:15:34 -0700225TEST_F(LibVintfTest, HalManifestConverterFramework) {
226 HalManifest vm = testFrameworkManfiest();
227 std::string xml = gHalManifestConverter(vm);
228 EXPECT_EQ(xml,
229 "<manifest version=\"1.0\" type=\"framework\">\n"
230 " <hal format=\"hidl\">\n"
231 " <name>android.hidl.manager</name>\n"
232 " <transport>hwbinder</transport>\n"
233 " <version>1.0</version>\n"
234 " <interface>\n"
235 " <name>IServiceManager</name>\n"
236 " <instance>default</instance>\n"
237 " </interface>\n"
238 " </hal>\n"
239 " <vndk>\n"
240 " <version>25.0.5</version>\n"
241 " <library>libbase.so</library>\n"
242 " <library>libjpeg.so</library>\n"
243 " </vndk>\n"
244 " <vndk>\n"
245 " <version>25.1.3</version>\n"
246 " <library>libbase.so</library>\n"
247 " <library>libjpeg.so</library>\n"
248 " <library>libtinyxml2.so</library>\n"
249 " </vndk>\n"
250 "</manifest>\n");
251 HalManifest vm2;
252 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700253 EXPECT_EQ(vm, vm2);
Yifan Honga04e1472017-04-05 13:15:34 -0700254}
255
Yifan Hong8e9c6692017-02-28 14:07:42 -0800256TEST_F(LibVintfTest, HalManifestOptional) {
257 HalManifest vm;
258 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700259 "<manifest version=\"1.0\" type=\"device\"></manifest>"));
Yifan Hong8e9c6692017-02-28 14:07:42 -0800260 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700261 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800262 " <hal>"
263 " <name>android.hidl.manager</name>"
264 " <transport>hwbinder</transport>"
265 " <version>1.0</version>"
266 " </hal>"
267 "</manifest>"));
268 EXPECT_FALSE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700269 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800270 " <hal>"
271 " <name>android.hidl.manager</name>"
272 " <version>1.0</version>"
273 " </hal>"
274 "</manifest>"));
275}
276
Yifan Hongec3b9b72017-02-23 13:24:42 -0800277TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700278 HalManifest vm = testDeviceManifest();
Yifan Hongec3b9b72017-02-23 13:24:42 -0800279 EXPECT_EQ(vm.getInstances("android.hardware.camera", "ICamera"),
280 std::set<std::string>({"default", "legacy/0"}));
281 EXPECT_EQ(vm.getInstances("android.hardware.camera", "IBetterCamera"),
282 std::set<std::string>({"camera"}));
283 EXPECT_EQ(vm.getInstances("android.hardware.camera", "INotExist"),
Yifan Hong9bbdb282017-04-12 21:53:59 -0700284 std::set<std::string>({}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800285 EXPECT_EQ(vm.getInstances("android.hardware.nfc", "INfc"),
286 std::set<std::string>({"default"}));
287
288 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "default"));
289 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "legacy/0"));
290 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "camera"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800291 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", "INfc", "default"));
292
Yifan Hong9bbdb282017-04-12 21:53:59 -0700293 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800294 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "ICamera", "notexist"));
295 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "default"));
296 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "notexist"));
297 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", "INfc", "notexist"));
298}
299
Yifan Hong676447a2016-11-15 12:57:23 -0800300TEST_F(LibVintfTest, VersionConverter) {
301 Version v(3, 6);
302 std::string xml = gVersionConverter(v);
303 EXPECT_EQ(xml, "<version>3.6</version>\n");
304 Version v2;
305 EXPECT_TRUE(gVersionConverter(&v2, xml));
306 EXPECT_EQ(v, v2);
307}
308
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700309static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
310 std::string name{intf.name};
311 return map->emplace(std::move(name), std::move(intf)).second;
312}
313
Yifan Hong676447a2016-11-15 12:57:23 -0800314TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800315 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800316 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700317 false /* optional */, {}};
318 EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
319 EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800320 std::string xml = gMatrixHalConverter(mh);
321 EXPECT_EQ(xml,
322 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800323 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800324 " <version>1.2-3</version>\n"
325 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700326 " <interface>\n"
327 " <name>IBetterCamera</name>\n"
328 " <instance>default</instance>\n"
329 " <instance>great</instance>\n"
330 " </interface>\n"
331 " <interface>\n"
332 " <name>ICamera</name>\n"
333 " <instance>default</instance>\n"
334 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800335 "</hal>\n");
336 MatrixHal mh2;
337 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
338 EXPECT_EQ(mh, mh2);
339}
340
Yifan Hong3f5489a2017-02-08 11:14:21 -0800341TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
342
343 KernelConfigTypedValue converted;
344
345 auto testOne = [] (const KernelConfigTypedValue &original,
346 const std::string &expectXml) {
347 std::string xml;
348 KernelConfigTypedValue converted;
349 xml = gKernelConfigTypedValueConverter(original);
350 EXPECT_EQ(xml, expectXml);
351 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
352 EXPECT_EQ(original, converted);
353 };
354
355 auto testParse = [] (const KernelConfigTypedValue &original,
356 const std::string &xml) {
357 KernelConfigTypedValue converted;
358 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
359 EXPECT_EQ(original, converted);
360 };
361
362 testOne(KernelConfigTypedValue("stringvalue"),
363 "<value type=\"string\">stringvalue</value>\n");
364 testOne(KernelConfigTypedValue(""),
365 "<value type=\"string\"></value>\n");
366
367 testOne(KernelConfigTypedValue(Tristate::YES),
368 "<value type=\"tristate\">y</value>\n");
369 testOne(KernelConfigTypedValue(Tristate::NO),
370 "<value type=\"tristate\">n</value>\n");
371 testOne(KernelConfigTypedValue(Tristate::MODULE),
372 "<value type=\"tristate\">m</value>\n");
373 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
374 "<value type=\"tristate\">q</value>\n"));
375
376 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
377 "<value type=\"range\">4-20</value>\n");
378 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
379 "<value type=\"range\">0-18446744073709551615</value>\n");
380 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
381 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
382
383 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
384 "<value type=\"int\">-18446744073709551616</value>\n"));
385
386 testOne(KernelConfigTypedValue(INT64_MIN),
387 "<value type=\"int\">-9223372036854775808</value>\n");
388 testParse(KernelConfigTypedValue(INT64_MIN),
389 "<value type=\"int\">0x8000000000000000</value>\n");
390 testParse(KernelConfigTypedValue(INT64_MIN),
391 "<value type=\"int\">-0X8000000000000000</value>\n");
392
393 testParse(KernelConfigTypedValue(INT64_MIN + 1),
394 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
395
396 testParse(KernelConfigTypedValue(-0x50),
397 "<value type=\"int\">-0x50</value>\n");
398
399 testOne(KernelConfigTypedValue(0),
400 "<value type=\"int\">0</value>\n");
401
402 // Truncation for underflow.
403 testParse(KernelConfigTypedValue(1),
404 "<value type=\"int\">-0xffffffffffffffff</value>\n");
405 testParse(KernelConfigTypedValue(1),
406 "<value type=\"int\">-18446744073709551615</value>\n");
407
408 testOne(KernelConfigTypedValue(INT64_MAX),
409 "<value type=\"int\">9223372036854775807</value>\n");
410 testParse(KernelConfigTypedValue(INT64_MAX),
411 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
412 // Truncation for underflow.
413 testParse(KernelConfigTypedValue(INT64_MAX),
414 "<value type=\"int\">-9223372036854775809</value>\n");
415
416 testParse(KernelConfigTypedValue(-1),
417 "<value type=\"int\">18446744073709551615</value>\n");
418 testParse(KernelConfigTypedValue(-1),
419 "<value type=\"int\">0xffffffffffffffff</value>\n");
420
421 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
422 "<value type=\"int\">18446744073709551616</value>\n"));
423}
424
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700425TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
Yifan Hong676447a2016-11-15 12:57:23 -0800426 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800427 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800428 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700429 false /* optional */, testHalInterfaces()}));
Yifan Honga9993572017-01-24 19:33:15 -0800430 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800431 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700432 true /* optional */, testHalInterfaces()}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800433 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
434 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
435 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
436 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700437 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700438 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800439 std::string xml = gCompatibilityMatrixConverter(cm);
440 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700441 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800442 " <hal format=\"native\" optional=\"false\">\n"
443 " <name>android.hardware.camera</name>\n"
444 " <version>1.2-3</version>\n"
445 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700446 " <interface>\n"
447 " <name>IFoo</name>\n"
448 " <instance>default</instance>\n"
449 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800450 " </hal>\n"
451 " <hal format=\"native\" optional=\"true\">\n"
452 " <name>android.hardware.nfc</name>\n"
453 " <version>4.5-6</version>\n"
454 " <version>10.11-12</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700455 " <interface>\n"
456 " <name>IFoo</name>\n"
457 " <instance>default</instance>\n"
458 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800459 " </hal>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800460 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800461 " <config>\n"
462 " <key>CONFIG_FOO</key>\n"
463 " <value type=\"tristate\">y</value>\n"
464 " </config>\n"
465 " <config>\n"
466 " <key>CONFIG_BAR</key>\n"
467 " <value type=\"string\">stringvalue</value>\n"
468 " </config>\n"
469 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800470 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800471 " <config>\n"
472 " <key>CONFIG_BAZ</key>\n"
473 " <value type=\"int\">20</value>\n"
474 " </config>\n"
475 " <config>\n"
476 " <key>CONFIG_BAR</key>\n"
477 " <value type=\"range\">3-5</value>\n"
478 " </config>\n"
479 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800480 " <sepolicy>\n"
481 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700482 " <sepolicy-version>25.0</sepolicy-version>\n"
483 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800484 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700485 " <avb>\n"
486 " <vbmeta-version>2.1</vbmeta-version>\n"
487 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800488 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800489 CompatibilityMatrix cm2;
490 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700491 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800492}
493
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700494TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
495 CompatibilityMatrix cm;
496 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
497 {{VersionRange(1,0)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700498 false /* optional */, testHalInterfaces()}));
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700499 set(cm, SchemaType::DEVICE);
500 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
501 std::string xml = gCompatibilityMatrixConverter(cm);
502 EXPECT_EQ(xml,
503 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
504 " <hal format=\"native\" optional=\"false\">\n"
505 " <name>android.hidl.manager</name>\n"
506 " <version>1.0</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700507 " <interface>\n"
508 " <name>IFoo</name>\n"
509 " <instance>default</instance>\n"
510 " </interface>\n"
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700511 " </hal>\n"
512 " <vndk>\n"
513 " <version>25.0.1-5</version>\n"
514 " <library>libbase.so</library>\n"
515 " <library>libjpeg.so</library>\n"
516 " </vndk>\n"
517 "</compatibility-matrix>\n");
518 CompatibilityMatrix cm2;
519 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
520 EXPECT_EQ(cm, cm2);
521}
522
Yifan Hong676447a2016-11-15 12:57:23 -0800523TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800524 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800525
Yifan Hong2059ffc2017-02-24 11:32:02 -0800526 ManifestHal invalidHal{
527 .format = HalFormat::HIDL,
528 .name = "android.hardware.camera",
529 .versions = {{Version(2, 0), Version(2, 1)}},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800530 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64}
Yifan Hong2059ffc2017-02-24 11:32:02 -0800531 };
532
Yifan Hong5a06ef72017-01-24 19:54:24 -0800533 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800534 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800535 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800536}
537
Tri Vod0143942017-03-24 17:51:23 -0700538TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700539 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700540 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
541 {"android.hardware.camera", "android.hardware.nfc"}));
542}
543
544TEST_F(LibVintfTest, HalManifestGetInterfaceNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700545 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700546 EXPECT_EQ(vm.getInterfaceNames("android.hardware.camera"),
547 std::set<std::string>({"ICamera", "IBetterCamera"}));
548 EXPECT_EQ(vm.getInterfaceNames("android.hardware.nfc"),
549 std::set<std::string>({"INfc"}));
550}
551
Yifan Hongd2b7e642017-02-17 10:15:32 -0800552TEST_F(LibVintfTest, HalManifestGetHal) {
Yifan Honga04e1472017-04-05 13:15:34 -0700553 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700554 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
555 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800556
557 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
558 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800559 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800560 EXPECT_EQ(hal.name, arr[i++]);
561 }
562}
563
Yifan Honga7201e72017-02-17 10:09:59 -0800564TEST_F(LibVintfTest, RuntimeInfo) {
565 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800566 using KernelConfigs = std::vector<KernelConfig>;
567 const KernelConfigs configs {
568 KernelConfig{"CONFIG_64BIT", Tristate::YES},
569 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
570 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
571 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
572 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
573 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
574 };
575
576 auto testMatrix = [&] (MatrixKernel &&kernel) {
577 CompatibilityMatrix cm;
578 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700579 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700580 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800581 return cm;
582 };
583
584 std::string error;
585
586 {
587 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
588 CompatibilityMatrix cm = testMatrix(std::move(kernel));
589 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
590 }
591
592 {
593 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
594 CompatibilityMatrix cm = testMatrix(std::move(kernel));
595 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
596 }
597
598 {
599 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
600 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700601 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800602 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
603 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700604 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800605 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
606 << "kernel-sepolicy-version shouldn't match";
607 }
608
609 {
610 KernelConfigs newConfigs(configs);
611 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
612 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
613 CompatibilityMatrix cm = testMatrix(std::move(kernel));
614 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
615 }
616
617 {
618 KernelConfigs newConfigs(configs);
619 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
620 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
621 CompatibilityMatrix cm = testMatrix(std::move(kernel));
622 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
623 }
624
625 {
626 KernelConfigs newConfigs(configs);
627 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
628 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
629 CompatibilityMatrix cm = testMatrix(std::move(kernel));
630 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
631 }
632
633 {
634 KernelConfigs newConfigs(configs);
635 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
636 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
637 CompatibilityMatrix cm = testMatrix(std::move(kernel));
638 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
639 }
640
641 {
642 KernelConfigs newConfigs(configs);
643 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
644 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
645 CompatibilityMatrix cm = testMatrix(std::move(kernel));
646 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
647 }
Yifan Hongf3029302017-04-12 17:23:49 -0700648
649 RuntimeInfo badAvb = testRuntimeInfo();
650 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
651 {
652 setAvb(badAvb, {1, 0}, {2, 1});
653 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
Michael Schwartz5cfbc922017-05-08 14:06:49 -0700654 EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
Yifan Hongf3029302017-04-12 17:23:49 -0700655 }
656 {
657 setAvb(badAvb, {2, 1}, {3, 0});
658 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
659 }
660 {
661 setAvb(badAvb, {2, 1}, {2, 3});
662 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
663 }
664 {
665 setAvb(badAvb, {2, 3}, {2, 1});
666 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
667 }
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800668}
669
Yifan Hong19e0a2a2017-04-14 17:30:53 -0700670TEST_F(LibVintfTest, MissingAvb) {
671 std::string xml =
672 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
673 " <kernel version=\"3.18.31\"></kernel>"
674 " <sepolicy>\n"
675 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
676 " <sepolicy-version>25.5</sepolicy-version>\n"
677 " </sepolicy>\n"
678 "</compatibility-matrix>\n";
679 CompatibilityMatrix cm;
680 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
681 EXPECT_EQ(getAvb(cm), Version(0, 0));
682}
683
Yifan Hong08e984c2017-05-18 12:50:04 -0700684// This is the test extracted from VINTF Object doc
685TEST_F(LibVintfTest, HalCompat) {
686 CompatibilityMatrix matrix;
687 std::string error;
688
689 std::string matrixXml =
690 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
691 " <hal format=\"hidl\" optional=\"false\">\n"
692 " <name>android.hardware.foo</name>\n"
693 " <version>1.0</version>\n"
694 " <version>3.1-2</version>\n"
695 " <interface>\n"
696 " <name>IFoo</name>\n"
697 " <instance>default</instance>\n"
698 " <instance>specific</instance>\n"
699 " </interface>\n"
700 " </hal>\n"
701 " <hal format=\"hidl\" optional=\"false\">\n"
702 " <name>android.hardware.foo</name>\n"
703 " <version>2.0</version>\n"
704 " <interface>\n"
705 " <name>IBar</name>\n"
706 " <instance>default</instance>\n"
707 " </interface>\n"
708 " </hal>\n"
709 " <sepolicy>\n"
710 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
711 " <sepolicy-version>25.5</sepolicy-version>\n"
712 " </sepolicy>\n"
713 "</compatibility-matrix>\n";
714 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
715 << gCompatibilityMatrixConverter.lastError();
716
717 {
718 std::string manifestXml =
719 "<manifest version=\"1.0\" type=\"device\">\n"
720 " <hal format=\"hidl\">\n"
721 " <name>android.hardware.foo</name>\n"
722 " <transport>hwbinder</transport>\n"
723 " <version>1.0</version>\n"
724 " <interface>\n"
725 " <name>IFoo</name>\n"
726 " <instance>default</instance>\n"
727 " <instance>specific</instance>\n"
728 " </interface>\n"
729 " </hal>\n"
730 " <hal format=\"hidl\">\n"
731 " <name>android.hardware.foo</name>\n"
732 " <transport>hwbinder</transport>\n"
733 " <version>2.0</version>\n"
734 " <interface>\n"
735 " <name>IBar</name>\n"
736 " <instance>default</instance>\n"
737 " </interface>\n"
738 " </hal>\n"
739 " <sepolicy>\n"
740 " <version>25.5</version>\n"
741 " </sepolicy>\n"
742 "</manifest>\n";
743
744 HalManifest manifest;
745 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
746 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
747 }
748
749 {
750 std::string manifestXml =
751 "<manifest version=\"1.0\" type=\"device\">\n"
752 " <hal format=\"hidl\">\n"
753 " <name>android.hardware.foo</name>\n"
754 " <transport>hwbinder</transport>\n"
755 " <version>1.0</version>\n"
756 " <interface>\n"
757 " <name>IFoo</name>\n"
758 " <instance>default</instance>\n"
759 " <instance>specific</instance>\n"
760 " </interface>\n"
761 " </hal>\n"
762 " <sepolicy>\n"
763 " <version>25.5</version>\n"
764 " </sepolicy>\n"
765 "</manifest>\n";
766 HalManifest manifest;
767 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
768 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
769 << "should not be compatible because IBar is missing";
770 }
771
772 {
773 std::string manifestXml =
774 "<manifest version=\"1.0\" type=\"device\">\n"
775 " <hal format=\"hidl\">\n"
776 " <name>android.hardware.foo</name>\n"
777 " <transport>hwbinder</transport>\n"
778 " <version>1.0</version>\n"
779 " <interface>\n"
780 " <name>IFoo</name>\n"
781 " <instance>default</instance>\n"
782 " </interface>\n"
783 " </hal>\n"
784 " <hal format=\"hidl\">\n"
785 " <name>android.hardware.foo</name>\n"
786 " <transport>hwbinder</transport>\n"
787 " <version>2.0</version>\n"
788 " <interface>\n"
789 " <name>IBar</name>\n"
790 " <instance>default</instance>\n"
791 " </interface>\n"
792 " </hal>\n"
793 " <sepolicy>\n"
794 " <version>25.5</version>\n"
795 " </sepolicy>\n"
796 "</manifest>\n";
797 HalManifest manifest;
798 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
799 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
800 << "should not be compatible because IFoo/default is missing";
801 }
802
803 {
804 std::string manifestXml =
805 "<manifest version=\"1.0\" type=\"device\">\n"
806 " <hal format=\"hidl\">\n"
807 " <name>android.hardware.foo</name>\n"
808 " <transport>hwbinder</transport>\n"
809 " <version>3.3</version>\n"
810 " <interface>\n"
811 " <name>IFoo</name>\n"
812 " <instance>default</instance>\n"
813 " <instance>specific</instance>\n"
814 " </interface>\n"
815 " </hal>\n"
816 " <hal format=\"hidl\">\n"
817 " <name>android.hardware.foo</name>\n"
818 " <transport>hwbinder</transport>\n"
819 " <version>2.0</version>\n"
820 " <interface>\n"
821 " <name>IBar</name>\n"
822 " <instance>default</instance>\n"
823 " </interface>\n"
824 " </hal>\n"
825 " <sepolicy>\n"
826 " <version>25.5</version>\n"
827 " </sepolicy>\n"
828 "</manifest>\n";
829 HalManifest manifest;
830 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
831 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
832 }
833
834 {
835 std::string manifestXml =
836 "<manifest version=\"1.0\" type=\"device\">\n"
837 " <hal format=\"hidl\">\n"
838 " <name>android.hardware.foo</name>\n"
839 " <transport>hwbinder</transport>\n"
840 " <version>1.0</version>\n"
841 " <interface>\n"
842 " <name>IFoo</name>\n"
843 " <instance>default</instance>\n"
844 " </interface>\n"
845 " </hal>\n"
846 " <hal format=\"hidl\">\n"
847 " <name>android.hardware.foo</name>\n"
848 " <transport>hwbinder</transport>\n"
849 " <version>3.2</version>\n"
850 " <interface>\n"
851 " <name>IFoo</name>\n"
852 " <instance>specific</instance>\n"
853 " </interface>\n"
854 " </hal>\n"
855 " <hal format=\"hidl\">\n"
856 " <name>android.hardware.foo</name>\n"
857 " <transport>hwbinder</transport>\n"
858 " <version>2.0</version>\n"
859 " <interface>\n"
860 " <name>IBar</name>\n"
861 " <instance>default</instance>\n"
862 " </interface>\n"
863 " </hal>\n"
864 " <sepolicy>\n"
865 " <version>25.5</version>\n"
866 " </sepolicy>\n"
867 "</manifest>\n";
868 HalManifest manifest;
869 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
870 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
871 << "should not be compatible even though @1.0::IFoo/default "
872 << "and @3.2::IFoo/specific present";
873 }
874
875 {
876 std::string manifestXml =
877 "<manifest version=\"1.0\" type=\"device\">\n"
878 " <hal format=\"hidl\">\n"
879 " <name>android.hardware.foo</name>\n"
880 " <transport>hwbinder</transport>\n"
881 " <version>1.0</version>\n"
882 " <interface>\n"
883 " <name>IFoo</name>\n"
884 " <instance>default</instance>\n"
885 " </interface>\n"
886 " </hal>\n"
887 " <hal format=\"hidl\">\n"
888 " <name>android.hardware.foo</name>\n"
889 " <transport>hwbinder</transport>\n"
890 " <version>1.0</version>\n"
891 " <interface>\n"
892 " <name>IFoo</name>\n"
893 " <instance>specific</instance>\n"
894 " </interface>\n"
895 " </hal>\n"
896 " <hal format=\"hidl\">\n"
897 " <name>android.hardware.foo</name>\n"
898 " <transport>hwbinder</transport>\n"
899 " <version>2.0</version>\n"
900 " <interface>\n"
901 " <name>IBar</name>\n"
902 " <instance>default</instance>\n"
903 " </interface>\n"
904 " </hal>\n"
905 " <sepolicy>\n"
906 " <version>25.5</version>\n"
907 " </sepolicy>\n"
908 "</manifest>\n";
909 HalManifest manifest;
910 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
911 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
912 << "should be compatible even though @1.0::IFoo/default "
913 << "and @1.0::IFoo/specific are splitted in two <hal>: "
914 << error;
915 }
916}
917
Yifan Hongd0cbf1f2017-04-12 19:47:06 -0700918TEST_F(LibVintfTest, Compat) {
919 std::string manifestXml =
920 "<manifest version=\"1.0\" type=\"device\">\n"
921 " <hal format=\"hidl\">\n"
922 " <name>android.hardware.camera</name>\n"
923 " <transport>hwbinder</transport>\n"
924 " <version>3.5</version>\n"
925 " <interface>\n"
926 " <name>IBetterCamera</name>\n"
927 " <instance>camera</instance>\n"
928 " </interface>\n"
929 " <interface>\n"
930 " <name>ICamera</name>\n"
931 " <instance>default</instance>\n"
932 " <instance>legacy/0</instance>\n"
933 " </interface>\n"
934 " </hal>\n"
935 " <hal format=\"hidl\">\n"
936 " <name>android.hardware.nfc</name>\n"
937 " <transport>hwbinder</transport>\n"
938 " <version>1.0</version>\n"
939 " <version>2.0</version>\n"
940 " <interface>\n"
941 " <name>INfc</name>\n"
942 " <instance>nfc_nci</instance>\n"
943 " </interface>\n"
944 " </hal>\n"
945 " <hal format=\"hidl\">\n"
946 " <name>android.hardware.nfc</name>\n"
947 " <transport>hwbinder</transport>\n"
948 " <version>2.0</version>\n"
949 " <interface>\n"
950 " <name>INfc</name>\n"
951 " <instance>default</instance>\n"
952 " </interface>\n"
953 " </hal>\n"
954 " <sepolicy>\n"
955 " <version>25.5</version>\n"
956 " </sepolicy>\n"
957 "</manifest>\n";
958
959 std::string matrixXml =
960 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
961 " <hal format=\"hidl\" optional=\"false\">\n"
962 " <name>android.hardware.camera</name>\n"
963 " <version>2.0-5</version>\n"
964 " <version>3.4-16</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -0700965 " <interface>\n"
966 " <name>IBetterCamera</name>\n"
967 " <instance>camera</instance>\n"
968 " </interface>\n"
969 " <interface>\n"
970 " <name>ICamera</name>\n"
971 " <instance>default</instance>\n"
972 " <instance>legacy/0</instance>\n"
973 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -0700974 " </hal>\n"
975 " <hal format=\"hidl\" optional=\"false\">\n"
976 " <name>android.hardware.nfc</name>\n"
977 " <version>1.0</version>\n"
978 " <version>2.0</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -0700979 " <interface>\n"
980 " <name>INfc</name>\n"
981 " <instance>nfc_nci</instance>\n"
982 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -0700983 " </hal>\n"
984 " <hal format=\"hidl\" optional=\"true\">\n"
985 " <name>android.hardware.foo</name>\n"
986 " <version>1.0</version>\n"
987 " </hal>\n"
988 " <sepolicy>\n"
989 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
990 " <sepolicy-version>25.5</sepolicy-version>\n"
991 " <sepolicy-version>26.0-3</sepolicy-version>\n"
992 " </sepolicy>\n"
993 " <avb>\n"
994 " <vbmeta-version>2.1</vbmeta-version>\n"
995 " </avb>\n"
996 "</compatibility-matrix>\n";
997
998 HalManifest manifest;
999 CompatibilityMatrix matrix;
1000 std::string error;
1001 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1002 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1003 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1004
1005 // some smaller test cases
1006 matrixXml =
1007 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1008 " <hal format=\"hidl\" optional=\"false\">\n"
1009 " <name>android.hardware.camera</name>\n"
1010 " <version>3.4</version>\n"
1011 " </hal>\n"
1012 " <sepolicy>\n"
1013 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1014 " <sepolicy-version>25.5</sepolicy-version>\n"
1015 " </sepolicy>\n"
1016 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1017 "</compatibility-matrix>\n";
1018 matrix = {};
1019 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1020 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1021 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
1022 EXPECT_NE(camera, nullptr);
1023 camera->versionRanges[0] = {3, 5};
1024 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1025 camera->versionRanges[0] = {3, 6};
1026 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1027
1028 // reset it
1029 matrix = {};
1030 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1031 set(matrix, Sepolicy{30, {{26, 0}}});
1032 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1033 set(matrix, Sepolicy{30, {{25, 6}}});
1034 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1035 set(matrix, Sepolicy{30, {{25, 4}}});
1036 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1037}
1038
Yifan Honga9993572017-01-24 19:33:15 -08001039} // namespace vintf
1040} // namespace android
1041
Yifan Hong676447a2016-11-15 12:57:23 -08001042int main(int argc, char **argv) {
1043 ::testing::InitGoogleTest(&argc, argv);
1044 return RUN_ALL_TESTS();
1045}