blob: ce3a656c3cea8edbc87d95a29356aef156b2cd32 [file] [log] [blame]
Yifan Hong676447a2016-11-15 12:57:23 -08001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Yifan Honge4770332017-12-20 10:44:07 -080017#define LOG_TAG "LibVintfTest"
Yifan Hong676447a2016-11-15 12:57:23 -080018
Yifan Hongd8cee082017-07-05 16:06:09 -070019#include <algorithm>
Yifan Hong398f4c72017-04-13 20:18:01 -070020#include <functional>
21
Yifan Hongd8cee082017-07-05 16:06:09 -070022#include <vintf/CompatibilityMatrix.h>
23#include <vintf/KernelConfigParser.h>
24#include <vintf/VintfObject.h>
Yifan Hong676447a2016-11-15 12:57:23 -080025#include <vintf/parse_string.h>
26#include <vintf/parse_xml.h>
Yifan Hong676447a2016-11-15 12:57:23 -080027
28#include <android-base/logging.h>
Yifan Hong3f5489a2017-02-08 11:14:21 -080029#include <android-base/parseint.h>
Yifan Hong676447a2016-11-15 12:57:23 -080030#include <gtest/gtest.h>
31
Yifan Honga9993572017-01-24 19:33:15 -080032namespace android {
33namespace vintf {
Yifan Hong676447a2016-11-15 12:57:23 -080034
Yifan Hong94757062018-02-09 16:36:31 -080035extern XmlConverter<Version>& gVersionConverter;
36extern XmlConverter<ManifestHal>& gManifestHalConverter;
37extern XmlConverter<MatrixHal>& gMatrixHalConverter;
38extern XmlConverter<KernelConfigTypedValue>& gKernelConfigTypedValueConverter;
39extern XmlConverter<HalManifest>& gHalManifestConverter;
40extern XmlConverter<CompatibilityMatrix>& gCompatibilityMatrixConverter;
Yifan Hong4a5eb7b2017-02-16 18:19:26 -080041
Yifan Hongfeb454e2018-01-09 16:16:40 -080042static bool In(const std::string& sub, const std::string& str) {
Yifan Hongd9e46432017-08-15 17:14:52 -070043 return str.find(sub) != std::string::npos;
44}
Yifan Hongfeb454e2018-01-09 16:16:40 -080045#define EXPECT_IN(sub, str) EXPECT_TRUE(In((sub), (str))) << (str);
46
Yifan Hong6bce1a62018-01-31 13:30:04 -080047#ifndef LIBVINTF_TARGET
Yifan Hongfeb454e2018-01-09 16:16:40 -080048#define EXPECT_CONTAINS(str, sub) EXPECT_IN(sub, str);
Yifan Honga67b2092017-10-09 13:24:54 -070049#endif
Yifan Hongd9e46432017-08-15 17:14:52 -070050
Yifan Honga9993572017-01-24 19:33:15 -080051struct LibVintfTest : public ::testing::Test {
Yifan Hong676447a2016-11-15 12:57:23 -080052public:
53 virtual void SetUp() override {
54 }
55 virtual void TearDown() override {
56 }
Yifan Honga9993572017-01-24 19:33:15 -080057 bool add(CompatibilityMatrix &cm, MatrixHal &&hal) {
58 return cm.add(std::move(hal));
59 }
60 bool add(CompatibilityMatrix &cm, MatrixKernel &&kernel) {
61 return cm.add(std::move(kernel));
62 }
Yifan Hongd2b7e642017-02-17 10:15:32 -080063 bool add(HalManifest &vm, ManifestHal &&hal) {
Yifan Honga9993572017-01-24 19:33:15 -080064 return vm.add(std::move(hal));
65 }
Yifan Hongd4857902017-06-13 14:13:56 -070066 void addXmlFile(CompatibilityMatrix& cm, std::string name, VersionRange range) {
67 MatrixXmlFile f;
68 f.mName = name;
69 f.mVersionRange = range;
70 f.mFormat = XmlSchemaFormat::DTD;
71 f.mOptional = true;
72 cm.addXmlFile(std::move(f));
73 }
Yifan Hong558380a2017-02-09 15:37:32 -080074 void set(CompatibilityMatrix &cm, Sepolicy &&sepolicy) {
Yifan Hong7c7d7062017-04-04 16:26:51 -070075 cm.framework.mSepolicy = sepolicy;
Yifan Hong558380a2017-02-09 15:37:32 -080076 }
Yifan Hong03d2d4a2017-04-12 17:34:14 -070077 void set(CompatibilityMatrix &cm, SchemaType type) {
78 cm.mType = type;
79 }
80 void set(CompatibilityMatrix &cm, VndkVersionRange &&range, std::set<std::string> &&libs) {
81 cm.device.mVndk.mVersionRange = range;
82 cm.device.mVndk.mLibraries = libs;
83 }
Yifan Hong881a9e452017-04-27 19:31:13 -070084 void setAvb(RuntimeInfo &ki, Version vbmeta, Version boot) {
85 ki.mBootVbmetaAvbVersion = vbmeta;
86 ki.mBootAvbVersion = boot;
Yifan Hongf3029302017-04-12 17:23:49 -070087 }
88 void setAvb(CompatibilityMatrix &cm, Version &&avbVersion) {
89 cm.framework.mAvbMetaVersion = avbVersion;
90 }
Yifan Hong19e0a2a2017-04-14 17:30:53 -070091 Version getAvb(CompatibilityMatrix &cm) {
92 return cm.framework.mAvbMetaVersion;
93 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070094 const ManifestHal *getAnyHal(HalManifest &vm, const std::string &name) {
95 return vm.getAnyHal(name);
Yifan Honga9993572017-01-24 19:33:15 -080096 }
Yifan Hongd0cbf1f2017-04-12 19:47:06 -070097 MatrixHal *getAnyHal(CompatibilityMatrix &cm, const std::string &name) {
98 return cm.getAnyHal(name);
99 }
Yifan Hong9bbdb282017-04-12 21:53:59 -0700100 ConstMultiMapValueIterable<std::string, ManifestHal> getHals(HalManifest &vm) {
Yifan Honga9993572017-01-24 19:33:15 -0800101 return vm.getHals();
102 }
Yifan Hong5a06ef72017-01-24 19:54:24 -0800103 bool isValid(const ManifestHal &mh) {
104 return mh.isValid();
105 }
Yifan Hong5f996502017-08-23 14:46:44 -0700106 std::vector<MatrixKernel>& getKernels(CompatibilityMatrix& cm) { return cm.framework.mKernels; }
Yifan Hongdbe9db32017-12-11 19:06:11 -0800107 bool addAllHalsAsOptional(CompatibilityMatrix* cm1, CompatibilityMatrix* cm2, std::string* e) {
108 return cm1->addAllHalsAsOptional(cm2, e);
109 }
Yifan Hongd4b92fe2017-12-20 15:29:03 -0800110 bool addAllXmlFilesAsOptional(CompatibilityMatrix* cm1, CompatibilityMatrix* cm2,
111 std::string* e) {
112 return cm1->addAllXmlFilesAsOptional(cm2, e);
113 }
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700114
115 std::map<std::string, HalInterface> testHalInterfaces() {
116 HalInterface intf;
117 intf.name = "IFoo";
118 intf.instances.insert("default");
119 std::map<std::string, HalInterface> map;
120 map[intf.name] = intf;
121 return map;
122 }
123
Yifan Honga04e1472017-04-05 13:15:34 -0700124 HalManifest testDeviceManifest() {
Yifan Hongd2b7e642017-02-17 10:15:32 -0800125 HalManifest vm;
Yifan Hong7c7d7062017-04-04 16:26:51 -0700126 vm.mType = SchemaType::DEVICE;
Yifan Hong2a3dd082017-04-04 17:15:35 -0700127 vm.device.mSepolicyVersion = {25, 0};
Yifan Hong2059ffc2017-02-24 11:32:02 -0800128 vm.add(ManifestHal{
129 .format = HalFormat::HIDL,
130 .name = "android.hardware.camera",
131 .versions = {Version(2, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800132 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800133 .interfaces = {
134 {"ICamera", {"ICamera", {"legacy/0", "default"}}},
135 {"IBetterCamera", {"IBetterCamera", {"camera"}}}
136 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800137 });
138 vm.add(ManifestHal{
139 .format = HalFormat::HIDL,
140 .name = "android.hardware.nfc",
141 .versions = {Version(1, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800142 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800143 .interfaces = {
144 {"INfc", {"INfc", {"default"}}}
145 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800146 });
Yifan Honga9993572017-01-24 19:33:15 -0800147
148 return vm;
149 }
Yifan Hongd4857902017-06-13 14:13:56 -0700150 HalManifest testDeviceManifestWithXmlFile() {
151 HalManifest vm = testDeviceManifest();
152 ManifestXmlFile xmlFile;
153 xmlFile.mName = "media_profile";
154 xmlFile.mVersion = {1, 0};
155 vm.addXmlFile(std::move(xmlFile));
156 return vm;
157 }
Yifan Honga04e1472017-04-05 13:15:34 -0700158 HalManifest testFrameworkManfiest() {
159 HalManifest vm;
160 vm.mType = SchemaType::FRAMEWORK;
161 vm.add(ManifestHal{
162 .format = HalFormat::HIDL,
163 .name = "android.hidl.manager",
164 .versions = {Version(1, 0)},
165 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
166 .interfaces = {
167 {"IServiceManager", {"IServiceManager", {"default"}}},
168 }
169 });
170 Vndk vndk2505;
171 vndk2505.mVersionRange = {25, 0, 5};
172 vndk2505.mLibraries = { "libjpeg.so", "libbase.so" };
173 Vndk vndk2513;
174 vndk2513.mVersionRange = {25, 1, 3};
175 vndk2513.mLibraries = { "libjpeg.so", "libbase.so", "libtinyxml2.so" };
176 vm.framework.mVndks = { std::move(vndk2505), std::move(vndk2513) };
177
178 return vm;
179 }
Yifan Honga7201e72017-02-17 10:09:59 -0800180 RuntimeInfo testRuntimeInfo() {
181 RuntimeInfo info;
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800182 info.mOsName = "Linux";
183 info.mNodeName = "localhost";
184 info.mOsRelease = "3.18.31-g936f9a479d0f";
185 info.mKernelVersion = {3, 18, 31};
186 info.mOsVersion = "#4 SMP PREEMPT Wed Feb 1 18:10:52 PST 2017";
187 info.mHardwareId = "aarch64";
188 info.mKernelSepolicyVersion = 30;
Yifan Hongf1af7522017-02-16 18:00:55 -0800189 info.mKernelConfigs = {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800190 {"CONFIG_64BIT", "y"},
191 {"CONFIG_ANDROID_BINDER_DEVICES", "\"binder,hwbinder\""},
192 {"CONFIG_ARCH_MMAP_RND_BITS", "24"},
193 {"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", "\"\""},
194 {"CONFIG_ILLEGAL_POINTER_VALUE", "0xdead000000000000"}
195 };
Yifan Hong881a9e452017-04-27 19:31:13 -0700196 setAvb(info, {2, 1}, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800197 return info;
198 }
Yifan Hong676447a2016-11-15 12:57:23 -0800199};
200
Yifan Hongd5cd0482017-06-19 12:25:48 -0700201TEST_F(LibVintfTest, ArchOperatorOr) {
202 Arch a = Arch::ARCH_EMPTY;
203 a |= Arch::ARCH_32;
204 EXPECT_EQ(Arch::ARCH_32, a);
205
206 a |= Arch::ARCH_64;
207 EXPECT_EQ(Arch::ARCH_32_64, a);
208
209 a = Arch::ARCH_EMPTY;
210 a |= Arch::ARCH_64;
211 EXPECT_EQ(Arch::ARCH_64, a);
212}
Yifan Hongef6d4d32017-01-23 14:12:28 -0800213
214TEST_F(LibVintfTest, Stringify) {
Yifan Honga04e1472017-04-05 13:15:34 -0700215 HalManifest vm = testDeviceManifest();
Yifan Hong974ad9c2017-04-04 15:37:39 -0700216 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/2.0:"
217 "hidl/android.hardware.nfc/passthrough32+64/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -0800218
219 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
220 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
221
222 VersionRange v(1, 2, 3);
223 EXPECT_EQ(to_string(v), "1.2-3");
224 VersionRange v2;
225 EXPECT_TRUE(parse("1.2-3", &v2));
226 EXPECT_EQ(v, v2);
227}
228
Yifan Hong9bbdb282017-04-12 21:53:59 -0700229TEST_F(LibVintfTest, GetTransport) {
230 HalManifest vm = testDeviceManifest();
231 EXPECT_EQ(Transport::HWBINDER, vm.getTransport("android.hardware.camera",
232 {2, 0}, "ICamera", "default"));
233}
234
Steven Morelanddd135ec2018-01-22 16:37:34 -0800235TEST_F(LibVintfTest, FutureManifestCompatible) {
236 HalManifest expectedManifest;
237 expectedManifest.add(ManifestHal{.format = HalFormat::HIDL,
238 .name = "android.hardware.foo",
239 .versions = {Version(1, 0)},
240 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
241 .interfaces = {
242 {"IFoo", {"IFoo", {"default"}}},
243 }});
244 std::string manifestXml =
245 "<manifest version=\"1.0\" type=\"device\" might_add=\"true\">\n"
246 " <hal format=\"hidl\" attribuet_might_be_added=\"value\">\n"
247 " <name>android.hardware.foo</name>\n"
248 " <transport>hwbinder</transport>\n"
249 " <version>1.0</version>\n"
250 " <interface>\n"
251 " <name>IFoo</name>\n"
252 " <instance>default</instance>\n"
253 " </interface>\n"
254 " </hal>\n"
255 " <tag_might_be_added/>\n"
256 "</manifest>\n";
257 HalManifest manifest;
258 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
259 EXPECT_EQ(expectedManifest, manifest);
260}
261
Yifan Hongd2b7e642017-02-17 10:15:32 -0800262TEST_F(LibVintfTest, HalManifestConverter) {
Yifan Honga04e1472017-04-05 13:15:34 -0700263 HalManifest vm = testDeviceManifest();
Yifan Hongd2b7e642017-02-17 10:15:32 -0800264 std::string xml = gHalManifestConverter(vm);
Yifan Hong676447a2016-11-15 12:57:23 -0800265 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700266 "<manifest version=\"1.0\" type=\"device\">\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800267 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800268 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800269 " <transport>hwbinder</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800270 " <version>2.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800271 " <interface>\n"
272 " <name>IBetterCamera</name>\n"
273 " <instance>camera</instance>\n"
274 " </interface>\n"
275 " <interface>\n"
276 " <name>ICamera</name>\n"
277 " <instance>default</instance>\n"
278 " <instance>legacy/0</instance>\n"
279 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800280 " </hal>\n"
281 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800282 " <name>android.hardware.nfc</name>\n"
Yifan Hongc54d32c2017-03-07 19:12:26 -0800283 " <transport arch=\"32+64\">passthrough</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800284 " <version>1.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800285 " <interface>\n"
286 " <name>INfc</name>\n"
287 " <instance>default</instance>\n"
288 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800289 " </hal>\n"
Yifan Hong2a3dd082017-04-04 17:15:35 -0700290 " <sepolicy>\n"
291 " <version>25.0</version>\n"
292 " </sepolicy>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800293 "</manifest>\n");
Yifan Hongfb7469c2017-04-05 19:15:21 -0700294 HalManifest vm2;
295 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
296 EXPECT_EQ(vm, vm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800297}
298
Yifan Honga04e1472017-04-05 13:15:34 -0700299TEST_F(LibVintfTest, HalManifestConverterFramework) {
300 HalManifest vm = testFrameworkManfiest();
301 std::string xml = gHalManifestConverter(vm);
302 EXPECT_EQ(xml,
303 "<manifest version=\"1.0\" type=\"framework\">\n"
304 " <hal format=\"hidl\">\n"
305 " <name>android.hidl.manager</name>\n"
306 " <transport>hwbinder</transport>\n"
307 " <version>1.0</version>\n"
308 " <interface>\n"
309 " <name>IServiceManager</name>\n"
310 " <instance>default</instance>\n"
311 " </interface>\n"
312 " </hal>\n"
313 " <vndk>\n"
314 " <version>25.0.5</version>\n"
315 " <library>libbase.so</library>\n"
316 " <library>libjpeg.so</library>\n"
317 " </vndk>\n"
318 " <vndk>\n"
319 " <version>25.1.3</version>\n"
320 " <library>libbase.so</library>\n"
321 " <library>libjpeg.so</library>\n"
322 " <library>libtinyxml2.so</library>\n"
323 " </vndk>\n"
324 "</manifest>\n");
325 HalManifest vm2;
326 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700327 EXPECT_EQ(vm, vm2);
Yifan Honga04e1472017-04-05 13:15:34 -0700328}
329
Yifan Hong8e9c6692017-02-28 14:07:42 -0800330TEST_F(LibVintfTest, HalManifestOptional) {
331 HalManifest vm;
332 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700333 "<manifest version=\"1.0\" type=\"device\"></manifest>"));
Yifan Hong8e9c6692017-02-28 14:07:42 -0800334 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700335 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800336 " <hal>"
337 " <name>android.hidl.manager</name>"
338 " <transport>hwbinder</transport>"
339 " <version>1.0</version>"
340 " </hal>"
341 "</manifest>"));
342 EXPECT_FALSE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700343 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800344 " <hal>"
345 " <name>android.hidl.manager</name>"
346 " <version>1.0</version>"
347 " </hal>"
348 "</manifest>"));
349}
350
Yifan Honge0bb98d2017-08-07 14:40:19 -0700351TEST_F(LibVintfTest, HalManifestNative) {
352 HalManifest vm;
353 EXPECT_TRUE(gHalManifestConverter(&vm,
354 "<manifest version=\"1.0\" type=\"device\">"
355 " <hal format=\"native\">"
356 " <name>foo</name>"
357 " <version>1.0</version>"
358 " </hal>"
359 "</manifest>"))
360 << gHalManifestConverter.lastError();
361 EXPECT_FALSE(gHalManifestConverter(&vm,
362 "<manifest version=\"1.0\" type=\"device\">"
363 " <hal format=\"native\">"
364 " <name>foo</name>"
365 " <version>1.0</version>"
366 " <transport>hwbinder</transport>"
367 " </hal>"
368 "</manifest>"));
369 EXPECT_TRUE(gHalManifestConverter.lastError().find(
370 "Native HAL 'foo' should not have <transport> defined") != std::string::npos);
371}
372
Yifan Hong79dcc1f2017-05-22 14:35:19 -0700373TEST_F(LibVintfTest, HalManifestDuplicate) {
374 HalManifest vm;
375 EXPECT_FALSE(gHalManifestConverter(&vm,
376 "<manifest version=\"1.0\" type=\"device\">"
377 " <hal>"
378 " <name>android.hidl.manager</name>"
379 " <transport>hwbinder</transport>"
380 " <version>1.0</version>"
381 " <version>1.1</version>"
382 " </hal>"
383 "</manifest>"))
384 << "Should not allow duplicated major version in <hal>";
385 EXPECT_FALSE(gHalManifestConverter(&vm,
386 "<manifest version=\"1.0\" type=\"device\">"
387 " <hal>"
388 " <name>android.hidl.manager</name>"
389 " <transport>hwbinder</transport>"
390 " <version>1.0</version>"
391 " </hal>"
392 " <hal>"
393 " <name>android.hidl.manager</name>"
394 " <transport arch=\"32+64\">passthrough</transport>"
395 " <version>1.1</version>"
396 " </hal>"
397 "</manifest>"))
398 << "Should not allow duplicated major version across <hal>";
399}
400
401TEST_F(LibVintfTest, HalManifestGetTransport) {
402 HalManifest vm;
403 EXPECT_TRUE(gHalManifestConverter(&vm,
404 "<manifest version=\"1.0\" type=\"device\">"
405 " <hal>"
406 " <name>android.hidl.manager</name>"
407 " <transport>hwbinder</transport>"
408 " <version>1.0</version>"
409 " <interface>"
410 " <name>IServiceManager</name>"
411 " <instance>default</instance>"
412 " </interface>"
413 " </hal>"
414 " <hal>"
415 " <name>android.hidl.manager</name>"
416 " <transport arch=\"32+64\">passthrough</transport>"
417 " <version>2.1</version>"
418 " <interface>"
419 " <name>IServiceManager</name>"
420 " <instance>default</instance>"
421 " </interface>"
422 " </hal>"
423 "</manifest>"));
424 EXPECT_EQ(Transport::PASSTHROUGH,
425 vm.getTransport("android.hidl.manager", {2, 1}, "IServiceManager", "default"));
426 EXPECT_EQ(Transport::PASSTHROUGH,
427 vm.getTransport("android.hidl.manager", {2, 0}, "IServiceManager", "default"));
428 EXPECT_EQ(Transport::EMPTY,
429 vm.getTransport("android.hidl.manager", {2, 2}, "IServiceManager", "default"));
430 EXPECT_EQ(Transport::HWBINDER,
431 vm.getTransport("android.hidl.manager", {1, 0}, "IServiceManager", "default"));
432}
433
Yifan Hongec3b9b72017-02-23 13:24:42 -0800434TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700435 HalManifest vm = testDeviceManifest();
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700436 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "ICamera"),
437 std::set<std::string>({"default", "legacy/0"}));
438 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "IBetterCamera"),
439 std::set<std::string>({"camera"}));
440 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "INotExist"),
441 std::set<std::string>({}));
442 EXPECT_EQ(vm.getInstances("android.hardware.nfc", {1, 0}, "INfc"),
443 std::set<std::string>({"default"}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800444
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700445 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "default"));
446 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "legacy/0"));
447 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "camera"));
448 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", {1, 0}, "INfc", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800449
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700450 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "INotExist", "default"));
451 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "notexist"));
452 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "default"));
453 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "INotExist", "notexist"));
454 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", {1, 0}, "INfc", "notexist"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800455}
456
Yifan Hong676447a2016-11-15 12:57:23 -0800457TEST_F(LibVintfTest, VersionConverter) {
458 Version v(3, 6);
459 std::string xml = gVersionConverter(v);
460 EXPECT_EQ(xml, "<version>3.6</version>\n");
461 Version v2;
462 EXPECT_TRUE(gVersionConverter(&v2, xml));
463 EXPECT_EQ(v, v2);
464}
465
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700466static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
467 std::string name{intf.name};
468 return map->emplace(std::move(name), std::move(intf)).second;
469}
470
Yifan Hong676447a2016-11-15 12:57:23 -0800471TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800472 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800473 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700474 false /* optional */, {}};
475 EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
476 EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800477 std::string xml = gMatrixHalConverter(mh);
478 EXPECT_EQ(xml,
479 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800480 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800481 " <version>1.2-3</version>\n"
482 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700483 " <interface>\n"
484 " <name>IBetterCamera</name>\n"
485 " <instance>default</instance>\n"
486 " <instance>great</instance>\n"
487 " </interface>\n"
488 " <interface>\n"
489 " <name>ICamera</name>\n"
490 " <instance>default</instance>\n"
491 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800492 "</hal>\n");
493 MatrixHal mh2;
494 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
495 EXPECT_EQ(mh, mh2);
496}
497
Yifan Hong3f5489a2017-02-08 11:14:21 -0800498TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
499
500 KernelConfigTypedValue converted;
501
502 auto testOne = [] (const KernelConfigTypedValue &original,
503 const std::string &expectXml) {
504 std::string xml;
505 KernelConfigTypedValue converted;
506 xml = gKernelConfigTypedValueConverter(original);
507 EXPECT_EQ(xml, expectXml);
508 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
509 EXPECT_EQ(original, converted);
510 };
511
512 auto testParse = [] (const KernelConfigTypedValue &original,
513 const std::string &xml) {
514 KernelConfigTypedValue converted;
515 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
516 EXPECT_EQ(original, converted);
517 };
518
519 testOne(KernelConfigTypedValue("stringvalue"),
520 "<value type=\"string\">stringvalue</value>\n");
521 testOne(KernelConfigTypedValue(""),
522 "<value type=\"string\"></value>\n");
523
524 testOne(KernelConfigTypedValue(Tristate::YES),
525 "<value type=\"tristate\">y</value>\n");
526 testOne(KernelConfigTypedValue(Tristate::NO),
527 "<value type=\"tristate\">n</value>\n");
528 testOne(KernelConfigTypedValue(Tristate::MODULE),
529 "<value type=\"tristate\">m</value>\n");
530 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
531 "<value type=\"tristate\">q</value>\n"));
532
533 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
534 "<value type=\"range\">4-20</value>\n");
535 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
536 "<value type=\"range\">0-18446744073709551615</value>\n");
537 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
538 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
539
540 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
541 "<value type=\"int\">-18446744073709551616</value>\n"));
542
543 testOne(KernelConfigTypedValue(INT64_MIN),
544 "<value type=\"int\">-9223372036854775808</value>\n");
545 testParse(KernelConfigTypedValue(INT64_MIN),
546 "<value type=\"int\">0x8000000000000000</value>\n");
547 testParse(KernelConfigTypedValue(INT64_MIN),
548 "<value type=\"int\">-0X8000000000000000</value>\n");
549
550 testParse(KernelConfigTypedValue(INT64_MIN + 1),
551 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
552
553 testParse(KernelConfigTypedValue(-0x50),
554 "<value type=\"int\">-0x50</value>\n");
555
556 testOne(KernelConfigTypedValue(0),
557 "<value type=\"int\">0</value>\n");
558
559 // Truncation for underflow.
560 testParse(KernelConfigTypedValue(1),
561 "<value type=\"int\">-0xffffffffffffffff</value>\n");
562 testParse(KernelConfigTypedValue(1),
563 "<value type=\"int\">-18446744073709551615</value>\n");
564
565 testOne(KernelConfigTypedValue(INT64_MAX),
566 "<value type=\"int\">9223372036854775807</value>\n");
567 testParse(KernelConfigTypedValue(INT64_MAX),
568 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
569 // Truncation for underflow.
570 testParse(KernelConfigTypedValue(INT64_MAX),
571 "<value type=\"int\">-9223372036854775809</value>\n");
572
573 testParse(KernelConfigTypedValue(-1),
574 "<value type=\"int\">18446744073709551615</value>\n");
575 testParse(KernelConfigTypedValue(-1),
576 "<value type=\"int\">0xffffffffffffffff</value>\n");
577
578 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
579 "<value type=\"int\">18446744073709551616</value>\n"));
580}
581
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700582TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
Yifan Hong676447a2016-11-15 12:57:23 -0800583 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800584 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800585 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700586 false /* optional */, testHalInterfaces()}));
Yifan Honga9993572017-01-24 19:33:15 -0800587 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800588 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700589 true /* optional */, testHalInterfaces()}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800590 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
591 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
592 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
593 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700594 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700595 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800596 std::string xml = gCompatibilityMatrixConverter(cm);
597 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700598 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800599 " <hal format=\"native\" optional=\"false\">\n"
600 " <name>android.hardware.camera</name>\n"
601 " <version>1.2-3</version>\n"
602 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700603 " <interface>\n"
604 " <name>IFoo</name>\n"
605 " <instance>default</instance>\n"
606 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800607 " </hal>\n"
608 " <hal format=\"native\" optional=\"true\">\n"
609 " <name>android.hardware.nfc</name>\n"
610 " <version>4.5-6</version>\n"
611 " <version>10.11-12</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700612 " <interface>\n"
613 " <name>IFoo</name>\n"
614 " <instance>default</instance>\n"
615 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800616 " </hal>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800617 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800618 " <config>\n"
619 " <key>CONFIG_FOO</key>\n"
620 " <value type=\"tristate\">y</value>\n"
621 " </config>\n"
622 " <config>\n"
623 " <key>CONFIG_BAR</key>\n"
624 " <value type=\"string\">stringvalue</value>\n"
625 " </config>\n"
626 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800627 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800628 " <config>\n"
629 " <key>CONFIG_BAZ</key>\n"
630 " <value type=\"int\">20</value>\n"
631 " </config>\n"
632 " <config>\n"
633 " <key>CONFIG_BAR</key>\n"
634 " <value type=\"range\">3-5</value>\n"
635 " </config>\n"
636 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800637 " <sepolicy>\n"
638 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700639 " <sepolicy-version>25.0</sepolicy-version>\n"
640 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800641 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700642 " <avb>\n"
643 " <vbmeta-version>2.1</vbmeta-version>\n"
644 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800645 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800646 CompatibilityMatrix cm2;
647 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700648 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800649}
650
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700651TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
652 CompatibilityMatrix cm;
653 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
654 {{VersionRange(1,0)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700655 false /* optional */, testHalInterfaces()}));
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700656 set(cm, SchemaType::DEVICE);
657 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
658 std::string xml = gCompatibilityMatrixConverter(cm);
659 EXPECT_EQ(xml,
660 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
661 " <hal format=\"native\" optional=\"false\">\n"
662 " <name>android.hidl.manager</name>\n"
663 " <version>1.0</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700664 " <interface>\n"
665 " <name>IFoo</name>\n"
666 " <instance>default</instance>\n"
667 " </interface>\n"
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700668 " </hal>\n"
669 " <vndk>\n"
670 " <version>25.0.1-5</version>\n"
671 " <library>libbase.so</library>\n"
672 " <library>libjpeg.so</library>\n"
673 " </vndk>\n"
674 "</compatibility-matrix>\n");
675 CompatibilityMatrix cm2;
676 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
677 EXPECT_EQ(cm, cm2);
678}
679
Yifan Hong676447a2016-11-15 12:57:23 -0800680TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800681 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800682
Yifan Hong2059ffc2017-02-24 11:32:02 -0800683 ManifestHal invalidHal{
684 .format = HalFormat::HIDL,
685 .name = "android.hardware.camera",
686 .versions = {{Version(2, 0), Version(2, 1)}},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800687 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64}
Yifan Hong2059ffc2017-02-24 11:32:02 -0800688 };
689
Yifan Hong5a06ef72017-01-24 19:54:24 -0800690 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800691 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800692 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800693}
694
Tri Vod0143942017-03-24 17:51:23 -0700695TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700696 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700697 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
698 {"android.hardware.camera", "android.hardware.nfc"}));
699}
700
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700701TEST_F(LibVintfTest, HalManifestGetAllHals) {
Yifan Honga04e1472017-04-05 13:15:34 -0700702 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700703 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
704 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800705
706 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
707 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800708 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800709 EXPECT_EQ(hal.name, arr[i++]);
710 }
711}
712
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700713TEST_F(LibVintfTest, HalManifestGetHals) {
714 HalManifest vm;
715 EXPECT_TRUE(
716 add(vm, ManifestHal{.format = HalFormat::HIDL,
717 .name = "android.hardware.camera",
718 .versions = {Version(1, 2)},
719 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
720 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
721 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}}));
722 EXPECT_TRUE(
723 add(vm, ManifestHal{.format = HalFormat::HIDL,
724 .name = "android.hardware.camera",
725 .versions = {Version(2, 0)},
726 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
727 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
728 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}}));
729 EXPECT_TRUE(add(vm, ManifestHal{.format = HalFormat::HIDL,
730 .name = "android.hardware.nfc",
731 .versions = {Version(1, 0), Version(2, 1)},
732 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
733 .interfaces = {{"INfc", {"INfc", {"default"}}}}}));
734 ManifestHal expectedCameraHalV1_2 =
735 ManifestHal{.format = HalFormat::HIDL,
736 .name = "android.hardware.camera",
737 .versions = {Version(1, 2)},
738 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
739 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
740 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}};
741 ManifestHal expectedCameraHalV2_0 =
742 ManifestHal{.format = HalFormat::HIDL,
743 .name = "android.hardware.camera",
744 .versions = {Version(2, 0)},
745 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
746 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
747 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}};
748 ManifestHal expectedNfcHal =
749 ManifestHal{.format = HalFormat::HIDL,
750 .name = "android.hardware.nfc",
751 .versions = {Version(1, 0), Version(2, 1)},
752 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
753 .interfaces = {{"INfc", {"INfc", {"default"}}}}};
754 auto cameraHals = vm.getHals("android.hardware.camera");
755 EXPECT_EQ((int)cameraHals.size(), 2);
756 EXPECT_EQ(*cameraHals[0], expectedCameraHalV1_2);
757 EXPECT_EQ(*cameraHals[1], expectedCameraHalV2_0);
758 auto nfcHals = vm.getHals("android.hardware.nfc");
759 EXPECT_EQ((int)nfcHals.size(), 1);
760 EXPECT_EQ(*nfcHals[0], expectedNfcHal);
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700761}
762
763TEST_F(LibVintfTest, CompatibilityMatrixGetHals) {
764 CompatibilityMatrix cm;
765 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
766 "android.hardware.camera",
767 {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
768 false /* optional */,
769 testHalInterfaces()}));
770 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
771 "android.hardware.nfc",
772 {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
773 true /* optional */,
774 testHalInterfaces()}));
775
776 MatrixHal expectedCameraHal = MatrixHal{
777 HalFormat::NATIVE,
778 "android.hardware.camera",
779 {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
780 false /* optional */,
781 testHalInterfaces(),
782 };
783 MatrixHal expectedNfcHal = MatrixHal{HalFormat::NATIVE,
784 "android.hardware.nfc",
785 {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
786 true /* optional */,
787 testHalInterfaces()};
788 auto cameraHals = cm.getHals("android.hardware.camera");
789 EXPECT_EQ((int)cameraHals.size(), 1);
790 EXPECT_EQ(*cameraHals[0], expectedCameraHal);
791 auto nfcHals = cm.getHals("android.hardware.nfc");
792 EXPECT_EQ((int)nfcHals.size(), 1);
793 EXPECT_EQ(*nfcHals[0], expectedNfcHal);
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700794}
795
Yifan Honga7201e72017-02-17 10:09:59 -0800796TEST_F(LibVintfTest, RuntimeInfo) {
797 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800798 using KernelConfigs = std::vector<KernelConfig>;
799 const KernelConfigs configs {
800 KernelConfig{"CONFIG_64BIT", Tristate::YES},
801 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
802 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
803 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
804 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
805 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
806 };
807
808 auto testMatrix = [&] (MatrixKernel &&kernel) {
809 CompatibilityMatrix cm;
810 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700811 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700812 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800813 return cm;
814 };
815
816 std::string error;
817
818 {
819 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
820 CompatibilityMatrix cm = testMatrix(std::move(kernel));
821 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
822 }
823
824 {
Yifan Hong5f996502017-08-23 14:46:44 -0700825 MatrixKernel kernel(KernelVersion{3, 18, 60}, KernelConfigs(configs));
826 CompatibilityMatrix cm = testMatrix(std::move(kernel));
827 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
828 }
829
830 {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800831 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
832 CompatibilityMatrix cm = testMatrix(std::move(kernel));
833 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
834 }
835
836 {
837 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
838 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700839 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800840 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
841 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700842 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800843 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
844 << "kernel-sepolicy-version shouldn't match";
845 }
846
847 {
848 KernelConfigs newConfigs(configs);
849 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
850 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
851 CompatibilityMatrix cm = testMatrix(std::move(kernel));
852 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
853 }
854
855 {
856 KernelConfigs newConfigs(configs);
857 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
858 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
859 CompatibilityMatrix cm = testMatrix(std::move(kernel));
860 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
861 }
862
863 {
864 KernelConfigs newConfigs(configs);
865 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
866 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
867 CompatibilityMatrix cm = testMatrix(std::move(kernel));
868 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
869 }
870
871 {
872 KernelConfigs newConfigs(configs);
873 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
874 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
875 CompatibilityMatrix cm = testMatrix(std::move(kernel));
876 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
877 }
878
879 {
880 KernelConfigs newConfigs(configs);
881 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
882 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
883 CompatibilityMatrix cm = testMatrix(std::move(kernel));
884 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
885 }
Yifan Hongdb6423e2017-09-11 14:38:46 -0700886
Yifan Hongf3029302017-04-12 17:23:49 -0700887 RuntimeInfo badAvb = testRuntimeInfo();
888 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
889 {
890 setAvb(badAvb, {1, 0}, {2, 1});
891 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
Michael Schwartz5cfbc922017-05-08 14:06:49 -0700892 EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
Yifan Hongf3029302017-04-12 17:23:49 -0700893 }
894 {
895 setAvb(badAvb, {2, 1}, {3, 0});
896 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
897 }
898 {
899 setAvb(badAvb, {2, 1}, {2, 3});
900 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
901 }
902 {
903 setAvb(badAvb, {2, 3}, {2, 1});
904 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
905 }
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800906}
907
Yifan Hong19e0a2a2017-04-14 17:30:53 -0700908TEST_F(LibVintfTest, MissingAvb) {
909 std::string xml =
910 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
911 " <kernel version=\"3.18.31\"></kernel>"
912 " <sepolicy>\n"
913 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
914 " <sepolicy-version>25.5</sepolicy-version>\n"
915 " </sepolicy>\n"
916 "</compatibility-matrix>\n";
917 CompatibilityMatrix cm;
918 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
919 EXPECT_EQ(getAvb(cm), Version(0, 0));
920}
921
Yifan Hongdb6423e2017-09-11 14:38:46 -0700922TEST_F(LibVintfTest, DisableAvb) {
923 std::string xml =
924 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
925 " <kernel version=\"3.18.31\"></kernel>"
926 " <sepolicy>\n"
927 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
928 " <sepolicy-version>25.5</sepolicy-version>\n"
929 " </sepolicy>\n"
930 " <avb>\n"
931 " <vbmeta-version>1.0</vbmeta-version>\n"
932 " </avb>\n"
933 "</compatibility-matrix>\n";
934 CompatibilityMatrix cm;
935 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
936 RuntimeInfo ki = testRuntimeInfo();
937 std::string error;
938 EXPECT_FALSE(ki.checkCompatibility(cm, &error));
939 EXPECT_STREQ(error.c_str(), "AVB version 2.1 does not match framework matrix 1.0");
940 EXPECT_TRUE(ki.checkCompatibility(cm, &error, DISABLE_AVB_CHECK)) << error;
941}
942
Yifan Hong08e984c2017-05-18 12:50:04 -0700943// This is the test extracted from VINTF Object doc
944TEST_F(LibVintfTest, HalCompat) {
945 CompatibilityMatrix matrix;
946 std::string error;
947
948 std::string matrixXml =
949 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
950 " <hal format=\"hidl\" optional=\"false\">\n"
951 " <name>android.hardware.foo</name>\n"
952 " <version>1.0</version>\n"
953 " <version>3.1-2</version>\n"
954 " <interface>\n"
955 " <name>IFoo</name>\n"
956 " <instance>default</instance>\n"
957 " <instance>specific</instance>\n"
958 " </interface>\n"
959 " </hal>\n"
960 " <hal format=\"hidl\" optional=\"false\">\n"
961 " <name>android.hardware.foo</name>\n"
962 " <version>2.0</version>\n"
963 " <interface>\n"
964 " <name>IBar</name>\n"
965 " <instance>default</instance>\n"
966 " </interface>\n"
967 " </hal>\n"
968 " <sepolicy>\n"
969 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
970 " <sepolicy-version>25.5</sepolicy-version>\n"
971 " </sepolicy>\n"
972 "</compatibility-matrix>\n";
973 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
974 << gCompatibilityMatrixConverter.lastError();
975
976 {
977 std::string manifestXml =
978 "<manifest version=\"1.0\" type=\"device\">\n"
979 " <hal format=\"hidl\">\n"
980 " <name>android.hardware.foo</name>\n"
981 " <transport>hwbinder</transport>\n"
982 " <version>1.0</version>\n"
983 " <interface>\n"
984 " <name>IFoo</name>\n"
985 " <instance>default</instance>\n"
986 " <instance>specific</instance>\n"
987 " </interface>\n"
988 " </hal>\n"
989 " <hal format=\"hidl\">\n"
990 " <name>android.hardware.foo</name>\n"
991 " <transport>hwbinder</transport>\n"
992 " <version>2.0</version>\n"
993 " <interface>\n"
994 " <name>IBar</name>\n"
995 " <instance>default</instance>\n"
996 " </interface>\n"
997 " </hal>\n"
998 " <sepolicy>\n"
999 " <version>25.5</version>\n"
1000 " </sepolicy>\n"
1001 "</manifest>\n";
1002
1003 HalManifest manifest;
1004 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1005 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1006 }
1007
1008 {
1009 std::string manifestXml =
1010 "<manifest version=\"1.0\" type=\"device\">\n"
1011 " <hal format=\"hidl\">\n"
1012 " <name>android.hardware.foo</name>\n"
1013 " <transport>hwbinder</transport>\n"
1014 " <version>1.0</version>\n"
1015 " <interface>\n"
1016 " <name>IFoo</name>\n"
1017 " <instance>default</instance>\n"
1018 " <instance>specific</instance>\n"
1019 " </interface>\n"
1020 " </hal>\n"
1021 " <sepolicy>\n"
1022 " <version>25.5</version>\n"
1023 " </sepolicy>\n"
1024 "</manifest>\n";
1025 HalManifest manifest;
1026 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1027 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1028 << "should not be compatible because IBar is missing";
1029 }
1030
1031 {
1032 std::string manifestXml =
1033 "<manifest version=\"1.0\" type=\"device\">\n"
1034 " <hal format=\"hidl\">\n"
1035 " <name>android.hardware.foo</name>\n"
1036 " <transport>hwbinder</transport>\n"
1037 " <version>1.0</version>\n"
1038 " <interface>\n"
1039 " <name>IFoo</name>\n"
1040 " <instance>default</instance>\n"
1041 " </interface>\n"
1042 " </hal>\n"
1043 " <hal format=\"hidl\">\n"
1044 " <name>android.hardware.foo</name>\n"
1045 " <transport>hwbinder</transport>\n"
1046 " <version>2.0</version>\n"
1047 " <interface>\n"
1048 " <name>IBar</name>\n"
1049 " <instance>default</instance>\n"
1050 " </interface>\n"
1051 " </hal>\n"
1052 " <sepolicy>\n"
1053 " <version>25.5</version>\n"
1054 " </sepolicy>\n"
1055 "</manifest>\n";
1056 HalManifest manifest;
1057 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1058 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1059 << "should not be compatible because IFoo/default is missing";
1060 }
1061
1062 {
1063 std::string manifestXml =
1064 "<manifest version=\"1.0\" type=\"device\">\n"
1065 " <hal format=\"hidl\">\n"
1066 " <name>android.hardware.foo</name>\n"
1067 " <transport>hwbinder</transport>\n"
1068 " <version>3.3</version>\n"
1069 " <interface>\n"
1070 " <name>IFoo</name>\n"
1071 " <instance>default</instance>\n"
1072 " <instance>specific</instance>\n"
1073 " </interface>\n"
1074 " </hal>\n"
1075 " <hal format=\"hidl\">\n"
1076 " <name>android.hardware.foo</name>\n"
1077 " <transport>hwbinder</transport>\n"
1078 " <version>2.0</version>\n"
1079 " <interface>\n"
1080 " <name>IBar</name>\n"
1081 " <instance>default</instance>\n"
1082 " </interface>\n"
1083 " </hal>\n"
1084 " <sepolicy>\n"
1085 " <version>25.5</version>\n"
1086 " </sepolicy>\n"
1087 "</manifest>\n";
1088 HalManifest manifest;
1089 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1090 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1091 }
1092
1093 {
1094 std::string manifestXml =
1095 "<manifest version=\"1.0\" type=\"device\">\n"
1096 " <hal format=\"hidl\">\n"
1097 " <name>android.hardware.foo</name>\n"
1098 " <transport>hwbinder</transport>\n"
1099 " <version>1.0</version>\n"
1100 " <interface>\n"
1101 " <name>IFoo</name>\n"
1102 " <instance>default</instance>\n"
1103 " </interface>\n"
1104 " </hal>\n"
1105 " <hal format=\"hidl\">\n"
1106 " <name>android.hardware.foo</name>\n"
1107 " <transport>hwbinder</transport>\n"
1108 " <version>3.2</version>\n"
1109 " <interface>\n"
1110 " <name>IFoo</name>\n"
1111 " <instance>specific</instance>\n"
1112 " </interface>\n"
1113 " </hal>\n"
1114 " <hal format=\"hidl\">\n"
1115 " <name>android.hardware.foo</name>\n"
1116 " <transport>hwbinder</transport>\n"
1117 " <version>2.0</version>\n"
1118 " <interface>\n"
1119 " <name>IBar</name>\n"
1120 " <instance>default</instance>\n"
1121 " </interface>\n"
1122 " </hal>\n"
1123 " <sepolicy>\n"
1124 " <version>25.5</version>\n"
1125 " </sepolicy>\n"
1126 "</manifest>\n";
1127 HalManifest manifest;
1128 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1129 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1130 << "should not be compatible even though @1.0::IFoo/default "
1131 << "and @3.2::IFoo/specific present";
1132 }
1133
1134 {
1135 std::string manifestXml =
1136 "<manifest version=\"1.0\" type=\"device\">\n"
1137 " <hal format=\"hidl\">\n"
1138 " <name>android.hardware.foo</name>\n"
1139 " <transport>hwbinder</transport>\n"
1140 " <version>1.0</version>\n"
1141 " <interface>\n"
1142 " <name>IFoo</name>\n"
1143 " <instance>default</instance>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001144 " <instance>specific</instance>\n"
1145 " </interface>\n"
1146 " </hal>\n"
1147 " <hal format=\"hidl\">\n"
1148 " <name>android.hardware.foo</name>\n"
1149 " <transport>hwbinder</transport>\n"
1150 " <version>2.0</version>\n"
1151 " <interface>\n"
1152 " <name>IBar</name>\n"
1153 " <instance>default</instance>\n"
1154 " </interface>\n"
1155 " </hal>\n"
1156 " <sepolicy>\n"
1157 " <version>25.5</version>\n"
1158 " </sepolicy>\n"
1159 "</manifest>\n";
1160 HalManifest manifest;
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001161 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml))
1162 << gHalManifestConverter.lastError();
1163 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
Yifan Hong08e984c2017-05-18 12:50:04 -07001164 }
1165}
1166
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001167TEST_F(LibVintfTest, Compat) {
1168 std::string manifestXml =
1169 "<manifest version=\"1.0\" type=\"device\">\n"
1170 " <hal format=\"hidl\">\n"
1171 " <name>android.hardware.camera</name>\n"
1172 " <transport>hwbinder</transport>\n"
1173 " <version>3.5</version>\n"
1174 " <interface>\n"
1175 " <name>IBetterCamera</name>\n"
1176 " <instance>camera</instance>\n"
1177 " </interface>\n"
1178 " <interface>\n"
1179 " <name>ICamera</name>\n"
1180 " <instance>default</instance>\n"
1181 " <instance>legacy/0</instance>\n"
1182 " </interface>\n"
1183 " </hal>\n"
1184 " <hal format=\"hidl\">\n"
1185 " <name>android.hardware.nfc</name>\n"
1186 " <transport>hwbinder</transport>\n"
1187 " <version>1.0</version>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001188 " <interface>\n"
1189 " <name>INfc</name>\n"
1190 " <instance>nfc_nci</instance>\n"
1191 " </interface>\n"
1192 " </hal>\n"
1193 " <hal format=\"hidl\">\n"
1194 " <name>android.hardware.nfc</name>\n"
1195 " <transport>hwbinder</transport>\n"
1196 " <version>2.0</version>\n"
1197 " <interface>\n"
1198 " <name>INfc</name>\n"
1199 " <instance>default</instance>\n"
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001200 " <instance>nfc_nci</instance>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001201 " </interface>\n"
1202 " </hal>\n"
1203 " <sepolicy>\n"
1204 " <version>25.5</version>\n"
1205 " </sepolicy>\n"
1206 "</manifest>\n";
1207
1208 std::string matrixXml =
1209 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1210 " <hal format=\"hidl\" optional=\"false\">\n"
1211 " <name>android.hardware.camera</name>\n"
1212 " <version>2.0-5</version>\n"
1213 " <version>3.4-16</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001214 " <interface>\n"
1215 " <name>IBetterCamera</name>\n"
1216 " <instance>camera</instance>\n"
1217 " </interface>\n"
1218 " <interface>\n"
1219 " <name>ICamera</name>\n"
1220 " <instance>default</instance>\n"
1221 " <instance>legacy/0</instance>\n"
1222 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001223 " </hal>\n"
1224 " <hal format=\"hidl\" optional=\"false\">\n"
1225 " <name>android.hardware.nfc</name>\n"
1226 " <version>1.0</version>\n"
1227 " <version>2.0</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001228 " <interface>\n"
1229 " <name>INfc</name>\n"
1230 " <instance>nfc_nci</instance>\n"
1231 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001232 " </hal>\n"
1233 " <hal format=\"hidl\" optional=\"true\">\n"
1234 " <name>android.hardware.foo</name>\n"
1235 " <version>1.0</version>\n"
1236 " </hal>\n"
1237 " <sepolicy>\n"
1238 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1239 " <sepolicy-version>25.5</sepolicy-version>\n"
1240 " <sepolicy-version>26.0-3</sepolicy-version>\n"
1241 " </sepolicy>\n"
1242 " <avb>\n"
1243 " <vbmeta-version>2.1</vbmeta-version>\n"
1244 " </avb>\n"
1245 "</compatibility-matrix>\n";
1246
1247 HalManifest manifest;
1248 CompatibilityMatrix matrix;
1249 std::string error;
1250 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1251 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1252 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1253
1254 // some smaller test cases
1255 matrixXml =
1256 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1257 " <hal format=\"hidl\" optional=\"false\">\n"
1258 " <name>android.hardware.camera</name>\n"
1259 " <version>3.4</version>\n"
1260 " </hal>\n"
1261 " <sepolicy>\n"
1262 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1263 " <sepolicy-version>25.5</sepolicy-version>\n"
1264 " </sepolicy>\n"
1265 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1266 "</compatibility-matrix>\n";
1267 matrix = {};
1268 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1269 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1270 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
1271 EXPECT_NE(camera, nullptr);
1272 camera->versionRanges[0] = {3, 5};
1273 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1274 camera->versionRanges[0] = {3, 6};
1275 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1276
1277 // reset it
1278 matrix = {};
1279 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1280 set(matrix, Sepolicy{30, {{26, 0}}});
1281 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1282 set(matrix, Sepolicy{30, {{25, 6}}});
1283 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1284 set(matrix, Sepolicy{30, {{25, 4}}});
1285 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1286}
1287
Yifan Hongd4857902017-06-13 14:13:56 -07001288/////////////////// xmlfile tests
1289
1290TEST_F(LibVintfTest, HalManifestConverterXmlFile) {
1291 HalManifest vm = testDeviceManifestWithXmlFile();
1292 std::string xml = gHalManifestConverter(vm);
1293 EXPECT_EQ(xml,
1294 "<manifest version=\"1.0\" type=\"device\">\n"
1295 " <hal format=\"hidl\">\n"
1296 " <name>android.hardware.camera</name>\n"
1297 " <transport>hwbinder</transport>\n"
1298 " <version>2.0</version>\n"
1299 " <interface>\n"
1300 " <name>IBetterCamera</name>\n"
1301 " <instance>camera</instance>\n"
1302 " </interface>\n"
1303 " <interface>\n"
1304 " <name>ICamera</name>\n"
1305 " <instance>default</instance>\n"
1306 " <instance>legacy/0</instance>\n"
1307 " </interface>\n"
1308 " </hal>\n"
1309 " <hal format=\"hidl\">\n"
1310 " <name>android.hardware.nfc</name>\n"
1311 " <transport arch=\"32+64\">passthrough</transport>\n"
1312 " <version>1.0</version>\n"
1313 " <interface>\n"
1314 " <name>INfc</name>\n"
1315 " <instance>default</instance>\n"
1316 " </interface>\n"
1317 " </hal>\n"
1318 " <sepolicy>\n"
1319 " <version>25.0</version>\n"
1320 " </sepolicy>\n"
1321 " <xmlfile>\n"
1322 " <name>media_profile</name>\n"
1323 " <version>1.0</version>\n"
1324 " </xmlfile>\n"
1325 "</manifest>\n");
1326 HalManifest vm2;
1327 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
1328 EXPECT_EQ(vm, vm2);
1329}
1330
1331TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile) {
1332 CompatibilityMatrix cm;
1333 addXmlFile(cm, "media_profile", {1, 0});
Yifan Hong244970c2018-01-23 15:29:27 -08001334 std::string xml = gCompatibilityMatrixConverter(cm, SerializeFlag::XMLFILES_ONLY);
Yifan Hongd4857902017-06-13 14:13:56 -07001335 EXPECT_EQ(xml,
1336 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hongd4857902017-06-13 14:13:56 -07001337 " <xmlfile format=\"dtd\" optional=\"true\">\n"
1338 " <name>media_profile</name>\n"
1339 " <version>1.0</version>\n"
1340 " </xmlfile>\n"
1341 "</compatibility-matrix>\n");
1342 CompatibilityMatrix cm2;
1343 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
1344 EXPECT_EQ(cm, cm2);
1345}
1346
1347TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile2) {
1348 std::string xml =
1349 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1350 " <xmlfile format=\"dtd\" optional=\"false\">\n"
1351 " <name>media_profile</name>\n"
1352 " <version>1.0</version>\n"
1353 " </xmlfile>\n"
1354 "</compatibility-matrix>\n";
1355 CompatibilityMatrix cm;
1356 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml));
1357 EXPECT_EQ(
1358 "compatibility-matrix.xmlfile entry media_profile has to be optional for "
1359 "compatibility matrix version 1.0",
1360 gCompatibilityMatrixConverter.lastError());
1361}
1362
Yifan Hongbbfff302017-06-06 17:10:13 -07001363TEST_F(LibVintfTest, ManifestXmlFilePathDevice) {
1364 std::string manifestXml =
1365 "<manifest version=\"1.0\" type=\"device\">"
1366 " <xmlfile>"
1367 " <name>media_profile</name>"
1368 " <version>1.0</version>"
1369 " </xmlfile>"
1370 "</manifest>";
1371 HalManifest manifest;
1372 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1373 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1374 "/vendor/etc/media_profile_V1_0.xml");
1375}
1376
1377TEST_F(LibVintfTest, ManifestXmlFilePathFramework) {
1378 std::string manifestXml =
1379 "<manifest version=\"1.0\" type=\"framework\">"
1380 " <xmlfile>"
1381 " <name>media_profile</name>"
1382 " <version>1.0</version>"
1383 " </xmlfile>"
1384 "</manifest>";
1385 HalManifest manifest;
1386 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1387 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1388 "/system/etc/media_profile_V1_0.xml");
1389}
1390
1391TEST_F(LibVintfTest, ManifestXmlFilePathOverride) {
1392 std::string manifestXml =
1393 "<manifest version=\"1.0\" type=\"device\">"
1394 " <xmlfile>"
1395 " <name>media_profile</name>"
1396 " <version>1.0</version>"
1397 " <path>/vendor/etc/foo.xml</path>"
1398 " </xmlfile>"
1399 "</manifest>";
1400 HalManifest manifest;
1401 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1402 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "/vendor/etc/foo.xml");
1403}
1404
1405TEST_F(LibVintfTest, ManifestXmlFilePathMissing) {
1406 std::string manifestXml =
1407 "<manifest version=\"1.0\" type=\"device\">"
1408 " <xmlfile>"
1409 " <name>media_profile</name>"
1410 " <version>1.1</version>"
1411 " </xmlfile>"
1412 "</manifest>";
1413 HalManifest manifest;
1414 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1415 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "");
1416}
1417
1418TEST_F(LibVintfTest, MatrixXmlFilePathFramework) {
1419 std::string matrixXml =
1420 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1421 " <xmlfile format=\"dtd\" optional=\"true\">"
1422 " <name>media_profile</name>"
1423 " <version>2.0-1</version>"
1424 " </xmlfile>"
1425 "</compatibility-matrix>";
1426 CompatibilityMatrix matrix;
1427 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1428 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 1}),
1429 "/system/etc/media_profile_V2_1.dtd");
1430}
1431
1432TEST_F(LibVintfTest, MatrixXmlFilePathDevice) {
1433 std::string matrixXml =
1434 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1435 " <xmlfile format=\"xsd\" optional=\"true\">"
1436 " <name>media_profile</name>"
1437 " <version>2.0-1</version>"
1438 " </xmlfile>"
1439 "</compatibility-matrix>";
1440 CompatibilityMatrix matrix;
1441 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1442 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}),
1443 "/vendor/etc/media_profile_V2_1.xsd");
1444}
1445
1446TEST_F(LibVintfTest, MatrixXmlFilePathOverride) {
1447 std::string matrixXml =
1448 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1449 " <xmlfile format=\"xsd\" optional=\"true\">"
1450 " <name>media_profile</name>"
1451 " <version>2.0-1</version>"
1452 " <path>/system/etc/foo.xsd</path>"
1453 " </xmlfile>"
1454 "</compatibility-matrix>";
1455 CompatibilityMatrix matrix;
1456 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1457 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "/system/etc/foo.xsd");
1458}
1459
1460TEST_F(LibVintfTest, MatrixXmlFilePathMissing) {
1461 std::string matrixXml =
1462 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1463 " <xmlfile format=\"dtd\" optional=\"true\">"
1464 " <name>media_profile</name>"
1465 " <version>2.1</version>"
1466 " </xmlfile>"
1467 "</compatibility-matrix>";
1468 CompatibilityMatrix matrix;
1469 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1470 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "");
1471}
1472
Yifan Hong02e94002017-07-10 15:41:56 -07001473std::pair<KernelConfigParser, status_t> processData(const std::string& data, bool processComments,
1474 bool relaxedFormat = false) {
1475 KernelConfigParser parser(processComments, relaxedFormat);
Yifan Hongd8cee082017-07-05 16:06:09 -07001476 const char* p = data.c_str();
1477 size_t n = 0;
1478 size_t chunkSize;
Yifan Hong6209d172017-07-07 16:18:19 -07001479 status_t status = OK;
Yifan Hongd8cee082017-07-05 16:06:09 -07001480 for (; n < data.size(); p += chunkSize, n += chunkSize) {
1481 chunkSize = std::min<size_t>(5, data.size() - n);
Yifan Hong6209d172017-07-07 16:18:19 -07001482 if ((status = parser.process(p, chunkSize)) != OK) {
1483 break;
1484 }
Yifan Hongd8cee082017-07-05 16:06:09 -07001485 }
Yifan Hong6209d172017-07-07 16:18:19 -07001486 return {std::move(parser), status};
Yifan Hongd8cee082017-07-05 16:06:09 -07001487}
1488
1489TEST_F(LibVintfTest, KernelConfigParser) {
1490 // usage in /proc/config.gz
1491 const std::string data =
1492 "# CONFIG_NOT_SET is not set\n"
1493 "CONFIG_ONE=1\n"
1494 "CONFIG_Y=y\n"
1495 "CONFIG_STR=\"string\"\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001496 auto pair = processData(data, false /* processComments */);
1497 ASSERT_EQ(OK, pair.second) << pair.first.error();
1498 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001499
1500 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1501 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1502 EXPECT_EQ(configs.find("CONFIG_STR")->second, "\"string\"");
1503 EXPECT_EQ(configs.find("CONFIG_NOT_SET"), configs.end());
1504}
1505
1506TEST_F(LibVintfTest, KernelConfigParser2) {
1507 // usage in android-base.cfg
1508 const std::string data =
1509 "# CONFIG_NOT_SET is not set\n"
1510 "CONFIG_ONE=1\n"
1511 "CONFIG_Y=y\n"
1512 "CONFIG_STR=string\n"
1513 "# ignore_thiscomment\n"
1514 "# CONFIG_NOT_SET2 is not set\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001515 auto pair = processData(data, true /* processComments */);
1516 ASSERT_EQ(OK, pair.second) << pair.first.error();
1517 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001518
1519 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1520 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1521 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1522 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1523 EXPECT_EQ(configs.find("CONFIG_NOT_SET2")->second, "n");
1524}
1525
Yifan Hongc1889722017-07-07 16:19:52 -07001526TEST_F(LibVintfTest, KernelConfigParserSpace) {
1527 // usage in android-base.cfg
1528 const std::string data =
1529 " # CONFIG_NOT_SET is not set \n"
1530 " CONFIG_ONE=1 # 'tis a one!\n"
1531 " CONFIG_TWO=2 #'tis a two! \n"
1532 " CONFIG_THREE=3#'tis a three! \n"
1533 " CONFIG_233=233#'tis a three! \n"
1534 "#yey! random comments\n"
1535 "CONFIG_Y=y \n"
1536 " CONFIG_YES=y#YES! \n"
1537 "CONFIG_STR=string\n"
1538 "CONFIG_HELLO=hello world! #still works\n"
1539 "CONFIG_WORLD=hello world! \n"
1540 "CONFIG_GOOD = good morning! #comments here\n"
1541 " CONFIG_MORNING = good morning! \n";
Yifan Hong02e94002017-07-10 15:41:56 -07001542 auto pair = processData(data, true /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07001543 ASSERT_EQ(OK, pair.second) << pair.first.error();
1544 const auto& configs = pair.first.configs();
1545
1546 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1547 EXPECT_EQ(configs.find("CONFIG_TWO")->second, "2");
1548 EXPECT_EQ(configs.find("CONFIG_THREE")->second, "3");
1549 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1550 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1551 EXPECT_EQ(configs.find("CONFIG_HELLO")->second, "hello world!")
1552 << "Value should be \"hello world!\" without trailing spaces";
1553 EXPECT_EQ(configs.find("CONFIG_WORLD")->second, "hello world!")
1554 << "Value should be \"hello world!\" without trailing spaces";
1555 EXPECT_EQ(configs.find("CONFIG_GOOD")->second, "good morning!")
1556 << "Value should be \"good morning!\" without leading or trailing spaces";
1557 EXPECT_EQ(configs.find("CONFIG_MORNING")->second, "good morning!")
1558 << "Value should be \"good morning!\" without leading or trailing spaces";
1559 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1560}
1561
Yifan Hongd9e46432017-08-15 17:14:52 -07001562TEST_F(LibVintfTest, NetutilsWrapperMatrix) {
1563 std::string matrixXml;
1564 CompatibilityMatrix matrix;
1565
1566 matrixXml =
1567 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1568 " <hal format=\"native\" optional=\"false\">"
1569 " <name>netutils-wrapper</name>"
1570 " <version>1.0</version>"
1571 " </hal>"
1572 "</compatibility-matrix>";
1573 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
1574 << gCompatibilityMatrixConverter.lastError();
1575
1576// only host libvintf hardcodes netutils-wrapper version requirements
Yifan Hong6bce1a62018-01-31 13:30:04 -08001577#ifndef LIBVINTF_TARGET
Yifan Hongd9e46432017-08-15 17:14:52 -07001578
1579 matrixXml =
1580 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1581 " <hal format=\"native\" optional=\"false\">"
1582 " <name>netutils-wrapper</name>"
1583 " <version>1.0-1</version>"
1584 " </hal>"
1585 "</compatibility-matrix>";
1586 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1587 EXPECT_CONTAINS(
1588 gCompatibilityMatrixConverter.lastError(),
1589 "netutils-wrapper HAL must specify exactly one version x.0, but a range is provided. "
1590 "Perhaps you mean '1.0'?");
1591
1592 matrixXml =
1593 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1594 " <hal format=\"native\" optional=\"false\">"
1595 " <name>netutils-wrapper</name>"
1596 " <version>1.1</version>"
1597 " </hal>"
1598 "</compatibility-matrix>";
1599 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1600 EXPECT_CONTAINS(
1601 gCompatibilityMatrixConverter.lastError(),
1602 "netutils-wrapper HAL must specify exactly one version x.0, but minor version is not 0. "
1603 "Perhaps you mean '1.0'?");
1604
1605 matrixXml =
1606 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1607 " <hal format=\"native\" optional=\"false\">"
1608 " <name>netutils-wrapper</name>"
1609 " <version>1.0</version>"
1610 " <version>2.0</version>"
1611 " </hal>"
1612 "</compatibility-matrix>";
1613 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1614 EXPECT_CONTAINS(
1615 gCompatibilityMatrixConverter.lastError(),
1616 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1617 "is specified.");
1618
Yifan Hong6bce1a62018-01-31 13:30:04 -08001619#endif // LIBVINTF_TARGET
Yifan Hongd9e46432017-08-15 17:14:52 -07001620}
1621
1622TEST_F(LibVintfTest, NetutilsWrapperManifest) {
1623 std::string manifestXml;
1624 HalManifest manifest;
1625
1626 manifestXml =
1627 "<manifest version=\"1.0\" type=\"framework\">"
1628 " <hal format=\"native\">"
1629 " <name>netutils-wrapper</name>"
1630 " <version>1.0</version>"
1631 " <version>2.0</version>"
1632 " </hal>"
1633 "</manifest>";
1634 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml)) << gHalManifestConverter.lastError();
1635
1636// only host libvintf hardcodes netutils-wrapper version requirements
Yifan Hong6bce1a62018-01-31 13:30:04 -08001637#ifndef LIBVINTF_TARGET
Yifan Hongd9e46432017-08-15 17:14:52 -07001638
1639 manifestXml =
1640 "<manifest version=\"1.0\" type=\"framework\">"
1641 " <hal format=\"native\">"
1642 " <name>netutils-wrapper</name>"
1643 " <version>1.1</version>"
1644 " </hal>"
1645 "</manifest>";
1646 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1647 EXPECT_CONTAINS(
1648 gCompatibilityMatrixConverter.lastError(),
1649 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1650 "is specified.");
1651
1652 manifestXml =
1653 "<manifest version=\"1.0\" type=\"framework\">"
1654 " <hal format=\"native\">"
1655 " <name>netutils-wrapper</name>"
1656 " <version>1.0</version>"
1657 " <version>2.1</version>"
1658 " </hal>"
1659 "</manifest>";
1660 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1661 EXPECT_CONTAINS(
1662 gCompatibilityMatrixConverter.lastError(),
1663 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1664 "is specified.");
1665
Yifan Hong6bce1a62018-01-31 13:30:04 -08001666#endif // LIBVINTF_TARGET
Yifan Hongd9e46432017-08-15 17:14:52 -07001667}
1668
Yifan Hong5f996502017-08-23 14:46:44 -07001669TEST_F(LibVintfTest, KernelConfigConditionTest) {
1670 std::string xml =
1671 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1672 " <kernel version=\"3.18.22\"/>\n"
1673 " <kernel version=\"3.18.22\">\n"
1674 " <conditions>\n"
1675 " <config>\n"
1676 " <key>CONFIG_ARM</key>\n"
1677 " <value type=\"tristate\">y</value>\n"
1678 " </config>\n"
1679 " </conditions>\n"
1680 " <config>\n"
1681 " <key>CONFIG_FOO</key>\n"
1682 " <value type=\"tristate\">y</value>\n"
1683 " </config>\n"
1684 " </kernel>\n"
1685 " <sepolicy>\n"
1686 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1687 " <sepolicy-version>25.0</sepolicy-version>\n"
1688 " </sepolicy>\n"
1689 " <avb>\n"
1690 " <vbmeta-version>2.1</vbmeta-version>\n"
1691 " </avb>\n"
1692 "</compatibility-matrix>\n";
1693
1694 CompatibilityMatrix cm;
1695 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1696 << gCompatibilityMatrixConverter.lastError();
1697 const auto& kernels = getKernels(cm);
1698 ASSERT_GE(kernels.size(), 2u);
1699 ASSERT_TRUE(kernels[0].conditions().empty());
1700 const auto& kernel = kernels[1];
1701 const auto& cond = kernel.conditions();
1702 ASSERT_FALSE(cond.empty());
1703 EXPECT_EQ("CONFIG_ARM", cond.begin()->first);
1704 EXPECT_EQ(KernelConfigTypedValue(Tristate::YES), cond.begin()->second);
1705 EXPECT_FALSE(kernel.configs().empty());
1706
1707 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
1708}
1709
1710TEST_F(LibVintfTest, KernelConfigConditionEmptyTest) {
1711 std::string xml =
1712 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1713 " <kernel version=\"4.4.0\"/>\n"
1714 " <kernel version=\"3.18.22\">\n"
1715 " <conditions>\n"
1716 " <config>\n"
1717 " <key>CONFIG_ARM</key>\n"
1718 " <value type=\"tristate\">y</value>\n"
1719 " </config>\n"
1720 " </conditions>\n"
1721 " </kernel>\n"
1722 "</compatibility-matrix>\n";
1723
1724 CompatibilityMatrix cm;
1725 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml))
1726 << "Should not accept first kernel version with non-empty conditions";
1727 EXPECT_EQ(
1728 "First <kernel> for version 3.18 must have empty <conditions> "
1729 "for backwards compatibility.",
1730 gCompatibilityMatrixConverter.lastError());
1731}
1732
1733TEST_F(LibVintfTest, KernelConfigConditionMatch) {
1734 RuntimeInfo runtime = testRuntimeInfo();
1735 std::string error;
1736 std::string xml;
1737 CompatibilityMatrix cm;
1738
1739 xml =
1740 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1741 " <kernel version=\"3.18.22\"/>\n"
1742 " <kernel version=\"3.18.22\">\n"
1743 " <conditions>\n"
1744 " <config>\n"
1745 " <key>CONFIG_64BIT</key>\n"
1746 " <value type=\"tristate\">y</value>\n"
1747 " </config>\n"
1748 " </conditions>\n"
1749 " <config>\n"
1750 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1751 " <value type=\"int\">24</value>\n"
1752 " </config>\n"
1753 " </kernel>\n"
1754 " <sepolicy>\n"
1755 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1756 " </sepolicy>\n"
1757 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1758 "</compatibility-matrix>\n";
1759
1760 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1761 << gCompatibilityMatrixConverter.lastError();
1762 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1763
1764 xml =
1765 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1766 " <kernel version=\"3.18.22\"/>\n"
1767 " <kernel version=\"3.18.22\">\n"
1768 " <conditions>\n"
1769 " <config>\n"
1770 " <key>CONFIG_64BIT</key>\n"
1771 " <value type=\"tristate\">y</value>\n"
1772 " </config>\n"
1773 " </conditions>\n"
1774 " <config>\n"
1775 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1776 " <value type=\"int\">26</value>\n"
1777 " </config>\n"
1778 " </kernel>\n"
1779 " <sepolicy>\n"
1780 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1781 " </sepolicy>\n"
1782 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1783 "</compatibility-matrix>\n";
1784
1785 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1786 << gCompatibilityMatrixConverter.lastError();
1787 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1788 << "conditions met, so CONFIG_ARCH_MMAP_RND_BITS should not match";
1789
1790 xml =
1791 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1792 " <kernel version=\"3.18.22\"/>\n"
1793 " <kernel version=\"3.18.22\">\n"
1794 " <conditions>\n"
1795 " <config>\n"
1796 " <key>CONFIG_64BIT</key>\n"
1797 " <value type=\"tristate\">n</value>\n"
1798 " </config>\n"
1799 " </conditions>\n"
1800 " <config>\n"
1801 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1802 " <value type=\"int\">26</value>\n"
1803 " </config>\n"
1804 " </kernel>\n"
1805 " <sepolicy>\n"
1806 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1807 " </sepolicy>\n"
1808 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1809 "</compatibility-matrix>\n";
1810
1811 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1812 << gCompatibilityMatrixConverter.lastError();
1813 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1814 xml =
1815 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1816 " <kernel version=\"3.18.22\"/>\n"
1817 " <kernel version=\"3.18.22\">\n"
1818 " <conditions>\n"
1819 " <config>\n"
1820 " <key>CONFIG_64BIT</key>\n"
1821 " <value type=\"tristate\">y</value>\n"
1822 " </config>\n"
1823 " <config>\n"
1824 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1825 " <value type=\"int\">24</value>\n"
1826 " </config>\n"
1827 " </conditions>\n"
1828 " <config>\n"
1829 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1830 " <value type=\"int\">0xdead000000000000</value>\n"
1831 " </config>\n"
1832 " </kernel>\n"
1833 " <sepolicy>\n"
1834 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1835 " </sepolicy>\n"
1836 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1837 "</compatibility-matrix>\n";
1838
1839 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1840 << gCompatibilityMatrixConverter.lastError();
1841 EXPECT_TRUE(runtime.checkCompatibility(cm, &error));
1842
1843 xml =
1844 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1845 " <kernel version=\"3.18.22\"/>\n"
1846 " <kernel version=\"3.18.22\">\n"
1847 " <conditions>\n"
1848 " <config>\n"
1849 " <key>CONFIG_64BIT</key>\n"
1850 " <value type=\"tristate\">y</value>\n"
1851 " </config>\n"
1852 " <config>\n"
1853 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1854 " <value type=\"int\">24</value>\n"
1855 " </config>\n"
1856 " </conditions>\n"
1857 " <config>\n"
1858 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1859 " <value type=\"int\">0xbeaf000000000000</value>\n"
1860 " </config>\n"
1861 " </kernel>\n"
1862 " <sepolicy>\n"
1863 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1864 " </sepolicy>\n"
1865 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1866 "</compatibility-matrix>\n";
1867
1868 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1869 << gCompatibilityMatrixConverter.lastError();
1870 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1871 << "conditions have 'and' relationship, so CONFIG_ILLEGAL_POINTER_VALUE should not match";
1872
1873 xml =
1874 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1875 " <kernel version=\"3.18.22\"/>\n"
1876 " <kernel version=\"3.18.22\">\n"
1877 " <conditions>\n"
1878 " <config>\n"
1879 " <key>CONFIG_64BIT</key>\n"
1880 " <value type=\"tristate\">y</value>\n"
1881 " </config>\n"
1882 " <config>\n"
1883 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1884 " <value type=\"int\">26</value>\n"
1885 " </config>\n"
1886 " </conditions>\n"
1887 " <config>\n"
1888 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1889 " <value type=\"int\">0xbeaf000000000000</value>\n"
1890 " </config>\n"
1891 " </kernel>\n"
1892 " <sepolicy>\n"
1893 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1894 " </sepolicy>\n"
1895 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1896 "</compatibility-matrix>\n";
1897
1898 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1899 << gCompatibilityMatrixConverter.lastError();
1900 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1901
1902 xml =
1903 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1904 " <kernel version=\"3.18.22\">\n"
1905 " <config>\n"
1906 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1907 " <value type=\"string\"/>\n"
1908 " </config>\n"
1909 " </kernel>\n"
1910 " <kernel version=\"3.18.22\">\n"
1911 " <conditions>\n"
1912 " <config>\n"
1913 " <key>CONFIG_64BIT</key>\n"
1914 " <value type=\"tristate\">y</value>\n"
1915 " </config>\n"
1916 " </conditions>\n"
1917 " <config>\n"
1918 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1919 " <value type=\"int\">0xdead000000000000</value>\n"
1920 " </config>\n"
1921 " </kernel>\n"
1922 " <kernel version=\"3.18.22\">\n"
1923 " <conditions>\n"
1924 " <config>\n"
1925 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1926 " <value type=\"int\">24</value>\n"
1927 " </config>\n"
1928 " </conditions>\n"
1929 " <config>\n"
1930 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1931 " <value type=\"string\">binder,hwbinder</value>\n"
1932 " </config>\n"
1933 " </kernel>\n"
1934 " <sepolicy>\n"
1935 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1936 " </sepolicy>\n"
1937 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1938 "</compatibility-matrix>\n";
1939
1940 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1941 << gCompatibilityMatrixConverter.lastError();
1942 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1943
1944 xml =
1945 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1946 " <kernel version=\"3.18.22\">\n"
1947 " <config>\n"
1948 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1949 " <value type=\"string\"/>\n"
1950 " </config>\n"
1951 " </kernel>\n"
1952 " <kernel version=\"3.18.22\">\n"
1953 " <conditions>\n"
1954 " <config>\n"
1955 " <key>CONFIG_64BIT</key>\n"
1956 " <value type=\"tristate\">y</value>\n"
1957 " </config>\n"
1958 " </conditions>\n"
1959 " <config>\n"
1960 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1961 " <value type=\"int\">0xbeaf000000000000</value>\n"
1962 " </config>\n"
1963 " </kernel>\n"
1964 " <kernel version=\"3.18.22\">\n"
1965 " <conditions>\n"
1966 " <config>\n"
1967 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1968 " <value type=\"int\">24</value>\n"
1969 " </config>\n"
1970 " </conditions>\n"
1971 " <config>\n"
1972 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1973 " <value type=\"string\">binder,hwbinder</value>\n"
1974 " </config>\n"
1975 " </kernel>\n"
1976 " <sepolicy>\n"
1977 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1978 " </sepolicy>\n"
1979 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1980 "</compatibility-matrix>\n";
1981
1982 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1983 << gCompatibilityMatrixConverter.lastError();
1984 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used.";
1985
1986 xml =
1987 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1988 " <kernel version=\"3.18.22\">\n"
1989 " <config>\n"
1990 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1991 " <value type=\"string\"/>\n"
1992 " </config>\n"
1993 " </kernel>\n"
1994 " <kernel version=\"3.18.22\">\n"
1995 " <conditions>\n"
1996 " <config>\n"
1997 " <key>CONFIG_64BIT</key>\n"
1998 " <value type=\"tristate\">y</value>\n"
1999 " </config>\n"
2000 " </conditions>\n"
2001 " <config>\n"
2002 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
2003 " <value type=\"int\">0xdead000000000000</value>\n"
2004 " </config>\n"
2005 " </kernel>\n"
2006 " <kernel version=\"3.18.22\">\n"
2007 " <conditions>\n"
2008 " <config>\n"
2009 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
2010 " <value type=\"int\">24</value>\n"
2011 " </config>\n"
2012 " </conditions>\n"
2013 " <config>\n"
2014 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
2015 " <value type=\"string\">binder</value>\n"
2016 " </config>\n"
2017 " </kernel>\n"
2018 " <sepolicy>\n"
2019 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2020 " </sepolicy>\n"
2021 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2022 "</compatibility-matrix>\n";
2023
2024 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2025 << gCompatibilityMatrixConverter.lastError();
2026 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used";
2027}
2028
Yifan Hongc1889722017-07-07 16:19:52 -07002029// Run KernelConfigParserInvalidTest on processComments = {true, false}
2030class KernelConfigParserInvalidTest : public ::testing::TestWithParam<bool> {};
2031
2032TEST_P(KernelConfigParserInvalidTest, NonSet1) {
2033 const std::string data = "# CONFIG_NOT_EXIST is not sat\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002034 auto pair = processData(data, GetParam() /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07002035 ASSERT_EQ(OK, pair.second) << pair.first.error();
2036 const auto& configs = pair.first.configs();
2037 EXPECT_EQ(configs.find("CONFIG_NOT_EXIST"), configs.end())
2038 << "CONFIG_NOT_EXIST should not exist because of typo";
2039}
2040
2041TEST_P(KernelConfigParserInvalidTest, InvalidLine1) {
2042 const std::string data = "FOO_CONFIG=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002043 ASSERT_NE(OK,
2044 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07002045}
2046
2047TEST_P(KernelConfigParserInvalidTest, InvalidLine2) {
2048 const std::string data = "CONFIG_BAR-BAZ=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002049 ASSERT_NE(OK,
2050 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07002051}
2052
2053INSTANTIATE_TEST_CASE_P(KernelConfigParser, KernelConfigParserInvalidTest, ::testing::Bool());
2054
Yifan Hong2027a492017-12-11 15:21:19 -08002055TEST_F(LibVintfTest, MatrixLevel) {
2056 CompatibilityMatrix cm;
2057 std::string xml;
2058
2059 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\"/>";
2060 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2061 << gCompatibilityMatrixConverter.lastError();
2062 EXPECT_EQ(Level::UNSPECIFIED, cm.level());
2063
2064 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"legacy\"/>";
2065 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2066 << gCompatibilityMatrixConverter.lastError();
2067 EXPECT_EQ(Level::LEGACY, cm.level());
2068
2069 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
2070 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2071 << gCompatibilityMatrixConverter.lastError();
2072 EXPECT_EQ(1u, cm.level());
2073}
2074
2075TEST_F(LibVintfTest, ManifestLevel) {
2076 HalManifest manifest;
2077 std::string xml;
2078
2079 xml = "<manifest version=\"1.0\" type=\"device\"/>";
2080 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2081 EXPECT_EQ(Level::UNSPECIFIED, manifest.level());
2082
2083 xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"legacy\"/>";
2084 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2085 EXPECT_EQ(Level::LEGACY, manifest.level());
2086
2087 xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"1\"/>";
2088 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2089 EXPECT_EQ(1u, manifest.level());
2090}
2091
Yifan Hongdbe9db32017-12-11 19:06:11 -08002092TEST_F(LibVintfTest, AddOptionalHal) {
2093 CompatibilityMatrix cm1;
2094 CompatibilityMatrix cm2;
2095 std::string error;
2096 std::string xml;
2097
2098 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
2099 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2100 << gCompatibilityMatrixConverter.lastError();
2101
2102 xml =
2103 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2104 " <hal format=\"hidl\" optional=\"false\">\n"
2105 " <name>android.hardware.foo</name>\n"
2106 " <version>1.0-1</version>\n"
2107 " <interface>\n"
2108 " <name>IFoo</name>\n"
2109 " <instance>default</instance>\n"
2110 " </interface>\n"
2111 " </hal>\n"
2112 "</compatibility-matrix>\n";
2113 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2114 << gCompatibilityMatrixConverter.lastError();
2115
2116 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2117 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2118 EXPECT_EQ(xml,
2119 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2120 " <hal format=\"hidl\" optional=\"true\">\n"
2121 " <name>android.hardware.foo</name>\n"
2122 " <version>1.0-1</version>\n"
2123 " <interface>\n"
2124 " <name>IFoo</name>\n"
2125 " <instance>default</instance>\n"
2126 " </interface>\n"
2127 " </hal>\n"
2128 "</compatibility-matrix>\n");
2129}
2130
2131TEST_F(LibVintfTest, AddOptionalHalMinorVersion) {
2132 CompatibilityMatrix cm1;
2133 CompatibilityMatrix cm2;
2134 std::string error;
2135 std::string xml;
2136
2137 xml =
2138 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2139 " <hal format=\"hidl\" optional=\"false\">\n"
2140 " <name>android.hardware.foo</name>\n"
2141 " <version>1.2-3</version>\n"
2142 " <interface>\n"
2143 " <name>IFoo</name>\n"
2144 " <instance>default</instance>\n"
2145 " </interface>\n"
2146 " </hal>\n"
2147 "</compatibility-matrix>\n";
2148 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2149 << gCompatibilityMatrixConverter.lastError();
2150
2151 xml =
2152 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2153 " <hal format=\"hidl\" optional=\"false\">\n"
2154 " <name>android.hardware.foo</name>\n"
2155 " <version>1.0-4</version>\n"
2156 " <interface>\n"
2157 " <name>IFoo</name>\n"
2158 " <instance>default</instance>\n"
2159 " </interface>\n"
2160 " </hal>\n"
2161 "</compatibility-matrix>\n";
2162 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2163 << gCompatibilityMatrixConverter.lastError();
2164
2165 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2166 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2167 EXPECT_EQ(xml,
2168 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2169 " <hal format=\"hidl\" optional=\"false\">\n"
2170 " <name>android.hardware.foo</name>\n"
2171 " <version>1.2-4</version>\n"
2172 " <interface>\n"
2173 " <name>IFoo</name>\n"
2174 " <instance>default</instance>\n"
2175 " </interface>\n"
2176 " </hal>\n"
2177 "</compatibility-matrix>\n");
2178}
2179
2180TEST_F(LibVintfTest, AddOptionalHalMajorVersion) {
2181 CompatibilityMatrix cm1;
2182 CompatibilityMatrix cm2;
2183 std::string error;
2184 std::string xml;
2185
2186 xml =
2187 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2188 " <hal format=\"hidl\" optional=\"false\">\n"
2189 " <name>android.hardware.foo</name>\n"
2190 " <version>1.2-3</version>\n"
2191 " <interface>\n"
2192 " <name>IFoo</name>\n"
2193 " <instance>default</instance>\n"
2194 " </interface>\n"
2195 " </hal>\n"
2196 "</compatibility-matrix>\n";
2197 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2198 << gCompatibilityMatrixConverter.lastError();
2199
2200 xml =
2201 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2202 " <hal format=\"hidl\" optional=\"false\">\n"
2203 " <name>android.hardware.foo</name>\n"
Yifan Hongd8eea9e2017-12-22 15:13:42 -08002204 " <version>1.2-3</version>\n"
Yifan Hongdbe9db32017-12-11 19:06:11 -08002205 " <version>2.0-4</version>\n"
2206 " <interface>\n"
2207 " <name>IFoo</name>\n"
2208 " <instance>default</instance>\n"
2209 " </interface>\n"
2210 " </hal>\n"
2211 "</compatibility-matrix>\n";
2212 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2213 << gCompatibilityMatrixConverter.lastError();
2214
2215 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2216 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2217 EXPECT_EQ(xml,
2218 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2219 " <hal format=\"hidl\" optional=\"false\">\n"
2220 " <name>android.hardware.foo</name>\n"
2221 " <version>1.2-3</version>\n"
2222 " <interface>\n"
2223 " <name>IFoo</name>\n"
2224 " <instance>default</instance>\n"
2225 " </interface>\n"
2226 " </hal>\n"
2227 " <hal format=\"hidl\" optional=\"true\">\n"
2228 " <name>android.hardware.foo</name>\n"
2229 " <version>2.0-4</version>\n"
2230 " <interface>\n"
2231 " <name>IFoo</name>\n"
2232 " <instance>default</instance>\n"
2233 " </interface>\n"
2234 " </hal>\n"
2235 "</compatibility-matrix>\n");
2236}
2237
Yifan Hongd4b92fe2017-12-20 15:29:03 -08002238TEST_F(LibVintfTest, AddOptionalXmlFile) {
2239 CompatibilityMatrix cm1;
2240 CompatibilityMatrix cm2;
2241 std::string error;
2242 std::string xml;
2243
2244 xml =
2245 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2246 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2247 " <name>foo</name>\n"
2248 " <version>1.0-2</version>\n"
2249 " <path>/foo/bar/baz.xsd</path>\n"
2250 " </xmlfile>\n"
2251 "</compatibility-matrix>\n";
2252 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2253 << gCompatibilityMatrixConverter.lastError();
2254
2255 xml =
2256 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2257 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2258 " <name>foo</name>\n"
2259 " <version>1.1-3</version>\n"
2260 " <path>/foo/bar/quux.xsd</path>\n"
2261 " </xmlfile>\n"
2262 "</compatibility-matrix>\n";
2263 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2264 << gCompatibilityMatrixConverter.lastError();
2265
2266 EXPECT_TRUE(addAllXmlFilesAsOptional(&cm1, &cm2, &error)) << error;
2267 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::XMLFILES_ONLY);
2268 EXPECT_EQ(xml,
2269 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2270 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2271 " <name>foo</name>\n"
2272 " <version>1.0-2</version>\n"
2273 " <path>/foo/bar/baz.xsd</path>\n"
2274 " </xmlfile>\n"
2275 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2276 " <name>foo</name>\n"
2277 " <version>1.1-3</version>\n"
2278 " <path>/foo/bar/quux.xsd</path>\n"
2279 " </xmlfile>\n"
2280 "</compatibility-matrix>\n");
2281}
2282
Yifan Hongfeb454e2018-01-09 16:16:40 -08002283TEST_F(LibVintfTest, VendorNdk) {
2284 CompatibilityMatrix cm;
2285 std::string error;
2286 std::string xml;
2287
2288 xml =
2289 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
2290 " <vendor-ndk>\n"
2291 " <version>P</version>\n"
2292 " <library>libbase.so</library>\n"
2293 " <library>libjpeg.so</library>\n"
2294 " </vendor-ndk>\n"
2295 "</compatibility-matrix>\n";
2296 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2297 << gCompatibilityMatrixConverter.lastError();
2298 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
2299
2300 {
2301 HalManifest manifest;
2302 xml =
2303 "<manifest version=\"1.0\" type=\"framework\">\n"
2304 " <vendor-ndk>\n"
2305 " <version>27</version>\n"
2306 " <library>libbase.so</library>\n"
2307 " <library>libjpeg.so</library>\n"
2308 " </vendor-ndk>\n"
2309 " <vendor-ndk>\n"
2310 " <version>P</version>\n"
2311 " <library>libbase.so</library>\n"
2312 " <library>libjpeg.so</library>\n"
2313 " <library>libtinyxml2.so</library>\n"
2314 " </vendor-ndk>\n"
2315 "</manifest>\n";
2316
2317 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2318 EXPECT_EQ(xml, gHalManifestConverter(manifest));
2319 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2320 }
2321
2322 {
2323 HalManifest manifest;
2324 xml =
2325 "<manifest version=\"1.0\" type=\"framework\">\n"
2326 " <vendor-ndk>\n"
2327 " <version>27</version>\n"
2328 " <library>libbase.so</library>\n"
2329 " <library>libjpeg.so</library>\n"
2330 " </vendor-ndk>\n"
2331 "</manifest>\n";
2332
2333 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2334 EXPECT_EQ(xml, gHalManifestConverter(manifest));
2335 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2336 EXPECT_IN("Vndk version P is not supported.", error);
2337 }
2338
2339 {
2340 HalManifest manifest;
2341 xml =
2342 "<manifest version=\"1.0\" type=\"framework\">\n"
2343 " <vendor-ndk>\n"
2344 " <version>P</version>\n"
2345 " <library>libbase.so</library>\n"
2346 " </vendor-ndk>\n"
2347 "</manifest>\n";
2348
2349 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2350 EXPECT_EQ(xml, gHalManifestConverter(manifest));
2351 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2352 EXPECT_IN("Vndk libs incompatible for version P.", error);
2353 EXPECT_IN("libjpeg.so", error);
2354 }
2355}
2356
2357TEST_F(LibVintfTest, MissingVendorNdkInMatrix) {
2358 CompatibilityMatrix cm;
2359 std::string xml;
2360 std::string error;
2361
2362 xml = "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n";
2363 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2364 << gCompatibilityMatrixConverter.lastError();
2365
2366 {
2367 HalManifest manifest;
2368 xml = "<manifest version=\"1.0\" type=\"framework\"/>\n";
2369 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2370
2371 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2372 }
2373
2374 {
2375 HalManifest manifest;
2376 xml =
2377 "<manifest version=\"1.0\" type=\"framework\">\n"
2378 " <vendor-ndk>\n"
2379 " <version>P</version>\n"
2380 " <library>libbase.so</library>\n"
2381 " </vendor-ndk>\n"
2382 "</manifest>\n";
2383 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2384
2385 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2386 }
2387}
2388
Yifan Hong0bfbc122018-02-02 13:27:29 -08002389TEST_F(LibVintfTest, DuplicatedVendorNdkVersion) {
2390 std::string error;
2391 HalManifest manifest;
2392 std::string xml =
2393 "<manifest version=\"1.0\" type=\"framework\">\n"
2394 " <vendor-ndk>\n"
2395 " <version>27</version>\n"
2396 " </vendor-ndk>\n"
2397 " <vendor-ndk>\n"
2398 " <version>27</version>\n"
2399 " </vendor-ndk>\n"
2400 "</manifest>\n";
2401
2402 EXPECT_FALSE(gHalManifestConverter(&manifest, xml));
2403 EXPECT_EQ("Duplicated manifest.vendor-ndk.version 27", gHalManifestConverter.lastError());
2404}
2405
Yifan Hong68d23062018-01-17 16:09:46 -08002406TEST_F(LibVintfTest, ManifestHalOverride) {
2407 HalManifest manifest;
2408 std::string xml =
2409 "<manifest version=\"1.0\" type=\"device\">\n"
2410 " <hal format=\"hidl\" override=\"true\">\n"
2411 " <name>android.hardware.foo</name>\n"
2412 " <transport>hwbinder</transport>\n"
2413 " <version>1.0</version>\n"
2414 " </hal>\n"
2415 " <hal format=\"hidl\">\n"
2416 " <name>android.hardware.bar</name>\n"
2417 " <transport>hwbinder</transport>\n"
2418 " <version>1.0</version>\n"
2419 " </hal>\n"
2420 "</manifest>\n";
2421 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
Yifan Hongad40a8e2018-03-05 17:45:34 -08002422 const auto& foo = manifest.getHals("android.hardware.foo");
2423 ASSERT_FALSE(foo.empty());
2424 EXPECT_TRUE(foo.front()->isOverride);
2425 const auto& bar = manifest.getHals("android.hardware.bar");
2426 ASSERT_FALSE(bar.empty());
2427 EXPECT_FALSE(bar.front()->isOverride);
Yifan Hong68d23062018-01-17 16:09:46 -08002428}
2429
Yifan Hong84f67e92018-01-17 16:57:19 -08002430// Test functionality of override="true" tag
2431TEST_F(LibVintfTest, ManifestAddOverrideHalSimple) {
2432 HalManifest manifest;
2433 std::string xml = "<manifest version=\"1.0\" type=\"device\"/>\n";
2434 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2435
2436 HalManifest newManifest;
2437 xml =
2438 "<manifest version=\"1.0\" type=\"device\">\n"
2439 " <hal format=\"hidl\" override=\"true\">\n"
2440 " <name>android.hardware.foo</name>\n"
2441 " <transport>hwbinder</transport>\n"
2442 " <version>1.1</version>\n"
2443 " <interface>\n"
2444 " <name>IFoo</name>\n"
2445 " <instance>default</instance>\n"
2446 " </interface>\n"
2447 " </hal>\n"
2448 "</manifest>\n";
2449 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2450
2451 manifest.addAllHals(&newManifest);
2452 EXPECT_EQ(xml, gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
2453}
2454
2455TEST_F(LibVintfTest, ManifestAddOverrideHalSimpleOverride) {
2456 HalManifest manifest;
2457 std::string xml =
2458 "<manifest version=\"1.0\" type=\"device\">\n"
2459 " <hal format=\"hidl\">\n"
2460 " <name>android.hardware.foo</name>\n"
2461 " <transport>hwbinder</transport>\n"
2462 " <version>1.0</version>\n"
2463 " </hal>\n"
2464 "</manifest>\n";
2465 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2466
2467 HalManifest newManifest;
2468 xml =
2469 "<manifest version=\"1.0\" type=\"device\">\n"
2470 " <hal format=\"hidl\" override=\"true\">\n"
2471 " <name>android.hardware.foo</name>\n"
2472 " <transport>hwbinder</transport>\n"
2473 " <version>1.1</version>\n"
2474 " <interface>\n"
2475 " <name>IFoo</name>\n"
2476 " <instance>default</instance>\n"
2477 " </interface>\n"
2478 " </hal>\n"
2479 "</manifest>\n";
2480 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2481
2482 manifest.addAllHals(&newManifest);
2483 EXPECT_EQ(xml, gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
2484}
2485
2486// Existing major versions should be removed.
2487TEST_F(LibVintfTest, ManifestAddOverrideHalMultiVersion) {
2488 HalManifest manifest;
2489 std::string xml =
2490 "<manifest version=\"1.0\" type=\"device\">\n"
2491 " <hal format=\"hidl\">\n"
2492 " <name>android.hardware.foo</name>\n"
2493 " <transport>hwbinder</transport>\n"
2494 " <version>1.3</version>\n"
2495 " <version>2.4</version>\n"
2496 " <interface>\n"
2497 " <name>IFoo</name>\n"
2498 " <instance>slot1</instance>\n"
2499 " </interface>\n"
2500 " </hal>\n"
2501 " <hal format=\"hidl\">\n"
2502 " <name>android.hardware.bar</name>\n"
2503 " <transport>hwbinder</transport>\n"
2504 " <version>1.3</version>\n"
2505 " </hal>\n"
2506 "</manifest>\n";
2507 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2508
2509 HalManifest newManifest;
2510 xml =
2511 "<manifest version=\"1.0\" type=\"device\">\n"
2512 " <hal format=\"hidl\" override=\"true\">\n"
2513 " <name>android.hardware.foo</name>\n"
2514 " <transport>hwbinder</transport>\n"
2515 " <version>1.1</version>\n"
2516 " <version>3.1</version>\n"
2517 " <interface>\n"
2518 " <name>IFoo</name>\n"
2519 " <instance>slot2</instance>\n"
2520 " </interface>\n"
2521 " </hal>\n"
2522 "</manifest>\n";
2523 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2524
2525 manifest.addAllHals(&newManifest);
2526 EXPECT_EQ(
2527 "<manifest version=\"1.0\" type=\"device\">\n"
2528 " <hal format=\"hidl\">\n"
2529 " <name>android.hardware.bar</name>\n"
2530 " <transport>hwbinder</transport>\n"
2531 " <version>1.3</version>\n"
2532 " </hal>\n"
2533 " <hal format=\"hidl\">\n"
2534 " <name>android.hardware.foo</name>\n"
2535 " <transport>hwbinder</transport>\n"
2536 " <version>2.4</version>\n"
2537 " <interface>\n"
2538 " <name>IFoo</name>\n"
2539 " <instance>slot1</instance>\n"
2540 " </interface>\n"
2541 " </hal>\n"
2542 " <hal format=\"hidl\" override=\"true\">\n"
2543 " <name>android.hardware.foo</name>\n"
2544 " <transport>hwbinder</transport>\n"
2545 " <version>1.1</version>\n"
2546 " <version>3.1</version>\n"
2547 " <interface>\n"
2548 " <name>IFoo</name>\n"
2549 " <instance>slot2</instance>\n"
2550 " </interface>\n"
2551 " </hal>\n"
2552 "</manifest>\n",
2553 gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
2554}
2555
2556TEST_F(LibVintfTest, ManifestAddOverrideHalMultiVersion2) {
2557 HalManifest manifest;
2558 std::string xml =
2559 "<manifest version=\"1.0\" type=\"device\">\n"
2560 " <hal format=\"hidl\">\n"
2561 " <name>android.hardware.foo</name>\n"
2562 " <transport>hwbinder</transport>\n"
2563 " <version>1.3</version>\n"
2564 " <version>2.4</version>\n"
2565 " <interface>\n"
2566 " <name>IFoo</name>\n"
2567 " <instance>slot1</instance>\n"
2568 " </interface>\n"
2569 " </hal>\n"
2570 "</manifest>\n";
2571 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2572
2573 HalManifest newManifest;
2574 xml =
2575 "<manifest version=\"1.0\" type=\"device\">\n"
2576 " <hal format=\"hidl\" override=\"true\">\n"
2577 " <name>android.hardware.foo</name>\n"
2578 " <transport>hwbinder</transport>\n"
2579 " <version>1.1</version>\n"
2580 " <version>2.1</version>\n"
2581 " <interface>\n"
2582 " <name>IFoo</name>\n"
2583 " <instance>slot2</instance>\n"
2584 " </interface>\n"
2585 " </hal>\n"
2586 "</manifest>\n";
2587 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2588
2589 manifest.addAllHals(&newManifest);
2590 EXPECT_EQ(xml, gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
2591}
2592
2593// if no <versions>, remove all existing <hal> with given <name>.
2594TEST_F(LibVintfTest, ManifestAddOverrideHalRemoveAll) {
2595 HalManifest manifest;
2596 std::string xml =
2597 "<manifest version=\"1.0\" type=\"device\">\n"
2598 " <hal format=\"hidl\">\n"
2599 " <name>android.hardware.foo</name>\n"
2600 " <transport>hwbinder</transport>\n"
2601 " <version>1.3</version>\n"
2602 " <version>2.4</version>\n"
2603 " <interface>\n"
2604 " <name>IFoo</name>\n"
2605 " <instance>slot1</instance>\n"
2606 " </interface>\n"
2607 " </hal>\n"
2608 " <hal format=\"hidl\">\n"
2609 " <name>android.hardware.foo</name>\n"
2610 " <transport>hwbinder</transport>\n"
2611 " <version>3.1</version>\n"
2612 " <version>4.3</version>\n"
2613 " <interface>\n"
2614 " <name>IBar</name>\n"
2615 " <instance>slot2</instance>\n"
2616 " </interface>\n"
2617 " </hal>\n"
2618 " <hal format=\"hidl\">\n"
2619 " <name>android.hardware.bar</name>\n"
2620 " <transport>hwbinder</transport>\n"
2621 " <version>1.3</version>\n"
2622 " </hal>\n"
2623 "</manifest>\n";
2624 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2625
2626 HalManifest newManifest;
2627 xml =
2628 "<manifest version=\"1.0\" type=\"device\">\n"
2629 " <hal format=\"hidl\" override=\"true\">\n"
2630 " <name>android.hardware.foo</name>\n"
2631 " <transport>hwbinder</transport>\n"
2632 " </hal>\n"
2633 "</manifest>\n";
2634 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2635
2636 manifest.addAllHals(&newManifest);
2637 EXPECT_EQ(
2638 "<manifest version=\"1.0\" type=\"device\">\n"
2639 " <hal format=\"hidl\">\n"
2640 " <name>android.hardware.bar</name>\n"
2641 " <transport>hwbinder</transport>\n"
2642 " <version>1.3</version>\n"
2643 " </hal>\n"
2644 " <hal format=\"hidl\" override=\"true\">\n"
2645 " <name>android.hardware.foo</name>\n"
2646 " <transport>hwbinder</transport>\n"
2647 " </hal>\n"
2648 "</manifest>\n",
2649 gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
2650}
2651
Yifan Honga28729e2018-01-17 13:40:35 -08002652// Make sure missing tags in old VINTF files does not cause incompatibilities.
2653TEST_F(LibVintfTest, Empty) {
2654 CompatibilityMatrix cm;
2655 HalManifest manifest;
2656 std::string xml;
2657 std::string error;
2658
2659 xml = "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n";
2660 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2661 << gCompatibilityMatrixConverter.lastError();
2662
2663 xml = "<manifest version=\"1.0\" type=\"framework\"/>\n";
2664 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2665
2666 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2667}
2668
2669TEST_F(LibVintfTest, SystemSdk) {
2670 CompatibilityMatrix cm;
2671 std::string xml;
2672 std::string error;
2673
2674 xml =
2675 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
2676 " <system-sdk>\n"
2677 " <version>1</version>\n"
2678 " <version>P</version>\n"
2679 " </system-sdk>\n"
2680 "</compatibility-matrix>\n";
2681 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2682 << gCompatibilityMatrixConverter.lastError();
2683 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm, ~SerializeFlag::NO_SSDK));
2684
2685 {
2686 HalManifest manifest;
2687 xml =
2688 "<manifest version=\"1.0\" type=\"framework\">\n"
2689 " <system-sdk>\n"
2690 " <version>1</version>\n"
2691 " <version>P</version>\n"
2692 " </system-sdk>\n"
2693 "</manifest>\n";
2694 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2695 EXPECT_EQ(xml, gHalManifestConverter(manifest, ~SerializeFlag::NO_SSDK));
2696
2697 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2698 }
2699
2700 {
2701 HalManifest manifest;
2702 xml =
2703 "<manifest version=\"1.0\" type=\"framework\">\n"
2704 " <system-sdk>\n"
2705 " <version>1</version>\n"
2706 " <version>3</version>\n"
2707 " <version>P</version>\n"
2708 " </system-sdk>\n"
2709 "</manifest>\n";
2710 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2711 EXPECT_TRUE(manifest.checkCompatibility(cm, &error));
2712 }
2713
2714 {
2715 HalManifest manifest;
2716 xml =
2717 "<manifest version=\"1.0\" type=\"framework\">\n"
2718 " <system-sdk>\n"
2719 " <version>1</version>\n"
2720 " </system-sdk>\n"
2721 "</manifest>\n";
2722 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2723 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2724 EXPECT_TRUE(error.find("System SDK") != std::string::npos) << error;
2725 }
2726}
2727
Yifan Hong94757062018-02-09 16:36:31 -08002728TEST_F(LibVintfTest, ManifestLastError) {
2729 HalManifest e;
2730 // Set mLastError to something else before testing.
2731 EXPECT_FALSE(gHalManifestConverter(&e, "<manifest/>"));
2732 EXPECT_NE("Not a valid XML", gHalManifestConverter.lastError());
2733
2734 std::string error;
2735 std::string prevError = gHalManifestConverter.lastError();
2736 EXPECT_FALSE(gHalManifestConverter(&e, "", &error));
2737 EXPECT_EQ("Not a valid XML", error);
2738 EXPECT_EQ(prevError, gHalManifestConverter.lastError()) << "lastError() should not be modified";
2739}
2740
2741TEST_F(LibVintfTest, MatrixLastError) {
2742 CompatibilityMatrix e;
2743 // Set mLastError to something else before testing.
2744 EXPECT_FALSE(gCompatibilityMatrixConverter(&e, "<compatibility-matrix/>"));
2745 EXPECT_NE("Not a valid XML", gCompatibilityMatrixConverter.lastError());
2746
2747 std::string error;
2748 std::string prevError = gCompatibilityMatrixConverter.lastError();
2749 EXPECT_FALSE(gCompatibilityMatrixConverter(&e, "", &error));
2750 EXPECT_EQ("Not a valid XML", error);
2751 EXPECT_EQ(prevError, gCompatibilityMatrixConverter.lastError())
2752 << "lastError() should not be modified";
2753}
2754
Yifan Hongde3aec22018-02-12 15:39:47 -08002755TEST_F(LibVintfTest, MatrixDetailErrorMsg) {
2756 std::string error;
2757 std::string xml;
2758
2759 HalManifest manifest;
2760 xml =
Yifan Hong970bf042018-03-07 13:58:43 -08002761 "<manifest version=\"1.0\" type=\"device\" target-level=\"103\">\n"
Yifan Hongde3aec22018-02-12 15:39:47 -08002762 " <hal format=\"hidl\">\n"
2763 " <name>android.hardware.foo</name>\n"
2764 " <transport>hwbinder</transport>\n"
2765 " <version>1.0</version>\n"
2766 " <interface>\n"
2767 " <name>IFoo</name>\n"
2768 " <instance>default</instance>\n"
2769 " </interface>\n"
2770 " </hal>\n"
2771 "</manifest>\n";
2772 ASSERT_TRUE(gHalManifestConverter(&manifest, xml, &error)) << error;
2773
2774 {
2775 CompatibilityMatrix cm;
2776 xml =
Yifan Hong970bf042018-03-07 13:58:43 -08002777 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"100\">\n"
Yifan Hongde3aec22018-02-12 15:39:47 -08002778 " <hal format=\"hidl\" optional=\"false\">\n"
2779 " <name>android.hardware.foo</name>\n"
2780 " <version>1.2-3</version>\n"
2781 " <version>4.5</version>\n"
2782 " <interface>\n"
2783 " <name>IFoo</name>\n"
2784 " <instance>default</instance>\n"
2785 " <instance>slot1</instance>\n"
2786 " </interface>\n"
2787 " <interface>\n"
2788 " <name>IBar</name>\n"
2789 " <instance>default</instance>\n"
2790 " </interface>\n"
2791 " </hal>\n"
2792 "</compatibility-matrix>\n";
2793 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml, &error)) << error;
2794 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
Yifan Hong970bf042018-03-07 13:58:43 -08002795 EXPECT_IN("Manifest level = 103", error)
2796 EXPECT_IN("Matrix level = 100", error)
Yifan Hongde3aec22018-02-12 15:39:47 -08002797 EXPECT_IN(
2798 "android.hardware.foo:\n"
2799 " required: \n"
2800 " (@1.2-3::IBar/default AND @1.2-3::IFoo/default AND @1.2-3::IFoo/slot1) OR\n"
2801 " (@4.5::IBar/default AND @4.5::IFoo/default AND @4.5::IFoo/slot1)\n"
2802 " provided: @1.0::IFoo/default",
2803 error);
2804 }
2805
2806 {
2807 CompatibilityMatrix cm;
2808 xml =
2809 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
2810 " <hal format=\"hidl\" optional=\"false\">\n"
2811 " <name>android.hardware.foo</name>\n"
2812 " <version>1.2-3</version>\n"
2813 " <interface>\n"
2814 " <name>IFoo</name>\n"
2815 " <instance>default</instance>\n"
2816 " <instance>slot1</instance>\n"
2817 " </interface>\n"
2818 " </hal>\n"
2819 "</compatibility-matrix>\n";
2820 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml, &error)) << error;
2821 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2822 EXPECT_IN(
2823 "android.hardware.foo:\n"
2824 " required: (@1.2-3::IFoo/default AND @1.2-3::IFoo/slot1)\n"
2825 " provided: @1.0::IFoo/default",
2826 error);
2827 }
2828
2829 // the most frequent use case.
2830 {
2831 CompatibilityMatrix cm;
2832 xml =
2833 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
2834 " <hal format=\"hidl\" optional=\"false\">\n"
2835 " <name>android.hardware.foo</name>\n"
2836 " <version>1.2-3</version>\n"
2837 " <interface>\n"
2838 " <name>IFoo</name>\n"
2839 " <instance>default</instance>\n"
2840 " </interface>\n"
2841 " </hal>\n"
2842 "</compatibility-matrix>\n";
2843 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml, &error)) << error;
2844 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2845 EXPECT_IN(
2846 "android.hardware.foo:\n"
2847 " required: @1.2-3::IFoo/default\n"
2848 " provided: @1.0::IFoo/default",
2849 error);
2850 }
2851}
2852
Yifan Honga9993572017-01-24 19:33:15 -08002853} // namespace vintf
2854} // namespace android
2855
Yifan Hong676447a2016-11-15 12:57:23 -08002856int main(int argc, char **argv) {
2857 ::testing::InitGoogleTest(&argc, argv);
2858 return RUN_ALL_TESTS();
2859}