blob: f0f04239d2c3b44714a089ec20867498f86e26cb [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 Hong8ec6f3f2018-03-13 13:58:56 -0700128 vm.add(ManifestHal{HalFormat::HIDL,
129 "android.hardware.camera",
130 {Version(2, 0)},
131 {Transport::HWBINDER, Arch::ARCH_EMPTY},
132 {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
133 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}});
134 vm.add(ManifestHal{HalFormat::HIDL,
135 "android.hardware.nfc",
136 {Version(1, 0)},
137 {Transport::PASSTHROUGH, Arch::ARCH_32_64},
138 {{"INfc", {"INfc", {"default"}}}}});
Yifan Honga9993572017-01-24 19:33:15 -0800139
140 return vm;
141 }
Yifan Hongd4857902017-06-13 14:13:56 -0700142 HalManifest testDeviceManifestWithXmlFile() {
143 HalManifest vm = testDeviceManifest();
144 ManifestXmlFile xmlFile;
145 xmlFile.mName = "media_profile";
146 xmlFile.mVersion = {1, 0};
147 vm.addXmlFile(std::move(xmlFile));
148 return vm;
149 }
Yifan Honga04e1472017-04-05 13:15:34 -0700150 HalManifest testFrameworkManfiest() {
151 HalManifest vm;
152 vm.mType = SchemaType::FRAMEWORK;
Yifan Hong8ec6f3f2018-03-13 13:58:56 -0700153 vm.add(ManifestHal{HalFormat::HIDL,
154 "android.hidl.manager",
155 {Version(1, 0)},
156 {Transport::HWBINDER, Arch::ARCH_EMPTY},
157 {
158 {"IServiceManager", {"IServiceManager", {"default"}}},
159 }});
Yifan Honga04e1472017-04-05 13:15:34 -0700160 Vndk vndk2505;
161 vndk2505.mVersionRange = {25, 0, 5};
162 vndk2505.mLibraries = { "libjpeg.so", "libbase.so" };
163 Vndk vndk2513;
164 vndk2513.mVersionRange = {25, 1, 3};
165 vndk2513.mLibraries = { "libjpeg.so", "libbase.so", "libtinyxml2.so" };
166 vm.framework.mVndks = { std::move(vndk2505), std::move(vndk2513) };
167
168 return vm;
169 }
Yifan Honga7201e72017-02-17 10:09:59 -0800170 RuntimeInfo testRuntimeInfo() {
171 RuntimeInfo info;
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800172 info.mOsName = "Linux";
173 info.mNodeName = "localhost";
174 info.mOsRelease = "3.18.31-g936f9a479d0f";
175 info.mKernelVersion = {3, 18, 31};
176 info.mOsVersion = "#4 SMP PREEMPT Wed Feb 1 18:10:52 PST 2017";
177 info.mHardwareId = "aarch64";
178 info.mKernelSepolicyVersion = 30;
Yifan Hongf1af7522017-02-16 18:00:55 -0800179 info.mKernelConfigs = {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800180 {"CONFIG_64BIT", "y"},
181 {"CONFIG_ANDROID_BINDER_DEVICES", "\"binder,hwbinder\""},
182 {"CONFIG_ARCH_MMAP_RND_BITS", "24"},
183 {"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", "\"\""},
184 {"CONFIG_ILLEGAL_POINTER_VALUE", "0xdead000000000000"}
185 };
Yifan Hong881a9e452017-04-27 19:31:13 -0700186 setAvb(info, {2, 1}, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800187 return info;
188 }
Yifan Hong676447a2016-11-15 12:57:23 -0800189};
190
Yifan Hongd5cd0482017-06-19 12:25:48 -0700191TEST_F(LibVintfTest, ArchOperatorOr) {
192 Arch a = Arch::ARCH_EMPTY;
193 a |= Arch::ARCH_32;
194 EXPECT_EQ(Arch::ARCH_32, a);
195
196 a |= Arch::ARCH_64;
197 EXPECT_EQ(Arch::ARCH_32_64, a);
198
199 a = Arch::ARCH_EMPTY;
200 a |= Arch::ARCH_64;
201 EXPECT_EQ(Arch::ARCH_64, a);
202}
Yifan Hongef6d4d32017-01-23 14:12:28 -0800203
204TEST_F(LibVintfTest, Stringify) {
Yifan Honga04e1472017-04-05 13:15:34 -0700205 HalManifest vm = testDeviceManifest();
Yifan Hong974ad9c2017-04-04 15:37:39 -0700206 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/2.0:"
207 "hidl/android.hardware.nfc/passthrough32+64/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -0800208
209 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
210 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
211
212 VersionRange v(1, 2, 3);
213 EXPECT_EQ(to_string(v), "1.2-3");
214 VersionRange v2;
215 EXPECT_TRUE(parse("1.2-3", &v2));
216 EXPECT_EQ(v, v2);
217}
218
Yifan Hong9bbdb282017-04-12 21:53:59 -0700219TEST_F(LibVintfTest, GetTransport) {
220 HalManifest vm = testDeviceManifest();
221 EXPECT_EQ(Transport::HWBINDER, vm.getTransport("android.hardware.camera",
222 {2, 0}, "ICamera", "default"));
223}
224
Steven Morelanddd135ec2018-01-22 16:37:34 -0800225TEST_F(LibVintfTest, FutureManifestCompatible) {
226 HalManifest expectedManifest;
Yifan Hong8ec6f3f2018-03-13 13:58:56 -0700227 expectedManifest.add(ManifestHal{HalFormat::HIDL,
228 "android.hardware.foo",
229 {Version(1, 0)},
230 {Transport::HWBINDER, Arch::ARCH_EMPTY},
231 {
Steven Morelanddd135ec2018-01-22 16:37:34 -0800232 {"IFoo", {"IFoo", {"default"}}},
233 }});
234 std::string manifestXml =
235 "<manifest version=\"1.0\" type=\"device\" might_add=\"true\">\n"
236 " <hal format=\"hidl\" attribuet_might_be_added=\"value\">\n"
237 " <name>android.hardware.foo</name>\n"
238 " <transport>hwbinder</transport>\n"
239 " <version>1.0</version>\n"
240 " <interface>\n"
241 " <name>IFoo</name>\n"
242 " <instance>default</instance>\n"
243 " </interface>\n"
244 " </hal>\n"
245 " <tag_might_be_added/>\n"
246 "</manifest>\n";
247 HalManifest manifest;
248 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
249 EXPECT_EQ(expectedManifest, manifest);
250}
251
Yifan Hongd2b7e642017-02-17 10:15:32 -0800252TEST_F(LibVintfTest, HalManifestConverter) {
Yifan Honga04e1472017-04-05 13:15:34 -0700253 HalManifest vm = testDeviceManifest();
Yifan Hongd2b7e642017-02-17 10:15:32 -0800254 std::string xml = gHalManifestConverter(vm);
Yifan Hong676447a2016-11-15 12:57:23 -0800255 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700256 "<manifest version=\"1.0\" type=\"device\">\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800257 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800258 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800259 " <transport>hwbinder</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800260 " <version>2.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800261 " <interface>\n"
262 " <name>IBetterCamera</name>\n"
263 " <instance>camera</instance>\n"
264 " </interface>\n"
265 " <interface>\n"
266 " <name>ICamera</name>\n"
267 " <instance>default</instance>\n"
268 " <instance>legacy/0</instance>\n"
269 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800270 " </hal>\n"
271 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800272 " <name>android.hardware.nfc</name>\n"
Yifan Hongc54d32c2017-03-07 19:12:26 -0800273 " <transport arch=\"32+64\">passthrough</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800274 " <version>1.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800275 " <interface>\n"
276 " <name>INfc</name>\n"
277 " <instance>default</instance>\n"
278 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800279 " </hal>\n"
Yifan Hong2a3dd082017-04-04 17:15:35 -0700280 " <sepolicy>\n"
281 " <version>25.0</version>\n"
282 " </sepolicy>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800283 "</manifest>\n");
Yifan Hongfb7469c2017-04-05 19:15:21 -0700284 HalManifest vm2;
285 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
286 EXPECT_EQ(vm, vm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800287}
288
Yifan Honga04e1472017-04-05 13:15:34 -0700289TEST_F(LibVintfTest, HalManifestConverterFramework) {
290 HalManifest vm = testFrameworkManfiest();
291 std::string xml = gHalManifestConverter(vm);
292 EXPECT_EQ(xml,
293 "<manifest version=\"1.0\" type=\"framework\">\n"
294 " <hal format=\"hidl\">\n"
295 " <name>android.hidl.manager</name>\n"
296 " <transport>hwbinder</transport>\n"
297 " <version>1.0</version>\n"
298 " <interface>\n"
299 " <name>IServiceManager</name>\n"
300 " <instance>default</instance>\n"
301 " </interface>\n"
302 " </hal>\n"
303 " <vndk>\n"
304 " <version>25.0.5</version>\n"
305 " <library>libbase.so</library>\n"
306 " <library>libjpeg.so</library>\n"
307 " </vndk>\n"
308 " <vndk>\n"
309 " <version>25.1.3</version>\n"
310 " <library>libbase.so</library>\n"
311 " <library>libjpeg.so</library>\n"
312 " <library>libtinyxml2.so</library>\n"
313 " </vndk>\n"
314 "</manifest>\n");
315 HalManifest vm2;
316 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700317 EXPECT_EQ(vm, vm2);
Yifan Honga04e1472017-04-05 13:15:34 -0700318}
319
Yifan Hong8e9c6692017-02-28 14:07:42 -0800320TEST_F(LibVintfTest, HalManifestOptional) {
321 HalManifest vm;
322 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700323 "<manifest version=\"1.0\" type=\"device\"></manifest>"));
Yifan Hong8e9c6692017-02-28 14:07:42 -0800324 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700325 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800326 " <hal>"
327 " <name>android.hidl.manager</name>"
328 " <transport>hwbinder</transport>"
329 " <version>1.0</version>"
330 " </hal>"
331 "</manifest>"));
332 EXPECT_FALSE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700333 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800334 " <hal>"
335 " <name>android.hidl.manager</name>"
336 " <version>1.0</version>"
337 " </hal>"
338 "</manifest>"));
339}
340
Yifan Honge0bb98d2017-08-07 14:40:19 -0700341TEST_F(LibVintfTest, HalManifestNative) {
342 HalManifest vm;
343 EXPECT_TRUE(gHalManifestConverter(&vm,
344 "<manifest version=\"1.0\" type=\"device\">"
345 " <hal format=\"native\">"
346 " <name>foo</name>"
347 " <version>1.0</version>"
348 " </hal>"
349 "</manifest>"))
350 << gHalManifestConverter.lastError();
351 EXPECT_FALSE(gHalManifestConverter(&vm,
352 "<manifest version=\"1.0\" type=\"device\">"
353 " <hal format=\"native\">"
354 " <name>foo</name>"
355 " <version>1.0</version>"
356 " <transport>hwbinder</transport>"
357 " </hal>"
358 "</manifest>"));
359 EXPECT_TRUE(gHalManifestConverter.lastError().find(
360 "Native HAL 'foo' should not have <transport> defined") != std::string::npos);
361}
362
Yifan Hong79dcc1f2017-05-22 14:35:19 -0700363TEST_F(LibVintfTest, HalManifestDuplicate) {
364 HalManifest vm;
365 EXPECT_FALSE(gHalManifestConverter(&vm,
366 "<manifest version=\"1.0\" type=\"device\">"
367 " <hal>"
368 " <name>android.hidl.manager</name>"
369 " <transport>hwbinder</transport>"
370 " <version>1.0</version>"
371 " <version>1.1</version>"
372 " </hal>"
373 "</manifest>"))
374 << "Should not allow duplicated major version in <hal>";
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 " </hal>"
382 " <hal>"
383 " <name>android.hidl.manager</name>"
384 " <transport arch=\"32+64\">passthrough</transport>"
385 " <version>1.1</version>"
386 " </hal>"
387 "</manifest>"))
388 << "Should not allow duplicated major version across <hal>";
389}
390
391TEST_F(LibVintfTest, HalManifestGetTransport) {
392 HalManifest vm;
393 EXPECT_TRUE(gHalManifestConverter(&vm,
394 "<manifest version=\"1.0\" type=\"device\">"
395 " <hal>"
396 " <name>android.hidl.manager</name>"
397 " <transport>hwbinder</transport>"
398 " <version>1.0</version>"
399 " <interface>"
400 " <name>IServiceManager</name>"
401 " <instance>default</instance>"
402 " </interface>"
403 " </hal>"
404 " <hal>"
405 " <name>android.hidl.manager</name>"
406 " <transport arch=\"32+64\">passthrough</transport>"
407 " <version>2.1</version>"
408 " <interface>"
409 " <name>IServiceManager</name>"
410 " <instance>default</instance>"
411 " </interface>"
412 " </hal>"
413 "</manifest>"));
414 EXPECT_EQ(Transport::PASSTHROUGH,
415 vm.getTransport("android.hidl.manager", {2, 1}, "IServiceManager", "default"));
416 EXPECT_EQ(Transport::PASSTHROUGH,
417 vm.getTransport("android.hidl.manager", {2, 0}, "IServiceManager", "default"));
418 EXPECT_EQ(Transport::EMPTY,
419 vm.getTransport("android.hidl.manager", {2, 2}, "IServiceManager", "default"));
420 EXPECT_EQ(Transport::HWBINDER,
421 vm.getTransport("android.hidl.manager", {1, 0}, "IServiceManager", "default"));
422}
423
Yifan Hongec3b9b72017-02-23 13:24:42 -0800424TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700425 HalManifest vm = testDeviceManifest();
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700426 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "ICamera"),
427 std::set<std::string>({"default", "legacy/0"}));
428 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "IBetterCamera"),
429 std::set<std::string>({"camera"}));
430 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "INotExist"),
431 std::set<std::string>({}));
432 EXPECT_EQ(vm.getInstances("android.hardware.nfc", {1, 0}, "INfc"),
433 std::set<std::string>({"default"}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800434
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700435 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "default"));
436 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "legacy/0"));
437 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "camera"));
438 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", {1, 0}, "INfc", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800439
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700440 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "INotExist", "default"));
441 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "notexist"));
442 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "default"));
443 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "INotExist", "notexist"));
444 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", {1, 0}, "INfc", "notexist"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800445}
446
Yifan Hong676447a2016-11-15 12:57:23 -0800447TEST_F(LibVintfTest, VersionConverter) {
448 Version v(3, 6);
449 std::string xml = gVersionConverter(v);
450 EXPECT_EQ(xml, "<version>3.6</version>\n");
451 Version v2;
452 EXPECT_TRUE(gVersionConverter(&v2, xml));
453 EXPECT_EQ(v, v2);
454}
455
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700456static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
457 std::string name{intf.name};
458 return map->emplace(std::move(name), std::move(intf)).second;
459}
460
Yifan Hong676447a2016-11-15 12:57:23 -0800461TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800462 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800463 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700464 false /* optional */, {}};
465 EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
466 EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800467 std::string xml = gMatrixHalConverter(mh);
468 EXPECT_EQ(xml,
469 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800470 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800471 " <version>1.2-3</version>\n"
472 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700473 " <interface>\n"
474 " <name>IBetterCamera</name>\n"
475 " <instance>default</instance>\n"
476 " <instance>great</instance>\n"
477 " </interface>\n"
478 " <interface>\n"
479 " <name>ICamera</name>\n"
480 " <instance>default</instance>\n"
481 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800482 "</hal>\n");
483 MatrixHal mh2;
484 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
485 EXPECT_EQ(mh, mh2);
486}
487
Yifan Hong3f5489a2017-02-08 11:14:21 -0800488TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
489
490 KernelConfigTypedValue converted;
491
492 auto testOne = [] (const KernelConfigTypedValue &original,
493 const std::string &expectXml) {
494 std::string xml;
495 KernelConfigTypedValue converted;
496 xml = gKernelConfigTypedValueConverter(original);
497 EXPECT_EQ(xml, expectXml);
498 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
499 EXPECT_EQ(original, converted);
500 };
501
502 auto testParse = [] (const KernelConfigTypedValue &original,
503 const std::string &xml) {
504 KernelConfigTypedValue converted;
505 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
506 EXPECT_EQ(original, converted);
507 };
508
509 testOne(KernelConfigTypedValue("stringvalue"),
510 "<value type=\"string\">stringvalue</value>\n");
511 testOne(KernelConfigTypedValue(""),
512 "<value type=\"string\"></value>\n");
513
514 testOne(KernelConfigTypedValue(Tristate::YES),
515 "<value type=\"tristate\">y</value>\n");
516 testOne(KernelConfigTypedValue(Tristate::NO),
517 "<value type=\"tristate\">n</value>\n");
518 testOne(KernelConfigTypedValue(Tristate::MODULE),
519 "<value type=\"tristate\">m</value>\n");
520 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
521 "<value type=\"tristate\">q</value>\n"));
522
523 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
524 "<value type=\"range\">4-20</value>\n");
525 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
526 "<value type=\"range\">0-18446744073709551615</value>\n");
527 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
528 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
529
530 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
531 "<value type=\"int\">-18446744073709551616</value>\n"));
532
533 testOne(KernelConfigTypedValue(INT64_MIN),
534 "<value type=\"int\">-9223372036854775808</value>\n");
535 testParse(KernelConfigTypedValue(INT64_MIN),
536 "<value type=\"int\">0x8000000000000000</value>\n");
537 testParse(KernelConfigTypedValue(INT64_MIN),
538 "<value type=\"int\">-0X8000000000000000</value>\n");
539
540 testParse(KernelConfigTypedValue(INT64_MIN + 1),
541 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
542
543 testParse(KernelConfigTypedValue(-0x50),
544 "<value type=\"int\">-0x50</value>\n");
545
546 testOne(KernelConfigTypedValue(0),
547 "<value type=\"int\">0</value>\n");
548
549 // Truncation for underflow.
550 testParse(KernelConfigTypedValue(1),
551 "<value type=\"int\">-0xffffffffffffffff</value>\n");
552 testParse(KernelConfigTypedValue(1),
553 "<value type=\"int\">-18446744073709551615</value>\n");
554
555 testOne(KernelConfigTypedValue(INT64_MAX),
556 "<value type=\"int\">9223372036854775807</value>\n");
557 testParse(KernelConfigTypedValue(INT64_MAX),
558 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
559 // Truncation for underflow.
560 testParse(KernelConfigTypedValue(INT64_MAX),
561 "<value type=\"int\">-9223372036854775809</value>\n");
562
563 testParse(KernelConfigTypedValue(-1),
564 "<value type=\"int\">18446744073709551615</value>\n");
565 testParse(KernelConfigTypedValue(-1),
566 "<value type=\"int\">0xffffffffffffffff</value>\n");
567
568 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
569 "<value type=\"int\">18446744073709551616</value>\n"));
570}
571
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700572TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
Yifan Hong676447a2016-11-15 12:57:23 -0800573 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800574 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800575 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700576 false /* optional */, testHalInterfaces()}));
Yifan Honga9993572017-01-24 19:33:15 -0800577 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800578 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700579 true /* optional */, testHalInterfaces()}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800580 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
581 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
582 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
583 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700584 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700585 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800586 std::string xml = gCompatibilityMatrixConverter(cm);
587 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700588 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800589 " <hal format=\"native\" optional=\"false\">\n"
590 " <name>android.hardware.camera</name>\n"
591 " <version>1.2-3</version>\n"
592 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700593 " <interface>\n"
594 " <name>IFoo</name>\n"
595 " <instance>default</instance>\n"
596 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800597 " </hal>\n"
598 " <hal format=\"native\" optional=\"true\">\n"
599 " <name>android.hardware.nfc</name>\n"
600 " <version>4.5-6</version>\n"
601 " <version>10.11-12</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700602 " <interface>\n"
603 " <name>IFoo</name>\n"
604 " <instance>default</instance>\n"
605 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800606 " </hal>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800607 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800608 " <config>\n"
609 " <key>CONFIG_FOO</key>\n"
610 " <value type=\"tristate\">y</value>\n"
611 " </config>\n"
612 " <config>\n"
613 " <key>CONFIG_BAR</key>\n"
614 " <value type=\"string\">stringvalue</value>\n"
615 " </config>\n"
616 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800617 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800618 " <config>\n"
619 " <key>CONFIG_BAZ</key>\n"
620 " <value type=\"int\">20</value>\n"
621 " </config>\n"
622 " <config>\n"
623 " <key>CONFIG_BAR</key>\n"
624 " <value type=\"range\">3-5</value>\n"
625 " </config>\n"
626 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800627 " <sepolicy>\n"
628 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700629 " <sepolicy-version>25.0</sepolicy-version>\n"
630 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800631 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700632 " <avb>\n"
633 " <vbmeta-version>2.1</vbmeta-version>\n"
634 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800635 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800636 CompatibilityMatrix cm2;
637 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700638 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800639}
640
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700641TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
642 CompatibilityMatrix cm;
643 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
644 {{VersionRange(1,0)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700645 false /* optional */, testHalInterfaces()}));
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700646 set(cm, SchemaType::DEVICE);
647 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
648 std::string xml = gCompatibilityMatrixConverter(cm);
649 EXPECT_EQ(xml,
650 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
651 " <hal format=\"native\" optional=\"false\">\n"
652 " <name>android.hidl.manager</name>\n"
653 " <version>1.0</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700654 " <interface>\n"
655 " <name>IFoo</name>\n"
656 " <instance>default</instance>\n"
657 " </interface>\n"
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700658 " </hal>\n"
659 " <vndk>\n"
660 " <version>25.0.1-5</version>\n"
661 " <library>libbase.so</library>\n"
662 " <library>libjpeg.so</library>\n"
663 " </vndk>\n"
664 "</compatibility-matrix>\n");
665 CompatibilityMatrix cm2;
666 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
667 EXPECT_EQ(cm, cm2);
668}
669
Yifan Hong676447a2016-11-15 12:57:23 -0800670TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800671 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800672
Yifan Hong8ec6f3f2018-03-13 13:58:56 -0700673 ManifestHal invalidHal{HalFormat::HIDL,
674 "android.hardware.camera",
675 {{Version(2, 0), Version(2, 1)}},
676 {Transport::PASSTHROUGH, Arch::ARCH_32_64},
677 {}};
Yifan Hong2059ffc2017-02-24 11:32:02 -0800678
Yifan Hong5a06ef72017-01-24 19:54:24 -0800679 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800680 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800681 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800682}
683
Tri Vod0143942017-03-24 17:51:23 -0700684TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700685 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700686 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
687 {"android.hardware.camera", "android.hardware.nfc"}));
688}
689
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700690TEST_F(LibVintfTest, HalManifestGetAllHals) {
Yifan Honga04e1472017-04-05 13:15:34 -0700691 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700692 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
693 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800694
695 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
696 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800697 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800698 EXPECT_EQ(hal.name, arr[i++]);
699 }
700}
701
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700702TEST_F(LibVintfTest, HalManifestGetHals) {
703 HalManifest vm;
Yifan Hong8ec6f3f2018-03-13 13:58:56 -0700704 EXPECT_TRUE(add(vm, ManifestHal{HalFormat::HIDL,
705 "android.hardware.camera",
706 {Version(1, 2)},
707 {Transport::HWBINDER, Arch::ARCH_EMPTY},
708 {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
709 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}}));
710 EXPECT_TRUE(add(vm, ManifestHal{HalFormat::HIDL,
711 "android.hardware.camera",
712 {Version(2, 0)},
713 {Transport::HWBINDER, Arch::ARCH_EMPTY},
714 {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
715 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}}));
716 EXPECT_TRUE(add(vm, ManifestHal{HalFormat::HIDL,
717 "android.hardware.nfc",
718 {Version(1, 0), Version(2, 1)},
719 {Transport::PASSTHROUGH, Arch::ARCH_32_64},
720 {{"INfc", {"INfc", {"default"}}}}}));
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700721 ManifestHal expectedCameraHalV1_2 =
Yifan Hong8ec6f3f2018-03-13 13:58:56 -0700722 ManifestHal{HalFormat::HIDL,
723 "android.hardware.camera",
724 {Version(1, 2)},
725 {Transport::HWBINDER, Arch::ARCH_EMPTY},
726 {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
727 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}};
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700728 ManifestHal expectedCameraHalV2_0 =
Yifan Hong8ec6f3f2018-03-13 13:58:56 -0700729 ManifestHal{HalFormat::HIDL,
730 "android.hardware.camera",
731 {Version(2, 0)},
732 {Transport::HWBINDER, Arch::ARCH_EMPTY},
733 {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
734 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}};
735 ManifestHal expectedNfcHal = ManifestHal{HalFormat::HIDL,
736 "android.hardware.nfc",
737 {Version(1, 0), Version(2, 1)},
738 {Transport::PASSTHROUGH, Arch::ARCH_32_64},
739 {{"INfc", {"INfc", {"default"}}}}};
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700740 auto cameraHals = vm.getHals("android.hardware.camera");
741 EXPECT_EQ((int)cameraHals.size(), 2);
742 EXPECT_EQ(*cameraHals[0], expectedCameraHalV1_2);
743 EXPECT_EQ(*cameraHals[1], expectedCameraHalV2_0);
744 auto nfcHals = vm.getHals("android.hardware.nfc");
745 EXPECT_EQ((int)nfcHals.size(), 1);
746 EXPECT_EQ(*nfcHals[0], expectedNfcHal);
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700747}
748
749TEST_F(LibVintfTest, CompatibilityMatrixGetHals) {
750 CompatibilityMatrix cm;
751 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
752 "android.hardware.camera",
753 {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
754 false /* optional */,
755 testHalInterfaces()}));
756 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
757 "android.hardware.nfc",
758 {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
759 true /* optional */,
760 testHalInterfaces()}));
761
762 MatrixHal expectedCameraHal = MatrixHal{
763 HalFormat::NATIVE,
764 "android.hardware.camera",
765 {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
766 false /* optional */,
767 testHalInterfaces(),
768 };
769 MatrixHal expectedNfcHal = MatrixHal{HalFormat::NATIVE,
770 "android.hardware.nfc",
771 {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
772 true /* optional */,
773 testHalInterfaces()};
774 auto cameraHals = cm.getHals("android.hardware.camera");
775 EXPECT_EQ((int)cameraHals.size(), 1);
776 EXPECT_EQ(*cameraHals[0], expectedCameraHal);
777 auto nfcHals = cm.getHals("android.hardware.nfc");
778 EXPECT_EQ((int)nfcHals.size(), 1);
779 EXPECT_EQ(*nfcHals[0], expectedNfcHal);
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700780}
781
Yifan Honga7201e72017-02-17 10:09:59 -0800782TEST_F(LibVintfTest, RuntimeInfo) {
783 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800784 using KernelConfigs = std::vector<KernelConfig>;
785 const KernelConfigs configs {
786 KernelConfig{"CONFIG_64BIT", Tristate::YES},
787 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
788 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
789 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
790 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
791 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
792 };
793
794 auto testMatrix = [&] (MatrixKernel &&kernel) {
795 CompatibilityMatrix cm;
796 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700797 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700798 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800799 return cm;
800 };
801
802 std::string error;
803
804 {
805 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
806 CompatibilityMatrix cm = testMatrix(std::move(kernel));
807 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
808 }
809
810 {
Yifan Hong5f996502017-08-23 14:46:44 -0700811 MatrixKernel kernel(KernelVersion{3, 18, 60}, KernelConfigs(configs));
812 CompatibilityMatrix cm = testMatrix(std::move(kernel));
813 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
814 }
815
816 {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800817 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
818 CompatibilityMatrix cm = testMatrix(std::move(kernel));
819 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
820 }
821
822 {
823 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
824 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700825 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800826 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
827 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700828 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800829 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
830 << "kernel-sepolicy-version shouldn't match";
831 }
832
833 {
834 KernelConfigs newConfigs(configs);
835 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
836 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
837 CompatibilityMatrix cm = testMatrix(std::move(kernel));
838 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
839 }
840
841 {
842 KernelConfigs newConfigs(configs);
843 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
844 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
845 CompatibilityMatrix cm = testMatrix(std::move(kernel));
846 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
847 }
848
849 {
850 KernelConfigs newConfigs(configs);
851 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
852 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
853 CompatibilityMatrix cm = testMatrix(std::move(kernel));
854 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
855 }
856
857 {
858 KernelConfigs newConfigs(configs);
859 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
860 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
861 CompatibilityMatrix cm = testMatrix(std::move(kernel));
862 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
863 }
864
865 {
866 KernelConfigs newConfigs(configs);
867 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
868 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
869 CompatibilityMatrix cm = testMatrix(std::move(kernel));
870 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
871 }
Yifan Hongdb6423e2017-09-11 14:38:46 -0700872
Yifan Hongf3029302017-04-12 17:23:49 -0700873 RuntimeInfo badAvb = testRuntimeInfo();
874 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
875 {
876 setAvb(badAvb, {1, 0}, {2, 1});
877 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
Michael Schwartz5cfbc922017-05-08 14:06:49 -0700878 EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
Yifan Hongf3029302017-04-12 17:23:49 -0700879 }
880 {
881 setAvb(badAvb, {2, 1}, {3, 0});
882 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
883 }
884 {
885 setAvb(badAvb, {2, 1}, {2, 3});
886 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
887 }
888 {
889 setAvb(badAvb, {2, 3}, {2, 1});
890 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
891 }
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800892}
893
Yifan Hong19e0a2a2017-04-14 17:30:53 -0700894TEST_F(LibVintfTest, MissingAvb) {
895 std::string xml =
896 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
897 " <kernel version=\"3.18.31\"></kernel>"
898 " <sepolicy>\n"
899 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
900 " <sepolicy-version>25.5</sepolicy-version>\n"
901 " </sepolicy>\n"
902 "</compatibility-matrix>\n";
903 CompatibilityMatrix cm;
904 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
905 EXPECT_EQ(getAvb(cm), Version(0, 0));
906}
907
Yifan Hongdb6423e2017-09-11 14:38:46 -0700908TEST_F(LibVintfTest, DisableAvb) {
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 " <avb>\n"
917 " <vbmeta-version>1.0</vbmeta-version>\n"
918 " </avb>\n"
919 "</compatibility-matrix>\n";
920 CompatibilityMatrix cm;
921 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
922 RuntimeInfo ki = testRuntimeInfo();
923 std::string error;
924 EXPECT_FALSE(ki.checkCompatibility(cm, &error));
925 EXPECT_STREQ(error.c_str(), "AVB version 2.1 does not match framework matrix 1.0");
926 EXPECT_TRUE(ki.checkCompatibility(cm, &error, DISABLE_AVB_CHECK)) << error;
927}
928
Yifan Hong08e984c2017-05-18 12:50:04 -0700929// This is the test extracted from VINTF Object doc
930TEST_F(LibVintfTest, HalCompat) {
931 CompatibilityMatrix matrix;
932 std::string error;
933
934 std::string matrixXml =
935 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
936 " <hal format=\"hidl\" optional=\"false\">\n"
937 " <name>android.hardware.foo</name>\n"
938 " <version>1.0</version>\n"
939 " <version>3.1-2</version>\n"
940 " <interface>\n"
941 " <name>IFoo</name>\n"
942 " <instance>default</instance>\n"
943 " <instance>specific</instance>\n"
944 " </interface>\n"
945 " </hal>\n"
946 " <hal format=\"hidl\" optional=\"false\">\n"
947 " <name>android.hardware.foo</name>\n"
948 " <version>2.0</version>\n"
949 " <interface>\n"
950 " <name>IBar</name>\n"
951 " <instance>default</instance>\n"
952 " </interface>\n"
953 " </hal>\n"
954 " <sepolicy>\n"
955 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
956 " <sepolicy-version>25.5</sepolicy-version>\n"
957 " </sepolicy>\n"
958 "</compatibility-matrix>\n";
959 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
960 << gCompatibilityMatrixConverter.lastError();
961
962 {
963 std::string manifestXml =
964 "<manifest version=\"1.0\" type=\"device\">\n"
965 " <hal format=\"hidl\">\n"
966 " <name>android.hardware.foo</name>\n"
967 " <transport>hwbinder</transport>\n"
968 " <version>1.0</version>\n"
969 " <interface>\n"
970 " <name>IFoo</name>\n"
971 " <instance>default</instance>\n"
972 " <instance>specific</instance>\n"
973 " </interface>\n"
974 " </hal>\n"
975 " <hal format=\"hidl\">\n"
976 " <name>android.hardware.foo</name>\n"
977 " <transport>hwbinder</transport>\n"
978 " <version>2.0</version>\n"
979 " <interface>\n"
980 " <name>IBar</name>\n"
981 " <instance>default</instance>\n"
982 " </interface>\n"
983 " </hal>\n"
984 " <sepolicy>\n"
985 " <version>25.5</version>\n"
986 " </sepolicy>\n"
987 "</manifest>\n";
988
989 HalManifest manifest;
990 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
991 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
992 }
993
994 {
995 std::string manifestXml =
996 "<manifest version=\"1.0\" type=\"device\">\n"
997 " <hal format=\"hidl\">\n"
998 " <name>android.hardware.foo</name>\n"
999 " <transport>hwbinder</transport>\n"
1000 " <version>1.0</version>\n"
1001 " <interface>\n"
1002 " <name>IFoo</name>\n"
1003 " <instance>default</instance>\n"
1004 " <instance>specific</instance>\n"
1005 " </interface>\n"
1006 " </hal>\n"
1007 " <sepolicy>\n"
1008 " <version>25.5</version>\n"
1009 " </sepolicy>\n"
1010 "</manifest>\n";
1011 HalManifest manifest;
1012 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1013 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1014 << "should not be compatible because IBar is missing";
1015 }
1016
1017 {
1018 std::string manifestXml =
1019 "<manifest version=\"1.0\" type=\"device\">\n"
1020 " <hal format=\"hidl\">\n"
1021 " <name>android.hardware.foo</name>\n"
1022 " <transport>hwbinder</transport>\n"
1023 " <version>1.0</version>\n"
1024 " <interface>\n"
1025 " <name>IFoo</name>\n"
1026 " <instance>default</instance>\n"
1027 " </interface>\n"
1028 " </hal>\n"
1029 " <hal format=\"hidl\">\n"
1030 " <name>android.hardware.foo</name>\n"
1031 " <transport>hwbinder</transport>\n"
1032 " <version>2.0</version>\n"
1033 " <interface>\n"
1034 " <name>IBar</name>\n"
1035 " <instance>default</instance>\n"
1036 " </interface>\n"
1037 " </hal>\n"
1038 " <sepolicy>\n"
1039 " <version>25.5</version>\n"
1040 " </sepolicy>\n"
1041 "</manifest>\n";
1042 HalManifest manifest;
1043 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1044 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1045 << "should not be compatible because IFoo/default is missing";
1046 }
1047
1048 {
1049 std::string manifestXml =
1050 "<manifest version=\"1.0\" type=\"device\">\n"
1051 " <hal format=\"hidl\">\n"
1052 " <name>android.hardware.foo</name>\n"
1053 " <transport>hwbinder</transport>\n"
1054 " <version>3.3</version>\n"
1055 " <interface>\n"
1056 " <name>IFoo</name>\n"
1057 " <instance>default</instance>\n"
1058 " <instance>specific</instance>\n"
1059 " </interface>\n"
1060 " </hal>\n"
1061 " <hal format=\"hidl\">\n"
1062 " <name>android.hardware.foo</name>\n"
1063 " <transport>hwbinder</transport>\n"
1064 " <version>2.0</version>\n"
1065 " <interface>\n"
1066 " <name>IBar</name>\n"
1067 " <instance>default</instance>\n"
1068 " </interface>\n"
1069 " </hal>\n"
1070 " <sepolicy>\n"
1071 " <version>25.5</version>\n"
1072 " </sepolicy>\n"
1073 "</manifest>\n";
1074 HalManifest manifest;
1075 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1076 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1077 }
1078
1079 {
1080 std::string manifestXml =
1081 "<manifest version=\"1.0\" type=\"device\">\n"
1082 " <hal format=\"hidl\">\n"
1083 " <name>android.hardware.foo</name>\n"
1084 " <transport>hwbinder</transport>\n"
1085 " <version>1.0</version>\n"
1086 " <interface>\n"
1087 " <name>IFoo</name>\n"
1088 " <instance>default</instance>\n"
1089 " </interface>\n"
1090 " </hal>\n"
1091 " <hal format=\"hidl\">\n"
1092 " <name>android.hardware.foo</name>\n"
1093 " <transport>hwbinder</transport>\n"
1094 " <version>3.2</version>\n"
1095 " <interface>\n"
1096 " <name>IFoo</name>\n"
1097 " <instance>specific</instance>\n"
1098 " </interface>\n"
1099 " </hal>\n"
1100 " <hal format=\"hidl\">\n"
1101 " <name>android.hardware.foo</name>\n"
1102 " <transport>hwbinder</transport>\n"
1103 " <version>2.0</version>\n"
1104 " <interface>\n"
1105 " <name>IBar</name>\n"
1106 " <instance>default</instance>\n"
1107 " </interface>\n"
1108 " </hal>\n"
1109 " <sepolicy>\n"
1110 " <version>25.5</version>\n"
1111 " </sepolicy>\n"
1112 "</manifest>\n";
1113 HalManifest manifest;
1114 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1115 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1116 << "should not be compatible even though @1.0::IFoo/default "
1117 << "and @3.2::IFoo/specific present";
1118 }
1119
1120 {
1121 std::string manifestXml =
1122 "<manifest version=\"1.0\" type=\"device\">\n"
1123 " <hal format=\"hidl\">\n"
1124 " <name>android.hardware.foo</name>\n"
1125 " <transport>hwbinder</transport>\n"
1126 " <version>1.0</version>\n"
1127 " <interface>\n"
1128 " <name>IFoo</name>\n"
1129 " <instance>default</instance>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001130 " <instance>specific</instance>\n"
1131 " </interface>\n"
1132 " </hal>\n"
1133 " <hal format=\"hidl\">\n"
1134 " <name>android.hardware.foo</name>\n"
1135 " <transport>hwbinder</transport>\n"
1136 " <version>2.0</version>\n"
1137 " <interface>\n"
1138 " <name>IBar</name>\n"
1139 " <instance>default</instance>\n"
1140 " </interface>\n"
1141 " </hal>\n"
1142 " <sepolicy>\n"
1143 " <version>25.5</version>\n"
1144 " </sepolicy>\n"
1145 "</manifest>\n";
1146 HalManifest manifest;
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001147 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml))
1148 << gHalManifestConverter.lastError();
1149 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
Yifan Hong08e984c2017-05-18 12:50:04 -07001150 }
1151}
1152
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001153TEST_F(LibVintfTest, Compat) {
1154 std::string manifestXml =
1155 "<manifest version=\"1.0\" type=\"device\">\n"
1156 " <hal format=\"hidl\">\n"
1157 " <name>android.hardware.camera</name>\n"
1158 " <transport>hwbinder</transport>\n"
1159 " <version>3.5</version>\n"
1160 " <interface>\n"
1161 " <name>IBetterCamera</name>\n"
1162 " <instance>camera</instance>\n"
1163 " </interface>\n"
1164 " <interface>\n"
1165 " <name>ICamera</name>\n"
1166 " <instance>default</instance>\n"
1167 " <instance>legacy/0</instance>\n"
1168 " </interface>\n"
1169 " </hal>\n"
1170 " <hal format=\"hidl\">\n"
1171 " <name>android.hardware.nfc</name>\n"
1172 " <transport>hwbinder</transport>\n"
1173 " <version>1.0</version>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001174 " <interface>\n"
1175 " <name>INfc</name>\n"
1176 " <instance>nfc_nci</instance>\n"
1177 " </interface>\n"
1178 " </hal>\n"
1179 " <hal format=\"hidl\">\n"
1180 " <name>android.hardware.nfc</name>\n"
1181 " <transport>hwbinder</transport>\n"
1182 " <version>2.0</version>\n"
1183 " <interface>\n"
1184 " <name>INfc</name>\n"
1185 " <instance>default</instance>\n"
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001186 " <instance>nfc_nci</instance>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001187 " </interface>\n"
1188 " </hal>\n"
1189 " <sepolicy>\n"
1190 " <version>25.5</version>\n"
1191 " </sepolicy>\n"
1192 "</manifest>\n";
1193
1194 std::string matrixXml =
1195 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1196 " <hal format=\"hidl\" optional=\"false\">\n"
1197 " <name>android.hardware.camera</name>\n"
1198 " <version>2.0-5</version>\n"
1199 " <version>3.4-16</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001200 " <interface>\n"
1201 " <name>IBetterCamera</name>\n"
1202 " <instance>camera</instance>\n"
1203 " </interface>\n"
1204 " <interface>\n"
1205 " <name>ICamera</name>\n"
1206 " <instance>default</instance>\n"
1207 " <instance>legacy/0</instance>\n"
1208 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001209 " </hal>\n"
1210 " <hal format=\"hidl\" optional=\"false\">\n"
1211 " <name>android.hardware.nfc</name>\n"
1212 " <version>1.0</version>\n"
1213 " <version>2.0</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001214 " <interface>\n"
1215 " <name>INfc</name>\n"
1216 " <instance>nfc_nci</instance>\n"
1217 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001218 " </hal>\n"
1219 " <hal format=\"hidl\" optional=\"true\">\n"
1220 " <name>android.hardware.foo</name>\n"
1221 " <version>1.0</version>\n"
1222 " </hal>\n"
1223 " <sepolicy>\n"
1224 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1225 " <sepolicy-version>25.5</sepolicy-version>\n"
1226 " <sepolicy-version>26.0-3</sepolicy-version>\n"
1227 " </sepolicy>\n"
1228 " <avb>\n"
1229 " <vbmeta-version>2.1</vbmeta-version>\n"
1230 " </avb>\n"
1231 "</compatibility-matrix>\n";
1232
1233 HalManifest manifest;
1234 CompatibilityMatrix matrix;
1235 std::string error;
1236 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1237 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1238 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1239
1240 // some smaller test cases
1241 matrixXml =
1242 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1243 " <hal format=\"hidl\" optional=\"false\">\n"
1244 " <name>android.hardware.camera</name>\n"
1245 " <version>3.4</version>\n"
1246 " </hal>\n"
1247 " <sepolicy>\n"
1248 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1249 " <sepolicy-version>25.5</sepolicy-version>\n"
1250 " </sepolicy>\n"
1251 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1252 "</compatibility-matrix>\n";
1253 matrix = {};
1254 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1255 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1256 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
1257 EXPECT_NE(camera, nullptr);
1258 camera->versionRanges[0] = {3, 5};
1259 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1260 camera->versionRanges[0] = {3, 6};
1261 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1262
1263 // reset it
1264 matrix = {};
1265 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1266 set(matrix, Sepolicy{30, {{26, 0}}});
1267 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1268 set(matrix, Sepolicy{30, {{25, 6}}});
1269 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1270 set(matrix, Sepolicy{30, {{25, 4}}});
1271 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1272}
1273
Yifan Hongd4857902017-06-13 14:13:56 -07001274/////////////////// xmlfile tests
1275
1276TEST_F(LibVintfTest, HalManifestConverterXmlFile) {
1277 HalManifest vm = testDeviceManifestWithXmlFile();
1278 std::string xml = gHalManifestConverter(vm);
1279 EXPECT_EQ(xml,
1280 "<manifest version=\"1.0\" type=\"device\">\n"
1281 " <hal format=\"hidl\">\n"
1282 " <name>android.hardware.camera</name>\n"
1283 " <transport>hwbinder</transport>\n"
1284 " <version>2.0</version>\n"
1285 " <interface>\n"
1286 " <name>IBetterCamera</name>\n"
1287 " <instance>camera</instance>\n"
1288 " </interface>\n"
1289 " <interface>\n"
1290 " <name>ICamera</name>\n"
1291 " <instance>default</instance>\n"
1292 " <instance>legacy/0</instance>\n"
1293 " </interface>\n"
1294 " </hal>\n"
1295 " <hal format=\"hidl\">\n"
1296 " <name>android.hardware.nfc</name>\n"
1297 " <transport arch=\"32+64\">passthrough</transport>\n"
1298 " <version>1.0</version>\n"
1299 " <interface>\n"
1300 " <name>INfc</name>\n"
1301 " <instance>default</instance>\n"
1302 " </interface>\n"
1303 " </hal>\n"
1304 " <sepolicy>\n"
1305 " <version>25.0</version>\n"
1306 " </sepolicy>\n"
1307 " <xmlfile>\n"
1308 " <name>media_profile</name>\n"
1309 " <version>1.0</version>\n"
1310 " </xmlfile>\n"
1311 "</manifest>\n");
1312 HalManifest vm2;
1313 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
1314 EXPECT_EQ(vm, vm2);
1315}
1316
1317TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile) {
1318 CompatibilityMatrix cm;
1319 addXmlFile(cm, "media_profile", {1, 0});
Yifan Hong244970c2018-01-23 15:29:27 -08001320 std::string xml = gCompatibilityMatrixConverter(cm, SerializeFlag::XMLFILES_ONLY);
Yifan Hongd4857902017-06-13 14:13:56 -07001321 EXPECT_EQ(xml,
1322 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hongd4857902017-06-13 14:13:56 -07001323 " <xmlfile format=\"dtd\" optional=\"true\">\n"
1324 " <name>media_profile</name>\n"
1325 " <version>1.0</version>\n"
1326 " </xmlfile>\n"
1327 "</compatibility-matrix>\n");
1328 CompatibilityMatrix cm2;
1329 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
1330 EXPECT_EQ(cm, cm2);
1331}
1332
1333TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile2) {
1334 std::string xml =
1335 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1336 " <xmlfile format=\"dtd\" optional=\"false\">\n"
1337 " <name>media_profile</name>\n"
1338 " <version>1.0</version>\n"
1339 " </xmlfile>\n"
1340 "</compatibility-matrix>\n";
1341 CompatibilityMatrix cm;
1342 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml));
1343 EXPECT_EQ(
1344 "compatibility-matrix.xmlfile entry media_profile has to be optional for "
1345 "compatibility matrix version 1.0",
1346 gCompatibilityMatrixConverter.lastError());
1347}
1348
Yifan Hongbbfff302017-06-06 17:10:13 -07001349TEST_F(LibVintfTest, ManifestXmlFilePathDevice) {
1350 std::string manifestXml =
1351 "<manifest version=\"1.0\" type=\"device\">"
1352 " <xmlfile>"
1353 " <name>media_profile</name>"
1354 " <version>1.0</version>"
1355 " </xmlfile>"
1356 "</manifest>";
1357 HalManifest manifest;
1358 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1359 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1360 "/vendor/etc/media_profile_V1_0.xml");
1361}
1362
1363TEST_F(LibVintfTest, ManifestXmlFilePathFramework) {
1364 std::string manifestXml =
1365 "<manifest version=\"1.0\" type=\"framework\">"
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 "/system/etc/media_profile_V1_0.xml");
1375}
1376
1377TEST_F(LibVintfTest, ManifestXmlFilePathOverride) {
1378 std::string manifestXml =
1379 "<manifest version=\"1.0\" type=\"device\">"
1380 " <xmlfile>"
1381 " <name>media_profile</name>"
1382 " <version>1.0</version>"
1383 " <path>/vendor/etc/foo.xml</path>"
1384 " </xmlfile>"
1385 "</manifest>";
1386 HalManifest manifest;
1387 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1388 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "/vendor/etc/foo.xml");
1389}
1390
1391TEST_F(LibVintfTest, ManifestXmlFilePathMissing) {
1392 std::string manifestXml =
1393 "<manifest version=\"1.0\" type=\"device\">"
1394 " <xmlfile>"
1395 " <name>media_profile</name>"
1396 " <version>1.1</version>"
1397 " </xmlfile>"
1398 "</manifest>";
1399 HalManifest manifest;
1400 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1401 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "");
1402}
1403
1404TEST_F(LibVintfTest, MatrixXmlFilePathFramework) {
1405 std::string matrixXml =
1406 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1407 " <xmlfile format=\"dtd\" optional=\"true\">"
1408 " <name>media_profile</name>"
1409 " <version>2.0-1</version>"
1410 " </xmlfile>"
1411 "</compatibility-matrix>";
1412 CompatibilityMatrix matrix;
1413 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1414 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 1}),
1415 "/system/etc/media_profile_V2_1.dtd");
1416}
1417
1418TEST_F(LibVintfTest, MatrixXmlFilePathDevice) {
1419 std::string matrixXml =
1420 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1421 " <xmlfile format=\"xsd\" 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, 0}),
1429 "/vendor/etc/media_profile_V2_1.xsd");
1430}
1431
1432TEST_F(LibVintfTest, MatrixXmlFilePathOverride) {
1433 std::string matrixXml =
1434 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1435 " <xmlfile format=\"xsd\" optional=\"true\">"
1436 " <name>media_profile</name>"
1437 " <version>2.0-1</version>"
1438 " <path>/system/etc/foo.xsd</path>"
1439 " </xmlfile>"
1440 "</compatibility-matrix>";
1441 CompatibilityMatrix matrix;
1442 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1443 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "/system/etc/foo.xsd");
1444}
1445
1446TEST_F(LibVintfTest, MatrixXmlFilePathMissing) {
1447 std::string matrixXml =
1448 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1449 " <xmlfile format=\"dtd\" optional=\"true\">"
1450 " <name>media_profile</name>"
1451 " <version>2.1</version>"
1452 " </xmlfile>"
1453 "</compatibility-matrix>";
1454 CompatibilityMatrix matrix;
1455 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1456 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "");
1457}
1458
Yifan Hong02e94002017-07-10 15:41:56 -07001459std::pair<KernelConfigParser, status_t> processData(const std::string& data, bool processComments,
1460 bool relaxedFormat = false) {
1461 KernelConfigParser parser(processComments, relaxedFormat);
Yifan Hongd8cee082017-07-05 16:06:09 -07001462 const char* p = data.c_str();
1463 size_t n = 0;
1464 size_t chunkSize;
Yifan Hong6209d172017-07-07 16:18:19 -07001465 status_t status = OK;
Yifan Hongd8cee082017-07-05 16:06:09 -07001466 for (; n < data.size(); p += chunkSize, n += chunkSize) {
1467 chunkSize = std::min<size_t>(5, data.size() - n);
Yifan Hong6209d172017-07-07 16:18:19 -07001468 if ((status = parser.process(p, chunkSize)) != OK) {
1469 break;
1470 }
Yifan Hongd8cee082017-07-05 16:06:09 -07001471 }
Yifan Hong6209d172017-07-07 16:18:19 -07001472 return {std::move(parser), status};
Yifan Hongd8cee082017-07-05 16:06:09 -07001473}
1474
1475TEST_F(LibVintfTest, KernelConfigParser) {
1476 // usage in /proc/config.gz
1477 const std::string data =
1478 "# CONFIG_NOT_SET is not set\n"
1479 "CONFIG_ONE=1\n"
1480 "CONFIG_Y=y\n"
1481 "CONFIG_STR=\"string\"\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001482 auto pair = processData(data, false /* processComments */);
1483 ASSERT_EQ(OK, pair.second) << pair.first.error();
1484 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001485
1486 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1487 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1488 EXPECT_EQ(configs.find("CONFIG_STR")->second, "\"string\"");
1489 EXPECT_EQ(configs.find("CONFIG_NOT_SET"), configs.end());
1490}
1491
1492TEST_F(LibVintfTest, KernelConfigParser2) {
1493 // usage in android-base.cfg
1494 const std::string data =
1495 "# CONFIG_NOT_SET is not set\n"
1496 "CONFIG_ONE=1\n"
1497 "CONFIG_Y=y\n"
1498 "CONFIG_STR=string\n"
1499 "# ignore_thiscomment\n"
1500 "# CONFIG_NOT_SET2 is not set\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001501 auto pair = processData(data, true /* processComments */);
1502 ASSERT_EQ(OK, pair.second) << pair.first.error();
1503 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001504
1505 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1506 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1507 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1508 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1509 EXPECT_EQ(configs.find("CONFIG_NOT_SET2")->second, "n");
1510}
1511
Yifan Hongc1889722017-07-07 16:19:52 -07001512TEST_F(LibVintfTest, KernelConfigParserSpace) {
1513 // usage in android-base.cfg
1514 const std::string data =
1515 " # CONFIG_NOT_SET is not set \n"
1516 " CONFIG_ONE=1 # 'tis a one!\n"
1517 " CONFIG_TWO=2 #'tis a two! \n"
1518 " CONFIG_THREE=3#'tis a three! \n"
1519 " CONFIG_233=233#'tis a three! \n"
1520 "#yey! random comments\n"
1521 "CONFIG_Y=y \n"
1522 " CONFIG_YES=y#YES! \n"
1523 "CONFIG_STR=string\n"
1524 "CONFIG_HELLO=hello world! #still works\n"
1525 "CONFIG_WORLD=hello world! \n"
1526 "CONFIG_GOOD = good morning! #comments here\n"
1527 " CONFIG_MORNING = good morning! \n";
Yifan Hong02e94002017-07-10 15:41:56 -07001528 auto pair = processData(data, true /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07001529 ASSERT_EQ(OK, pair.second) << pair.first.error();
1530 const auto& configs = pair.first.configs();
1531
1532 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1533 EXPECT_EQ(configs.find("CONFIG_TWO")->second, "2");
1534 EXPECT_EQ(configs.find("CONFIG_THREE")->second, "3");
1535 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1536 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1537 EXPECT_EQ(configs.find("CONFIG_HELLO")->second, "hello world!")
1538 << "Value should be \"hello world!\" without trailing spaces";
1539 EXPECT_EQ(configs.find("CONFIG_WORLD")->second, "hello world!")
1540 << "Value should be \"hello world!\" without trailing spaces";
1541 EXPECT_EQ(configs.find("CONFIG_GOOD")->second, "good morning!")
1542 << "Value should be \"good morning!\" without leading or trailing spaces";
1543 EXPECT_EQ(configs.find("CONFIG_MORNING")->second, "good morning!")
1544 << "Value should be \"good morning!\" without leading or trailing spaces";
1545 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1546}
1547
Yifan Hongd9e46432017-08-15 17:14:52 -07001548TEST_F(LibVintfTest, NetutilsWrapperMatrix) {
1549 std::string matrixXml;
1550 CompatibilityMatrix matrix;
1551
1552 matrixXml =
1553 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1554 " <hal format=\"native\" optional=\"false\">"
1555 " <name>netutils-wrapper</name>"
1556 " <version>1.0</version>"
1557 " </hal>"
1558 "</compatibility-matrix>";
1559 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
1560 << gCompatibilityMatrixConverter.lastError();
1561
1562// only host libvintf hardcodes netutils-wrapper version requirements
Yifan Hong6bce1a62018-01-31 13:30:04 -08001563#ifndef LIBVINTF_TARGET
Yifan Hongd9e46432017-08-15 17:14:52 -07001564
1565 matrixXml =
1566 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1567 " <hal format=\"native\" optional=\"false\">"
1568 " <name>netutils-wrapper</name>"
1569 " <version>1.0-1</version>"
1570 " </hal>"
1571 "</compatibility-matrix>";
1572 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1573 EXPECT_CONTAINS(
1574 gCompatibilityMatrixConverter.lastError(),
1575 "netutils-wrapper HAL must specify exactly one version x.0, but a range is provided. "
1576 "Perhaps you mean '1.0'?");
1577
1578 matrixXml =
1579 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1580 " <hal format=\"native\" optional=\"false\">"
1581 " <name>netutils-wrapper</name>"
1582 " <version>1.1</version>"
1583 " </hal>"
1584 "</compatibility-matrix>";
1585 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1586 EXPECT_CONTAINS(
1587 gCompatibilityMatrixConverter.lastError(),
1588 "netutils-wrapper HAL must specify exactly one version x.0, but minor version is not 0. "
1589 "Perhaps you mean '1.0'?");
1590
1591 matrixXml =
1592 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1593 " <hal format=\"native\" optional=\"false\">"
1594 " <name>netutils-wrapper</name>"
1595 " <version>1.0</version>"
1596 " <version>2.0</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 multiple <version> element "
1603 "is specified.");
1604
Yifan Hong6bce1a62018-01-31 13:30:04 -08001605#endif // LIBVINTF_TARGET
Yifan Hongd9e46432017-08-15 17:14:52 -07001606}
1607
1608TEST_F(LibVintfTest, NetutilsWrapperManifest) {
1609 std::string manifestXml;
1610 HalManifest manifest;
1611
1612 manifestXml =
1613 "<manifest version=\"1.0\" type=\"framework\">"
1614 " <hal format=\"native\">"
1615 " <name>netutils-wrapper</name>"
1616 " <version>1.0</version>"
1617 " <version>2.0</version>"
1618 " </hal>"
1619 "</manifest>";
1620 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml)) << gHalManifestConverter.lastError();
1621
1622// only host libvintf hardcodes netutils-wrapper version requirements
Yifan Hong6bce1a62018-01-31 13:30:04 -08001623#ifndef LIBVINTF_TARGET
Yifan Hongd9e46432017-08-15 17:14:52 -07001624
1625 manifestXml =
1626 "<manifest version=\"1.0\" type=\"framework\">"
1627 " <hal format=\"native\">"
1628 " <name>netutils-wrapper</name>"
1629 " <version>1.1</version>"
1630 " </hal>"
1631 "</manifest>";
1632 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1633 EXPECT_CONTAINS(
1634 gCompatibilityMatrixConverter.lastError(),
1635 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1636 "is specified.");
1637
1638 manifestXml =
1639 "<manifest version=\"1.0\" type=\"framework\">"
1640 " <hal format=\"native\">"
1641 " <name>netutils-wrapper</name>"
1642 " <version>1.0</version>"
1643 " <version>2.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
Yifan Hong6bce1a62018-01-31 13:30:04 -08001652#endif // LIBVINTF_TARGET
Yifan Hongd9e46432017-08-15 17:14:52 -07001653}
1654
Yifan Hong5f996502017-08-23 14:46:44 -07001655TEST_F(LibVintfTest, KernelConfigConditionTest) {
1656 std::string xml =
1657 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1658 " <kernel version=\"3.18.22\"/>\n"
1659 " <kernel version=\"3.18.22\">\n"
1660 " <conditions>\n"
1661 " <config>\n"
1662 " <key>CONFIG_ARM</key>\n"
1663 " <value type=\"tristate\">y</value>\n"
1664 " </config>\n"
1665 " </conditions>\n"
1666 " <config>\n"
1667 " <key>CONFIG_FOO</key>\n"
1668 " <value type=\"tristate\">y</value>\n"
1669 " </config>\n"
1670 " </kernel>\n"
1671 " <sepolicy>\n"
1672 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1673 " <sepolicy-version>25.0</sepolicy-version>\n"
1674 " </sepolicy>\n"
1675 " <avb>\n"
1676 " <vbmeta-version>2.1</vbmeta-version>\n"
1677 " </avb>\n"
1678 "</compatibility-matrix>\n";
1679
1680 CompatibilityMatrix cm;
1681 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1682 << gCompatibilityMatrixConverter.lastError();
1683 const auto& kernels = getKernels(cm);
1684 ASSERT_GE(kernels.size(), 2u);
1685 ASSERT_TRUE(kernels[0].conditions().empty());
1686 const auto& kernel = kernels[1];
1687 const auto& cond = kernel.conditions();
1688 ASSERT_FALSE(cond.empty());
1689 EXPECT_EQ("CONFIG_ARM", cond.begin()->first);
1690 EXPECT_EQ(KernelConfigTypedValue(Tristate::YES), cond.begin()->second);
1691 EXPECT_FALSE(kernel.configs().empty());
1692
1693 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
1694}
1695
1696TEST_F(LibVintfTest, KernelConfigConditionEmptyTest) {
1697 std::string xml =
1698 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1699 " <kernel version=\"4.4.0\"/>\n"
1700 " <kernel version=\"3.18.22\">\n"
1701 " <conditions>\n"
1702 " <config>\n"
1703 " <key>CONFIG_ARM</key>\n"
1704 " <value type=\"tristate\">y</value>\n"
1705 " </config>\n"
1706 " </conditions>\n"
1707 " </kernel>\n"
1708 "</compatibility-matrix>\n";
1709
1710 CompatibilityMatrix cm;
1711 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml))
1712 << "Should not accept first kernel version with non-empty conditions";
1713 EXPECT_EQ(
1714 "First <kernel> for version 3.18 must have empty <conditions> "
1715 "for backwards compatibility.",
1716 gCompatibilityMatrixConverter.lastError());
1717}
1718
1719TEST_F(LibVintfTest, KernelConfigConditionMatch) {
1720 RuntimeInfo runtime = testRuntimeInfo();
1721 std::string error;
1722 std::string xml;
1723 CompatibilityMatrix cm;
1724
1725 xml =
1726 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1727 " <kernel version=\"3.18.22\"/>\n"
1728 " <kernel version=\"3.18.22\">\n"
1729 " <conditions>\n"
1730 " <config>\n"
1731 " <key>CONFIG_64BIT</key>\n"
1732 " <value type=\"tristate\">y</value>\n"
1733 " </config>\n"
1734 " </conditions>\n"
1735 " <config>\n"
1736 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1737 " <value type=\"int\">24</value>\n"
1738 " </config>\n"
1739 " </kernel>\n"
1740 " <sepolicy>\n"
1741 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1742 " </sepolicy>\n"
1743 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1744 "</compatibility-matrix>\n";
1745
1746 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1747 << gCompatibilityMatrixConverter.lastError();
1748 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1749
1750 xml =
1751 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1752 " <kernel version=\"3.18.22\"/>\n"
1753 " <kernel version=\"3.18.22\">\n"
1754 " <conditions>\n"
1755 " <config>\n"
1756 " <key>CONFIG_64BIT</key>\n"
1757 " <value type=\"tristate\">y</value>\n"
1758 " </config>\n"
1759 " </conditions>\n"
1760 " <config>\n"
1761 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1762 " <value type=\"int\">26</value>\n"
1763 " </config>\n"
1764 " </kernel>\n"
1765 " <sepolicy>\n"
1766 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1767 " </sepolicy>\n"
1768 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1769 "</compatibility-matrix>\n";
1770
1771 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1772 << gCompatibilityMatrixConverter.lastError();
1773 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1774 << "conditions met, so CONFIG_ARCH_MMAP_RND_BITS should not match";
1775
1776 xml =
1777 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1778 " <kernel version=\"3.18.22\"/>\n"
1779 " <kernel version=\"3.18.22\">\n"
1780 " <conditions>\n"
1781 " <config>\n"
1782 " <key>CONFIG_64BIT</key>\n"
1783 " <value type=\"tristate\">n</value>\n"
1784 " </config>\n"
1785 " </conditions>\n"
1786 " <config>\n"
1787 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1788 " <value type=\"int\">26</value>\n"
1789 " </config>\n"
1790 " </kernel>\n"
1791 " <sepolicy>\n"
1792 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1793 " </sepolicy>\n"
1794 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1795 "</compatibility-matrix>\n";
1796
1797 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1798 << gCompatibilityMatrixConverter.lastError();
1799 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1800 xml =
1801 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1802 " <kernel version=\"3.18.22\"/>\n"
1803 " <kernel version=\"3.18.22\">\n"
1804 " <conditions>\n"
1805 " <config>\n"
1806 " <key>CONFIG_64BIT</key>\n"
1807 " <value type=\"tristate\">y</value>\n"
1808 " </config>\n"
1809 " <config>\n"
1810 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1811 " <value type=\"int\">24</value>\n"
1812 " </config>\n"
1813 " </conditions>\n"
1814 " <config>\n"
1815 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1816 " <value type=\"int\">0xdead000000000000</value>\n"
1817 " </config>\n"
1818 " </kernel>\n"
1819 " <sepolicy>\n"
1820 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1821 " </sepolicy>\n"
1822 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1823 "</compatibility-matrix>\n";
1824
1825 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1826 << gCompatibilityMatrixConverter.lastError();
1827 EXPECT_TRUE(runtime.checkCompatibility(cm, &error));
1828
1829 xml =
1830 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1831 " <kernel version=\"3.18.22\"/>\n"
1832 " <kernel version=\"3.18.22\">\n"
1833 " <conditions>\n"
1834 " <config>\n"
1835 " <key>CONFIG_64BIT</key>\n"
1836 " <value type=\"tristate\">y</value>\n"
1837 " </config>\n"
1838 " <config>\n"
1839 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1840 " <value type=\"int\">24</value>\n"
1841 " </config>\n"
1842 " </conditions>\n"
1843 " <config>\n"
1844 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1845 " <value type=\"int\">0xbeaf000000000000</value>\n"
1846 " </config>\n"
1847 " </kernel>\n"
1848 " <sepolicy>\n"
1849 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1850 " </sepolicy>\n"
1851 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1852 "</compatibility-matrix>\n";
1853
1854 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1855 << gCompatibilityMatrixConverter.lastError();
1856 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1857 << "conditions have 'and' relationship, so CONFIG_ILLEGAL_POINTER_VALUE should not match";
1858
1859 xml =
1860 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1861 " <kernel version=\"3.18.22\"/>\n"
1862 " <kernel version=\"3.18.22\">\n"
1863 " <conditions>\n"
1864 " <config>\n"
1865 " <key>CONFIG_64BIT</key>\n"
1866 " <value type=\"tristate\">y</value>\n"
1867 " </config>\n"
1868 " <config>\n"
1869 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1870 " <value type=\"int\">26</value>\n"
1871 " </config>\n"
1872 " </conditions>\n"
1873 " <config>\n"
1874 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1875 " <value type=\"int\">0xbeaf000000000000</value>\n"
1876 " </config>\n"
1877 " </kernel>\n"
1878 " <sepolicy>\n"
1879 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1880 " </sepolicy>\n"
1881 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1882 "</compatibility-matrix>\n";
1883
1884 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1885 << gCompatibilityMatrixConverter.lastError();
1886 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1887
1888 xml =
1889 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1890 " <kernel version=\"3.18.22\">\n"
1891 " <config>\n"
1892 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1893 " <value type=\"string\"/>\n"
1894 " </config>\n"
1895 " </kernel>\n"
1896 " <kernel version=\"3.18.22\">\n"
1897 " <conditions>\n"
1898 " <config>\n"
1899 " <key>CONFIG_64BIT</key>\n"
1900 " <value type=\"tristate\">y</value>\n"
1901 " </config>\n"
1902 " </conditions>\n"
1903 " <config>\n"
1904 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1905 " <value type=\"int\">0xdead000000000000</value>\n"
1906 " </config>\n"
1907 " </kernel>\n"
1908 " <kernel version=\"3.18.22\">\n"
1909 " <conditions>\n"
1910 " <config>\n"
1911 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1912 " <value type=\"int\">24</value>\n"
1913 " </config>\n"
1914 " </conditions>\n"
1915 " <config>\n"
1916 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1917 " <value type=\"string\">binder,hwbinder</value>\n"
1918 " </config>\n"
1919 " </kernel>\n"
1920 " <sepolicy>\n"
1921 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1922 " </sepolicy>\n"
1923 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1924 "</compatibility-matrix>\n";
1925
1926 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1927 << gCompatibilityMatrixConverter.lastError();
1928 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1929
1930 xml =
1931 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1932 " <kernel version=\"3.18.22\">\n"
1933 " <config>\n"
1934 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1935 " <value type=\"string\"/>\n"
1936 " </config>\n"
1937 " </kernel>\n"
1938 " <kernel version=\"3.18.22\">\n"
1939 " <conditions>\n"
1940 " <config>\n"
1941 " <key>CONFIG_64BIT</key>\n"
1942 " <value type=\"tristate\">y</value>\n"
1943 " </config>\n"
1944 " </conditions>\n"
1945 " <config>\n"
1946 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1947 " <value type=\"int\">0xbeaf000000000000</value>\n"
1948 " </config>\n"
1949 " </kernel>\n"
1950 " <kernel version=\"3.18.22\">\n"
1951 " <conditions>\n"
1952 " <config>\n"
1953 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1954 " <value type=\"int\">24</value>\n"
1955 " </config>\n"
1956 " </conditions>\n"
1957 " <config>\n"
1958 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1959 " <value type=\"string\">binder,hwbinder</value>\n"
1960 " </config>\n"
1961 " </kernel>\n"
1962 " <sepolicy>\n"
1963 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1964 " </sepolicy>\n"
1965 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1966 "</compatibility-matrix>\n";
1967
1968 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1969 << gCompatibilityMatrixConverter.lastError();
1970 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used.";
1971
1972 xml =
1973 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1974 " <kernel version=\"3.18.22\">\n"
1975 " <config>\n"
1976 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1977 " <value type=\"string\"/>\n"
1978 " </config>\n"
1979 " </kernel>\n"
1980 " <kernel version=\"3.18.22\">\n"
1981 " <conditions>\n"
1982 " <config>\n"
1983 " <key>CONFIG_64BIT</key>\n"
1984 " <value type=\"tristate\">y</value>\n"
1985 " </config>\n"
1986 " </conditions>\n"
1987 " <config>\n"
1988 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1989 " <value type=\"int\">0xdead000000000000</value>\n"
1990 " </config>\n"
1991 " </kernel>\n"
1992 " <kernel version=\"3.18.22\">\n"
1993 " <conditions>\n"
1994 " <config>\n"
1995 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1996 " <value type=\"int\">24</value>\n"
1997 " </config>\n"
1998 " </conditions>\n"
1999 " <config>\n"
2000 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
2001 " <value type=\"string\">binder</value>\n"
2002 " </config>\n"
2003 " </kernel>\n"
2004 " <sepolicy>\n"
2005 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2006 " </sepolicy>\n"
2007 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2008 "</compatibility-matrix>\n";
2009
2010 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2011 << gCompatibilityMatrixConverter.lastError();
2012 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used";
2013}
2014
Yifan Hongc1889722017-07-07 16:19:52 -07002015// Run KernelConfigParserInvalidTest on processComments = {true, false}
2016class KernelConfigParserInvalidTest : public ::testing::TestWithParam<bool> {};
2017
2018TEST_P(KernelConfigParserInvalidTest, NonSet1) {
2019 const std::string data = "# CONFIG_NOT_EXIST is not sat\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002020 auto pair = processData(data, GetParam() /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07002021 ASSERT_EQ(OK, pair.second) << pair.first.error();
2022 const auto& configs = pair.first.configs();
2023 EXPECT_EQ(configs.find("CONFIG_NOT_EXIST"), configs.end())
2024 << "CONFIG_NOT_EXIST should not exist because of typo";
2025}
2026
2027TEST_P(KernelConfigParserInvalidTest, InvalidLine1) {
2028 const std::string data = "FOO_CONFIG=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002029 ASSERT_NE(OK,
2030 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07002031}
2032
2033TEST_P(KernelConfigParserInvalidTest, InvalidLine2) {
2034 const std::string data = "CONFIG_BAR-BAZ=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002035 ASSERT_NE(OK,
2036 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07002037}
2038
2039INSTANTIATE_TEST_CASE_P(KernelConfigParser, KernelConfigParserInvalidTest, ::testing::Bool());
2040
Yifan Hong2027a492017-12-11 15:21:19 -08002041TEST_F(LibVintfTest, MatrixLevel) {
2042 CompatibilityMatrix cm;
2043 std::string xml;
2044
2045 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\"/>";
2046 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2047 << gCompatibilityMatrixConverter.lastError();
2048 EXPECT_EQ(Level::UNSPECIFIED, cm.level());
2049
2050 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"legacy\"/>";
2051 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2052 << gCompatibilityMatrixConverter.lastError();
2053 EXPECT_EQ(Level::LEGACY, cm.level());
2054
2055 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
2056 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2057 << gCompatibilityMatrixConverter.lastError();
2058 EXPECT_EQ(1u, cm.level());
2059}
2060
2061TEST_F(LibVintfTest, ManifestLevel) {
2062 HalManifest manifest;
2063 std::string xml;
2064
2065 xml = "<manifest version=\"1.0\" type=\"device\"/>";
2066 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2067 EXPECT_EQ(Level::UNSPECIFIED, manifest.level());
2068
2069 xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"legacy\"/>";
2070 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2071 EXPECT_EQ(Level::LEGACY, manifest.level());
2072
2073 xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"1\"/>";
2074 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2075 EXPECT_EQ(1u, manifest.level());
2076}
2077
Yifan Hongdbe9db32017-12-11 19:06:11 -08002078TEST_F(LibVintfTest, AddOptionalHal) {
2079 CompatibilityMatrix cm1;
2080 CompatibilityMatrix cm2;
2081 std::string error;
2082 std::string xml;
2083
2084 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
2085 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2086 << gCompatibilityMatrixConverter.lastError();
2087
2088 xml =
2089 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2090 " <hal format=\"hidl\" optional=\"false\">\n"
2091 " <name>android.hardware.foo</name>\n"
2092 " <version>1.0-1</version>\n"
2093 " <interface>\n"
2094 " <name>IFoo</name>\n"
2095 " <instance>default</instance>\n"
2096 " </interface>\n"
2097 " </hal>\n"
2098 "</compatibility-matrix>\n";
2099 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2100 << gCompatibilityMatrixConverter.lastError();
2101
2102 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2103 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2104 EXPECT_EQ(xml,
2105 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2106 " <hal format=\"hidl\" optional=\"true\">\n"
2107 " <name>android.hardware.foo</name>\n"
2108 " <version>1.0-1</version>\n"
2109 " <interface>\n"
2110 " <name>IFoo</name>\n"
2111 " <instance>default</instance>\n"
2112 " </interface>\n"
2113 " </hal>\n"
2114 "</compatibility-matrix>\n");
2115}
2116
2117TEST_F(LibVintfTest, AddOptionalHalMinorVersion) {
2118 CompatibilityMatrix cm1;
2119 CompatibilityMatrix cm2;
2120 std::string error;
2121 std::string xml;
2122
2123 xml =
2124 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2125 " <hal format=\"hidl\" optional=\"false\">\n"
2126 " <name>android.hardware.foo</name>\n"
2127 " <version>1.2-3</version>\n"
2128 " <interface>\n"
2129 " <name>IFoo</name>\n"
2130 " <instance>default</instance>\n"
2131 " </interface>\n"
2132 " </hal>\n"
2133 "</compatibility-matrix>\n";
2134 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2135 << gCompatibilityMatrixConverter.lastError();
2136
2137 xml =
2138 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2139 " <hal format=\"hidl\" optional=\"false\">\n"
2140 " <name>android.hardware.foo</name>\n"
2141 " <version>1.0-4</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(&cm2, xml))
2149 << gCompatibilityMatrixConverter.lastError();
2150
2151 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2152 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2153 EXPECT_EQ(xml,
2154 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2155 " <hal format=\"hidl\" optional=\"false\">\n"
2156 " <name>android.hardware.foo</name>\n"
2157 " <version>1.2-4</version>\n"
2158 " <interface>\n"
2159 " <name>IFoo</name>\n"
2160 " <instance>default</instance>\n"
2161 " </interface>\n"
2162 " </hal>\n"
2163 "</compatibility-matrix>\n");
2164}
2165
2166TEST_F(LibVintfTest, AddOptionalHalMajorVersion) {
2167 CompatibilityMatrix cm1;
2168 CompatibilityMatrix cm2;
2169 std::string error;
2170 std::string xml;
2171
2172 xml =
2173 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2174 " <hal format=\"hidl\" optional=\"false\">\n"
2175 " <name>android.hardware.foo</name>\n"
2176 " <version>1.2-3</version>\n"
2177 " <interface>\n"
2178 " <name>IFoo</name>\n"
2179 " <instance>default</instance>\n"
2180 " </interface>\n"
2181 " </hal>\n"
2182 "</compatibility-matrix>\n";
2183 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2184 << gCompatibilityMatrixConverter.lastError();
2185
2186 xml =
2187 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2188 " <hal format=\"hidl\" optional=\"false\">\n"
2189 " <name>android.hardware.foo</name>\n"
Yifan Hongd8eea9e2017-12-22 15:13:42 -08002190 " <version>1.2-3</version>\n"
Yifan Hongdbe9db32017-12-11 19:06:11 -08002191 " <version>2.0-4</version>\n"
2192 " <interface>\n"
2193 " <name>IFoo</name>\n"
2194 " <instance>default</instance>\n"
2195 " </interface>\n"
2196 " </hal>\n"
2197 "</compatibility-matrix>\n";
2198 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2199 << gCompatibilityMatrixConverter.lastError();
2200
2201 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2202 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2203 EXPECT_EQ(xml,
2204 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2205 " <hal format=\"hidl\" optional=\"false\">\n"
2206 " <name>android.hardware.foo</name>\n"
2207 " <version>1.2-3</version>\n"
2208 " <interface>\n"
2209 " <name>IFoo</name>\n"
2210 " <instance>default</instance>\n"
2211 " </interface>\n"
2212 " </hal>\n"
2213 " <hal format=\"hidl\" optional=\"true\">\n"
2214 " <name>android.hardware.foo</name>\n"
2215 " <version>2.0-4</version>\n"
2216 " <interface>\n"
2217 " <name>IFoo</name>\n"
2218 " <instance>default</instance>\n"
2219 " </interface>\n"
2220 " </hal>\n"
2221 "</compatibility-matrix>\n");
2222}
2223
Yifan Hongd4b92fe2017-12-20 15:29:03 -08002224TEST_F(LibVintfTest, AddOptionalXmlFile) {
2225 CompatibilityMatrix cm1;
2226 CompatibilityMatrix cm2;
2227 std::string error;
2228 std::string xml;
2229
2230 xml =
2231 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2232 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2233 " <name>foo</name>\n"
2234 " <version>1.0-2</version>\n"
2235 " <path>/foo/bar/baz.xsd</path>\n"
2236 " </xmlfile>\n"
2237 "</compatibility-matrix>\n";
2238 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2239 << gCompatibilityMatrixConverter.lastError();
2240
2241 xml =
2242 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2243 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2244 " <name>foo</name>\n"
2245 " <version>1.1-3</version>\n"
2246 " <path>/foo/bar/quux.xsd</path>\n"
2247 " </xmlfile>\n"
2248 "</compatibility-matrix>\n";
2249 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2250 << gCompatibilityMatrixConverter.lastError();
2251
2252 EXPECT_TRUE(addAllXmlFilesAsOptional(&cm1, &cm2, &error)) << error;
2253 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::XMLFILES_ONLY);
2254 EXPECT_EQ(xml,
2255 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2256 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2257 " <name>foo</name>\n"
2258 " <version>1.0-2</version>\n"
2259 " <path>/foo/bar/baz.xsd</path>\n"
2260 " </xmlfile>\n"
2261 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2262 " <name>foo</name>\n"
2263 " <version>1.1-3</version>\n"
2264 " <path>/foo/bar/quux.xsd</path>\n"
2265 " </xmlfile>\n"
2266 "</compatibility-matrix>\n");
2267}
2268
Yifan Hongfeb454e2018-01-09 16:16:40 -08002269TEST_F(LibVintfTest, VendorNdk) {
2270 CompatibilityMatrix cm;
2271 std::string error;
2272 std::string xml;
2273
2274 xml =
2275 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
2276 " <vendor-ndk>\n"
2277 " <version>P</version>\n"
2278 " <library>libbase.so</library>\n"
2279 " <library>libjpeg.so</library>\n"
2280 " </vendor-ndk>\n"
2281 "</compatibility-matrix>\n";
2282 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2283 << gCompatibilityMatrixConverter.lastError();
2284 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
2285
2286 {
2287 HalManifest manifest;
2288 xml =
2289 "<manifest version=\"1.0\" type=\"framework\">\n"
2290 " <vendor-ndk>\n"
2291 " <version>27</version>\n"
2292 " <library>libbase.so</library>\n"
2293 " <library>libjpeg.so</library>\n"
2294 " </vendor-ndk>\n"
2295 " <vendor-ndk>\n"
2296 " <version>P</version>\n"
2297 " <library>libbase.so</library>\n"
2298 " <library>libjpeg.so</library>\n"
2299 " <library>libtinyxml2.so</library>\n"
2300 " </vendor-ndk>\n"
2301 "</manifest>\n";
2302
2303 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2304 EXPECT_EQ(xml, gHalManifestConverter(manifest));
2305 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2306 }
2307
2308 {
2309 HalManifest manifest;
2310 xml =
2311 "<manifest version=\"1.0\" type=\"framework\">\n"
2312 " <vendor-ndk>\n"
2313 " <version>27</version>\n"
2314 " <library>libbase.so</library>\n"
2315 " <library>libjpeg.so</library>\n"
2316 " </vendor-ndk>\n"
2317 "</manifest>\n";
2318
2319 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2320 EXPECT_EQ(xml, gHalManifestConverter(manifest));
2321 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2322 EXPECT_IN("Vndk version P is not supported.", error);
2323 }
2324
2325 {
2326 HalManifest manifest;
2327 xml =
2328 "<manifest version=\"1.0\" type=\"framework\">\n"
2329 " <vendor-ndk>\n"
2330 " <version>P</version>\n"
2331 " <library>libbase.so</library>\n"
2332 " </vendor-ndk>\n"
2333 "</manifest>\n";
2334
2335 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2336 EXPECT_EQ(xml, gHalManifestConverter(manifest));
2337 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2338 EXPECT_IN("Vndk libs incompatible for version P.", error);
2339 EXPECT_IN("libjpeg.so", error);
2340 }
2341}
2342
2343TEST_F(LibVintfTest, MissingVendorNdkInMatrix) {
2344 CompatibilityMatrix cm;
2345 std::string xml;
2346 std::string error;
2347
2348 xml = "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n";
2349 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2350 << gCompatibilityMatrixConverter.lastError();
2351
2352 {
2353 HalManifest manifest;
2354 xml = "<manifest version=\"1.0\" type=\"framework\"/>\n";
2355 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2356
2357 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2358 }
2359
2360 {
2361 HalManifest manifest;
2362 xml =
2363 "<manifest version=\"1.0\" type=\"framework\">\n"
2364 " <vendor-ndk>\n"
2365 " <version>P</version>\n"
2366 " <library>libbase.so</library>\n"
2367 " </vendor-ndk>\n"
2368 "</manifest>\n";
2369 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2370
2371 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2372 }
2373}
2374
Yifan Hong0bfbc122018-02-02 13:27:29 -08002375TEST_F(LibVintfTest, DuplicatedVendorNdkVersion) {
2376 std::string error;
2377 HalManifest manifest;
2378 std::string xml =
2379 "<manifest version=\"1.0\" type=\"framework\">\n"
2380 " <vendor-ndk>\n"
2381 " <version>27</version>\n"
2382 " </vendor-ndk>\n"
2383 " <vendor-ndk>\n"
2384 " <version>27</version>\n"
2385 " </vendor-ndk>\n"
2386 "</manifest>\n";
2387
2388 EXPECT_FALSE(gHalManifestConverter(&manifest, xml));
2389 EXPECT_EQ("Duplicated manifest.vendor-ndk.version 27", gHalManifestConverter.lastError());
2390}
2391
Yifan Hong68d23062018-01-17 16:09:46 -08002392TEST_F(LibVintfTest, ManifestHalOverride) {
2393 HalManifest manifest;
2394 std::string xml =
2395 "<manifest version=\"1.0\" type=\"device\">\n"
2396 " <hal format=\"hidl\" override=\"true\">\n"
2397 " <name>android.hardware.foo</name>\n"
2398 " <transport>hwbinder</transport>\n"
2399 " <version>1.0</version>\n"
2400 " </hal>\n"
2401 " <hal format=\"hidl\">\n"
2402 " <name>android.hardware.bar</name>\n"
2403 " <transport>hwbinder</transport>\n"
2404 " <version>1.0</version>\n"
2405 " </hal>\n"
2406 "</manifest>\n";
2407 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
Yifan Hongad40a8e2018-03-05 17:45:34 -08002408 const auto& foo = manifest.getHals("android.hardware.foo");
2409 ASSERT_FALSE(foo.empty());
Yifan Hong038f07c2018-03-13 12:01:24 -07002410 EXPECT_TRUE(foo.front()->isOverride());
Yifan Hongad40a8e2018-03-05 17:45:34 -08002411 const auto& bar = manifest.getHals("android.hardware.bar");
2412 ASSERT_FALSE(bar.empty());
Yifan Hong038f07c2018-03-13 12:01:24 -07002413 EXPECT_FALSE(bar.front()->isOverride());
Yifan Hong68d23062018-01-17 16:09:46 -08002414}
2415
Yifan Hong84f67e92018-01-17 16:57:19 -08002416// Test functionality of override="true" tag
2417TEST_F(LibVintfTest, ManifestAddOverrideHalSimple) {
2418 HalManifest manifest;
2419 std::string xml = "<manifest version=\"1.0\" type=\"device\"/>\n";
2420 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2421
2422 HalManifest newManifest;
2423 xml =
2424 "<manifest version=\"1.0\" type=\"device\">\n"
2425 " <hal format=\"hidl\" override=\"true\">\n"
2426 " <name>android.hardware.foo</name>\n"
2427 " <transport>hwbinder</transport>\n"
2428 " <version>1.1</version>\n"
2429 " <interface>\n"
2430 " <name>IFoo</name>\n"
2431 " <instance>default</instance>\n"
2432 " </interface>\n"
2433 " </hal>\n"
2434 "</manifest>\n";
2435 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2436
2437 manifest.addAllHals(&newManifest);
2438 EXPECT_EQ(xml, gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
2439}
2440
2441TEST_F(LibVintfTest, ManifestAddOverrideHalSimpleOverride) {
2442 HalManifest manifest;
2443 std::string xml =
2444 "<manifest version=\"1.0\" type=\"device\">\n"
2445 " <hal format=\"hidl\">\n"
2446 " <name>android.hardware.foo</name>\n"
2447 " <transport>hwbinder</transport>\n"
2448 " <version>1.0</version>\n"
2449 " </hal>\n"
2450 "</manifest>\n";
2451 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2452
2453 HalManifest newManifest;
2454 xml =
2455 "<manifest version=\"1.0\" type=\"device\">\n"
2456 " <hal format=\"hidl\" override=\"true\">\n"
2457 " <name>android.hardware.foo</name>\n"
2458 " <transport>hwbinder</transport>\n"
2459 " <version>1.1</version>\n"
2460 " <interface>\n"
2461 " <name>IFoo</name>\n"
2462 " <instance>default</instance>\n"
2463 " </interface>\n"
2464 " </hal>\n"
2465 "</manifest>\n";
2466 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2467
2468 manifest.addAllHals(&newManifest);
2469 EXPECT_EQ(xml, gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
2470}
2471
2472// Existing major versions should be removed.
2473TEST_F(LibVintfTest, ManifestAddOverrideHalMultiVersion) {
2474 HalManifest manifest;
2475 std::string xml =
2476 "<manifest version=\"1.0\" type=\"device\">\n"
2477 " <hal format=\"hidl\">\n"
2478 " <name>android.hardware.foo</name>\n"
2479 " <transport>hwbinder</transport>\n"
2480 " <version>1.3</version>\n"
2481 " <version>2.4</version>\n"
2482 " <interface>\n"
2483 " <name>IFoo</name>\n"
2484 " <instance>slot1</instance>\n"
2485 " </interface>\n"
2486 " </hal>\n"
2487 " <hal format=\"hidl\">\n"
2488 " <name>android.hardware.bar</name>\n"
2489 " <transport>hwbinder</transport>\n"
2490 " <version>1.3</version>\n"
2491 " </hal>\n"
2492 "</manifest>\n";
2493 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2494
2495 HalManifest newManifest;
2496 xml =
2497 "<manifest version=\"1.0\" type=\"device\">\n"
2498 " <hal format=\"hidl\" override=\"true\">\n"
2499 " <name>android.hardware.foo</name>\n"
2500 " <transport>hwbinder</transport>\n"
2501 " <version>1.1</version>\n"
2502 " <version>3.1</version>\n"
2503 " <interface>\n"
2504 " <name>IFoo</name>\n"
2505 " <instance>slot2</instance>\n"
2506 " </interface>\n"
2507 " </hal>\n"
2508 "</manifest>\n";
2509 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2510
2511 manifest.addAllHals(&newManifest);
2512 EXPECT_EQ(
2513 "<manifest version=\"1.0\" type=\"device\">\n"
2514 " <hal format=\"hidl\">\n"
2515 " <name>android.hardware.bar</name>\n"
2516 " <transport>hwbinder</transport>\n"
2517 " <version>1.3</version>\n"
2518 " </hal>\n"
2519 " <hal format=\"hidl\">\n"
2520 " <name>android.hardware.foo</name>\n"
2521 " <transport>hwbinder</transport>\n"
2522 " <version>2.4</version>\n"
2523 " <interface>\n"
2524 " <name>IFoo</name>\n"
2525 " <instance>slot1</instance>\n"
2526 " </interface>\n"
2527 " </hal>\n"
2528 " <hal format=\"hidl\" override=\"true\">\n"
2529 " <name>android.hardware.foo</name>\n"
2530 " <transport>hwbinder</transport>\n"
2531 " <version>1.1</version>\n"
2532 " <version>3.1</version>\n"
2533 " <interface>\n"
2534 " <name>IFoo</name>\n"
2535 " <instance>slot2</instance>\n"
2536 " </interface>\n"
2537 " </hal>\n"
2538 "</manifest>\n",
2539 gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
2540}
2541
2542TEST_F(LibVintfTest, ManifestAddOverrideHalMultiVersion2) {
2543 HalManifest manifest;
2544 std::string xml =
2545 "<manifest version=\"1.0\" type=\"device\">\n"
2546 " <hal format=\"hidl\">\n"
2547 " <name>android.hardware.foo</name>\n"
2548 " <transport>hwbinder</transport>\n"
2549 " <version>1.3</version>\n"
2550 " <version>2.4</version>\n"
2551 " <interface>\n"
2552 " <name>IFoo</name>\n"
2553 " <instance>slot1</instance>\n"
2554 " </interface>\n"
2555 " </hal>\n"
2556 "</manifest>\n";
2557 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2558
2559 HalManifest newManifest;
2560 xml =
2561 "<manifest version=\"1.0\" type=\"device\">\n"
2562 " <hal format=\"hidl\" override=\"true\">\n"
2563 " <name>android.hardware.foo</name>\n"
2564 " <transport>hwbinder</transport>\n"
2565 " <version>1.1</version>\n"
2566 " <version>2.1</version>\n"
2567 " <interface>\n"
2568 " <name>IFoo</name>\n"
2569 " <instance>slot2</instance>\n"
2570 " </interface>\n"
2571 " </hal>\n"
2572 "</manifest>\n";
2573 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2574
2575 manifest.addAllHals(&newManifest);
2576 EXPECT_EQ(xml, gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
2577}
2578
2579// if no <versions>, remove all existing <hal> with given <name>.
2580TEST_F(LibVintfTest, ManifestAddOverrideHalRemoveAll) {
2581 HalManifest manifest;
2582 std::string xml =
2583 "<manifest version=\"1.0\" type=\"device\">\n"
2584 " <hal format=\"hidl\">\n"
2585 " <name>android.hardware.foo</name>\n"
2586 " <transport>hwbinder</transport>\n"
2587 " <version>1.3</version>\n"
2588 " <version>2.4</version>\n"
2589 " <interface>\n"
2590 " <name>IFoo</name>\n"
2591 " <instance>slot1</instance>\n"
2592 " </interface>\n"
2593 " </hal>\n"
2594 " <hal format=\"hidl\">\n"
2595 " <name>android.hardware.foo</name>\n"
2596 " <transport>hwbinder</transport>\n"
2597 " <version>3.1</version>\n"
2598 " <version>4.3</version>\n"
2599 " <interface>\n"
2600 " <name>IBar</name>\n"
2601 " <instance>slot2</instance>\n"
2602 " </interface>\n"
2603 " </hal>\n"
2604 " <hal format=\"hidl\">\n"
2605 " <name>android.hardware.bar</name>\n"
2606 " <transport>hwbinder</transport>\n"
2607 " <version>1.3</version>\n"
2608 " </hal>\n"
2609 "</manifest>\n";
2610 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2611
2612 HalManifest newManifest;
2613 xml =
2614 "<manifest version=\"1.0\" type=\"device\">\n"
2615 " <hal format=\"hidl\" override=\"true\">\n"
2616 " <name>android.hardware.foo</name>\n"
2617 " <transport>hwbinder</transport>\n"
2618 " </hal>\n"
2619 "</manifest>\n";
2620 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2621
2622 manifest.addAllHals(&newManifest);
2623 EXPECT_EQ(
2624 "<manifest version=\"1.0\" type=\"device\">\n"
2625 " <hal format=\"hidl\">\n"
2626 " <name>android.hardware.bar</name>\n"
2627 " <transport>hwbinder</transport>\n"
2628 " <version>1.3</version>\n"
2629 " </hal>\n"
2630 " <hal format=\"hidl\" override=\"true\">\n"
2631 " <name>android.hardware.foo</name>\n"
2632 " <transport>hwbinder</transport>\n"
2633 " </hal>\n"
2634 "</manifest>\n",
2635 gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
2636}
2637
Yifan Honga28729e2018-01-17 13:40:35 -08002638// Make sure missing tags in old VINTF files does not cause incompatibilities.
2639TEST_F(LibVintfTest, Empty) {
2640 CompatibilityMatrix cm;
2641 HalManifest manifest;
2642 std::string xml;
2643 std::string error;
2644
2645 xml = "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n";
2646 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2647 << gCompatibilityMatrixConverter.lastError();
2648
2649 xml = "<manifest version=\"1.0\" type=\"framework\"/>\n";
2650 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2651
2652 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2653}
2654
2655TEST_F(LibVintfTest, SystemSdk) {
2656 CompatibilityMatrix cm;
2657 std::string xml;
2658 std::string error;
2659
2660 xml =
2661 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
2662 " <system-sdk>\n"
2663 " <version>1</version>\n"
2664 " <version>P</version>\n"
2665 " </system-sdk>\n"
2666 "</compatibility-matrix>\n";
2667 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2668 << gCompatibilityMatrixConverter.lastError();
2669 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm, ~SerializeFlag::NO_SSDK));
2670
2671 {
2672 HalManifest manifest;
2673 xml =
2674 "<manifest version=\"1.0\" type=\"framework\">\n"
2675 " <system-sdk>\n"
2676 " <version>1</version>\n"
2677 " <version>P</version>\n"
2678 " </system-sdk>\n"
2679 "</manifest>\n";
2680 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2681 EXPECT_EQ(xml, gHalManifestConverter(manifest, ~SerializeFlag::NO_SSDK));
2682
2683 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2684 }
2685
2686 {
2687 HalManifest manifest;
2688 xml =
2689 "<manifest version=\"1.0\" type=\"framework\">\n"
2690 " <system-sdk>\n"
2691 " <version>1</version>\n"
2692 " <version>3</version>\n"
2693 " <version>P</version>\n"
2694 " </system-sdk>\n"
2695 "</manifest>\n";
2696 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2697 EXPECT_TRUE(manifest.checkCompatibility(cm, &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 " </system-sdk>\n"
2707 "</manifest>\n";
2708 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2709 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2710 EXPECT_TRUE(error.find("System SDK") != std::string::npos) << error;
2711 }
2712}
2713
Yifan Hong94757062018-02-09 16:36:31 -08002714TEST_F(LibVintfTest, ManifestLastError) {
2715 HalManifest e;
2716 // Set mLastError to something else before testing.
2717 EXPECT_FALSE(gHalManifestConverter(&e, "<manifest/>"));
2718 EXPECT_NE("Not a valid XML", gHalManifestConverter.lastError());
2719
2720 std::string error;
2721 std::string prevError = gHalManifestConverter.lastError();
2722 EXPECT_FALSE(gHalManifestConverter(&e, "", &error));
2723 EXPECT_EQ("Not a valid XML", error);
2724 EXPECT_EQ(prevError, gHalManifestConverter.lastError()) << "lastError() should not be modified";
2725}
2726
2727TEST_F(LibVintfTest, MatrixLastError) {
2728 CompatibilityMatrix e;
2729 // Set mLastError to something else before testing.
2730 EXPECT_FALSE(gCompatibilityMatrixConverter(&e, "<compatibility-matrix/>"));
2731 EXPECT_NE("Not a valid XML", gCompatibilityMatrixConverter.lastError());
2732
2733 std::string error;
2734 std::string prevError = gCompatibilityMatrixConverter.lastError();
2735 EXPECT_FALSE(gCompatibilityMatrixConverter(&e, "", &error));
2736 EXPECT_EQ("Not a valid XML", error);
2737 EXPECT_EQ(prevError, gCompatibilityMatrixConverter.lastError())
2738 << "lastError() should not be modified";
2739}
2740
Yifan Hongde3aec22018-02-12 15:39:47 -08002741TEST_F(LibVintfTest, MatrixDetailErrorMsg) {
2742 std::string error;
2743 std::string xml;
2744
2745 HalManifest manifest;
2746 xml =
Yifan Hong970bf042018-03-07 13:58:43 -08002747 "<manifest version=\"1.0\" type=\"device\" target-level=\"103\">\n"
Yifan Hongde3aec22018-02-12 15:39:47 -08002748 " <hal format=\"hidl\">\n"
2749 " <name>android.hardware.foo</name>\n"
2750 " <transport>hwbinder</transport>\n"
2751 " <version>1.0</version>\n"
2752 " <interface>\n"
2753 " <name>IFoo</name>\n"
2754 " <instance>default</instance>\n"
2755 " </interface>\n"
2756 " </hal>\n"
2757 "</manifest>\n";
2758 ASSERT_TRUE(gHalManifestConverter(&manifest, xml, &error)) << error;
2759
2760 {
2761 CompatibilityMatrix cm;
2762 xml =
Yifan Hong970bf042018-03-07 13:58:43 -08002763 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"100\">\n"
Yifan Hongde3aec22018-02-12 15:39:47 -08002764 " <hal format=\"hidl\" optional=\"false\">\n"
2765 " <name>android.hardware.foo</name>\n"
2766 " <version>1.2-3</version>\n"
2767 " <version>4.5</version>\n"
2768 " <interface>\n"
2769 " <name>IFoo</name>\n"
2770 " <instance>default</instance>\n"
2771 " <instance>slot1</instance>\n"
2772 " </interface>\n"
2773 " <interface>\n"
2774 " <name>IBar</name>\n"
2775 " <instance>default</instance>\n"
2776 " </interface>\n"
2777 " </hal>\n"
2778 "</compatibility-matrix>\n";
2779 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml, &error)) << error;
2780 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
Yifan Hong970bf042018-03-07 13:58:43 -08002781 EXPECT_IN("Manifest level = 103", error)
2782 EXPECT_IN("Matrix level = 100", error)
Yifan Hongde3aec22018-02-12 15:39:47 -08002783 EXPECT_IN(
2784 "android.hardware.foo:\n"
2785 " required: \n"
2786 " (@1.2-3::IBar/default AND @1.2-3::IFoo/default AND @1.2-3::IFoo/slot1) OR\n"
2787 " (@4.5::IBar/default AND @4.5::IFoo/default AND @4.5::IFoo/slot1)\n"
2788 " provided: @1.0::IFoo/default",
2789 error);
2790 }
2791
2792 {
2793 CompatibilityMatrix cm;
2794 xml =
2795 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
2796 " <hal format=\"hidl\" optional=\"false\">\n"
2797 " <name>android.hardware.foo</name>\n"
2798 " <version>1.2-3</version>\n"
2799 " <interface>\n"
2800 " <name>IFoo</name>\n"
2801 " <instance>default</instance>\n"
2802 " <instance>slot1</instance>\n"
2803 " </interface>\n"
2804 " </hal>\n"
2805 "</compatibility-matrix>\n";
2806 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml, &error)) << error;
2807 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2808 EXPECT_IN(
2809 "android.hardware.foo:\n"
2810 " required: (@1.2-3::IFoo/default AND @1.2-3::IFoo/slot1)\n"
2811 " provided: @1.0::IFoo/default",
2812 error);
2813 }
2814
2815 // the most frequent use case.
2816 {
2817 CompatibilityMatrix cm;
2818 xml =
2819 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
2820 " <hal format=\"hidl\" optional=\"false\">\n"
2821 " <name>android.hardware.foo</name>\n"
2822 " <version>1.2-3</version>\n"
2823 " <interface>\n"
2824 " <name>IFoo</name>\n"
2825 " <instance>default</instance>\n"
2826 " </interface>\n"
2827 " </hal>\n"
2828 "</compatibility-matrix>\n";
2829 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml, &error)) << error;
2830 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2831 EXPECT_IN(
2832 "android.hardware.foo:\n"
2833 " required: @1.2-3::IFoo/default\n"
2834 " provided: @1.0::IFoo/default",
2835 error);
2836 }
2837}
2838
Yifan Honga9993572017-01-24 19:33:15 -08002839} // namespace vintf
2840} // namespace android
2841
Yifan Hong676447a2016-11-15 12:57:23 -08002842int main(int argc, char **argv) {
2843 ::testing::InitGoogleTest(&argc, argv);
2844 return RUN_ALL_TESTS();
2845}