blob: d705243c52c79bde0ff1e273731bb3065e2cd2d4 [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
47#ifdef LIBVINTF_HOST
48#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});
1358 std::string xml = gCompatibilityMatrixConverter(cm);
1359 EXPECT_EQ(xml,
1360 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1361 " <sepolicy>\n"
1362 " <kernel-sepolicy-version>0</kernel-sepolicy-version>\n"
1363 " </sepolicy>\n"
1364 " <avb>\n"
1365 " <vbmeta-version>0.0</vbmeta-version>\n"
1366 " </avb>\n"
1367 " <xmlfile format=\"dtd\" optional=\"true\">\n"
1368 " <name>media_profile</name>\n"
1369 " <version>1.0</version>\n"
1370 " </xmlfile>\n"
1371 "</compatibility-matrix>\n");
1372 CompatibilityMatrix cm2;
1373 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
1374 EXPECT_EQ(cm, cm2);
1375}
1376
1377TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile2) {
1378 std::string xml =
1379 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1380 " <xmlfile format=\"dtd\" optional=\"false\">\n"
1381 " <name>media_profile</name>\n"
1382 " <version>1.0</version>\n"
1383 " </xmlfile>\n"
1384 "</compatibility-matrix>\n";
1385 CompatibilityMatrix cm;
1386 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml));
1387 EXPECT_EQ(
1388 "compatibility-matrix.xmlfile entry media_profile has to be optional for "
1389 "compatibility matrix version 1.0",
1390 gCompatibilityMatrixConverter.lastError());
1391}
1392
Yifan Hongbbfff302017-06-06 17:10:13 -07001393TEST_F(LibVintfTest, ManifestXmlFilePathDevice) {
1394 std::string manifestXml =
1395 "<manifest version=\"1.0\" type=\"device\">"
1396 " <xmlfile>"
1397 " <name>media_profile</name>"
1398 " <version>1.0</version>"
1399 " </xmlfile>"
1400 "</manifest>";
1401 HalManifest manifest;
1402 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1403 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1404 "/vendor/etc/media_profile_V1_0.xml");
1405}
1406
1407TEST_F(LibVintfTest, ManifestXmlFilePathFramework) {
1408 std::string manifestXml =
1409 "<manifest version=\"1.0\" type=\"framework\">"
1410 " <xmlfile>"
1411 " <name>media_profile</name>"
1412 " <version>1.0</version>"
1413 " </xmlfile>"
1414 "</manifest>";
1415 HalManifest manifest;
1416 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1417 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1418 "/system/etc/media_profile_V1_0.xml");
1419}
1420
1421TEST_F(LibVintfTest, ManifestXmlFilePathOverride) {
1422 std::string manifestXml =
1423 "<manifest version=\"1.0\" type=\"device\">"
1424 " <xmlfile>"
1425 " <name>media_profile</name>"
1426 " <version>1.0</version>"
1427 " <path>/vendor/etc/foo.xml</path>"
1428 " </xmlfile>"
1429 "</manifest>";
1430 HalManifest manifest;
1431 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1432 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "/vendor/etc/foo.xml");
1433}
1434
1435TEST_F(LibVintfTest, ManifestXmlFilePathMissing) {
1436 std::string manifestXml =
1437 "<manifest version=\"1.0\" type=\"device\">"
1438 " <xmlfile>"
1439 " <name>media_profile</name>"
1440 " <version>1.1</version>"
1441 " </xmlfile>"
1442 "</manifest>";
1443 HalManifest manifest;
1444 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1445 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "");
1446}
1447
1448TEST_F(LibVintfTest, MatrixXmlFilePathFramework) {
1449 std::string matrixXml =
1450 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1451 " <xmlfile format=\"dtd\" optional=\"true\">"
1452 " <name>media_profile</name>"
1453 " <version>2.0-1</version>"
1454 " </xmlfile>"
1455 "</compatibility-matrix>";
1456 CompatibilityMatrix matrix;
1457 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1458 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 1}),
1459 "/system/etc/media_profile_V2_1.dtd");
1460}
1461
1462TEST_F(LibVintfTest, MatrixXmlFilePathDevice) {
1463 std::string matrixXml =
1464 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1465 " <xmlfile format=\"xsd\" optional=\"true\">"
1466 " <name>media_profile</name>"
1467 " <version>2.0-1</version>"
1468 " </xmlfile>"
1469 "</compatibility-matrix>";
1470 CompatibilityMatrix matrix;
1471 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1472 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}),
1473 "/vendor/etc/media_profile_V2_1.xsd");
1474}
1475
1476TEST_F(LibVintfTest, MatrixXmlFilePathOverride) {
1477 std::string matrixXml =
1478 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1479 " <xmlfile format=\"xsd\" optional=\"true\">"
1480 " <name>media_profile</name>"
1481 " <version>2.0-1</version>"
1482 " <path>/system/etc/foo.xsd</path>"
1483 " </xmlfile>"
1484 "</compatibility-matrix>";
1485 CompatibilityMatrix matrix;
1486 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1487 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "/system/etc/foo.xsd");
1488}
1489
1490TEST_F(LibVintfTest, MatrixXmlFilePathMissing) {
1491 std::string matrixXml =
1492 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1493 " <xmlfile format=\"dtd\" optional=\"true\">"
1494 " <name>media_profile</name>"
1495 " <version>2.1</version>"
1496 " </xmlfile>"
1497 "</compatibility-matrix>";
1498 CompatibilityMatrix matrix;
1499 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1500 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "");
1501}
1502
Yifan Hong02e94002017-07-10 15:41:56 -07001503std::pair<KernelConfigParser, status_t> processData(const std::string& data, bool processComments,
1504 bool relaxedFormat = false) {
1505 KernelConfigParser parser(processComments, relaxedFormat);
Yifan Hongd8cee082017-07-05 16:06:09 -07001506 const char* p = data.c_str();
1507 size_t n = 0;
1508 size_t chunkSize;
Yifan Hong6209d172017-07-07 16:18:19 -07001509 status_t status = OK;
Yifan Hongd8cee082017-07-05 16:06:09 -07001510 for (; n < data.size(); p += chunkSize, n += chunkSize) {
1511 chunkSize = std::min<size_t>(5, data.size() - n);
Yifan Hong6209d172017-07-07 16:18:19 -07001512 if ((status = parser.process(p, chunkSize)) != OK) {
1513 break;
1514 }
Yifan Hongd8cee082017-07-05 16:06:09 -07001515 }
Yifan Hong6209d172017-07-07 16:18:19 -07001516 return {std::move(parser), status};
Yifan Hongd8cee082017-07-05 16:06:09 -07001517}
1518
1519TEST_F(LibVintfTest, KernelConfigParser) {
1520 // usage in /proc/config.gz
1521 const std::string data =
1522 "# CONFIG_NOT_SET is not set\n"
1523 "CONFIG_ONE=1\n"
1524 "CONFIG_Y=y\n"
1525 "CONFIG_STR=\"string\"\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001526 auto pair = processData(data, false /* processComments */);
1527 ASSERT_EQ(OK, pair.second) << pair.first.error();
1528 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001529
1530 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1531 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1532 EXPECT_EQ(configs.find("CONFIG_STR")->second, "\"string\"");
1533 EXPECT_EQ(configs.find("CONFIG_NOT_SET"), configs.end());
1534}
1535
1536TEST_F(LibVintfTest, KernelConfigParser2) {
1537 // usage in android-base.cfg
1538 const std::string data =
1539 "# CONFIG_NOT_SET is not set\n"
1540 "CONFIG_ONE=1\n"
1541 "CONFIG_Y=y\n"
1542 "CONFIG_STR=string\n"
1543 "# ignore_thiscomment\n"
1544 "# CONFIG_NOT_SET2 is not set\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001545 auto pair = processData(data, true /* processComments */);
1546 ASSERT_EQ(OK, pair.second) << pair.first.error();
1547 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001548
1549 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1550 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1551 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1552 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1553 EXPECT_EQ(configs.find("CONFIG_NOT_SET2")->second, "n");
1554}
1555
Yifan Hongc1889722017-07-07 16:19:52 -07001556TEST_F(LibVintfTest, KernelConfigParserSpace) {
1557 // usage in android-base.cfg
1558 const std::string data =
1559 " # CONFIG_NOT_SET is not set \n"
1560 " CONFIG_ONE=1 # 'tis a one!\n"
1561 " CONFIG_TWO=2 #'tis a two! \n"
1562 " CONFIG_THREE=3#'tis a three! \n"
1563 " CONFIG_233=233#'tis a three! \n"
1564 "#yey! random comments\n"
1565 "CONFIG_Y=y \n"
1566 " CONFIG_YES=y#YES! \n"
1567 "CONFIG_STR=string\n"
1568 "CONFIG_HELLO=hello world! #still works\n"
1569 "CONFIG_WORLD=hello world! \n"
1570 "CONFIG_GOOD = good morning! #comments here\n"
1571 " CONFIG_MORNING = good morning! \n";
Yifan Hong02e94002017-07-10 15:41:56 -07001572 auto pair = processData(data, true /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07001573 ASSERT_EQ(OK, pair.second) << pair.first.error();
1574 const auto& configs = pair.first.configs();
1575
1576 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1577 EXPECT_EQ(configs.find("CONFIG_TWO")->second, "2");
1578 EXPECT_EQ(configs.find("CONFIG_THREE")->second, "3");
1579 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1580 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1581 EXPECT_EQ(configs.find("CONFIG_HELLO")->second, "hello world!")
1582 << "Value should be \"hello world!\" without trailing spaces";
1583 EXPECT_EQ(configs.find("CONFIG_WORLD")->second, "hello world!")
1584 << "Value should be \"hello world!\" without trailing spaces";
1585 EXPECT_EQ(configs.find("CONFIG_GOOD")->second, "good morning!")
1586 << "Value should be \"good morning!\" without leading or trailing spaces";
1587 EXPECT_EQ(configs.find("CONFIG_MORNING")->second, "good morning!")
1588 << "Value should be \"good morning!\" without leading or trailing spaces";
1589 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1590}
1591
Yifan Hongd9e46432017-08-15 17:14:52 -07001592TEST_F(LibVintfTest, NetutilsWrapperMatrix) {
1593 std::string matrixXml;
1594 CompatibilityMatrix matrix;
1595
1596 matrixXml =
1597 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1598 " <hal format=\"native\" optional=\"false\">"
1599 " <name>netutils-wrapper</name>"
1600 " <version>1.0</version>"
1601 " </hal>"
1602 "</compatibility-matrix>";
1603 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
1604 << gCompatibilityMatrixConverter.lastError();
1605
1606// only host libvintf hardcodes netutils-wrapper version requirements
1607#ifdef LIBVINTF_HOST
1608
1609 matrixXml =
1610 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1611 " <hal format=\"native\" optional=\"false\">"
1612 " <name>netutils-wrapper</name>"
1613 " <version>1.0-1</version>"
1614 " </hal>"
1615 "</compatibility-matrix>";
1616 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1617 EXPECT_CONTAINS(
1618 gCompatibilityMatrixConverter.lastError(),
1619 "netutils-wrapper HAL must specify exactly one version x.0, but a range is provided. "
1620 "Perhaps you mean '1.0'?");
1621
1622 matrixXml =
1623 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1624 " <hal format=\"native\" optional=\"false\">"
1625 " <name>netutils-wrapper</name>"
1626 " <version>1.1</version>"
1627 " </hal>"
1628 "</compatibility-matrix>";
1629 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1630 EXPECT_CONTAINS(
1631 gCompatibilityMatrixConverter.lastError(),
1632 "netutils-wrapper HAL must specify exactly one version x.0, but minor version is not 0. "
1633 "Perhaps you mean '1.0'?");
1634
1635 matrixXml =
1636 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1637 " <hal format=\"native\" optional=\"false\">"
1638 " <name>netutils-wrapper</name>"
1639 " <version>1.0</version>"
1640 " <version>2.0</version>"
1641 " </hal>"
1642 "</compatibility-matrix>";
1643 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1644 EXPECT_CONTAINS(
1645 gCompatibilityMatrixConverter.lastError(),
1646 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1647 "is specified.");
1648
1649#endif // LIBVINTF_HOST
1650}
1651
1652TEST_F(LibVintfTest, NetutilsWrapperManifest) {
1653 std::string manifestXml;
1654 HalManifest manifest;
1655
1656 manifestXml =
1657 "<manifest version=\"1.0\" type=\"framework\">"
1658 " <hal format=\"native\">"
1659 " <name>netutils-wrapper</name>"
1660 " <version>1.0</version>"
1661 " <version>2.0</version>"
1662 " </hal>"
1663 "</manifest>";
1664 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml)) << gHalManifestConverter.lastError();
1665
1666// only host libvintf hardcodes netutils-wrapper version requirements
1667#ifdef LIBVINTF_HOST
1668
1669 manifestXml =
1670 "<manifest version=\"1.0\" type=\"framework\">"
1671 " <hal format=\"native\">"
1672 " <name>netutils-wrapper</name>"
1673 " <version>1.1</version>"
1674 " </hal>"
1675 "</manifest>";
1676 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1677 EXPECT_CONTAINS(
1678 gCompatibilityMatrixConverter.lastError(),
1679 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1680 "is specified.");
1681
1682 manifestXml =
1683 "<manifest version=\"1.0\" type=\"framework\">"
1684 " <hal format=\"native\">"
1685 " <name>netutils-wrapper</name>"
1686 " <version>1.0</version>"
1687 " <version>2.1</version>"
1688 " </hal>"
1689 "</manifest>";
1690 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1691 EXPECT_CONTAINS(
1692 gCompatibilityMatrixConverter.lastError(),
1693 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1694 "is specified.");
1695
1696#endif // LIBVINTF_HOST
1697}
1698
Yifan Hong5f996502017-08-23 14:46:44 -07001699TEST_F(LibVintfTest, KernelConfigConditionTest) {
1700 std::string xml =
1701 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1702 " <kernel version=\"3.18.22\"/>\n"
1703 " <kernel version=\"3.18.22\">\n"
1704 " <conditions>\n"
1705 " <config>\n"
1706 " <key>CONFIG_ARM</key>\n"
1707 " <value type=\"tristate\">y</value>\n"
1708 " </config>\n"
1709 " </conditions>\n"
1710 " <config>\n"
1711 " <key>CONFIG_FOO</key>\n"
1712 " <value type=\"tristate\">y</value>\n"
1713 " </config>\n"
1714 " </kernel>\n"
1715 " <sepolicy>\n"
1716 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1717 " <sepolicy-version>25.0</sepolicy-version>\n"
1718 " </sepolicy>\n"
1719 " <avb>\n"
1720 " <vbmeta-version>2.1</vbmeta-version>\n"
1721 " </avb>\n"
1722 "</compatibility-matrix>\n";
1723
1724 CompatibilityMatrix cm;
1725 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1726 << gCompatibilityMatrixConverter.lastError();
1727 const auto& kernels = getKernels(cm);
1728 ASSERT_GE(kernels.size(), 2u);
1729 ASSERT_TRUE(kernels[0].conditions().empty());
1730 const auto& kernel = kernels[1];
1731 const auto& cond = kernel.conditions();
1732 ASSERT_FALSE(cond.empty());
1733 EXPECT_EQ("CONFIG_ARM", cond.begin()->first);
1734 EXPECT_EQ(KernelConfigTypedValue(Tristate::YES), cond.begin()->second);
1735 EXPECT_FALSE(kernel.configs().empty());
1736
1737 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
1738}
1739
1740TEST_F(LibVintfTest, KernelConfigConditionEmptyTest) {
1741 std::string xml =
1742 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1743 " <kernel version=\"4.4.0\"/>\n"
1744 " <kernel version=\"3.18.22\">\n"
1745 " <conditions>\n"
1746 " <config>\n"
1747 " <key>CONFIG_ARM</key>\n"
1748 " <value type=\"tristate\">y</value>\n"
1749 " </config>\n"
1750 " </conditions>\n"
1751 " </kernel>\n"
1752 "</compatibility-matrix>\n";
1753
1754 CompatibilityMatrix cm;
1755 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml))
1756 << "Should not accept first kernel version with non-empty conditions";
1757 EXPECT_EQ(
1758 "First <kernel> for version 3.18 must have empty <conditions> "
1759 "for backwards compatibility.",
1760 gCompatibilityMatrixConverter.lastError());
1761}
1762
1763TEST_F(LibVintfTest, KernelConfigConditionMatch) {
1764 RuntimeInfo runtime = testRuntimeInfo();
1765 std::string error;
1766 std::string xml;
1767 CompatibilityMatrix cm;
1768
1769 xml =
1770 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1771 " <kernel version=\"3.18.22\"/>\n"
1772 " <kernel version=\"3.18.22\">\n"
1773 " <conditions>\n"
1774 " <config>\n"
1775 " <key>CONFIG_64BIT</key>\n"
1776 " <value type=\"tristate\">y</value>\n"
1777 " </config>\n"
1778 " </conditions>\n"
1779 " <config>\n"
1780 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1781 " <value type=\"int\">24</value>\n"
1782 " </config>\n"
1783 " </kernel>\n"
1784 " <sepolicy>\n"
1785 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1786 " </sepolicy>\n"
1787 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1788 "</compatibility-matrix>\n";
1789
1790 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1791 << gCompatibilityMatrixConverter.lastError();
1792 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1793
1794 xml =
1795 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1796 " <kernel version=\"3.18.22\"/>\n"
1797 " <kernel version=\"3.18.22\">\n"
1798 " <conditions>\n"
1799 " <config>\n"
1800 " <key>CONFIG_64BIT</key>\n"
1801 " <value type=\"tristate\">y</value>\n"
1802 " </config>\n"
1803 " </conditions>\n"
1804 " <config>\n"
1805 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1806 " <value type=\"int\">26</value>\n"
1807 " </config>\n"
1808 " </kernel>\n"
1809 " <sepolicy>\n"
1810 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1811 " </sepolicy>\n"
1812 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1813 "</compatibility-matrix>\n";
1814
1815 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1816 << gCompatibilityMatrixConverter.lastError();
1817 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1818 << "conditions met, so CONFIG_ARCH_MMAP_RND_BITS should not match";
1819
1820 xml =
1821 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1822 " <kernel version=\"3.18.22\"/>\n"
1823 " <kernel version=\"3.18.22\">\n"
1824 " <conditions>\n"
1825 " <config>\n"
1826 " <key>CONFIG_64BIT</key>\n"
1827 " <value type=\"tristate\">n</value>\n"
1828 " </config>\n"
1829 " </conditions>\n"
1830 " <config>\n"
1831 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1832 " <value type=\"int\">26</value>\n"
1833 " </config>\n"
1834 " </kernel>\n"
1835 " <sepolicy>\n"
1836 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1837 " </sepolicy>\n"
1838 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1839 "</compatibility-matrix>\n";
1840
1841 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1842 << gCompatibilityMatrixConverter.lastError();
1843 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1844 xml =
1845 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1846 " <kernel version=\"3.18.22\"/>\n"
1847 " <kernel version=\"3.18.22\">\n"
1848 " <conditions>\n"
1849 " <config>\n"
1850 " <key>CONFIG_64BIT</key>\n"
1851 " <value type=\"tristate\">y</value>\n"
1852 " </config>\n"
1853 " <config>\n"
1854 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1855 " <value type=\"int\">24</value>\n"
1856 " </config>\n"
1857 " </conditions>\n"
1858 " <config>\n"
1859 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1860 " <value type=\"int\">0xdead000000000000</value>\n"
1861 " </config>\n"
1862 " </kernel>\n"
1863 " <sepolicy>\n"
1864 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1865 " </sepolicy>\n"
1866 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1867 "</compatibility-matrix>\n";
1868
1869 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1870 << gCompatibilityMatrixConverter.lastError();
1871 EXPECT_TRUE(runtime.checkCompatibility(cm, &error));
1872
1873 xml =
1874 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1875 " <kernel version=\"3.18.22\"/>\n"
1876 " <kernel version=\"3.18.22\">\n"
1877 " <conditions>\n"
1878 " <config>\n"
1879 " <key>CONFIG_64BIT</key>\n"
1880 " <value type=\"tristate\">y</value>\n"
1881 " </config>\n"
1882 " <config>\n"
1883 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1884 " <value type=\"int\">24</value>\n"
1885 " </config>\n"
1886 " </conditions>\n"
1887 " <config>\n"
1888 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1889 " <value type=\"int\">0xbeaf000000000000</value>\n"
1890 " </config>\n"
1891 " </kernel>\n"
1892 " <sepolicy>\n"
1893 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1894 " </sepolicy>\n"
1895 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1896 "</compatibility-matrix>\n";
1897
1898 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1899 << gCompatibilityMatrixConverter.lastError();
1900 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1901 << "conditions have 'and' relationship, so CONFIG_ILLEGAL_POINTER_VALUE should not match";
1902
1903 xml =
1904 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1905 " <kernel version=\"3.18.22\"/>\n"
1906 " <kernel version=\"3.18.22\">\n"
1907 " <conditions>\n"
1908 " <config>\n"
1909 " <key>CONFIG_64BIT</key>\n"
1910 " <value type=\"tristate\">y</value>\n"
1911 " </config>\n"
1912 " <config>\n"
1913 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1914 " <value type=\"int\">26</value>\n"
1915 " </config>\n"
1916 " </conditions>\n"
1917 " <config>\n"
1918 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1919 " <value type=\"int\">0xbeaf000000000000</value>\n"
1920 " </config>\n"
1921 " </kernel>\n"
1922 " <sepolicy>\n"
1923 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1924 " </sepolicy>\n"
1925 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1926 "</compatibility-matrix>\n";
1927
1928 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1929 << gCompatibilityMatrixConverter.lastError();
1930 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1931
1932 xml =
1933 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1934 " <kernel version=\"3.18.22\">\n"
1935 " <config>\n"
1936 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1937 " <value type=\"string\"/>\n"
1938 " </config>\n"
1939 " </kernel>\n"
1940 " <kernel version=\"3.18.22\">\n"
1941 " <conditions>\n"
1942 " <config>\n"
1943 " <key>CONFIG_64BIT</key>\n"
1944 " <value type=\"tristate\">y</value>\n"
1945 " </config>\n"
1946 " </conditions>\n"
1947 " <config>\n"
1948 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1949 " <value type=\"int\">0xdead000000000000</value>\n"
1950 " </config>\n"
1951 " </kernel>\n"
1952 " <kernel version=\"3.18.22\">\n"
1953 " <conditions>\n"
1954 " <config>\n"
1955 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1956 " <value type=\"int\">24</value>\n"
1957 " </config>\n"
1958 " </conditions>\n"
1959 " <config>\n"
1960 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1961 " <value type=\"string\">binder,hwbinder</value>\n"
1962 " </config>\n"
1963 " </kernel>\n"
1964 " <sepolicy>\n"
1965 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1966 " </sepolicy>\n"
1967 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1968 "</compatibility-matrix>\n";
1969
1970 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1971 << gCompatibilityMatrixConverter.lastError();
1972 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1973
1974 xml =
1975 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1976 " <kernel version=\"3.18.22\">\n"
1977 " <config>\n"
1978 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1979 " <value type=\"string\"/>\n"
1980 " </config>\n"
1981 " </kernel>\n"
1982 " <kernel version=\"3.18.22\">\n"
1983 " <conditions>\n"
1984 " <config>\n"
1985 " <key>CONFIG_64BIT</key>\n"
1986 " <value type=\"tristate\">y</value>\n"
1987 " </config>\n"
1988 " </conditions>\n"
1989 " <config>\n"
1990 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1991 " <value type=\"int\">0xbeaf000000000000</value>\n"
1992 " </config>\n"
1993 " </kernel>\n"
1994 " <kernel version=\"3.18.22\">\n"
1995 " <conditions>\n"
1996 " <config>\n"
1997 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1998 " <value type=\"int\">24</value>\n"
1999 " </config>\n"
2000 " </conditions>\n"
2001 " <config>\n"
2002 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
2003 " <value type=\"string\">binder,hwbinder</value>\n"
2004 " </config>\n"
2005 " </kernel>\n"
2006 " <sepolicy>\n"
2007 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2008 " </sepolicy>\n"
2009 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2010 "</compatibility-matrix>\n";
2011
2012 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2013 << gCompatibilityMatrixConverter.lastError();
2014 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used.";
2015
2016 xml =
2017 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
2018 " <kernel version=\"3.18.22\">\n"
2019 " <config>\n"
2020 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
2021 " <value type=\"string\"/>\n"
2022 " </config>\n"
2023 " </kernel>\n"
2024 " <kernel version=\"3.18.22\">\n"
2025 " <conditions>\n"
2026 " <config>\n"
2027 " <key>CONFIG_64BIT</key>\n"
2028 " <value type=\"tristate\">y</value>\n"
2029 " </config>\n"
2030 " </conditions>\n"
2031 " <config>\n"
2032 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
2033 " <value type=\"int\">0xdead000000000000</value>\n"
2034 " </config>\n"
2035 " </kernel>\n"
2036 " <kernel version=\"3.18.22\">\n"
2037 " <conditions>\n"
2038 " <config>\n"
2039 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
2040 " <value type=\"int\">24</value>\n"
2041 " </config>\n"
2042 " </conditions>\n"
2043 " <config>\n"
2044 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
2045 " <value type=\"string\">binder</value>\n"
2046 " </config>\n"
2047 " </kernel>\n"
2048 " <sepolicy>\n"
2049 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2050 " </sepolicy>\n"
2051 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2052 "</compatibility-matrix>\n";
2053
2054 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2055 << gCompatibilityMatrixConverter.lastError();
2056 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used";
2057}
2058
Yifan Hongc1889722017-07-07 16:19:52 -07002059// Run KernelConfigParserInvalidTest on processComments = {true, false}
2060class KernelConfigParserInvalidTest : public ::testing::TestWithParam<bool> {};
2061
2062TEST_P(KernelConfigParserInvalidTest, NonSet1) {
2063 const std::string data = "# CONFIG_NOT_EXIST is not sat\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002064 auto pair = processData(data, GetParam() /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07002065 ASSERT_EQ(OK, pair.second) << pair.first.error();
2066 const auto& configs = pair.first.configs();
2067 EXPECT_EQ(configs.find("CONFIG_NOT_EXIST"), configs.end())
2068 << "CONFIG_NOT_EXIST should not exist because of typo";
2069}
2070
2071TEST_P(KernelConfigParserInvalidTest, InvalidLine1) {
2072 const std::string data = "FOO_CONFIG=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
2077TEST_P(KernelConfigParserInvalidTest, InvalidLine2) {
2078 const std::string data = "CONFIG_BAR-BAZ=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002079 ASSERT_NE(OK,
2080 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07002081}
2082
2083INSTANTIATE_TEST_CASE_P(KernelConfigParser, KernelConfigParserInvalidTest, ::testing::Bool());
2084
Yifan Hong2027a492017-12-11 15:21:19 -08002085TEST_F(LibVintfTest, MatrixLevel) {
2086 CompatibilityMatrix cm;
2087 std::string xml;
2088
2089 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\"/>";
2090 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2091 << gCompatibilityMatrixConverter.lastError();
2092 EXPECT_EQ(Level::UNSPECIFIED, cm.level());
2093
2094 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"legacy\"/>";
2095 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2096 << gCompatibilityMatrixConverter.lastError();
2097 EXPECT_EQ(Level::LEGACY, cm.level());
2098
2099 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
2100 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2101 << gCompatibilityMatrixConverter.lastError();
2102 EXPECT_EQ(1u, cm.level());
2103}
2104
2105TEST_F(LibVintfTest, ManifestLevel) {
2106 HalManifest manifest;
2107 std::string xml;
2108
2109 xml = "<manifest version=\"1.0\" type=\"device\"/>";
2110 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2111 EXPECT_EQ(Level::UNSPECIFIED, manifest.level());
2112
2113 xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"legacy\"/>";
2114 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2115 EXPECT_EQ(Level::LEGACY, manifest.level());
2116
2117 xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"1\"/>";
2118 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2119 EXPECT_EQ(1u, manifest.level());
2120}
2121
Yifan Hongdbe9db32017-12-11 19:06:11 -08002122TEST_F(LibVintfTest, AddOptionalHal) {
2123 CompatibilityMatrix cm1;
2124 CompatibilityMatrix cm2;
2125 std::string error;
2126 std::string xml;
2127
2128 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
2129 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2130 << gCompatibilityMatrixConverter.lastError();
2131
2132 xml =
2133 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2134 " <hal format=\"hidl\" optional=\"false\">\n"
2135 " <name>android.hardware.foo</name>\n"
2136 " <version>1.0-1</version>\n"
2137 " <interface>\n"
2138 " <name>IFoo</name>\n"
2139 " <instance>default</instance>\n"
2140 " </interface>\n"
2141 " </hal>\n"
2142 "</compatibility-matrix>\n";
2143 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2144 << gCompatibilityMatrixConverter.lastError();
2145
2146 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2147 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2148 EXPECT_EQ(xml,
2149 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2150 " <hal format=\"hidl\" optional=\"true\">\n"
2151 " <name>android.hardware.foo</name>\n"
2152 " <version>1.0-1</version>\n"
2153 " <interface>\n"
2154 " <name>IFoo</name>\n"
2155 " <instance>default</instance>\n"
2156 " </interface>\n"
2157 " </hal>\n"
2158 "</compatibility-matrix>\n");
2159}
2160
2161TEST_F(LibVintfTest, AddOptionalHalMinorVersion) {
2162 CompatibilityMatrix cm1;
2163 CompatibilityMatrix cm2;
2164 std::string error;
2165 std::string xml;
2166
2167 xml =
2168 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2169 " <hal format=\"hidl\" optional=\"false\">\n"
2170 " <name>android.hardware.foo</name>\n"
2171 " <version>1.2-3</version>\n"
2172 " <interface>\n"
2173 " <name>IFoo</name>\n"
2174 " <instance>default</instance>\n"
2175 " </interface>\n"
2176 " </hal>\n"
2177 "</compatibility-matrix>\n";
2178 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2179 << gCompatibilityMatrixConverter.lastError();
2180
2181 xml =
2182 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2183 " <hal format=\"hidl\" optional=\"false\">\n"
2184 " <name>android.hardware.foo</name>\n"
2185 " <version>1.0-4</version>\n"
2186 " <interface>\n"
2187 " <name>IFoo</name>\n"
2188 " <instance>default</instance>\n"
2189 " </interface>\n"
2190 " </hal>\n"
2191 "</compatibility-matrix>\n";
2192 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2193 << gCompatibilityMatrixConverter.lastError();
2194
2195 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2196 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2197 EXPECT_EQ(xml,
2198 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2199 " <hal format=\"hidl\" optional=\"false\">\n"
2200 " <name>android.hardware.foo</name>\n"
2201 " <version>1.2-4</version>\n"
2202 " <interface>\n"
2203 " <name>IFoo</name>\n"
2204 " <instance>default</instance>\n"
2205 " </interface>\n"
2206 " </hal>\n"
2207 "</compatibility-matrix>\n");
2208}
2209
2210TEST_F(LibVintfTest, AddOptionalHalMajorVersion) {
2211 CompatibilityMatrix cm1;
2212 CompatibilityMatrix cm2;
2213 std::string error;
2214 std::string xml;
2215
2216 xml =
2217 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2218 " <hal format=\"hidl\" optional=\"false\">\n"
2219 " <name>android.hardware.foo</name>\n"
2220 " <version>1.2-3</version>\n"
2221 " <interface>\n"
2222 " <name>IFoo</name>\n"
2223 " <instance>default</instance>\n"
2224 " </interface>\n"
2225 " </hal>\n"
2226 "</compatibility-matrix>\n";
2227 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2228 << gCompatibilityMatrixConverter.lastError();
2229
2230 xml =
2231 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2232 " <hal format=\"hidl\" optional=\"false\">\n"
2233 " <name>android.hardware.foo</name>\n"
Yifan Hongd8eea9e2017-12-22 15:13:42 -08002234 " <version>1.2-3</version>\n"
Yifan Hongdbe9db32017-12-11 19:06:11 -08002235 " <version>2.0-4</version>\n"
2236 " <interface>\n"
2237 " <name>IFoo</name>\n"
2238 " <instance>default</instance>\n"
2239 " </interface>\n"
2240 " </hal>\n"
2241 "</compatibility-matrix>\n";
2242 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2243 << gCompatibilityMatrixConverter.lastError();
2244
2245 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2246 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2247 EXPECT_EQ(xml,
2248 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2249 " <hal format=\"hidl\" optional=\"false\">\n"
2250 " <name>android.hardware.foo</name>\n"
2251 " <version>1.2-3</version>\n"
2252 " <interface>\n"
2253 " <name>IFoo</name>\n"
2254 " <instance>default</instance>\n"
2255 " </interface>\n"
2256 " </hal>\n"
2257 " <hal format=\"hidl\" optional=\"true\">\n"
2258 " <name>android.hardware.foo</name>\n"
2259 " <version>2.0-4</version>\n"
2260 " <interface>\n"
2261 " <name>IFoo</name>\n"
2262 " <instance>default</instance>\n"
2263 " </interface>\n"
2264 " </hal>\n"
2265 "</compatibility-matrix>\n");
2266}
2267
Yifan Hongd4b92fe2017-12-20 15:29:03 -08002268TEST_F(LibVintfTest, AddOptionalXmlFile) {
2269 CompatibilityMatrix cm1;
2270 CompatibilityMatrix cm2;
2271 std::string error;
2272 std::string xml;
2273
2274 xml =
2275 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2276 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2277 " <name>foo</name>\n"
2278 " <version>1.0-2</version>\n"
2279 " <path>/foo/bar/baz.xsd</path>\n"
2280 " </xmlfile>\n"
2281 "</compatibility-matrix>\n";
2282 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2283 << gCompatibilityMatrixConverter.lastError();
2284
2285 xml =
2286 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2287 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2288 " <name>foo</name>\n"
2289 " <version>1.1-3</version>\n"
2290 " <path>/foo/bar/quux.xsd</path>\n"
2291 " </xmlfile>\n"
2292 "</compatibility-matrix>\n";
2293 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2294 << gCompatibilityMatrixConverter.lastError();
2295
2296 EXPECT_TRUE(addAllXmlFilesAsOptional(&cm1, &cm2, &error)) << error;
2297 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::XMLFILES_ONLY);
2298 EXPECT_EQ(xml,
2299 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2300 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2301 " <name>foo</name>\n"
2302 " <version>1.0-2</version>\n"
2303 " <path>/foo/bar/baz.xsd</path>\n"
2304 " </xmlfile>\n"
2305 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2306 " <name>foo</name>\n"
2307 " <version>1.1-3</version>\n"
2308 " <path>/foo/bar/quux.xsd</path>\n"
2309 " </xmlfile>\n"
2310 "</compatibility-matrix>\n");
2311}
2312
Yifan Hongfeb454e2018-01-09 16:16:40 -08002313TEST_F(LibVintfTest, VendorNdk) {
2314 CompatibilityMatrix cm;
2315 std::string error;
2316 std::string xml;
2317
2318 xml =
2319 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
2320 " <vendor-ndk>\n"
2321 " <version>P</version>\n"
2322 " <library>libbase.so</library>\n"
2323 " <library>libjpeg.so</library>\n"
2324 " </vendor-ndk>\n"
2325 "</compatibility-matrix>\n";
2326 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2327 << gCompatibilityMatrixConverter.lastError();
2328 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
2329
2330 {
2331 HalManifest manifest;
2332 xml =
2333 "<manifest version=\"1.0\" type=\"framework\">\n"
2334 " <vendor-ndk>\n"
2335 " <version>27</version>\n"
2336 " <library>libbase.so</library>\n"
2337 " <library>libjpeg.so</library>\n"
2338 " </vendor-ndk>\n"
2339 " <vendor-ndk>\n"
2340 " <version>P</version>\n"
2341 " <library>libbase.so</library>\n"
2342 " <library>libjpeg.so</library>\n"
2343 " <library>libtinyxml2.so</library>\n"
2344 " </vendor-ndk>\n"
2345 "</manifest>\n";
2346
2347 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2348 EXPECT_EQ(xml, gHalManifestConverter(manifest));
2349 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2350 }
2351
2352 {
2353 HalManifest manifest;
2354 xml =
2355 "<manifest version=\"1.0\" type=\"framework\">\n"
2356 " <vendor-ndk>\n"
2357 " <version>27</version>\n"
2358 " <library>libbase.so</library>\n"
2359 " <library>libjpeg.so</library>\n"
2360 " </vendor-ndk>\n"
2361 "</manifest>\n";
2362
2363 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2364 EXPECT_EQ(xml, gHalManifestConverter(manifest));
2365 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2366 EXPECT_IN("Vndk version P is not supported.", error);
2367 }
2368
2369 {
2370 HalManifest manifest;
2371 xml =
2372 "<manifest version=\"1.0\" type=\"framework\">\n"
2373 " <vendor-ndk>\n"
2374 " <version>P</version>\n"
2375 " <library>libbase.so</library>\n"
2376 " </vendor-ndk>\n"
2377 "</manifest>\n";
2378
2379 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2380 EXPECT_EQ(xml, gHalManifestConverter(manifest));
2381 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2382 EXPECT_IN("Vndk libs incompatible for version P.", error);
2383 EXPECT_IN("libjpeg.so", error);
2384 }
2385}
2386
2387TEST_F(LibVintfTest, MissingVendorNdkInMatrix) {
2388 CompatibilityMatrix cm;
2389 std::string xml;
2390 std::string error;
2391
2392 xml = "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n";
2393 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2394 << gCompatibilityMatrixConverter.lastError();
2395
2396 {
2397 HalManifest manifest;
2398 xml = "<manifest version=\"1.0\" type=\"framework\"/>\n";
2399 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2400
2401 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2402 }
2403
2404 {
2405 HalManifest manifest;
2406 xml =
2407 "<manifest version=\"1.0\" type=\"framework\">\n"
2408 " <vendor-ndk>\n"
2409 " <version>P</version>\n"
2410 " <library>libbase.so</library>\n"
2411 " </vendor-ndk>\n"
2412 "</manifest>\n";
2413 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2414
2415 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2416 }
2417}
2418
Yifan Hong68d23062018-01-17 16:09:46 -08002419TEST_F(LibVintfTest, ManifestHalOverride) {
2420 HalManifest manifest;
2421 std::string xml =
2422 "<manifest version=\"1.0\" type=\"device\">\n"
2423 " <hal format=\"hidl\" override=\"true\">\n"
2424 " <name>android.hardware.foo</name>\n"
2425 " <transport>hwbinder</transport>\n"
2426 " <version>1.0</version>\n"
2427 " </hal>\n"
2428 " <hal format=\"hidl\">\n"
2429 " <name>android.hardware.bar</name>\n"
2430 " <transport>hwbinder</transport>\n"
2431 " <version>1.0</version>\n"
2432 " </hal>\n"
2433 "</manifest>\n";
2434 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2435 const ManifestHal* foo = manifest.getHal("android.hardware.foo", {1, 0});
2436 ASSERT_NE(nullptr, foo);
2437 EXPECT_TRUE(foo->isOverride);
2438 const ManifestHal* bar = manifest.getHal("android.hardware.bar", {1, 0});
2439 ASSERT_NE(nullptr, bar);
2440 EXPECT_FALSE(bar->isOverride);
2441}
2442
Yifan Hong84f67e92018-01-17 16:57:19 -08002443// Test functionality of override="true" tag
2444TEST_F(LibVintfTest, ManifestAddOverrideHalSimple) {
2445 HalManifest manifest;
2446 std::string xml = "<manifest version=\"1.0\" type=\"device\"/>\n";
2447 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2448
2449 HalManifest newManifest;
2450 xml =
2451 "<manifest version=\"1.0\" type=\"device\">\n"
2452 " <hal format=\"hidl\" override=\"true\">\n"
2453 " <name>android.hardware.foo</name>\n"
2454 " <transport>hwbinder</transport>\n"
2455 " <version>1.1</version>\n"
2456 " <interface>\n"
2457 " <name>IFoo</name>\n"
2458 " <instance>default</instance>\n"
2459 " </interface>\n"
2460 " </hal>\n"
2461 "</manifest>\n";
2462 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2463
2464 manifest.addAllHals(&newManifest);
2465 EXPECT_EQ(xml, gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
2466}
2467
2468TEST_F(LibVintfTest, ManifestAddOverrideHalSimpleOverride) {
2469 HalManifest manifest;
2470 std::string xml =
2471 "<manifest version=\"1.0\" type=\"device\">\n"
2472 " <hal format=\"hidl\">\n"
2473 " <name>android.hardware.foo</name>\n"
2474 " <transport>hwbinder</transport>\n"
2475 " <version>1.0</version>\n"
2476 " </hal>\n"
2477 "</manifest>\n";
2478 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2479
2480 HalManifest newManifest;
2481 xml =
2482 "<manifest version=\"1.0\" type=\"device\">\n"
2483 " <hal format=\"hidl\" override=\"true\">\n"
2484 " <name>android.hardware.foo</name>\n"
2485 " <transport>hwbinder</transport>\n"
2486 " <version>1.1</version>\n"
2487 " <interface>\n"
2488 " <name>IFoo</name>\n"
2489 " <instance>default</instance>\n"
2490 " </interface>\n"
2491 " </hal>\n"
2492 "</manifest>\n";
2493 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2494
2495 manifest.addAllHals(&newManifest);
2496 EXPECT_EQ(xml, gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
2497}
2498
2499// Existing major versions should be removed.
2500TEST_F(LibVintfTest, ManifestAddOverrideHalMultiVersion) {
2501 HalManifest manifest;
2502 std::string xml =
2503 "<manifest version=\"1.0\" type=\"device\">\n"
2504 " <hal format=\"hidl\">\n"
2505 " <name>android.hardware.foo</name>\n"
2506 " <transport>hwbinder</transport>\n"
2507 " <version>1.3</version>\n"
2508 " <version>2.4</version>\n"
2509 " <interface>\n"
2510 " <name>IFoo</name>\n"
2511 " <instance>slot1</instance>\n"
2512 " </interface>\n"
2513 " </hal>\n"
2514 " <hal format=\"hidl\">\n"
2515 " <name>android.hardware.bar</name>\n"
2516 " <transport>hwbinder</transport>\n"
2517 " <version>1.3</version>\n"
2518 " </hal>\n"
2519 "</manifest>\n";
2520 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2521
2522 HalManifest newManifest;
2523 xml =
2524 "<manifest version=\"1.0\" type=\"device\">\n"
2525 " <hal format=\"hidl\" override=\"true\">\n"
2526 " <name>android.hardware.foo</name>\n"
2527 " <transport>hwbinder</transport>\n"
2528 " <version>1.1</version>\n"
2529 " <version>3.1</version>\n"
2530 " <interface>\n"
2531 " <name>IFoo</name>\n"
2532 " <instance>slot2</instance>\n"
2533 " </interface>\n"
2534 " </hal>\n"
2535 "</manifest>\n";
2536 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2537
2538 manifest.addAllHals(&newManifest);
2539 EXPECT_EQ(
2540 "<manifest version=\"1.0\" type=\"device\">\n"
2541 " <hal format=\"hidl\">\n"
2542 " <name>android.hardware.bar</name>\n"
2543 " <transport>hwbinder</transport>\n"
2544 " <version>1.3</version>\n"
2545 " </hal>\n"
2546 " <hal format=\"hidl\">\n"
2547 " <name>android.hardware.foo</name>\n"
2548 " <transport>hwbinder</transport>\n"
2549 " <version>2.4</version>\n"
2550 " <interface>\n"
2551 " <name>IFoo</name>\n"
2552 " <instance>slot1</instance>\n"
2553 " </interface>\n"
2554 " </hal>\n"
2555 " <hal format=\"hidl\" override=\"true\">\n"
2556 " <name>android.hardware.foo</name>\n"
2557 " <transport>hwbinder</transport>\n"
2558 " <version>1.1</version>\n"
2559 " <version>3.1</version>\n"
2560 " <interface>\n"
2561 " <name>IFoo</name>\n"
2562 " <instance>slot2</instance>\n"
2563 " </interface>\n"
2564 " </hal>\n"
2565 "</manifest>\n",
2566 gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
2567}
2568
2569TEST_F(LibVintfTest, ManifestAddOverrideHalMultiVersion2) {
2570 HalManifest manifest;
2571 std::string xml =
2572 "<manifest version=\"1.0\" type=\"device\">\n"
2573 " <hal format=\"hidl\">\n"
2574 " <name>android.hardware.foo</name>\n"
2575 " <transport>hwbinder</transport>\n"
2576 " <version>1.3</version>\n"
2577 " <version>2.4</version>\n"
2578 " <interface>\n"
2579 " <name>IFoo</name>\n"
2580 " <instance>slot1</instance>\n"
2581 " </interface>\n"
2582 " </hal>\n"
2583 "</manifest>\n";
2584 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2585
2586 HalManifest newManifest;
2587 xml =
2588 "<manifest version=\"1.0\" type=\"device\">\n"
2589 " <hal format=\"hidl\" override=\"true\">\n"
2590 " <name>android.hardware.foo</name>\n"
2591 " <transport>hwbinder</transport>\n"
2592 " <version>1.1</version>\n"
2593 " <version>2.1</version>\n"
2594 " <interface>\n"
2595 " <name>IFoo</name>\n"
2596 " <instance>slot2</instance>\n"
2597 " </interface>\n"
2598 " </hal>\n"
2599 "</manifest>\n";
2600 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2601
2602 manifest.addAllHals(&newManifest);
2603 EXPECT_EQ(xml, gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
2604}
2605
2606// if no <versions>, remove all existing <hal> with given <name>.
2607TEST_F(LibVintfTest, ManifestAddOverrideHalRemoveAll) {
2608 HalManifest manifest;
2609 std::string xml =
2610 "<manifest version=\"1.0\" type=\"device\">\n"
2611 " <hal format=\"hidl\">\n"
2612 " <name>android.hardware.foo</name>\n"
2613 " <transport>hwbinder</transport>\n"
2614 " <version>1.3</version>\n"
2615 " <version>2.4</version>\n"
2616 " <interface>\n"
2617 " <name>IFoo</name>\n"
2618 " <instance>slot1</instance>\n"
2619 " </interface>\n"
2620 " </hal>\n"
2621 " <hal format=\"hidl\">\n"
2622 " <name>android.hardware.foo</name>\n"
2623 " <transport>hwbinder</transport>\n"
2624 " <version>3.1</version>\n"
2625 " <version>4.3</version>\n"
2626 " <interface>\n"
2627 " <name>IBar</name>\n"
2628 " <instance>slot2</instance>\n"
2629 " </interface>\n"
2630 " </hal>\n"
2631 " <hal format=\"hidl\">\n"
2632 " <name>android.hardware.bar</name>\n"
2633 " <transport>hwbinder</transport>\n"
2634 " <version>1.3</version>\n"
2635 " </hal>\n"
2636 "</manifest>\n";
2637 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2638
2639 HalManifest newManifest;
2640 xml =
2641 "<manifest version=\"1.0\" type=\"device\">\n"
2642 " <hal format=\"hidl\" override=\"true\">\n"
2643 " <name>android.hardware.foo</name>\n"
2644 " <transport>hwbinder</transport>\n"
2645 " </hal>\n"
2646 "</manifest>\n";
2647 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2648
2649 manifest.addAllHals(&newManifest);
2650 EXPECT_EQ(
2651 "<manifest version=\"1.0\" type=\"device\">\n"
2652 " <hal format=\"hidl\">\n"
2653 " <name>android.hardware.bar</name>\n"
2654 " <transport>hwbinder</transport>\n"
2655 " <version>1.3</version>\n"
2656 " </hal>\n"
2657 " <hal format=\"hidl\" override=\"true\">\n"
2658 " <name>android.hardware.foo</name>\n"
2659 " <transport>hwbinder</transport>\n"
2660 " </hal>\n"
2661 "</manifest>\n",
2662 gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
2663}
2664
Yifan Honga28729e2018-01-17 13:40:35 -08002665// Make sure missing tags in old VINTF files does not cause incompatibilities.
2666TEST_F(LibVintfTest, Empty) {
2667 CompatibilityMatrix cm;
2668 HalManifest manifest;
2669 std::string xml;
2670 std::string error;
2671
2672 xml = "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n";
2673 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2674 << gCompatibilityMatrixConverter.lastError();
2675
2676 xml = "<manifest version=\"1.0\" type=\"framework\"/>\n";
2677 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2678
2679 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2680}
2681
2682TEST_F(LibVintfTest, SystemSdk) {
2683 CompatibilityMatrix cm;
2684 std::string xml;
2685 std::string error;
2686
2687 xml =
2688 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
2689 " <system-sdk>\n"
2690 " <version>1</version>\n"
2691 " <version>P</version>\n"
2692 " </system-sdk>\n"
2693 "</compatibility-matrix>\n";
2694 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2695 << gCompatibilityMatrixConverter.lastError();
2696 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm, ~SerializeFlag::NO_SSDK));
2697
2698 {
2699 HalManifest manifest;
2700 xml =
2701 "<manifest version=\"1.0\" type=\"framework\">\n"
2702 " <system-sdk>\n"
2703 " <version>1</version>\n"
2704 " <version>P</version>\n"
2705 " </system-sdk>\n"
2706 "</manifest>\n";
2707 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2708 EXPECT_EQ(xml, gHalManifestConverter(manifest, ~SerializeFlag::NO_SSDK));
2709
2710 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2711 }
2712
2713 {
2714 HalManifest manifest;
2715 xml =
2716 "<manifest version=\"1.0\" type=\"framework\">\n"
2717 " <system-sdk>\n"
2718 " <version>1</version>\n"
2719 " <version>3</version>\n"
2720 " <version>P</version>\n"
2721 " </system-sdk>\n"
2722 "</manifest>\n";
2723 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2724 EXPECT_TRUE(manifest.checkCompatibility(cm, &error));
2725 }
2726
2727 {
2728 HalManifest manifest;
2729 xml =
2730 "<manifest version=\"1.0\" type=\"framework\">\n"
2731 " <system-sdk>\n"
2732 " <version>1</version>\n"
2733 " </system-sdk>\n"
2734 "</manifest>\n";
2735 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2736 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2737 EXPECT_TRUE(error.find("System SDK") != std::string::npos) << error;
2738 }
2739}
2740
Yifan Honga9993572017-01-24 19:33:15 -08002741} // namespace vintf
2742} // namespace android
2743
Yifan Hong676447a2016-11-15 12:57:23 -08002744int main(int argc, char **argv) {
2745 ::testing::InitGoogleTest(&argc, argv);
2746 return RUN_ALL_TESTS();
2747}