blob: 343f3276790251ca56944b2f274be7236e993478 [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 Hong79dcc1f2017-05-22 14:35:19 -0700277TEST_F(LibVintfTest, HalManifestDuplicate) {
278 HalManifest vm;
279 EXPECT_FALSE(gHalManifestConverter(&vm,
280 "<manifest version=\"1.0\" type=\"device\">"
281 " <hal>"
282 " <name>android.hidl.manager</name>"
283 " <transport>hwbinder</transport>"
284 " <version>1.0</version>"
285 " <version>1.1</version>"
286 " </hal>"
287 "</manifest>"))
288 << "Should not allow duplicated major version in <hal>";
289 EXPECT_FALSE(gHalManifestConverter(&vm,
290 "<manifest version=\"1.0\" type=\"device\">"
291 " <hal>"
292 " <name>android.hidl.manager</name>"
293 " <transport>hwbinder</transport>"
294 " <version>1.0</version>"
295 " </hal>"
296 " <hal>"
297 " <name>android.hidl.manager</name>"
298 " <transport arch=\"32+64\">passthrough</transport>"
299 " <version>1.1</version>"
300 " </hal>"
301 "</manifest>"))
302 << "Should not allow duplicated major version across <hal>";
303}
304
305TEST_F(LibVintfTest, HalManifestGetTransport) {
306 HalManifest vm;
307 EXPECT_TRUE(gHalManifestConverter(&vm,
308 "<manifest version=\"1.0\" type=\"device\">"
309 " <hal>"
310 " <name>android.hidl.manager</name>"
311 " <transport>hwbinder</transport>"
312 " <version>1.0</version>"
313 " <interface>"
314 " <name>IServiceManager</name>"
315 " <instance>default</instance>"
316 " </interface>"
317 " </hal>"
318 " <hal>"
319 " <name>android.hidl.manager</name>"
320 " <transport arch=\"32+64\">passthrough</transport>"
321 " <version>2.1</version>"
322 " <interface>"
323 " <name>IServiceManager</name>"
324 " <instance>default</instance>"
325 " </interface>"
326 " </hal>"
327 "</manifest>"));
328 EXPECT_EQ(Transport::PASSTHROUGH,
329 vm.getTransport("android.hidl.manager", {2, 1}, "IServiceManager", "default"));
330 EXPECT_EQ(Transport::PASSTHROUGH,
331 vm.getTransport("android.hidl.manager", {2, 0}, "IServiceManager", "default"));
332 EXPECT_EQ(Transport::EMPTY,
333 vm.getTransport("android.hidl.manager", {2, 2}, "IServiceManager", "default"));
334 EXPECT_EQ(Transport::HWBINDER,
335 vm.getTransport("android.hidl.manager", {1, 0}, "IServiceManager", "default"));
336}
337
Yifan Hongec3b9b72017-02-23 13:24:42 -0800338TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700339 HalManifest vm = testDeviceManifest();
Yifan Hongec3b9b72017-02-23 13:24:42 -0800340 EXPECT_EQ(vm.getInstances("android.hardware.camera", "ICamera"),
341 std::set<std::string>({"default", "legacy/0"}));
342 EXPECT_EQ(vm.getInstances("android.hardware.camera", "IBetterCamera"),
343 std::set<std::string>({"camera"}));
344 EXPECT_EQ(vm.getInstances("android.hardware.camera", "INotExist"),
Yifan Hong9bbdb282017-04-12 21:53:59 -0700345 std::set<std::string>({}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800346 EXPECT_EQ(vm.getInstances("android.hardware.nfc", "INfc"),
347 std::set<std::string>({"default"}));
348
349 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "default"));
350 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "legacy/0"));
351 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "camera"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800352 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", "INfc", "default"));
353
Yifan Hong9bbdb282017-04-12 21:53:59 -0700354 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800355 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "ICamera", "notexist"));
356 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "default"));
357 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "notexist"));
358 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", "INfc", "notexist"));
359}
360
Yifan Hong676447a2016-11-15 12:57:23 -0800361TEST_F(LibVintfTest, VersionConverter) {
362 Version v(3, 6);
363 std::string xml = gVersionConverter(v);
364 EXPECT_EQ(xml, "<version>3.6</version>\n");
365 Version v2;
366 EXPECT_TRUE(gVersionConverter(&v2, xml));
367 EXPECT_EQ(v, v2);
368}
369
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700370static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
371 std::string name{intf.name};
372 return map->emplace(std::move(name), std::move(intf)).second;
373}
374
Yifan Hong676447a2016-11-15 12:57:23 -0800375TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800376 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800377 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700378 false /* optional */, {}};
379 EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
380 EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800381 std::string xml = gMatrixHalConverter(mh);
382 EXPECT_EQ(xml,
383 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800384 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800385 " <version>1.2-3</version>\n"
386 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700387 " <interface>\n"
388 " <name>IBetterCamera</name>\n"
389 " <instance>default</instance>\n"
390 " <instance>great</instance>\n"
391 " </interface>\n"
392 " <interface>\n"
393 " <name>ICamera</name>\n"
394 " <instance>default</instance>\n"
395 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800396 "</hal>\n");
397 MatrixHal mh2;
398 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
399 EXPECT_EQ(mh, mh2);
400}
401
Yifan Hong3f5489a2017-02-08 11:14:21 -0800402TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
403
404 KernelConfigTypedValue converted;
405
406 auto testOne = [] (const KernelConfigTypedValue &original,
407 const std::string &expectXml) {
408 std::string xml;
409 KernelConfigTypedValue converted;
410 xml = gKernelConfigTypedValueConverter(original);
411 EXPECT_EQ(xml, expectXml);
412 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
413 EXPECT_EQ(original, converted);
414 };
415
416 auto testParse = [] (const KernelConfigTypedValue &original,
417 const std::string &xml) {
418 KernelConfigTypedValue converted;
419 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
420 EXPECT_EQ(original, converted);
421 };
422
423 testOne(KernelConfigTypedValue("stringvalue"),
424 "<value type=\"string\">stringvalue</value>\n");
425 testOne(KernelConfigTypedValue(""),
426 "<value type=\"string\"></value>\n");
427
428 testOne(KernelConfigTypedValue(Tristate::YES),
429 "<value type=\"tristate\">y</value>\n");
430 testOne(KernelConfigTypedValue(Tristate::NO),
431 "<value type=\"tristate\">n</value>\n");
432 testOne(KernelConfigTypedValue(Tristate::MODULE),
433 "<value type=\"tristate\">m</value>\n");
434 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
435 "<value type=\"tristate\">q</value>\n"));
436
437 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
438 "<value type=\"range\">4-20</value>\n");
439 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
440 "<value type=\"range\">0-18446744073709551615</value>\n");
441 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
442 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
443
444 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
445 "<value type=\"int\">-18446744073709551616</value>\n"));
446
447 testOne(KernelConfigTypedValue(INT64_MIN),
448 "<value type=\"int\">-9223372036854775808</value>\n");
449 testParse(KernelConfigTypedValue(INT64_MIN),
450 "<value type=\"int\">0x8000000000000000</value>\n");
451 testParse(KernelConfigTypedValue(INT64_MIN),
452 "<value type=\"int\">-0X8000000000000000</value>\n");
453
454 testParse(KernelConfigTypedValue(INT64_MIN + 1),
455 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
456
457 testParse(KernelConfigTypedValue(-0x50),
458 "<value type=\"int\">-0x50</value>\n");
459
460 testOne(KernelConfigTypedValue(0),
461 "<value type=\"int\">0</value>\n");
462
463 // Truncation for underflow.
464 testParse(KernelConfigTypedValue(1),
465 "<value type=\"int\">-0xffffffffffffffff</value>\n");
466 testParse(KernelConfigTypedValue(1),
467 "<value type=\"int\">-18446744073709551615</value>\n");
468
469 testOne(KernelConfigTypedValue(INT64_MAX),
470 "<value type=\"int\">9223372036854775807</value>\n");
471 testParse(KernelConfigTypedValue(INT64_MAX),
472 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
473 // Truncation for underflow.
474 testParse(KernelConfigTypedValue(INT64_MAX),
475 "<value type=\"int\">-9223372036854775809</value>\n");
476
477 testParse(KernelConfigTypedValue(-1),
478 "<value type=\"int\">18446744073709551615</value>\n");
479 testParse(KernelConfigTypedValue(-1),
480 "<value type=\"int\">0xffffffffffffffff</value>\n");
481
482 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
483 "<value type=\"int\">18446744073709551616</value>\n"));
484}
485
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700486TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
Yifan Hong676447a2016-11-15 12:57:23 -0800487 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800488 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800489 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700490 false /* optional */, testHalInterfaces()}));
Yifan Honga9993572017-01-24 19:33:15 -0800491 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800492 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700493 true /* optional */, testHalInterfaces()}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800494 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
495 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
496 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
497 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700498 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700499 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800500 std::string xml = gCompatibilityMatrixConverter(cm);
501 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700502 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800503 " <hal format=\"native\" optional=\"false\">\n"
504 " <name>android.hardware.camera</name>\n"
505 " <version>1.2-3</version>\n"
506 " <version>4.5-6</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 Hong3f5489a2017-02-08 11:14:21 -0800511 " </hal>\n"
512 " <hal format=\"native\" optional=\"true\">\n"
513 " <name>android.hardware.nfc</name>\n"
514 " <version>4.5-6</version>\n"
515 " <version>10.11-12</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700516 " <interface>\n"
517 " <name>IFoo</name>\n"
518 " <instance>default</instance>\n"
519 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800520 " </hal>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800521 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800522 " <config>\n"
523 " <key>CONFIG_FOO</key>\n"
524 " <value type=\"tristate\">y</value>\n"
525 " </config>\n"
526 " <config>\n"
527 " <key>CONFIG_BAR</key>\n"
528 " <value type=\"string\">stringvalue</value>\n"
529 " </config>\n"
530 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800531 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800532 " <config>\n"
533 " <key>CONFIG_BAZ</key>\n"
534 " <value type=\"int\">20</value>\n"
535 " </config>\n"
536 " <config>\n"
537 " <key>CONFIG_BAR</key>\n"
538 " <value type=\"range\">3-5</value>\n"
539 " </config>\n"
540 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800541 " <sepolicy>\n"
542 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700543 " <sepolicy-version>25.0</sepolicy-version>\n"
544 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800545 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700546 " <avb>\n"
547 " <vbmeta-version>2.1</vbmeta-version>\n"
548 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800549 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800550 CompatibilityMatrix cm2;
551 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700552 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800553}
554
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700555TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
556 CompatibilityMatrix cm;
557 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
558 {{VersionRange(1,0)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700559 false /* optional */, testHalInterfaces()}));
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700560 set(cm, SchemaType::DEVICE);
561 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
562 std::string xml = gCompatibilityMatrixConverter(cm);
563 EXPECT_EQ(xml,
564 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
565 " <hal format=\"native\" optional=\"false\">\n"
566 " <name>android.hidl.manager</name>\n"
567 " <version>1.0</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700568 " <interface>\n"
569 " <name>IFoo</name>\n"
570 " <instance>default</instance>\n"
571 " </interface>\n"
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700572 " </hal>\n"
573 " <vndk>\n"
574 " <version>25.0.1-5</version>\n"
575 " <library>libbase.so</library>\n"
576 " <library>libjpeg.so</library>\n"
577 " </vndk>\n"
578 "</compatibility-matrix>\n");
579 CompatibilityMatrix cm2;
580 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
581 EXPECT_EQ(cm, cm2);
582}
583
Yifan Hong676447a2016-11-15 12:57:23 -0800584TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800585 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800586
Yifan Hong2059ffc2017-02-24 11:32:02 -0800587 ManifestHal invalidHal{
588 .format = HalFormat::HIDL,
589 .name = "android.hardware.camera",
590 .versions = {{Version(2, 0), Version(2, 1)}},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800591 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64}
Yifan Hong2059ffc2017-02-24 11:32:02 -0800592 };
593
Yifan Hong5a06ef72017-01-24 19:54:24 -0800594 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800595 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800596 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800597}
598
Tri Vod0143942017-03-24 17:51:23 -0700599TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700600 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700601 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
602 {"android.hardware.camera", "android.hardware.nfc"}));
603}
604
605TEST_F(LibVintfTest, HalManifestGetInterfaceNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700606 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700607 EXPECT_EQ(vm.getInterfaceNames("android.hardware.camera"),
608 std::set<std::string>({"ICamera", "IBetterCamera"}));
609 EXPECT_EQ(vm.getInterfaceNames("android.hardware.nfc"),
610 std::set<std::string>({"INfc"}));
611}
612
Yifan Hongd2b7e642017-02-17 10:15:32 -0800613TEST_F(LibVintfTest, HalManifestGetHal) {
Yifan Honga04e1472017-04-05 13:15:34 -0700614 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700615 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
616 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800617
618 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
619 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800620 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800621 EXPECT_EQ(hal.name, arr[i++]);
622 }
623}
624
Yifan Honga7201e72017-02-17 10:09:59 -0800625TEST_F(LibVintfTest, RuntimeInfo) {
626 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800627 using KernelConfigs = std::vector<KernelConfig>;
628 const KernelConfigs configs {
629 KernelConfig{"CONFIG_64BIT", Tristate::YES},
630 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
631 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
632 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
633 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
634 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
635 };
636
637 auto testMatrix = [&] (MatrixKernel &&kernel) {
638 CompatibilityMatrix cm;
639 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700640 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700641 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800642 return cm;
643 };
644
645 std::string error;
646
647 {
648 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
649 CompatibilityMatrix cm = testMatrix(std::move(kernel));
650 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
651 }
652
653 {
654 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
655 CompatibilityMatrix cm = testMatrix(std::move(kernel));
656 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
657 }
658
659 {
660 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
661 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700662 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800663 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
664 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700665 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800666 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
667 << "kernel-sepolicy-version shouldn't match";
668 }
669
670 {
671 KernelConfigs newConfigs(configs);
672 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
673 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
674 CompatibilityMatrix cm = testMatrix(std::move(kernel));
675 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
676 }
677
678 {
679 KernelConfigs newConfigs(configs);
680 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
681 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
682 CompatibilityMatrix cm = testMatrix(std::move(kernel));
683 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
684 }
685
686 {
687 KernelConfigs newConfigs(configs);
688 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
689 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
690 CompatibilityMatrix cm = testMatrix(std::move(kernel));
691 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
692 }
693
694 {
695 KernelConfigs newConfigs(configs);
696 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
697 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
698 CompatibilityMatrix cm = testMatrix(std::move(kernel));
699 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
700 }
701
702 {
703 KernelConfigs newConfigs(configs);
704 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
705 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
706 CompatibilityMatrix cm = testMatrix(std::move(kernel));
707 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
708 }
Yifan Hongf3029302017-04-12 17:23:49 -0700709
710 RuntimeInfo badAvb = testRuntimeInfo();
711 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
712 {
713 setAvb(badAvb, {1, 0}, {2, 1});
714 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
Michael Schwartz5cfbc922017-05-08 14:06:49 -0700715 EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
Yifan Hongf3029302017-04-12 17:23:49 -0700716 }
717 {
718 setAvb(badAvb, {2, 1}, {3, 0});
719 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
720 }
721 {
722 setAvb(badAvb, {2, 1}, {2, 3});
723 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
724 }
725 {
726 setAvb(badAvb, {2, 3}, {2, 1});
727 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
728 }
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800729}
730
Yifan Hong19e0a2a2017-04-14 17:30:53 -0700731TEST_F(LibVintfTest, MissingAvb) {
732 std::string xml =
733 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
734 " <kernel version=\"3.18.31\"></kernel>"
735 " <sepolicy>\n"
736 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
737 " <sepolicy-version>25.5</sepolicy-version>\n"
738 " </sepolicy>\n"
739 "</compatibility-matrix>\n";
740 CompatibilityMatrix cm;
741 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
742 EXPECT_EQ(getAvb(cm), Version(0, 0));
743}
744
Yifan Hong08e984c2017-05-18 12:50:04 -0700745// This is the test extracted from VINTF Object doc
746TEST_F(LibVintfTest, HalCompat) {
747 CompatibilityMatrix matrix;
748 std::string error;
749
750 std::string matrixXml =
751 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
752 " <hal format=\"hidl\" optional=\"false\">\n"
753 " <name>android.hardware.foo</name>\n"
754 " <version>1.0</version>\n"
755 " <version>3.1-2</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 " <hal format=\"hidl\" optional=\"false\">\n"
763 " <name>android.hardware.foo</name>\n"
764 " <version>2.0</version>\n"
765 " <interface>\n"
766 " <name>IBar</name>\n"
767 " <instance>default</instance>\n"
768 " </interface>\n"
769 " </hal>\n"
770 " <sepolicy>\n"
771 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
772 " <sepolicy-version>25.5</sepolicy-version>\n"
773 " </sepolicy>\n"
774 "</compatibility-matrix>\n";
775 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
776 << gCompatibilityMatrixConverter.lastError();
777
778 {
779 std::string manifestXml =
780 "<manifest version=\"1.0\" type=\"device\">\n"
781 " <hal format=\"hidl\">\n"
782 " <name>android.hardware.foo</name>\n"
783 " <transport>hwbinder</transport>\n"
784 " <version>1.0</version>\n"
785 " <interface>\n"
786 " <name>IFoo</name>\n"
787 " <instance>default</instance>\n"
788 " <instance>specific</instance>\n"
789 " </interface>\n"
790 " </hal>\n"
791 " <hal format=\"hidl\">\n"
792 " <name>android.hardware.foo</name>\n"
793 " <transport>hwbinder</transport>\n"
794 " <version>2.0</version>\n"
795 " <interface>\n"
796 " <name>IBar</name>\n"
797 " <instance>default</instance>\n"
798 " </interface>\n"
799 " </hal>\n"
800 " <sepolicy>\n"
801 " <version>25.5</version>\n"
802 " </sepolicy>\n"
803 "</manifest>\n";
804
805 HalManifest manifest;
806 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
807 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
808 }
809
810 {
811 std::string manifestXml =
812 "<manifest version=\"1.0\" type=\"device\">\n"
813 " <hal format=\"hidl\">\n"
814 " <name>android.hardware.foo</name>\n"
815 " <transport>hwbinder</transport>\n"
816 " <version>1.0</version>\n"
817 " <interface>\n"
818 " <name>IFoo</name>\n"
819 " <instance>default</instance>\n"
820 " <instance>specific</instance>\n"
821 " </interface>\n"
822 " </hal>\n"
823 " <sepolicy>\n"
824 " <version>25.5</version>\n"
825 " </sepolicy>\n"
826 "</manifest>\n";
827 HalManifest manifest;
828 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
829 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
830 << "should not be compatible because IBar is missing";
831 }
832
833 {
834 std::string manifestXml =
835 "<manifest version=\"1.0\" type=\"device\">\n"
836 " <hal format=\"hidl\">\n"
837 " <name>android.hardware.foo</name>\n"
838 " <transport>hwbinder</transport>\n"
839 " <version>1.0</version>\n"
840 " <interface>\n"
841 " <name>IFoo</name>\n"
842 " <instance>default</instance>\n"
843 " </interface>\n"
844 " </hal>\n"
845 " <hal format=\"hidl\">\n"
846 " <name>android.hardware.foo</name>\n"
847 " <transport>hwbinder</transport>\n"
848 " <version>2.0</version>\n"
849 " <interface>\n"
850 " <name>IBar</name>\n"
851 " <instance>default</instance>\n"
852 " </interface>\n"
853 " </hal>\n"
854 " <sepolicy>\n"
855 " <version>25.5</version>\n"
856 " </sepolicy>\n"
857 "</manifest>\n";
858 HalManifest manifest;
859 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
860 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
861 << "should not be compatible because IFoo/default is missing";
862 }
863
864 {
865 std::string manifestXml =
866 "<manifest version=\"1.0\" type=\"device\">\n"
867 " <hal format=\"hidl\">\n"
868 " <name>android.hardware.foo</name>\n"
869 " <transport>hwbinder</transport>\n"
870 " <version>3.3</version>\n"
871 " <interface>\n"
872 " <name>IFoo</name>\n"
873 " <instance>default</instance>\n"
874 " <instance>specific</instance>\n"
875 " </interface>\n"
876 " </hal>\n"
877 " <hal format=\"hidl\">\n"
878 " <name>android.hardware.foo</name>\n"
879 " <transport>hwbinder</transport>\n"
880 " <version>2.0</version>\n"
881 " <interface>\n"
882 " <name>IBar</name>\n"
883 " <instance>default</instance>\n"
884 " </interface>\n"
885 " </hal>\n"
886 " <sepolicy>\n"
887 " <version>25.5</version>\n"
888 " </sepolicy>\n"
889 "</manifest>\n";
890 HalManifest manifest;
891 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
892 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
893 }
894
895 {
896 std::string manifestXml =
897 "<manifest version=\"1.0\" type=\"device\">\n"
898 " <hal format=\"hidl\">\n"
899 " <name>android.hardware.foo</name>\n"
900 " <transport>hwbinder</transport>\n"
901 " <version>1.0</version>\n"
902 " <interface>\n"
903 " <name>IFoo</name>\n"
904 " <instance>default</instance>\n"
905 " </interface>\n"
906 " </hal>\n"
907 " <hal format=\"hidl\">\n"
908 " <name>android.hardware.foo</name>\n"
909 " <transport>hwbinder</transport>\n"
910 " <version>3.2</version>\n"
911 " <interface>\n"
912 " <name>IFoo</name>\n"
913 " <instance>specific</instance>\n"
914 " </interface>\n"
915 " </hal>\n"
916 " <hal format=\"hidl\">\n"
917 " <name>android.hardware.foo</name>\n"
918 " <transport>hwbinder</transport>\n"
919 " <version>2.0</version>\n"
920 " <interface>\n"
921 " <name>IBar</name>\n"
922 " <instance>default</instance>\n"
923 " </interface>\n"
924 " </hal>\n"
925 " <sepolicy>\n"
926 " <version>25.5</version>\n"
927 " </sepolicy>\n"
928 "</manifest>\n";
929 HalManifest manifest;
930 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
931 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
932 << "should not be compatible even though @1.0::IFoo/default "
933 << "and @3.2::IFoo/specific present";
934 }
935
936 {
937 std::string manifestXml =
938 "<manifest version=\"1.0\" type=\"device\">\n"
939 " <hal format=\"hidl\">\n"
940 " <name>android.hardware.foo</name>\n"
941 " <transport>hwbinder</transport>\n"
942 " <version>1.0</version>\n"
943 " <interface>\n"
944 " <name>IFoo</name>\n"
945 " <instance>default</instance>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -0700946 " <instance>specific</instance>\n"
947 " </interface>\n"
948 " </hal>\n"
949 " <hal format=\"hidl\">\n"
950 " <name>android.hardware.foo</name>\n"
951 " <transport>hwbinder</transport>\n"
952 " <version>2.0</version>\n"
953 " <interface>\n"
954 " <name>IBar</name>\n"
955 " <instance>default</instance>\n"
956 " </interface>\n"
957 " </hal>\n"
958 " <sepolicy>\n"
959 " <version>25.5</version>\n"
960 " </sepolicy>\n"
961 "</manifest>\n";
962 HalManifest manifest;
Yifan Hong79dcc1f2017-05-22 14:35:19 -0700963 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml))
964 << gHalManifestConverter.lastError();
965 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
Yifan Hong08e984c2017-05-18 12:50:04 -0700966 }
967}
968
Yifan Hongd0cbf1f2017-04-12 19:47:06 -0700969TEST_F(LibVintfTest, Compat) {
970 std::string manifestXml =
971 "<manifest version=\"1.0\" type=\"device\">\n"
972 " <hal format=\"hidl\">\n"
973 " <name>android.hardware.camera</name>\n"
974 " <transport>hwbinder</transport>\n"
975 " <version>3.5</version>\n"
976 " <interface>\n"
977 " <name>IBetterCamera</name>\n"
978 " <instance>camera</instance>\n"
979 " </interface>\n"
980 " <interface>\n"
981 " <name>ICamera</name>\n"
982 " <instance>default</instance>\n"
983 " <instance>legacy/0</instance>\n"
984 " </interface>\n"
985 " </hal>\n"
986 " <hal format=\"hidl\">\n"
987 " <name>android.hardware.nfc</name>\n"
988 " <transport>hwbinder</transport>\n"
989 " <version>1.0</version>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -0700990 " <interface>\n"
991 " <name>INfc</name>\n"
992 " <instance>nfc_nci</instance>\n"
993 " </interface>\n"
994 " </hal>\n"
995 " <hal format=\"hidl\">\n"
996 " <name>android.hardware.nfc</name>\n"
997 " <transport>hwbinder</transport>\n"
998 " <version>2.0</version>\n"
999 " <interface>\n"
1000 " <name>INfc</name>\n"
1001 " <instance>default</instance>\n"
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001002 " <instance>nfc_nci</instance>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001003 " </interface>\n"
1004 " </hal>\n"
1005 " <sepolicy>\n"
1006 " <version>25.5</version>\n"
1007 " </sepolicy>\n"
1008 "</manifest>\n";
1009
1010 std::string matrixXml =
1011 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1012 " <hal format=\"hidl\" optional=\"false\">\n"
1013 " <name>android.hardware.camera</name>\n"
1014 " <version>2.0-5</version>\n"
1015 " <version>3.4-16</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001016 " <interface>\n"
1017 " <name>IBetterCamera</name>\n"
1018 " <instance>camera</instance>\n"
1019 " </interface>\n"
1020 " <interface>\n"
1021 " <name>ICamera</name>\n"
1022 " <instance>default</instance>\n"
1023 " <instance>legacy/0</instance>\n"
1024 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001025 " </hal>\n"
1026 " <hal format=\"hidl\" optional=\"false\">\n"
1027 " <name>android.hardware.nfc</name>\n"
1028 " <version>1.0</version>\n"
1029 " <version>2.0</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001030 " <interface>\n"
1031 " <name>INfc</name>\n"
1032 " <instance>nfc_nci</instance>\n"
1033 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001034 " </hal>\n"
1035 " <hal format=\"hidl\" optional=\"true\">\n"
1036 " <name>android.hardware.foo</name>\n"
1037 " <version>1.0</version>\n"
1038 " </hal>\n"
1039 " <sepolicy>\n"
1040 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1041 " <sepolicy-version>25.5</sepolicy-version>\n"
1042 " <sepolicy-version>26.0-3</sepolicy-version>\n"
1043 " </sepolicy>\n"
1044 " <avb>\n"
1045 " <vbmeta-version>2.1</vbmeta-version>\n"
1046 " </avb>\n"
1047 "</compatibility-matrix>\n";
1048
1049 HalManifest manifest;
1050 CompatibilityMatrix matrix;
1051 std::string error;
1052 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1053 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1054 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1055
1056 // some smaller test cases
1057 matrixXml =
1058 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1059 " <hal format=\"hidl\" optional=\"false\">\n"
1060 " <name>android.hardware.camera</name>\n"
1061 " <version>3.4</version>\n"
1062 " </hal>\n"
1063 " <sepolicy>\n"
1064 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1065 " <sepolicy-version>25.5</sepolicy-version>\n"
1066 " </sepolicy>\n"
1067 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1068 "</compatibility-matrix>\n";
1069 matrix = {};
1070 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1071 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1072 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
1073 EXPECT_NE(camera, nullptr);
1074 camera->versionRanges[0] = {3, 5};
1075 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1076 camera->versionRanges[0] = {3, 6};
1077 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1078
1079 // reset it
1080 matrix = {};
1081 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1082 set(matrix, Sepolicy{30, {{26, 0}}});
1083 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1084 set(matrix, Sepolicy{30, {{25, 6}}});
1085 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1086 set(matrix, Sepolicy{30, {{25, 4}}});
1087 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1088}
1089
Yifan Honga9993572017-01-24 19:33:15 -08001090} // namespace vintf
1091} // namespace android
1092
Yifan Hong676447a2016-11-15 12:57:23 -08001093int main(int argc, char **argv) {
1094 ::testing::InitGoogleTest(&argc, argv);
1095 return RUN_ALL_TESTS();
1096}