blob: 090fd3d780a0792919e32e630d98bcf238b3eb68 [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 Hongd4857902017-06-13 14:13:56 -070055 void addXmlFile(CompatibilityMatrix& cm, std::string name, VersionRange range) {
56 MatrixXmlFile f;
57 f.mName = name;
58 f.mVersionRange = range;
59 f.mFormat = XmlSchemaFormat::DTD;
60 f.mOptional = true;
61 cm.addXmlFile(std::move(f));
62 }
Yifan Hong558380a2017-02-09 15:37:32 -080063 void set(CompatibilityMatrix &cm, Sepolicy &&sepolicy) {
Yifan Hong7c7d7062017-04-04 16:26:51 -070064 cm.framework.mSepolicy = sepolicy;
Yifan Hong558380a2017-02-09 15:37:32 -080065 }
Yifan Hong03d2d4a2017-04-12 17:34:14 -070066 void set(CompatibilityMatrix &cm, SchemaType type) {
67 cm.mType = type;
68 }
69 void set(CompatibilityMatrix &cm, VndkVersionRange &&range, std::set<std::string> &&libs) {
70 cm.device.mVndk.mVersionRange = range;
71 cm.device.mVndk.mLibraries = libs;
72 }
Yifan Hong881a9e452017-04-27 19:31:13 -070073 void setAvb(RuntimeInfo &ki, Version vbmeta, Version boot) {
74 ki.mBootVbmetaAvbVersion = vbmeta;
75 ki.mBootAvbVersion = boot;
Yifan Hongf3029302017-04-12 17:23:49 -070076 }
77 void setAvb(CompatibilityMatrix &cm, Version &&avbVersion) {
78 cm.framework.mAvbMetaVersion = avbVersion;
79 }
Yifan Hong19e0a2a2017-04-14 17:30:53 -070080 Version getAvb(CompatibilityMatrix &cm) {
81 return cm.framework.mAvbMetaVersion;
82 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070083 const ManifestHal *getAnyHal(HalManifest &vm, const std::string &name) {
84 return vm.getAnyHal(name);
Yifan Honga9993572017-01-24 19:33:15 -080085 }
Yifan Hongd0cbf1f2017-04-12 19:47:06 -070086 MatrixHal *getAnyHal(CompatibilityMatrix &cm, const std::string &name) {
87 return cm.getAnyHal(name);
88 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070089 ConstMultiMapValueIterable<std::string, ManifestHal> getHals(HalManifest &vm) {
Yifan Honga9993572017-01-24 19:33:15 -080090 return vm.getHals();
91 }
Yifan Hong5a06ef72017-01-24 19:54:24 -080092 bool isValid(const ManifestHal &mh) {
93 return mh.isValid();
94 }
Yifan Hong9cd9eb02017-05-17 18:36:08 -070095
96 std::map<std::string, HalInterface> testHalInterfaces() {
97 HalInterface intf;
98 intf.name = "IFoo";
99 intf.instances.insert("default");
100 std::map<std::string, HalInterface> map;
101 map[intf.name] = intf;
102 return map;
103 }
104
Yifan Honga04e1472017-04-05 13:15:34 -0700105 HalManifest testDeviceManifest() {
Yifan Hongd2b7e642017-02-17 10:15:32 -0800106 HalManifest vm;
Yifan Hong7c7d7062017-04-04 16:26:51 -0700107 vm.mType = SchemaType::DEVICE;
Yifan Hong2a3dd082017-04-04 17:15:35 -0700108 vm.device.mSepolicyVersion = {25, 0};
Yifan Hong2059ffc2017-02-24 11:32:02 -0800109 vm.add(ManifestHal{
110 .format = HalFormat::HIDL,
111 .name = "android.hardware.camera",
112 .versions = {Version(2, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800113 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800114 .interfaces = {
115 {"ICamera", {"ICamera", {"legacy/0", "default"}}},
116 {"IBetterCamera", {"IBetterCamera", {"camera"}}}
117 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800118 });
119 vm.add(ManifestHal{
120 .format = HalFormat::HIDL,
121 .name = "android.hardware.nfc",
122 .versions = {Version(1, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800123 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800124 .interfaces = {
125 {"INfc", {"INfc", {"default"}}}
126 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800127 });
Yifan Honga9993572017-01-24 19:33:15 -0800128
129 return vm;
130 }
Yifan Hongd4857902017-06-13 14:13:56 -0700131 HalManifest testDeviceManifestWithXmlFile() {
132 HalManifest vm = testDeviceManifest();
133 ManifestXmlFile xmlFile;
134 xmlFile.mName = "media_profile";
135 xmlFile.mVersion = {1, 0};
136 vm.addXmlFile(std::move(xmlFile));
137 return vm;
138 }
Yifan Honga04e1472017-04-05 13:15:34 -0700139 HalManifest testFrameworkManfiest() {
140 HalManifest vm;
141 vm.mType = SchemaType::FRAMEWORK;
142 vm.add(ManifestHal{
143 .format = HalFormat::HIDL,
144 .name = "android.hidl.manager",
145 .versions = {Version(1, 0)},
146 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
147 .interfaces = {
148 {"IServiceManager", {"IServiceManager", {"default"}}},
149 }
150 });
151 Vndk vndk2505;
152 vndk2505.mVersionRange = {25, 0, 5};
153 vndk2505.mLibraries = { "libjpeg.so", "libbase.so" };
154 Vndk vndk2513;
155 vndk2513.mVersionRange = {25, 1, 3};
156 vndk2513.mLibraries = { "libjpeg.so", "libbase.so", "libtinyxml2.so" };
157 vm.framework.mVndks = { std::move(vndk2505), std::move(vndk2513) };
158
159 return vm;
160 }
Yifan Honga7201e72017-02-17 10:09:59 -0800161 RuntimeInfo testRuntimeInfo() {
162 RuntimeInfo info;
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800163 info.mOsName = "Linux";
164 info.mNodeName = "localhost";
165 info.mOsRelease = "3.18.31-g936f9a479d0f";
166 info.mKernelVersion = {3, 18, 31};
167 info.mOsVersion = "#4 SMP PREEMPT Wed Feb 1 18:10:52 PST 2017";
168 info.mHardwareId = "aarch64";
169 info.mKernelSepolicyVersion = 30;
Yifan Hongf1af7522017-02-16 18:00:55 -0800170 info.mKernelConfigs = {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800171 {"CONFIG_64BIT", "y"},
172 {"CONFIG_ANDROID_BINDER_DEVICES", "\"binder,hwbinder\""},
173 {"CONFIG_ARCH_MMAP_RND_BITS", "24"},
174 {"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", "\"\""},
175 {"CONFIG_ILLEGAL_POINTER_VALUE", "0xdead000000000000"}
176 };
Yifan Hong881a9e452017-04-27 19:31:13 -0700177 setAvb(info, {2, 1}, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800178 return info;
179 }
Yifan Hong676447a2016-11-15 12:57:23 -0800180};
181
Yifan Hongd5cd0482017-06-19 12:25:48 -0700182TEST_F(LibVintfTest, ArchOperatorOr) {
183 Arch a = Arch::ARCH_EMPTY;
184 a |= Arch::ARCH_32;
185 EXPECT_EQ(Arch::ARCH_32, a);
186
187 a |= Arch::ARCH_64;
188 EXPECT_EQ(Arch::ARCH_32_64, a);
189
190 a = Arch::ARCH_EMPTY;
191 a |= Arch::ARCH_64;
192 EXPECT_EQ(Arch::ARCH_64, a);
193}
Yifan Hongef6d4d32017-01-23 14:12:28 -0800194
195TEST_F(LibVintfTest, Stringify) {
Yifan Honga04e1472017-04-05 13:15:34 -0700196 HalManifest vm = testDeviceManifest();
Yifan Hong974ad9c2017-04-04 15:37:39 -0700197 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/2.0:"
198 "hidl/android.hardware.nfc/passthrough32+64/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -0800199
200 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
201 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
202
203 VersionRange v(1, 2, 3);
204 EXPECT_EQ(to_string(v), "1.2-3");
205 VersionRange v2;
206 EXPECT_TRUE(parse("1.2-3", &v2));
207 EXPECT_EQ(v, v2);
208}
209
Yifan Hong9bbdb282017-04-12 21:53:59 -0700210TEST_F(LibVintfTest, GetTransport) {
211 HalManifest vm = testDeviceManifest();
212 EXPECT_EQ(Transport::HWBINDER, vm.getTransport("android.hardware.camera",
213 {2, 0}, "ICamera", "default"));
214}
215
Yifan Hongd2b7e642017-02-17 10:15:32 -0800216TEST_F(LibVintfTest, HalManifestConverter) {
Yifan Honga04e1472017-04-05 13:15:34 -0700217 HalManifest vm = testDeviceManifest();
Yifan Hongd2b7e642017-02-17 10:15:32 -0800218 std::string xml = gHalManifestConverter(vm);
Yifan Hong676447a2016-11-15 12:57:23 -0800219 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700220 "<manifest version=\"1.0\" type=\"device\">\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800221 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800222 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800223 " <transport>hwbinder</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800224 " <version>2.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800225 " <interface>\n"
226 " <name>IBetterCamera</name>\n"
227 " <instance>camera</instance>\n"
228 " </interface>\n"
229 " <interface>\n"
230 " <name>ICamera</name>\n"
231 " <instance>default</instance>\n"
232 " <instance>legacy/0</instance>\n"
233 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800234 " </hal>\n"
235 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800236 " <name>android.hardware.nfc</name>\n"
Yifan Hongc54d32c2017-03-07 19:12:26 -0800237 " <transport arch=\"32+64\">passthrough</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800238 " <version>1.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800239 " <interface>\n"
240 " <name>INfc</name>\n"
241 " <instance>default</instance>\n"
242 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800243 " </hal>\n"
Yifan Hong2a3dd082017-04-04 17:15:35 -0700244 " <sepolicy>\n"
245 " <version>25.0</version>\n"
246 " </sepolicy>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800247 "</manifest>\n");
Yifan Hongfb7469c2017-04-05 19:15:21 -0700248 HalManifest vm2;
249 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
250 EXPECT_EQ(vm, vm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800251}
252
Yifan Honga04e1472017-04-05 13:15:34 -0700253TEST_F(LibVintfTest, HalManifestConverterFramework) {
254 HalManifest vm = testFrameworkManfiest();
255 std::string xml = gHalManifestConverter(vm);
256 EXPECT_EQ(xml,
257 "<manifest version=\"1.0\" type=\"framework\">\n"
258 " <hal format=\"hidl\">\n"
259 " <name>android.hidl.manager</name>\n"
260 " <transport>hwbinder</transport>\n"
261 " <version>1.0</version>\n"
262 " <interface>\n"
263 " <name>IServiceManager</name>\n"
264 " <instance>default</instance>\n"
265 " </interface>\n"
266 " </hal>\n"
267 " <vndk>\n"
268 " <version>25.0.5</version>\n"
269 " <library>libbase.so</library>\n"
270 " <library>libjpeg.so</library>\n"
271 " </vndk>\n"
272 " <vndk>\n"
273 " <version>25.1.3</version>\n"
274 " <library>libbase.so</library>\n"
275 " <library>libjpeg.so</library>\n"
276 " <library>libtinyxml2.so</library>\n"
277 " </vndk>\n"
278 "</manifest>\n");
279 HalManifest vm2;
280 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700281 EXPECT_EQ(vm, vm2);
Yifan Honga04e1472017-04-05 13:15:34 -0700282}
283
Yifan Hong8e9c6692017-02-28 14:07:42 -0800284TEST_F(LibVintfTest, HalManifestOptional) {
285 HalManifest vm;
286 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700287 "<manifest version=\"1.0\" type=\"device\"></manifest>"));
Yifan Hong8e9c6692017-02-28 14:07:42 -0800288 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700289 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800290 " <hal>"
291 " <name>android.hidl.manager</name>"
292 " <transport>hwbinder</transport>"
293 " <version>1.0</version>"
294 " </hal>"
295 "</manifest>"));
296 EXPECT_FALSE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700297 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800298 " <hal>"
299 " <name>android.hidl.manager</name>"
300 " <version>1.0</version>"
301 " </hal>"
302 "</manifest>"));
303}
304
Yifan Hong79dcc1f2017-05-22 14:35:19 -0700305TEST_F(LibVintfTest, HalManifestDuplicate) {
306 HalManifest vm;
307 EXPECT_FALSE(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 " <version>1.1</version>"
314 " </hal>"
315 "</manifest>"))
316 << "Should not allow duplicated major version in <hal>";
317 EXPECT_FALSE(gHalManifestConverter(&vm,
318 "<manifest version=\"1.0\" type=\"device\">"
319 " <hal>"
320 " <name>android.hidl.manager</name>"
321 " <transport>hwbinder</transport>"
322 " <version>1.0</version>"
323 " </hal>"
324 " <hal>"
325 " <name>android.hidl.manager</name>"
326 " <transport arch=\"32+64\">passthrough</transport>"
327 " <version>1.1</version>"
328 " </hal>"
329 "</manifest>"))
330 << "Should not allow duplicated major version across <hal>";
331}
332
333TEST_F(LibVintfTest, HalManifestGetTransport) {
334 HalManifest vm;
335 EXPECT_TRUE(gHalManifestConverter(&vm,
336 "<manifest version=\"1.0\" type=\"device\">"
337 " <hal>"
338 " <name>android.hidl.manager</name>"
339 " <transport>hwbinder</transport>"
340 " <version>1.0</version>"
341 " <interface>"
342 " <name>IServiceManager</name>"
343 " <instance>default</instance>"
344 " </interface>"
345 " </hal>"
346 " <hal>"
347 " <name>android.hidl.manager</name>"
348 " <transport arch=\"32+64\">passthrough</transport>"
349 " <version>2.1</version>"
350 " <interface>"
351 " <name>IServiceManager</name>"
352 " <instance>default</instance>"
353 " </interface>"
354 " </hal>"
355 "</manifest>"));
356 EXPECT_EQ(Transport::PASSTHROUGH,
357 vm.getTransport("android.hidl.manager", {2, 1}, "IServiceManager", "default"));
358 EXPECT_EQ(Transport::PASSTHROUGH,
359 vm.getTransport("android.hidl.manager", {2, 0}, "IServiceManager", "default"));
360 EXPECT_EQ(Transport::EMPTY,
361 vm.getTransport("android.hidl.manager", {2, 2}, "IServiceManager", "default"));
362 EXPECT_EQ(Transport::HWBINDER,
363 vm.getTransport("android.hidl.manager", {1, 0}, "IServiceManager", "default"));
364}
365
Yifan Hongec3b9b72017-02-23 13:24:42 -0800366TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700367 HalManifest vm = testDeviceManifest();
Yifan Hongec3b9b72017-02-23 13:24:42 -0800368 EXPECT_EQ(vm.getInstances("android.hardware.camera", "ICamera"),
369 std::set<std::string>({"default", "legacy/0"}));
370 EXPECT_EQ(vm.getInstances("android.hardware.camera", "IBetterCamera"),
371 std::set<std::string>({"camera"}));
372 EXPECT_EQ(vm.getInstances("android.hardware.camera", "INotExist"),
Yifan Hong9bbdb282017-04-12 21:53:59 -0700373 std::set<std::string>({}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800374 EXPECT_EQ(vm.getInstances("android.hardware.nfc", "INfc"),
375 std::set<std::string>({"default"}));
376
377 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "default"));
378 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "legacy/0"));
379 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "camera"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800380 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", "INfc", "default"));
381
Yifan Hong9bbdb282017-04-12 21:53:59 -0700382 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800383 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "ICamera", "notexist"));
384 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "default"));
385 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "notexist"));
386 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", "INfc", "notexist"));
387}
388
Yifan Hong676447a2016-11-15 12:57:23 -0800389TEST_F(LibVintfTest, VersionConverter) {
390 Version v(3, 6);
391 std::string xml = gVersionConverter(v);
392 EXPECT_EQ(xml, "<version>3.6</version>\n");
393 Version v2;
394 EXPECT_TRUE(gVersionConverter(&v2, xml));
395 EXPECT_EQ(v, v2);
396}
397
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700398static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
399 std::string name{intf.name};
400 return map->emplace(std::move(name), std::move(intf)).second;
401}
402
Yifan Hong676447a2016-11-15 12:57:23 -0800403TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800404 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800405 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700406 false /* optional */, {}};
407 EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
408 EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800409 std::string xml = gMatrixHalConverter(mh);
410 EXPECT_EQ(xml,
411 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800412 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800413 " <version>1.2-3</version>\n"
414 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700415 " <interface>\n"
416 " <name>IBetterCamera</name>\n"
417 " <instance>default</instance>\n"
418 " <instance>great</instance>\n"
419 " </interface>\n"
420 " <interface>\n"
421 " <name>ICamera</name>\n"
422 " <instance>default</instance>\n"
423 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800424 "</hal>\n");
425 MatrixHal mh2;
426 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
427 EXPECT_EQ(mh, mh2);
428}
429
Yifan Hong3f5489a2017-02-08 11:14:21 -0800430TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
431
432 KernelConfigTypedValue converted;
433
434 auto testOne = [] (const KernelConfigTypedValue &original,
435 const std::string &expectXml) {
436 std::string xml;
437 KernelConfigTypedValue converted;
438 xml = gKernelConfigTypedValueConverter(original);
439 EXPECT_EQ(xml, expectXml);
440 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
441 EXPECT_EQ(original, converted);
442 };
443
444 auto testParse = [] (const KernelConfigTypedValue &original,
445 const std::string &xml) {
446 KernelConfigTypedValue converted;
447 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
448 EXPECT_EQ(original, converted);
449 };
450
451 testOne(KernelConfigTypedValue("stringvalue"),
452 "<value type=\"string\">stringvalue</value>\n");
453 testOne(KernelConfigTypedValue(""),
454 "<value type=\"string\"></value>\n");
455
456 testOne(KernelConfigTypedValue(Tristate::YES),
457 "<value type=\"tristate\">y</value>\n");
458 testOne(KernelConfigTypedValue(Tristate::NO),
459 "<value type=\"tristate\">n</value>\n");
460 testOne(KernelConfigTypedValue(Tristate::MODULE),
461 "<value type=\"tristate\">m</value>\n");
462 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
463 "<value type=\"tristate\">q</value>\n"));
464
465 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
466 "<value type=\"range\">4-20</value>\n");
467 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
468 "<value type=\"range\">0-18446744073709551615</value>\n");
469 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
470 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
471
472 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
473 "<value type=\"int\">-18446744073709551616</value>\n"));
474
475 testOne(KernelConfigTypedValue(INT64_MIN),
476 "<value type=\"int\">-9223372036854775808</value>\n");
477 testParse(KernelConfigTypedValue(INT64_MIN),
478 "<value type=\"int\">0x8000000000000000</value>\n");
479 testParse(KernelConfigTypedValue(INT64_MIN),
480 "<value type=\"int\">-0X8000000000000000</value>\n");
481
482 testParse(KernelConfigTypedValue(INT64_MIN + 1),
483 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
484
485 testParse(KernelConfigTypedValue(-0x50),
486 "<value type=\"int\">-0x50</value>\n");
487
488 testOne(KernelConfigTypedValue(0),
489 "<value type=\"int\">0</value>\n");
490
491 // Truncation for underflow.
492 testParse(KernelConfigTypedValue(1),
493 "<value type=\"int\">-0xffffffffffffffff</value>\n");
494 testParse(KernelConfigTypedValue(1),
495 "<value type=\"int\">-18446744073709551615</value>\n");
496
497 testOne(KernelConfigTypedValue(INT64_MAX),
498 "<value type=\"int\">9223372036854775807</value>\n");
499 testParse(KernelConfigTypedValue(INT64_MAX),
500 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
501 // Truncation for underflow.
502 testParse(KernelConfigTypedValue(INT64_MAX),
503 "<value type=\"int\">-9223372036854775809</value>\n");
504
505 testParse(KernelConfigTypedValue(-1),
506 "<value type=\"int\">18446744073709551615</value>\n");
507 testParse(KernelConfigTypedValue(-1),
508 "<value type=\"int\">0xffffffffffffffff</value>\n");
509
510 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
511 "<value type=\"int\">18446744073709551616</value>\n"));
512}
513
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700514TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
Yifan Hong676447a2016-11-15 12:57:23 -0800515 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800516 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800517 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700518 false /* optional */, testHalInterfaces()}));
Yifan Honga9993572017-01-24 19:33:15 -0800519 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800520 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700521 true /* optional */, testHalInterfaces()}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800522 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
523 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
524 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
525 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700526 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700527 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800528 std::string xml = gCompatibilityMatrixConverter(cm);
529 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700530 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800531 " <hal format=\"native\" optional=\"false\">\n"
532 " <name>android.hardware.camera</name>\n"
533 " <version>1.2-3</version>\n"
534 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700535 " <interface>\n"
536 " <name>IFoo</name>\n"
537 " <instance>default</instance>\n"
538 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800539 " </hal>\n"
540 " <hal format=\"native\" optional=\"true\">\n"
541 " <name>android.hardware.nfc</name>\n"
542 " <version>4.5-6</version>\n"
543 " <version>10.11-12</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700544 " <interface>\n"
545 " <name>IFoo</name>\n"
546 " <instance>default</instance>\n"
547 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800548 " </hal>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800549 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800550 " <config>\n"
551 " <key>CONFIG_FOO</key>\n"
552 " <value type=\"tristate\">y</value>\n"
553 " </config>\n"
554 " <config>\n"
555 " <key>CONFIG_BAR</key>\n"
556 " <value type=\"string\">stringvalue</value>\n"
557 " </config>\n"
558 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800559 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800560 " <config>\n"
561 " <key>CONFIG_BAZ</key>\n"
562 " <value type=\"int\">20</value>\n"
563 " </config>\n"
564 " <config>\n"
565 " <key>CONFIG_BAR</key>\n"
566 " <value type=\"range\">3-5</value>\n"
567 " </config>\n"
568 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800569 " <sepolicy>\n"
570 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700571 " <sepolicy-version>25.0</sepolicy-version>\n"
572 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800573 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700574 " <avb>\n"
575 " <vbmeta-version>2.1</vbmeta-version>\n"
576 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800577 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800578 CompatibilityMatrix cm2;
579 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700580 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800581}
582
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700583TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
584 CompatibilityMatrix cm;
585 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
586 {{VersionRange(1,0)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700587 false /* optional */, testHalInterfaces()}));
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700588 set(cm, SchemaType::DEVICE);
589 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
590 std::string xml = gCompatibilityMatrixConverter(cm);
591 EXPECT_EQ(xml,
592 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
593 " <hal format=\"native\" optional=\"false\">\n"
594 " <name>android.hidl.manager</name>\n"
595 " <version>1.0</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700596 " <interface>\n"
597 " <name>IFoo</name>\n"
598 " <instance>default</instance>\n"
599 " </interface>\n"
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700600 " </hal>\n"
601 " <vndk>\n"
602 " <version>25.0.1-5</version>\n"
603 " <library>libbase.so</library>\n"
604 " <library>libjpeg.so</library>\n"
605 " </vndk>\n"
606 "</compatibility-matrix>\n");
607 CompatibilityMatrix cm2;
608 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
609 EXPECT_EQ(cm, cm2);
610}
611
Yifan Hong676447a2016-11-15 12:57:23 -0800612TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800613 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800614
Yifan Hong2059ffc2017-02-24 11:32:02 -0800615 ManifestHal invalidHal{
616 .format = HalFormat::HIDL,
617 .name = "android.hardware.camera",
618 .versions = {{Version(2, 0), Version(2, 1)}},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800619 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64}
Yifan Hong2059ffc2017-02-24 11:32:02 -0800620 };
621
Yifan Hong5a06ef72017-01-24 19:54:24 -0800622 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800623 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800624 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800625}
626
Tri Vod0143942017-03-24 17:51:23 -0700627TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700628 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700629 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
630 {"android.hardware.camera", "android.hardware.nfc"}));
631}
632
633TEST_F(LibVintfTest, HalManifestGetInterfaceNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700634 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700635 EXPECT_EQ(vm.getInterfaceNames("android.hardware.camera"),
636 std::set<std::string>({"ICamera", "IBetterCamera"}));
637 EXPECT_EQ(vm.getInterfaceNames("android.hardware.nfc"),
638 std::set<std::string>({"INfc"}));
639}
640
Yifan Hongd2b7e642017-02-17 10:15:32 -0800641TEST_F(LibVintfTest, HalManifestGetHal) {
Yifan Honga04e1472017-04-05 13:15:34 -0700642 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700643 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
644 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800645
646 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
647 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800648 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800649 EXPECT_EQ(hal.name, arr[i++]);
650 }
651}
652
Yifan Honga7201e72017-02-17 10:09:59 -0800653TEST_F(LibVintfTest, RuntimeInfo) {
654 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800655 using KernelConfigs = std::vector<KernelConfig>;
656 const KernelConfigs configs {
657 KernelConfig{"CONFIG_64BIT", Tristate::YES},
658 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
659 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
660 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
661 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
662 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
663 };
664
665 auto testMatrix = [&] (MatrixKernel &&kernel) {
666 CompatibilityMatrix cm;
667 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700668 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700669 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800670 return cm;
671 };
672
673 std::string error;
674
675 {
676 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
677 CompatibilityMatrix cm = testMatrix(std::move(kernel));
678 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
679 }
680
681 {
682 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
683 CompatibilityMatrix cm = testMatrix(std::move(kernel));
684 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
685 }
686
687 {
688 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
689 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700690 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800691 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
692 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700693 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800694 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
695 << "kernel-sepolicy-version shouldn't match";
696 }
697
698 {
699 KernelConfigs newConfigs(configs);
700 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
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 tristate";
704 }
705
706 {
707 KernelConfigs newConfigs(configs);
708 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
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[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
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 string";
720 }
721
722 {
723 KernelConfigs newConfigs(configs);
724 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
725 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
726 CompatibilityMatrix cm = testMatrix(std::move(kernel));
727 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
728 }
729
730 {
731 KernelConfigs newConfigs(configs);
732 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
733 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
734 CompatibilityMatrix cm = testMatrix(std::move(kernel));
735 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
736 }
Yifan Hongb4233162017-05-24 15:17:40 -0700737// TODO(b/38325029) enable avb check when avb version is injected to fwk matrix.
738#if 0
Yifan Hongf3029302017-04-12 17:23:49 -0700739 RuntimeInfo badAvb = testRuntimeInfo();
740 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
741 {
742 setAvb(badAvb, {1, 0}, {2, 1});
743 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
Michael Schwartz5cfbc922017-05-08 14:06:49 -0700744 EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
Yifan Hongf3029302017-04-12 17:23:49 -0700745 }
746 {
747 setAvb(badAvb, {2, 1}, {3, 0});
748 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
749 }
750 {
751 setAvb(badAvb, {2, 1}, {2, 3});
752 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
753 }
754 {
755 setAvb(badAvb, {2, 3}, {2, 1});
756 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
757 }
Yifan Hongb4233162017-05-24 15:17:40 -0700758#endif
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800759}
760
Yifan Hong19e0a2a2017-04-14 17:30:53 -0700761TEST_F(LibVintfTest, MissingAvb) {
762 std::string xml =
763 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
764 " <kernel version=\"3.18.31\"></kernel>"
765 " <sepolicy>\n"
766 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
767 " <sepolicy-version>25.5</sepolicy-version>\n"
768 " </sepolicy>\n"
769 "</compatibility-matrix>\n";
770 CompatibilityMatrix cm;
771 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
772 EXPECT_EQ(getAvb(cm), Version(0, 0));
773}
774
Yifan Hong08e984c2017-05-18 12:50:04 -0700775// This is the test extracted from VINTF Object doc
776TEST_F(LibVintfTest, HalCompat) {
777 CompatibilityMatrix matrix;
778 std::string error;
779
780 std::string matrixXml =
781 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
782 " <hal format=\"hidl\" optional=\"false\">\n"
783 " <name>android.hardware.foo</name>\n"
784 " <version>1.0</version>\n"
785 " <version>3.1-2</version>\n"
786 " <interface>\n"
787 " <name>IFoo</name>\n"
788 " <instance>default</instance>\n"
789 " <instance>specific</instance>\n"
790 " </interface>\n"
791 " </hal>\n"
792 " <hal format=\"hidl\" optional=\"false\">\n"
793 " <name>android.hardware.foo</name>\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 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
802 " <sepolicy-version>25.5</sepolicy-version>\n"
803 " </sepolicy>\n"
804 "</compatibility-matrix>\n";
805 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
806 << gCompatibilityMatrixConverter.lastError();
807
808 {
809 std::string manifestXml =
810 "<manifest version=\"1.0\" type=\"device\">\n"
811 " <hal format=\"hidl\">\n"
812 " <name>android.hardware.foo</name>\n"
813 " <transport>hwbinder</transport>\n"
814 " <version>1.0</version>\n"
815 " <interface>\n"
816 " <name>IFoo</name>\n"
817 " <instance>default</instance>\n"
818 " <instance>specific</instance>\n"
819 " </interface>\n"
820 " </hal>\n"
821 " <hal format=\"hidl\">\n"
822 " <name>android.hardware.foo</name>\n"
823 " <transport>hwbinder</transport>\n"
824 " <version>2.0</version>\n"
825 " <interface>\n"
826 " <name>IBar</name>\n"
827 " <instance>default</instance>\n"
828 " </interface>\n"
829 " </hal>\n"
830 " <sepolicy>\n"
831 " <version>25.5</version>\n"
832 " </sepolicy>\n"
833 "</manifest>\n";
834
835 HalManifest manifest;
836 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
837 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
838 }
839
840 {
841 std::string manifestXml =
842 "<manifest version=\"1.0\" type=\"device\">\n"
843 " <hal format=\"hidl\">\n"
844 " <name>android.hardware.foo</name>\n"
845 " <transport>hwbinder</transport>\n"
846 " <version>1.0</version>\n"
847 " <interface>\n"
848 " <name>IFoo</name>\n"
849 " <instance>default</instance>\n"
850 " <instance>specific</instance>\n"
851 " </interface>\n"
852 " </hal>\n"
853 " <sepolicy>\n"
854 " <version>25.5</version>\n"
855 " </sepolicy>\n"
856 "</manifest>\n";
857 HalManifest manifest;
858 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
859 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
860 << "should not be compatible because IBar is missing";
861 }
862
863 {
864 std::string manifestXml =
865 "<manifest version=\"1.0\" type=\"device\">\n"
866 " <hal format=\"hidl\">\n"
867 " <name>android.hardware.foo</name>\n"
868 " <transport>hwbinder</transport>\n"
869 " <version>1.0</version>\n"
870 " <interface>\n"
871 " <name>IFoo</name>\n"
872 " <instance>default</instance>\n"
873 " </interface>\n"
874 " </hal>\n"
875 " <hal format=\"hidl\">\n"
876 " <name>android.hardware.foo</name>\n"
877 " <transport>hwbinder</transport>\n"
878 " <version>2.0</version>\n"
879 " <interface>\n"
880 " <name>IBar</name>\n"
881 " <instance>default</instance>\n"
882 " </interface>\n"
883 " </hal>\n"
884 " <sepolicy>\n"
885 " <version>25.5</version>\n"
886 " </sepolicy>\n"
887 "</manifest>\n";
888 HalManifest manifest;
889 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
890 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
891 << "should not be compatible because IFoo/default is missing";
892 }
893
894 {
895 std::string manifestXml =
896 "<manifest version=\"1.0\" type=\"device\">\n"
897 " <hal format=\"hidl\">\n"
898 " <name>android.hardware.foo</name>\n"
899 " <transport>hwbinder</transport>\n"
900 " <version>3.3</version>\n"
901 " <interface>\n"
902 " <name>IFoo</name>\n"
903 " <instance>default</instance>\n"
904 " <instance>specific</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>2.0</version>\n"
911 " <interface>\n"
912 " <name>IBar</name>\n"
913 " <instance>default</instance>\n"
914 " </interface>\n"
915 " </hal>\n"
916 " <sepolicy>\n"
917 " <version>25.5</version>\n"
918 " </sepolicy>\n"
919 "</manifest>\n";
920 HalManifest manifest;
921 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
922 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
923 }
924
925 {
926 std::string manifestXml =
927 "<manifest version=\"1.0\" type=\"device\">\n"
928 " <hal format=\"hidl\">\n"
929 " <name>android.hardware.foo</name>\n"
930 " <transport>hwbinder</transport>\n"
931 " <version>1.0</version>\n"
932 " <interface>\n"
933 " <name>IFoo</name>\n"
934 " <instance>default</instance>\n"
935 " </interface>\n"
936 " </hal>\n"
937 " <hal format=\"hidl\">\n"
938 " <name>android.hardware.foo</name>\n"
939 " <transport>hwbinder</transport>\n"
940 " <version>3.2</version>\n"
941 " <interface>\n"
942 " <name>IFoo</name>\n"
943 " <instance>specific</instance>\n"
944 " </interface>\n"
945 " </hal>\n"
946 " <hal format=\"hidl\">\n"
947 " <name>android.hardware.foo</name>\n"
948 " <transport>hwbinder</transport>\n"
949 " <version>2.0</version>\n"
950 " <interface>\n"
951 " <name>IBar</name>\n"
952 " <instance>default</instance>\n"
953 " </interface>\n"
954 " </hal>\n"
955 " <sepolicy>\n"
956 " <version>25.5</version>\n"
957 " </sepolicy>\n"
958 "</manifest>\n";
959 HalManifest manifest;
960 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
961 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
962 << "should not be compatible even though @1.0::IFoo/default "
963 << "and @3.2::IFoo/specific present";
964 }
965
966 {
967 std::string manifestXml =
968 "<manifest version=\"1.0\" type=\"device\">\n"
969 " <hal format=\"hidl\">\n"
970 " <name>android.hardware.foo</name>\n"
971 " <transport>hwbinder</transport>\n"
972 " <version>1.0</version>\n"
973 " <interface>\n"
974 " <name>IFoo</name>\n"
975 " <instance>default</instance>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -0700976 " <instance>specific</instance>\n"
977 " </interface>\n"
978 " </hal>\n"
979 " <hal format=\"hidl\">\n"
980 " <name>android.hardware.foo</name>\n"
981 " <transport>hwbinder</transport>\n"
982 " <version>2.0</version>\n"
983 " <interface>\n"
984 " <name>IBar</name>\n"
985 " <instance>default</instance>\n"
986 " </interface>\n"
987 " </hal>\n"
988 " <sepolicy>\n"
989 " <version>25.5</version>\n"
990 " </sepolicy>\n"
991 "</manifest>\n";
992 HalManifest manifest;
Yifan Hong79dcc1f2017-05-22 14:35:19 -0700993 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml))
994 << gHalManifestConverter.lastError();
995 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
Yifan Hong08e984c2017-05-18 12:50:04 -0700996 }
997}
998
Yifan Hongd0cbf1f2017-04-12 19:47:06 -0700999TEST_F(LibVintfTest, Compat) {
1000 std::string manifestXml =
1001 "<manifest version=\"1.0\" type=\"device\">\n"
1002 " <hal format=\"hidl\">\n"
1003 " <name>android.hardware.camera</name>\n"
1004 " <transport>hwbinder</transport>\n"
1005 " <version>3.5</version>\n"
1006 " <interface>\n"
1007 " <name>IBetterCamera</name>\n"
1008 " <instance>camera</instance>\n"
1009 " </interface>\n"
1010 " <interface>\n"
1011 " <name>ICamera</name>\n"
1012 " <instance>default</instance>\n"
1013 " <instance>legacy/0</instance>\n"
1014 " </interface>\n"
1015 " </hal>\n"
1016 " <hal format=\"hidl\">\n"
1017 " <name>android.hardware.nfc</name>\n"
1018 " <transport>hwbinder</transport>\n"
1019 " <version>1.0</version>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001020 " <interface>\n"
1021 " <name>INfc</name>\n"
1022 " <instance>nfc_nci</instance>\n"
1023 " </interface>\n"
1024 " </hal>\n"
1025 " <hal format=\"hidl\">\n"
1026 " <name>android.hardware.nfc</name>\n"
1027 " <transport>hwbinder</transport>\n"
1028 " <version>2.0</version>\n"
1029 " <interface>\n"
1030 " <name>INfc</name>\n"
1031 " <instance>default</instance>\n"
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001032 " <instance>nfc_nci</instance>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001033 " </interface>\n"
1034 " </hal>\n"
1035 " <sepolicy>\n"
1036 " <version>25.5</version>\n"
1037 " </sepolicy>\n"
1038 "</manifest>\n";
1039
1040 std::string matrixXml =
1041 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1042 " <hal format=\"hidl\" optional=\"false\">\n"
1043 " <name>android.hardware.camera</name>\n"
1044 " <version>2.0-5</version>\n"
1045 " <version>3.4-16</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001046 " <interface>\n"
1047 " <name>IBetterCamera</name>\n"
1048 " <instance>camera</instance>\n"
1049 " </interface>\n"
1050 " <interface>\n"
1051 " <name>ICamera</name>\n"
1052 " <instance>default</instance>\n"
1053 " <instance>legacy/0</instance>\n"
1054 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001055 " </hal>\n"
1056 " <hal format=\"hidl\" optional=\"false\">\n"
1057 " <name>android.hardware.nfc</name>\n"
1058 " <version>1.0</version>\n"
1059 " <version>2.0</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001060 " <interface>\n"
1061 " <name>INfc</name>\n"
1062 " <instance>nfc_nci</instance>\n"
1063 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001064 " </hal>\n"
1065 " <hal format=\"hidl\" optional=\"true\">\n"
1066 " <name>android.hardware.foo</name>\n"
1067 " <version>1.0</version>\n"
1068 " </hal>\n"
1069 " <sepolicy>\n"
1070 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1071 " <sepolicy-version>25.5</sepolicy-version>\n"
1072 " <sepolicy-version>26.0-3</sepolicy-version>\n"
1073 " </sepolicy>\n"
1074 " <avb>\n"
1075 " <vbmeta-version>2.1</vbmeta-version>\n"
1076 " </avb>\n"
1077 "</compatibility-matrix>\n";
1078
1079 HalManifest manifest;
1080 CompatibilityMatrix matrix;
1081 std::string error;
1082 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1083 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1084 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1085
1086 // some smaller test cases
1087 matrixXml =
1088 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1089 " <hal format=\"hidl\" optional=\"false\">\n"
1090 " <name>android.hardware.camera</name>\n"
1091 " <version>3.4</version>\n"
1092 " </hal>\n"
1093 " <sepolicy>\n"
1094 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1095 " <sepolicy-version>25.5</sepolicy-version>\n"
1096 " </sepolicy>\n"
1097 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1098 "</compatibility-matrix>\n";
1099 matrix = {};
1100 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1101 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1102 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
1103 EXPECT_NE(camera, nullptr);
1104 camera->versionRanges[0] = {3, 5};
1105 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1106 camera->versionRanges[0] = {3, 6};
1107 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1108
1109 // reset it
1110 matrix = {};
1111 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1112 set(matrix, Sepolicy{30, {{26, 0}}});
1113 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1114 set(matrix, Sepolicy{30, {{25, 6}}});
1115 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1116 set(matrix, Sepolicy{30, {{25, 4}}});
1117 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1118}
1119
Yifan Hongd4857902017-06-13 14:13:56 -07001120/////////////////// xmlfile tests
1121
1122TEST_F(LibVintfTest, HalManifestConverterXmlFile) {
1123 HalManifest vm = testDeviceManifestWithXmlFile();
1124 std::string xml = gHalManifestConverter(vm);
1125 EXPECT_EQ(xml,
1126 "<manifest version=\"1.0\" type=\"device\">\n"
1127 " <hal format=\"hidl\">\n"
1128 " <name>android.hardware.camera</name>\n"
1129 " <transport>hwbinder</transport>\n"
1130 " <version>2.0</version>\n"
1131 " <interface>\n"
1132 " <name>IBetterCamera</name>\n"
1133 " <instance>camera</instance>\n"
1134 " </interface>\n"
1135 " <interface>\n"
1136 " <name>ICamera</name>\n"
1137 " <instance>default</instance>\n"
1138 " <instance>legacy/0</instance>\n"
1139 " </interface>\n"
1140 " </hal>\n"
1141 " <hal format=\"hidl\">\n"
1142 " <name>android.hardware.nfc</name>\n"
1143 " <transport arch=\"32+64\">passthrough</transport>\n"
1144 " <version>1.0</version>\n"
1145 " <interface>\n"
1146 " <name>INfc</name>\n"
1147 " <instance>default</instance>\n"
1148 " </interface>\n"
1149 " </hal>\n"
1150 " <sepolicy>\n"
1151 " <version>25.0</version>\n"
1152 " </sepolicy>\n"
1153 " <xmlfile>\n"
1154 " <name>media_profile</name>\n"
1155 " <version>1.0</version>\n"
1156 " </xmlfile>\n"
1157 "</manifest>\n");
1158 HalManifest vm2;
1159 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
1160 EXPECT_EQ(vm, vm2);
1161}
1162
1163TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile) {
1164 CompatibilityMatrix cm;
1165 addXmlFile(cm, "media_profile", {1, 0});
1166 std::string xml = gCompatibilityMatrixConverter(cm);
1167 EXPECT_EQ(xml,
1168 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1169 " <sepolicy>\n"
1170 " <kernel-sepolicy-version>0</kernel-sepolicy-version>\n"
1171 " </sepolicy>\n"
1172 " <avb>\n"
1173 " <vbmeta-version>0.0</vbmeta-version>\n"
1174 " </avb>\n"
1175 " <xmlfile format=\"dtd\" optional=\"true\">\n"
1176 " <name>media_profile</name>\n"
1177 " <version>1.0</version>\n"
1178 " </xmlfile>\n"
1179 "</compatibility-matrix>\n");
1180 CompatibilityMatrix cm2;
1181 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
1182 EXPECT_EQ(cm, cm2);
1183}
1184
1185TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile2) {
1186 std::string xml =
1187 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1188 " <xmlfile format=\"dtd\" optional=\"false\">\n"
1189 " <name>media_profile</name>\n"
1190 " <version>1.0</version>\n"
1191 " </xmlfile>\n"
1192 "</compatibility-matrix>\n";
1193 CompatibilityMatrix cm;
1194 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml));
1195 EXPECT_EQ(
1196 "compatibility-matrix.xmlfile entry media_profile has to be optional for "
1197 "compatibility matrix version 1.0",
1198 gCompatibilityMatrixConverter.lastError());
1199}
1200
Yifan Honga9993572017-01-24 19:33:15 -08001201} // namespace vintf
1202} // namespace android
1203
Yifan Hong676447a2016-11-15 12:57:23 -08001204int main(int argc, char **argv) {
1205 ::testing::InitGoogleTest(&argc, argv);
1206 return RUN_ALL_TESTS();
1207}