blob: 6ce1e23ed8d79c46e7138f0ea32ee93ecc43b317 [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 Hongd5cd0482017-06-19 12:25:48 -0700166TEST_F(LibVintfTest, ArchOperatorOr) {
167 Arch a = Arch::ARCH_EMPTY;
168 a |= Arch::ARCH_32;
169 EXPECT_EQ(Arch::ARCH_32, a);
170
171 a |= Arch::ARCH_64;
172 EXPECT_EQ(Arch::ARCH_32_64, a);
173
174 a = Arch::ARCH_EMPTY;
175 a |= Arch::ARCH_64;
176 EXPECT_EQ(Arch::ARCH_64, a);
177}
Yifan Hongef6d4d32017-01-23 14:12:28 -0800178
179TEST_F(LibVintfTest, Stringify) {
Yifan Honga04e1472017-04-05 13:15:34 -0700180 HalManifest vm = testDeviceManifest();
Yifan Hong974ad9c2017-04-04 15:37:39 -0700181 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/2.0:"
182 "hidl/android.hardware.nfc/passthrough32+64/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -0800183
184 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
185 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
186
187 VersionRange v(1, 2, 3);
188 EXPECT_EQ(to_string(v), "1.2-3");
189 VersionRange v2;
190 EXPECT_TRUE(parse("1.2-3", &v2));
191 EXPECT_EQ(v, v2);
192}
193
Yifan Hong9bbdb282017-04-12 21:53:59 -0700194TEST_F(LibVintfTest, GetTransport) {
195 HalManifest vm = testDeviceManifest();
196 EXPECT_EQ(Transport::HWBINDER, vm.getTransport("android.hardware.camera",
197 {2, 0}, "ICamera", "default"));
198}
199
Yifan Hongd2b7e642017-02-17 10:15:32 -0800200TEST_F(LibVintfTest, HalManifestConverter) {
Yifan Honga04e1472017-04-05 13:15:34 -0700201 HalManifest vm = testDeviceManifest();
Yifan Hongd2b7e642017-02-17 10:15:32 -0800202 std::string xml = gHalManifestConverter(vm);
Yifan Hong676447a2016-11-15 12:57:23 -0800203 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700204 "<manifest version=\"1.0\" type=\"device\">\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800205 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800206 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800207 " <transport>hwbinder</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800208 " <version>2.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800209 " <interface>\n"
210 " <name>IBetterCamera</name>\n"
211 " <instance>camera</instance>\n"
212 " </interface>\n"
213 " <interface>\n"
214 " <name>ICamera</name>\n"
215 " <instance>default</instance>\n"
216 " <instance>legacy/0</instance>\n"
217 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800218 " </hal>\n"
219 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800220 " <name>android.hardware.nfc</name>\n"
Yifan Hongc54d32c2017-03-07 19:12:26 -0800221 " <transport arch=\"32+64\">passthrough</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800222 " <version>1.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800223 " <interface>\n"
224 " <name>INfc</name>\n"
225 " <instance>default</instance>\n"
226 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800227 " </hal>\n"
Yifan Hong2a3dd082017-04-04 17:15:35 -0700228 " <sepolicy>\n"
229 " <version>25.0</version>\n"
230 " </sepolicy>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800231 "</manifest>\n");
Yifan Hongfb7469c2017-04-05 19:15:21 -0700232 HalManifest vm2;
233 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
234 EXPECT_EQ(vm, vm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800235}
236
Yifan Honga04e1472017-04-05 13:15:34 -0700237TEST_F(LibVintfTest, HalManifestConverterFramework) {
238 HalManifest vm = testFrameworkManfiest();
239 std::string xml = gHalManifestConverter(vm);
240 EXPECT_EQ(xml,
241 "<manifest version=\"1.0\" type=\"framework\">\n"
242 " <hal format=\"hidl\">\n"
243 " <name>android.hidl.manager</name>\n"
244 " <transport>hwbinder</transport>\n"
245 " <version>1.0</version>\n"
246 " <interface>\n"
247 " <name>IServiceManager</name>\n"
248 " <instance>default</instance>\n"
249 " </interface>\n"
250 " </hal>\n"
251 " <vndk>\n"
252 " <version>25.0.5</version>\n"
253 " <library>libbase.so</library>\n"
254 " <library>libjpeg.so</library>\n"
255 " </vndk>\n"
256 " <vndk>\n"
257 " <version>25.1.3</version>\n"
258 " <library>libbase.so</library>\n"
259 " <library>libjpeg.so</library>\n"
260 " <library>libtinyxml2.so</library>\n"
261 " </vndk>\n"
262 "</manifest>\n");
263 HalManifest vm2;
264 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700265 EXPECT_EQ(vm, vm2);
Yifan Honga04e1472017-04-05 13:15:34 -0700266}
267
Yifan Hong8e9c6692017-02-28 14:07:42 -0800268TEST_F(LibVintfTest, HalManifestOptional) {
269 HalManifest vm;
270 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700271 "<manifest version=\"1.0\" type=\"device\"></manifest>"));
Yifan Hong8e9c6692017-02-28 14:07:42 -0800272 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700273 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800274 " <hal>"
275 " <name>android.hidl.manager</name>"
276 " <transport>hwbinder</transport>"
277 " <version>1.0</version>"
278 " </hal>"
279 "</manifest>"));
280 EXPECT_FALSE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700281 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800282 " <hal>"
283 " <name>android.hidl.manager</name>"
284 " <version>1.0</version>"
285 " </hal>"
286 "</manifest>"));
287}
288
Yifan Hong79dcc1f2017-05-22 14:35:19 -0700289TEST_F(LibVintfTest, HalManifestDuplicate) {
290 HalManifest vm;
291 EXPECT_FALSE(gHalManifestConverter(&vm,
292 "<manifest version=\"1.0\" type=\"device\">"
293 " <hal>"
294 " <name>android.hidl.manager</name>"
295 " <transport>hwbinder</transport>"
296 " <version>1.0</version>"
297 " <version>1.1</version>"
298 " </hal>"
299 "</manifest>"))
300 << "Should not allow duplicated major version in <hal>";
301 EXPECT_FALSE(gHalManifestConverter(&vm,
302 "<manifest version=\"1.0\" type=\"device\">"
303 " <hal>"
304 " <name>android.hidl.manager</name>"
305 " <transport>hwbinder</transport>"
306 " <version>1.0</version>"
307 " </hal>"
308 " <hal>"
309 " <name>android.hidl.manager</name>"
310 " <transport arch=\"32+64\">passthrough</transport>"
311 " <version>1.1</version>"
312 " </hal>"
313 "</manifest>"))
314 << "Should not allow duplicated major version across <hal>";
315}
316
317TEST_F(LibVintfTest, HalManifestGetTransport) {
318 HalManifest vm;
319 EXPECT_TRUE(gHalManifestConverter(&vm,
320 "<manifest version=\"1.0\" type=\"device\">"
321 " <hal>"
322 " <name>android.hidl.manager</name>"
323 " <transport>hwbinder</transport>"
324 " <version>1.0</version>"
325 " <interface>"
326 " <name>IServiceManager</name>"
327 " <instance>default</instance>"
328 " </interface>"
329 " </hal>"
330 " <hal>"
331 " <name>android.hidl.manager</name>"
332 " <transport arch=\"32+64\">passthrough</transport>"
333 " <version>2.1</version>"
334 " <interface>"
335 " <name>IServiceManager</name>"
336 " <instance>default</instance>"
337 " </interface>"
338 " </hal>"
339 "</manifest>"));
340 EXPECT_EQ(Transport::PASSTHROUGH,
341 vm.getTransport("android.hidl.manager", {2, 1}, "IServiceManager", "default"));
342 EXPECT_EQ(Transport::PASSTHROUGH,
343 vm.getTransport("android.hidl.manager", {2, 0}, "IServiceManager", "default"));
344 EXPECT_EQ(Transport::EMPTY,
345 vm.getTransport("android.hidl.manager", {2, 2}, "IServiceManager", "default"));
346 EXPECT_EQ(Transport::HWBINDER,
347 vm.getTransport("android.hidl.manager", {1, 0}, "IServiceManager", "default"));
348}
349
Yifan Hongec3b9b72017-02-23 13:24:42 -0800350TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700351 HalManifest vm = testDeviceManifest();
Yifan Hongec3b9b72017-02-23 13:24:42 -0800352 EXPECT_EQ(vm.getInstances("android.hardware.camera", "ICamera"),
353 std::set<std::string>({"default", "legacy/0"}));
354 EXPECT_EQ(vm.getInstances("android.hardware.camera", "IBetterCamera"),
355 std::set<std::string>({"camera"}));
356 EXPECT_EQ(vm.getInstances("android.hardware.camera", "INotExist"),
Yifan Hong9bbdb282017-04-12 21:53:59 -0700357 std::set<std::string>({}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800358 EXPECT_EQ(vm.getInstances("android.hardware.nfc", "INfc"),
359 std::set<std::string>({"default"}));
360
361 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "default"));
362 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "legacy/0"));
363 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "camera"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800364 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", "INfc", "default"));
365
Yifan Hong9bbdb282017-04-12 21:53:59 -0700366 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800367 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "ICamera", "notexist"));
368 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "default"));
369 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "notexist"));
370 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", "INfc", "notexist"));
371}
372
Yifan Hong676447a2016-11-15 12:57:23 -0800373TEST_F(LibVintfTest, VersionConverter) {
374 Version v(3, 6);
375 std::string xml = gVersionConverter(v);
376 EXPECT_EQ(xml, "<version>3.6</version>\n");
377 Version v2;
378 EXPECT_TRUE(gVersionConverter(&v2, xml));
379 EXPECT_EQ(v, v2);
380}
381
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700382static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
383 std::string name{intf.name};
384 return map->emplace(std::move(name), std::move(intf)).second;
385}
386
Yifan Hong676447a2016-11-15 12:57:23 -0800387TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800388 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800389 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700390 false /* optional */, {}};
391 EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
392 EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800393 std::string xml = gMatrixHalConverter(mh);
394 EXPECT_EQ(xml,
395 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800396 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800397 " <version>1.2-3</version>\n"
398 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700399 " <interface>\n"
400 " <name>IBetterCamera</name>\n"
401 " <instance>default</instance>\n"
402 " <instance>great</instance>\n"
403 " </interface>\n"
404 " <interface>\n"
405 " <name>ICamera</name>\n"
406 " <instance>default</instance>\n"
407 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800408 "</hal>\n");
409 MatrixHal mh2;
410 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
411 EXPECT_EQ(mh, mh2);
412}
413
Yifan Hong3f5489a2017-02-08 11:14:21 -0800414TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
415
416 KernelConfigTypedValue converted;
417
418 auto testOne = [] (const KernelConfigTypedValue &original,
419 const std::string &expectXml) {
420 std::string xml;
421 KernelConfigTypedValue converted;
422 xml = gKernelConfigTypedValueConverter(original);
423 EXPECT_EQ(xml, expectXml);
424 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
425 EXPECT_EQ(original, converted);
426 };
427
428 auto testParse = [] (const KernelConfigTypedValue &original,
429 const std::string &xml) {
430 KernelConfigTypedValue converted;
431 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
432 EXPECT_EQ(original, converted);
433 };
434
435 testOne(KernelConfigTypedValue("stringvalue"),
436 "<value type=\"string\">stringvalue</value>\n");
437 testOne(KernelConfigTypedValue(""),
438 "<value type=\"string\"></value>\n");
439
440 testOne(KernelConfigTypedValue(Tristate::YES),
441 "<value type=\"tristate\">y</value>\n");
442 testOne(KernelConfigTypedValue(Tristate::NO),
443 "<value type=\"tristate\">n</value>\n");
444 testOne(KernelConfigTypedValue(Tristate::MODULE),
445 "<value type=\"tristate\">m</value>\n");
446 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
447 "<value type=\"tristate\">q</value>\n"));
448
449 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
450 "<value type=\"range\">4-20</value>\n");
451 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
452 "<value type=\"range\">0-18446744073709551615</value>\n");
453 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
454 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
455
456 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
457 "<value type=\"int\">-18446744073709551616</value>\n"));
458
459 testOne(KernelConfigTypedValue(INT64_MIN),
460 "<value type=\"int\">-9223372036854775808</value>\n");
461 testParse(KernelConfigTypedValue(INT64_MIN),
462 "<value type=\"int\">0x8000000000000000</value>\n");
463 testParse(KernelConfigTypedValue(INT64_MIN),
464 "<value type=\"int\">-0X8000000000000000</value>\n");
465
466 testParse(KernelConfigTypedValue(INT64_MIN + 1),
467 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
468
469 testParse(KernelConfigTypedValue(-0x50),
470 "<value type=\"int\">-0x50</value>\n");
471
472 testOne(KernelConfigTypedValue(0),
473 "<value type=\"int\">0</value>\n");
474
475 // Truncation for underflow.
476 testParse(KernelConfigTypedValue(1),
477 "<value type=\"int\">-0xffffffffffffffff</value>\n");
478 testParse(KernelConfigTypedValue(1),
479 "<value type=\"int\">-18446744073709551615</value>\n");
480
481 testOne(KernelConfigTypedValue(INT64_MAX),
482 "<value type=\"int\">9223372036854775807</value>\n");
483 testParse(KernelConfigTypedValue(INT64_MAX),
484 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
485 // Truncation for underflow.
486 testParse(KernelConfigTypedValue(INT64_MAX),
487 "<value type=\"int\">-9223372036854775809</value>\n");
488
489 testParse(KernelConfigTypedValue(-1),
490 "<value type=\"int\">18446744073709551615</value>\n");
491 testParse(KernelConfigTypedValue(-1),
492 "<value type=\"int\">0xffffffffffffffff</value>\n");
493
494 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
495 "<value type=\"int\">18446744073709551616</value>\n"));
496}
497
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700498TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
Yifan Hong676447a2016-11-15 12:57:23 -0800499 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800500 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800501 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700502 false /* optional */, testHalInterfaces()}));
Yifan Honga9993572017-01-24 19:33:15 -0800503 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800504 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700505 true /* optional */, testHalInterfaces()}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800506 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
507 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
508 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
509 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700510 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700511 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800512 std::string xml = gCompatibilityMatrixConverter(cm);
513 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700514 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800515 " <hal format=\"native\" optional=\"false\">\n"
516 " <name>android.hardware.camera</name>\n"
517 " <version>1.2-3</version>\n"
518 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700519 " <interface>\n"
520 " <name>IFoo</name>\n"
521 " <instance>default</instance>\n"
522 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800523 " </hal>\n"
524 " <hal format=\"native\" optional=\"true\">\n"
525 " <name>android.hardware.nfc</name>\n"
526 " <version>4.5-6</version>\n"
527 " <version>10.11-12</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700528 " <interface>\n"
529 " <name>IFoo</name>\n"
530 " <instance>default</instance>\n"
531 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800532 " </hal>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800533 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800534 " <config>\n"
535 " <key>CONFIG_FOO</key>\n"
536 " <value type=\"tristate\">y</value>\n"
537 " </config>\n"
538 " <config>\n"
539 " <key>CONFIG_BAR</key>\n"
540 " <value type=\"string\">stringvalue</value>\n"
541 " </config>\n"
542 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800543 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800544 " <config>\n"
545 " <key>CONFIG_BAZ</key>\n"
546 " <value type=\"int\">20</value>\n"
547 " </config>\n"
548 " <config>\n"
549 " <key>CONFIG_BAR</key>\n"
550 " <value type=\"range\">3-5</value>\n"
551 " </config>\n"
552 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800553 " <sepolicy>\n"
554 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700555 " <sepolicy-version>25.0</sepolicy-version>\n"
556 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800557 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700558 " <avb>\n"
559 " <vbmeta-version>2.1</vbmeta-version>\n"
560 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800561 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800562 CompatibilityMatrix cm2;
563 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700564 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800565}
566
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700567TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
568 CompatibilityMatrix cm;
569 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
570 {{VersionRange(1,0)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700571 false /* optional */, testHalInterfaces()}));
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700572 set(cm, SchemaType::DEVICE);
573 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
574 std::string xml = gCompatibilityMatrixConverter(cm);
575 EXPECT_EQ(xml,
576 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
577 " <hal format=\"native\" optional=\"false\">\n"
578 " <name>android.hidl.manager</name>\n"
579 " <version>1.0</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 Hong03d2d4a2017-04-12 17:34:14 -0700584 " </hal>\n"
585 " <vndk>\n"
586 " <version>25.0.1-5</version>\n"
587 " <library>libbase.so</library>\n"
588 " <library>libjpeg.so</library>\n"
589 " </vndk>\n"
590 "</compatibility-matrix>\n");
591 CompatibilityMatrix cm2;
592 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
593 EXPECT_EQ(cm, cm2);
594}
595
Yifan Hong676447a2016-11-15 12:57:23 -0800596TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800597 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800598
Yifan Hong2059ffc2017-02-24 11:32:02 -0800599 ManifestHal invalidHal{
600 .format = HalFormat::HIDL,
601 .name = "android.hardware.camera",
602 .versions = {{Version(2, 0), Version(2, 1)}},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800603 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64}
Yifan Hong2059ffc2017-02-24 11:32:02 -0800604 };
605
Yifan Hong5a06ef72017-01-24 19:54:24 -0800606 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800607 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800608 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800609}
610
Tri Vod0143942017-03-24 17:51:23 -0700611TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700612 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700613 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
614 {"android.hardware.camera", "android.hardware.nfc"}));
615}
616
617TEST_F(LibVintfTest, HalManifestGetInterfaceNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700618 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700619 EXPECT_EQ(vm.getInterfaceNames("android.hardware.camera"),
620 std::set<std::string>({"ICamera", "IBetterCamera"}));
621 EXPECT_EQ(vm.getInterfaceNames("android.hardware.nfc"),
622 std::set<std::string>({"INfc"}));
623}
624
Yifan Hongd2b7e642017-02-17 10:15:32 -0800625TEST_F(LibVintfTest, HalManifestGetHal) {
Yifan Honga04e1472017-04-05 13:15:34 -0700626 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700627 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
628 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800629
630 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
631 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800632 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800633 EXPECT_EQ(hal.name, arr[i++]);
634 }
635}
636
Yifan Honga7201e72017-02-17 10:09:59 -0800637TEST_F(LibVintfTest, RuntimeInfo) {
638 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800639 using KernelConfigs = std::vector<KernelConfig>;
640 const KernelConfigs configs {
641 KernelConfig{"CONFIG_64BIT", Tristate::YES},
642 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
643 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
644 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
645 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
646 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
647 };
648
649 auto testMatrix = [&] (MatrixKernel &&kernel) {
650 CompatibilityMatrix cm;
651 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700652 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700653 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800654 return cm;
655 };
656
657 std::string error;
658
659 {
660 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
661 CompatibilityMatrix cm = testMatrix(std::move(kernel));
662 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
663 }
664
665 {
666 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
667 CompatibilityMatrix cm = testMatrix(std::move(kernel));
668 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
669 }
670
671 {
672 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
673 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700674 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800675 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
676 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700677 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800678 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
679 << "kernel-sepolicy-version shouldn't match";
680 }
681
682 {
683 KernelConfigs newConfigs(configs);
684 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
685 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
686 CompatibilityMatrix cm = testMatrix(std::move(kernel));
687 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
688 }
689
690 {
691 KernelConfigs newConfigs(configs);
692 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
693 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
694 CompatibilityMatrix cm = testMatrix(std::move(kernel));
695 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
696 }
697
698 {
699 KernelConfigs newConfigs(configs);
700 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
701 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
702 CompatibilityMatrix cm = testMatrix(std::move(kernel));
703 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
704 }
705
706 {
707 KernelConfigs newConfigs(configs);
708 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
709 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
710 CompatibilityMatrix cm = testMatrix(std::move(kernel));
711 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
712 }
713
714 {
715 KernelConfigs newConfigs(configs);
716 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
717 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
718 CompatibilityMatrix cm = testMatrix(std::move(kernel));
719 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
720 }
Yifan Hongb4233162017-05-24 15:17:40 -0700721// TODO(b/38325029) enable avb check when avb version is injected to fwk matrix.
722#if 0
Yifan Hongf3029302017-04-12 17:23:49 -0700723 RuntimeInfo badAvb = testRuntimeInfo();
724 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
725 {
726 setAvb(badAvb, {1, 0}, {2, 1});
727 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
Michael Schwartz5cfbc922017-05-08 14:06:49 -0700728 EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
Yifan Hongf3029302017-04-12 17:23:49 -0700729 }
730 {
731 setAvb(badAvb, {2, 1}, {3, 0});
732 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
733 }
734 {
735 setAvb(badAvb, {2, 1}, {2, 3});
736 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
737 }
738 {
739 setAvb(badAvb, {2, 3}, {2, 1});
740 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
741 }
Yifan Hongb4233162017-05-24 15:17:40 -0700742#endif
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800743}
744
Yifan Hong19e0a2a2017-04-14 17:30:53 -0700745TEST_F(LibVintfTest, MissingAvb) {
746 std::string xml =
747 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
748 " <kernel version=\"3.18.31\"></kernel>"
749 " <sepolicy>\n"
750 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
751 " <sepolicy-version>25.5</sepolicy-version>\n"
752 " </sepolicy>\n"
753 "</compatibility-matrix>\n";
754 CompatibilityMatrix cm;
755 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
756 EXPECT_EQ(getAvb(cm), Version(0, 0));
757}
758
Yifan Hong08e984c2017-05-18 12:50:04 -0700759// This is the test extracted from VINTF Object doc
760TEST_F(LibVintfTest, HalCompat) {
761 CompatibilityMatrix matrix;
762 std::string error;
763
764 std::string matrixXml =
765 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
766 " <hal format=\"hidl\" optional=\"false\">\n"
767 " <name>android.hardware.foo</name>\n"
768 " <version>1.0</version>\n"
769 " <version>3.1-2</version>\n"
770 " <interface>\n"
771 " <name>IFoo</name>\n"
772 " <instance>default</instance>\n"
773 " <instance>specific</instance>\n"
774 " </interface>\n"
775 " </hal>\n"
776 " <hal format=\"hidl\" optional=\"false\">\n"
777 " <name>android.hardware.foo</name>\n"
778 " <version>2.0</version>\n"
779 " <interface>\n"
780 " <name>IBar</name>\n"
781 " <instance>default</instance>\n"
782 " </interface>\n"
783 " </hal>\n"
784 " <sepolicy>\n"
785 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
786 " <sepolicy-version>25.5</sepolicy-version>\n"
787 " </sepolicy>\n"
788 "</compatibility-matrix>\n";
789 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
790 << gCompatibilityMatrixConverter.lastError();
791
792 {
793 std::string manifestXml =
794 "<manifest version=\"1.0\" type=\"device\">\n"
795 " <hal format=\"hidl\">\n"
796 " <name>android.hardware.foo</name>\n"
797 " <transport>hwbinder</transport>\n"
798 " <version>1.0</version>\n"
799 " <interface>\n"
800 " <name>IFoo</name>\n"
801 " <instance>default</instance>\n"
802 " <instance>specific</instance>\n"
803 " </interface>\n"
804 " </hal>\n"
805 " <hal format=\"hidl\">\n"
806 " <name>android.hardware.foo</name>\n"
807 " <transport>hwbinder</transport>\n"
808 " <version>2.0</version>\n"
809 " <interface>\n"
810 " <name>IBar</name>\n"
811 " <instance>default</instance>\n"
812 " </interface>\n"
813 " </hal>\n"
814 " <sepolicy>\n"
815 " <version>25.5</version>\n"
816 " </sepolicy>\n"
817 "</manifest>\n";
818
819 HalManifest manifest;
820 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
821 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
822 }
823
824 {
825 std::string manifestXml =
826 "<manifest version=\"1.0\" type=\"device\">\n"
827 " <hal format=\"hidl\">\n"
828 " <name>android.hardware.foo</name>\n"
829 " <transport>hwbinder</transport>\n"
830 " <version>1.0</version>\n"
831 " <interface>\n"
832 " <name>IFoo</name>\n"
833 " <instance>default</instance>\n"
834 " <instance>specific</instance>\n"
835 " </interface>\n"
836 " </hal>\n"
837 " <sepolicy>\n"
838 " <version>25.5</version>\n"
839 " </sepolicy>\n"
840 "</manifest>\n";
841 HalManifest manifest;
842 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
843 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
844 << "should not be compatible because IBar is missing";
845 }
846
847 {
848 std::string manifestXml =
849 "<manifest version=\"1.0\" type=\"device\">\n"
850 " <hal format=\"hidl\">\n"
851 " <name>android.hardware.foo</name>\n"
852 " <transport>hwbinder</transport>\n"
853 " <version>1.0</version>\n"
854 " <interface>\n"
855 " <name>IFoo</name>\n"
856 " <instance>default</instance>\n"
857 " </interface>\n"
858 " </hal>\n"
859 " <hal format=\"hidl\">\n"
860 " <name>android.hardware.foo</name>\n"
861 " <transport>hwbinder</transport>\n"
862 " <version>2.0</version>\n"
863 " <interface>\n"
864 " <name>IBar</name>\n"
865 " <instance>default</instance>\n"
866 " </interface>\n"
867 " </hal>\n"
868 " <sepolicy>\n"
869 " <version>25.5</version>\n"
870 " </sepolicy>\n"
871 "</manifest>\n";
872 HalManifest manifest;
873 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
874 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
875 << "should not be compatible because IFoo/default is missing";
876 }
877
878 {
879 std::string manifestXml =
880 "<manifest version=\"1.0\" type=\"device\">\n"
881 " <hal format=\"hidl\">\n"
882 " <name>android.hardware.foo</name>\n"
883 " <transport>hwbinder</transport>\n"
884 " <version>3.3</version>\n"
885 " <interface>\n"
886 " <name>IFoo</name>\n"
887 " <instance>default</instance>\n"
888 " <instance>specific</instance>\n"
889 " </interface>\n"
890 " </hal>\n"
891 " <hal format=\"hidl\">\n"
892 " <name>android.hardware.foo</name>\n"
893 " <transport>hwbinder</transport>\n"
894 " <version>2.0</version>\n"
895 " <interface>\n"
896 " <name>IBar</name>\n"
897 " <instance>default</instance>\n"
898 " </interface>\n"
899 " </hal>\n"
900 " <sepolicy>\n"
901 " <version>25.5</version>\n"
902 " </sepolicy>\n"
903 "</manifest>\n";
904 HalManifest manifest;
905 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
906 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
907 }
908
909 {
910 std::string manifestXml =
911 "<manifest version=\"1.0\" type=\"device\">\n"
912 " <hal format=\"hidl\">\n"
913 " <name>android.hardware.foo</name>\n"
914 " <transport>hwbinder</transport>\n"
915 " <version>1.0</version>\n"
916 " <interface>\n"
917 " <name>IFoo</name>\n"
918 " <instance>default</instance>\n"
919 " </interface>\n"
920 " </hal>\n"
921 " <hal format=\"hidl\">\n"
922 " <name>android.hardware.foo</name>\n"
923 " <transport>hwbinder</transport>\n"
924 " <version>3.2</version>\n"
925 " <interface>\n"
926 " <name>IFoo</name>\n"
927 " <instance>specific</instance>\n"
928 " </interface>\n"
929 " </hal>\n"
930 " <hal format=\"hidl\">\n"
931 " <name>android.hardware.foo</name>\n"
932 " <transport>hwbinder</transport>\n"
933 " <version>2.0</version>\n"
934 " <interface>\n"
935 " <name>IBar</name>\n"
936 " <instance>default</instance>\n"
937 " </interface>\n"
938 " </hal>\n"
939 " <sepolicy>\n"
940 " <version>25.5</version>\n"
941 " </sepolicy>\n"
942 "</manifest>\n";
943 HalManifest manifest;
944 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
945 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
946 << "should not be compatible even though @1.0::IFoo/default "
947 << "and @3.2::IFoo/specific present";
948 }
949
950 {
951 std::string manifestXml =
952 "<manifest version=\"1.0\" type=\"device\">\n"
953 " <hal format=\"hidl\">\n"
954 " <name>android.hardware.foo</name>\n"
955 " <transport>hwbinder</transport>\n"
956 " <version>1.0</version>\n"
957 " <interface>\n"
958 " <name>IFoo</name>\n"
959 " <instance>default</instance>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -0700960 " <instance>specific</instance>\n"
961 " </interface>\n"
962 " </hal>\n"
963 " <hal format=\"hidl\">\n"
964 " <name>android.hardware.foo</name>\n"
965 " <transport>hwbinder</transport>\n"
966 " <version>2.0</version>\n"
967 " <interface>\n"
968 " <name>IBar</name>\n"
969 " <instance>default</instance>\n"
970 " </interface>\n"
971 " </hal>\n"
972 " <sepolicy>\n"
973 " <version>25.5</version>\n"
974 " </sepolicy>\n"
975 "</manifest>\n";
976 HalManifest manifest;
Yifan Hong79dcc1f2017-05-22 14:35:19 -0700977 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml))
978 << gHalManifestConverter.lastError();
979 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
Yifan Hong08e984c2017-05-18 12:50:04 -0700980 }
981}
982
Yifan Hongd0cbf1f2017-04-12 19:47:06 -0700983TEST_F(LibVintfTest, Compat) {
984 std::string manifestXml =
985 "<manifest version=\"1.0\" type=\"device\">\n"
986 " <hal format=\"hidl\">\n"
987 " <name>android.hardware.camera</name>\n"
988 " <transport>hwbinder</transport>\n"
989 " <version>3.5</version>\n"
990 " <interface>\n"
991 " <name>IBetterCamera</name>\n"
992 " <instance>camera</instance>\n"
993 " </interface>\n"
994 " <interface>\n"
995 " <name>ICamera</name>\n"
996 " <instance>default</instance>\n"
997 " <instance>legacy/0</instance>\n"
998 " </interface>\n"
999 " </hal>\n"
1000 " <hal format=\"hidl\">\n"
1001 " <name>android.hardware.nfc</name>\n"
1002 " <transport>hwbinder</transport>\n"
1003 " <version>1.0</version>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001004 " <interface>\n"
1005 " <name>INfc</name>\n"
1006 " <instance>nfc_nci</instance>\n"
1007 " </interface>\n"
1008 " </hal>\n"
1009 " <hal format=\"hidl\">\n"
1010 " <name>android.hardware.nfc</name>\n"
1011 " <transport>hwbinder</transport>\n"
1012 " <version>2.0</version>\n"
1013 " <interface>\n"
1014 " <name>INfc</name>\n"
1015 " <instance>default</instance>\n"
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001016 " <instance>nfc_nci</instance>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001017 " </interface>\n"
1018 " </hal>\n"
1019 " <sepolicy>\n"
1020 " <version>25.5</version>\n"
1021 " </sepolicy>\n"
1022 "</manifest>\n";
1023
1024 std::string matrixXml =
1025 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1026 " <hal format=\"hidl\" optional=\"false\">\n"
1027 " <name>android.hardware.camera</name>\n"
1028 " <version>2.0-5</version>\n"
1029 " <version>3.4-16</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001030 " <interface>\n"
1031 " <name>IBetterCamera</name>\n"
1032 " <instance>camera</instance>\n"
1033 " </interface>\n"
1034 " <interface>\n"
1035 " <name>ICamera</name>\n"
1036 " <instance>default</instance>\n"
1037 " <instance>legacy/0</instance>\n"
1038 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001039 " </hal>\n"
1040 " <hal format=\"hidl\" optional=\"false\">\n"
1041 " <name>android.hardware.nfc</name>\n"
1042 " <version>1.0</version>\n"
1043 " <version>2.0</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001044 " <interface>\n"
1045 " <name>INfc</name>\n"
1046 " <instance>nfc_nci</instance>\n"
1047 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001048 " </hal>\n"
1049 " <hal format=\"hidl\" optional=\"true\">\n"
1050 " <name>android.hardware.foo</name>\n"
1051 " <version>1.0</version>\n"
1052 " </hal>\n"
1053 " <sepolicy>\n"
1054 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1055 " <sepolicy-version>25.5</sepolicy-version>\n"
1056 " <sepolicy-version>26.0-3</sepolicy-version>\n"
1057 " </sepolicy>\n"
1058 " <avb>\n"
1059 " <vbmeta-version>2.1</vbmeta-version>\n"
1060 " </avb>\n"
1061 "</compatibility-matrix>\n";
1062
1063 HalManifest manifest;
1064 CompatibilityMatrix matrix;
1065 std::string error;
1066 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1067 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1068 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1069
1070 // some smaller test cases
1071 matrixXml =
1072 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1073 " <hal format=\"hidl\" optional=\"false\">\n"
1074 " <name>android.hardware.camera</name>\n"
1075 " <version>3.4</version>\n"
1076 " </hal>\n"
1077 " <sepolicy>\n"
1078 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1079 " <sepolicy-version>25.5</sepolicy-version>\n"
1080 " </sepolicy>\n"
1081 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1082 "</compatibility-matrix>\n";
1083 matrix = {};
1084 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1085 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1086 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
1087 EXPECT_NE(camera, nullptr);
1088 camera->versionRanges[0] = {3, 5};
1089 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1090 camera->versionRanges[0] = {3, 6};
1091 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1092
1093 // reset it
1094 matrix = {};
1095 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1096 set(matrix, Sepolicy{30, {{26, 0}}});
1097 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1098 set(matrix, Sepolicy{30, {{25, 6}}});
1099 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1100 set(matrix, Sepolicy{30, {{25, 4}}});
1101 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1102}
1103
Yifan Honga9993572017-01-24 19:33:15 -08001104} // namespace vintf
1105} // namespace android
1106
Yifan Hong676447a2016-11-15 12:57:23 -08001107int main(int argc, char **argv) {
1108 ::testing::InitGoogleTest(&argc, argv);
1109 return RUN_ALL_TESTS();
1110}