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