blob: 2001f0cbb82389455b89c1decb0633226030d7f2 [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
Yifan Hongd2b7e642017-02-17 10:15:32 -0800235TEST_F(LibVintfTest, HalManifestConverter) {
Yifan Honga04e1472017-04-05 13:15:34 -0700236 HalManifest vm = testDeviceManifest();
Yifan Hongd2b7e642017-02-17 10:15:32 -0800237 std::string xml = gHalManifestConverter(vm);
Yifan Hong676447a2016-11-15 12:57:23 -0800238 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700239 "<manifest version=\"1.0\" type=\"device\">\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800240 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800241 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800242 " <transport>hwbinder</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800243 " <version>2.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800244 " <interface>\n"
245 " <name>IBetterCamera</name>\n"
246 " <instance>camera</instance>\n"
247 " </interface>\n"
248 " <interface>\n"
249 " <name>ICamera</name>\n"
250 " <instance>default</instance>\n"
251 " <instance>legacy/0</instance>\n"
252 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800253 " </hal>\n"
254 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800255 " <name>android.hardware.nfc</name>\n"
Yifan Hongc54d32c2017-03-07 19:12:26 -0800256 " <transport arch=\"32+64\">passthrough</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800257 " <version>1.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800258 " <interface>\n"
259 " <name>INfc</name>\n"
260 " <instance>default</instance>\n"
261 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800262 " </hal>\n"
Yifan Hong2a3dd082017-04-04 17:15:35 -0700263 " <sepolicy>\n"
264 " <version>25.0</version>\n"
265 " </sepolicy>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800266 "</manifest>\n");
Yifan Hongfb7469c2017-04-05 19:15:21 -0700267 HalManifest vm2;
268 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
269 EXPECT_EQ(vm, vm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800270}
271
Yifan Honga04e1472017-04-05 13:15:34 -0700272TEST_F(LibVintfTest, HalManifestConverterFramework) {
273 HalManifest vm = testFrameworkManfiest();
274 std::string xml = gHalManifestConverter(vm);
275 EXPECT_EQ(xml,
276 "<manifest version=\"1.0\" type=\"framework\">\n"
277 " <hal format=\"hidl\">\n"
278 " <name>android.hidl.manager</name>\n"
279 " <transport>hwbinder</transport>\n"
280 " <version>1.0</version>\n"
281 " <interface>\n"
282 " <name>IServiceManager</name>\n"
283 " <instance>default</instance>\n"
284 " </interface>\n"
285 " </hal>\n"
286 " <vndk>\n"
287 " <version>25.0.5</version>\n"
288 " <library>libbase.so</library>\n"
289 " <library>libjpeg.so</library>\n"
290 " </vndk>\n"
291 " <vndk>\n"
292 " <version>25.1.3</version>\n"
293 " <library>libbase.so</library>\n"
294 " <library>libjpeg.so</library>\n"
295 " <library>libtinyxml2.so</library>\n"
296 " </vndk>\n"
297 "</manifest>\n");
298 HalManifest vm2;
299 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700300 EXPECT_EQ(vm, vm2);
Yifan Honga04e1472017-04-05 13:15:34 -0700301}
302
Yifan Hong8e9c6692017-02-28 14:07:42 -0800303TEST_F(LibVintfTest, HalManifestOptional) {
304 HalManifest vm;
305 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700306 "<manifest version=\"1.0\" type=\"device\"></manifest>"));
Yifan Hong8e9c6692017-02-28 14:07:42 -0800307 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700308 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800309 " <hal>"
310 " <name>android.hidl.manager</name>"
311 " <transport>hwbinder</transport>"
312 " <version>1.0</version>"
313 " </hal>"
314 "</manifest>"));
315 EXPECT_FALSE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700316 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800317 " <hal>"
318 " <name>android.hidl.manager</name>"
319 " <version>1.0</version>"
320 " </hal>"
321 "</manifest>"));
322}
323
Yifan Honge0bb98d2017-08-07 14:40:19 -0700324TEST_F(LibVintfTest, HalManifestNative) {
325 HalManifest vm;
326 EXPECT_TRUE(gHalManifestConverter(&vm,
327 "<manifest version=\"1.0\" type=\"device\">"
328 " <hal format=\"native\">"
329 " <name>foo</name>"
330 " <version>1.0</version>"
331 " </hal>"
332 "</manifest>"))
333 << gHalManifestConverter.lastError();
334 EXPECT_FALSE(gHalManifestConverter(&vm,
335 "<manifest version=\"1.0\" type=\"device\">"
336 " <hal format=\"native\">"
337 " <name>foo</name>"
338 " <version>1.0</version>"
339 " <transport>hwbinder</transport>"
340 " </hal>"
341 "</manifest>"));
342 EXPECT_TRUE(gHalManifestConverter.lastError().find(
343 "Native HAL 'foo' should not have <transport> defined") != std::string::npos);
344}
345
Yifan Hong79dcc1f2017-05-22 14:35:19 -0700346TEST_F(LibVintfTest, HalManifestDuplicate) {
347 HalManifest vm;
348 EXPECT_FALSE(gHalManifestConverter(&vm,
349 "<manifest version=\"1.0\" type=\"device\">"
350 " <hal>"
351 " <name>android.hidl.manager</name>"
352 " <transport>hwbinder</transport>"
353 " <version>1.0</version>"
354 " <version>1.1</version>"
355 " </hal>"
356 "</manifest>"))
357 << "Should not allow duplicated major version in <hal>";
358 EXPECT_FALSE(gHalManifestConverter(&vm,
359 "<manifest version=\"1.0\" type=\"device\">"
360 " <hal>"
361 " <name>android.hidl.manager</name>"
362 " <transport>hwbinder</transport>"
363 " <version>1.0</version>"
364 " </hal>"
365 " <hal>"
366 " <name>android.hidl.manager</name>"
367 " <transport arch=\"32+64\">passthrough</transport>"
368 " <version>1.1</version>"
369 " </hal>"
370 "</manifest>"))
371 << "Should not allow duplicated major version across <hal>";
372}
373
374TEST_F(LibVintfTest, HalManifestGetTransport) {
375 HalManifest vm;
376 EXPECT_TRUE(gHalManifestConverter(&vm,
377 "<manifest version=\"1.0\" type=\"device\">"
378 " <hal>"
379 " <name>android.hidl.manager</name>"
380 " <transport>hwbinder</transport>"
381 " <version>1.0</version>"
382 " <interface>"
383 " <name>IServiceManager</name>"
384 " <instance>default</instance>"
385 " </interface>"
386 " </hal>"
387 " <hal>"
388 " <name>android.hidl.manager</name>"
389 " <transport arch=\"32+64\">passthrough</transport>"
390 " <version>2.1</version>"
391 " <interface>"
392 " <name>IServiceManager</name>"
393 " <instance>default</instance>"
394 " </interface>"
395 " </hal>"
396 "</manifest>"));
397 EXPECT_EQ(Transport::PASSTHROUGH,
398 vm.getTransport("android.hidl.manager", {2, 1}, "IServiceManager", "default"));
399 EXPECT_EQ(Transport::PASSTHROUGH,
400 vm.getTransport("android.hidl.manager", {2, 0}, "IServiceManager", "default"));
401 EXPECT_EQ(Transport::EMPTY,
402 vm.getTransport("android.hidl.manager", {2, 2}, "IServiceManager", "default"));
403 EXPECT_EQ(Transport::HWBINDER,
404 vm.getTransport("android.hidl.manager", {1, 0}, "IServiceManager", "default"));
405}
406
Yifan Hongec3b9b72017-02-23 13:24:42 -0800407TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700408 HalManifest vm = testDeviceManifest();
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700409 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "ICamera"),
410 std::set<std::string>({"default", "legacy/0"}));
411 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "IBetterCamera"),
412 std::set<std::string>({"camera"}));
413 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "INotExist"),
414 std::set<std::string>({}));
415 EXPECT_EQ(vm.getInstances("android.hardware.nfc", {1, 0}, "INfc"),
416 std::set<std::string>({"default"}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800417
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700418 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "default"));
419 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "legacy/0"));
420 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "camera"));
421 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", {1, 0}, "INfc", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800422
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700423 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "INotExist", "default"));
424 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "notexist"));
425 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "default"));
426 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "INotExist", "notexist"));
427 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", {1, 0}, "INfc", "notexist"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800428}
429
Yifan Hong676447a2016-11-15 12:57:23 -0800430TEST_F(LibVintfTest, VersionConverter) {
431 Version v(3, 6);
432 std::string xml = gVersionConverter(v);
433 EXPECT_EQ(xml, "<version>3.6</version>\n");
434 Version v2;
435 EXPECT_TRUE(gVersionConverter(&v2, xml));
436 EXPECT_EQ(v, v2);
437}
438
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700439static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
440 std::string name{intf.name};
441 return map->emplace(std::move(name), std::move(intf)).second;
442}
443
Yifan Hong676447a2016-11-15 12:57:23 -0800444TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800445 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800446 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700447 false /* optional */, {}};
448 EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
449 EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800450 std::string xml = gMatrixHalConverter(mh);
451 EXPECT_EQ(xml,
452 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800453 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800454 " <version>1.2-3</version>\n"
455 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700456 " <interface>\n"
457 " <name>IBetterCamera</name>\n"
458 " <instance>default</instance>\n"
459 " <instance>great</instance>\n"
460 " </interface>\n"
461 " <interface>\n"
462 " <name>ICamera</name>\n"
463 " <instance>default</instance>\n"
464 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800465 "</hal>\n");
466 MatrixHal mh2;
467 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
468 EXPECT_EQ(mh, mh2);
469}
470
Yifan Hong3f5489a2017-02-08 11:14:21 -0800471TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
472
473 KernelConfigTypedValue converted;
474
475 auto testOne = [] (const KernelConfigTypedValue &original,
476 const std::string &expectXml) {
477 std::string xml;
478 KernelConfigTypedValue converted;
479 xml = gKernelConfigTypedValueConverter(original);
480 EXPECT_EQ(xml, expectXml);
481 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
482 EXPECT_EQ(original, converted);
483 };
484
485 auto testParse = [] (const KernelConfigTypedValue &original,
486 const std::string &xml) {
487 KernelConfigTypedValue converted;
488 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
489 EXPECT_EQ(original, converted);
490 };
491
492 testOne(KernelConfigTypedValue("stringvalue"),
493 "<value type=\"string\">stringvalue</value>\n");
494 testOne(KernelConfigTypedValue(""),
495 "<value type=\"string\"></value>\n");
496
497 testOne(KernelConfigTypedValue(Tristate::YES),
498 "<value type=\"tristate\">y</value>\n");
499 testOne(KernelConfigTypedValue(Tristate::NO),
500 "<value type=\"tristate\">n</value>\n");
501 testOne(KernelConfigTypedValue(Tristate::MODULE),
502 "<value type=\"tristate\">m</value>\n");
503 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
504 "<value type=\"tristate\">q</value>\n"));
505
506 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
507 "<value type=\"range\">4-20</value>\n");
508 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
509 "<value type=\"range\">0-18446744073709551615</value>\n");
510 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
511 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
512
513 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
514 "<value type=\"int\">-18446744073709551616</value>\n"));
515
516 testOne(KernelConfigTypedValue(INT64_MIN),
517 "<value type=\"int\">-9223372036854775808</value>\n");
518 testParse(KernelConfigTypedValue(INT64_MIN),
519 "<value type=\"int\">0x8000000000000000</value>\n");
520 testParse(KernelConfigTypedValue(INT64_MIN),
521 "<value type=\"int\">-0X8000000000000000</value>\n");
522
523 testParse(KernelConfigTypedValue(INT64_MIN + 1),
524 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
525
526 testParse(KernelConfigTypedValue(-0x50),
527 "<value type=\"int\">-0x50</value>\n");
528
529 testOne(KernelConfigTypedValue(0),
530 "<value type=\"int\">0</value>\n");
531
532 // Truncation for underflow.
533 testParse(KernelConfigTypedValue(1),
534 "<value type=\"int\">-0xffffffffffffffff</value>\n");
535 testParse(KernelConfigTypedValue(1),
536 "<value type=\"int\">-18446744073709551615</value>\n");
537
538 testOne(KernelConfigTypedValue(INT64_MAX),
539 "<value type=\"int\">9223372036854775807</value>\n");
540 testParse(KernelConfigTypedValue(INT64_MAX),
541 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
542 // Truncation for underflow.
543 testParse(KernelConfigTypedValue(INT64_MAX),
544 "<value type=\"int\">-9223372036854775809</value>\n");
545
546 testParse(KernelConfigTypedValue(-1),
547 "<value type=\"int\">18446744073709551615</value>\n");
548 testParse(KernelConfigTypedValue(-1),
549 "<value type=\"int\">0xffffffffffffffff</value>\n");
550
551 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
552 "<value type=\"int\">18446744073709551616</value>\n"));
553}
554
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700555TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
Yifan Hong676447a2016-11-15 12:57:23 -0800556 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800557 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800558 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700559 false /* optional */, testHalInterfaces()}));
Yifan Honga9993572017-01-24 19:33:15 -0800560 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800561 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700562 true /* optional */, testHalInterfaces()}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800563 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
564 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
565 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
566 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700567 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700568 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800569 std::string xml = gCompatibilityMatrixConverter(cm);
570 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700571 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800572 " <hal format=\"native\" optional=\"false\">\n"
573 " <name>android.hardware.camera</name>\n"
574 " <version>1.2-3</version>\n"
575 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700576 " <interface>\n"
577 " <name>IFoo</name>\n"
578 " <instance>default</instance>\n"
579 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800580 " </hal>\n"
581 " <hal format=\"native\" optional=\"true\">\n"
582 " <name>android.hardware.nfc</name>\n"
583 " <version>4.5-6</version>\n"
584 " <version>10.11-12</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700585 " <interface>\n"
586 " <name>IFoo</name>\n"
587 " <instance>default</instance>\n"
588 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800589 " </hal>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800590 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800591 " <config>\n"
592 " <key>CONFIG_FOO</key>\n"
593 " <value type=\"tristate\">y</value>\n"
594 " </config>\n"
595 " <config>\n"
596 " <key>CONFIG_BAR</key>\n"
597 " <value type=\"string\">stringvalue</value>\n"
598 " </config>\n"
599 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800600 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800601 " <config>\n"
602 " <key>CONFIG_BAZ</key>\n"
603 " <value type=\"int\">20</value>\n"
604 " </config>\n"
605 " <config>\n"
606 " <key>CONFIG_BAR</key>\n"
607 " <value type=\"range\">3-5</value>\n"
608 " </config>\n"
609 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800610 " <sepolicy>\n"
611 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700612 " <sepolicy-version>25.0</sepolicy-version>\n"
613 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800614 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700615 " <avb>\n"
616 " <vbmeta-version>2.1</vbmeta-version>\n"
617 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800618 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800619 CompatibilityMatrix cm2;
620 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700621 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800622}
623
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700624TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
625 CompatibilityMatrix cm;
626 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
627 {{VersionRange(1,0)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700628 false /* optional */, testHalInterfaces()}));
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700629 set(cm, SchemaType::DEVICE);
630 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
631 std::string xml = gCompatibilityMatrixConverter(cm);
632 EXPECT_EQ(xml,
633 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
634 " <hal format=\"native\" optional=\"false\">\n"
635 " <name>android.hidl.manager</name>\n"
636 " <version>1.0</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700637 " <interface>\n"
638 " <name>IFoo</name>\n"
639 " <instance>default</instance>\n"
640 " </interface>\n"
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700641 " </hal>\n"
642 " <vndk>\n"
643 " <version>25.0.1-5</version>\n"
644 " <library>libbase.so</library>\n"
645 " <library>libjpeg.so</library>\n"
646 " </vndk>\n"
647 "</compatibility-matrix>\n");
648 CompatibilityMatrix cm2;
649 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
650 EXPECT_EQ(cm, cm2);
651}
652
Yifan Hong676447a2016-11-15 12:57:23 -0800653TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800654 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800655
Yifan Hong2059ffc2017-02-24 11:32:02 -0800656 ManifestHal invalidHal{
657 .format = HalFormat::HIDL,
658 .name = "android.hardware.camera",
659 .versions = {{Version(2, 0), Version(2, 1)}},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800660 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64}
Yifan Hong2059ffc2017-02-24 11:32:02 -0800661 };
662
Yifan Hong5a06ef72017-01-24 19:54:24 -0800663 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800664 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800665 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800666}
667
Tri Vod0143942017-03-24 17:51:23 -0700668TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700669 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700670 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
671 {"android.hardware.camera", "android.hardware.nfc"}));
672}
673
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700674TEST_F(LibVintfTest, HalManifestGetAllHals) {
Yifan Honga04e1472017-04-05 13:15:34 -0700675 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700676 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
677 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800678
679 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
680 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800681 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800682 EXPECT_EQ(hal.name, arr[i++]);
683 }
684}
685
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700686TEST_F(LibVintfTest, HalManifestGetHals) {
687 HalManifest vm;
688 EXPECT_TRUE(
689 add(vm, ManifestHal{.format = HalFormat::HIDL,
690 .name = "android.hardware.camera",
691 .versions = {Version(1, 2)},
692 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
693 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
694 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}}));
695 EXPECT_TRUE(
696 add(vm, ManifestHal{.format = HalFormat::HIDL,
697 .name = "android.hardware.camera",
698 .versions = {Version(2, 0)},
699 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
700 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
701 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}}));
702 EXPECT_TRUE(add(vm, ManifestHal{.format = HalFormat::HIDL,
703 .name = "android.hardware.nfc",
704 .versions = {Version(1, 0), Version(2, 1)},
705 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
706 .interfaces = {{"INfc", {"INfc", {"default"}}}}}));
707 ManifestHal expectedCameraHalV1_2 =
708 ManifestHal{.format = HalFormat::HIDL,
709 .name = "android.hardware.camera",
710 .versions = {Version(1, 2)},
711 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
712 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
713 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}};
714 ManifestHal expectedCameraHalV2_0 =
715 ManifestHal{.format = HalFormat::HIDL,
716 .name = "android.hardware.camera",
717 .versions = {Version(2, 0)},
718 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
719 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
720 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}};
721 ManifestHal expectedNfcHal =
722 ManifestHal{.format = HalFormat::HIDL,
723 .name = "android.hardware.nfc",
724 .versions = {Version(1, 0), Version(2, 1)},
725 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
726 .interfaces = {{"INfc", {"INfc", {"default"}}}}};
727 auto cameraHals = vm.getHals("android.hardware.camera");
728 EXPECT_EQ((int)cameraHals.size(), 2);
729 EXPECT_EQ(*cameraHals[0], expectedCameraHalV1_2);
730 EXPECT_EQ(*cameraHals[1], expectedCameraHalV2_0);
731 auto nfcHals = vm.getHals("android.hardware.nfc");
732 EXPECT_EQ((int)nfcHals.size(), 1);
733 EXPECT_EQ(*nfcHals[0], expectedNfcHal);
734
735 EXPECT_EQ(*vm.getHal("android.hardware.camera", {1, 1}), expectedCameraHalV1_2);
736 EXPECT_EQ(*vm.getHal("android.hardware.camera", {2, 0}), expectedCameraHalV2_0);
737 EXPECT_EQ(*vm.getHal("android.hardware.nfc", {1, 0}), expectedNfcHal);
738 EXPECT_EQ(*vm.getHal("android.hardware.nfc", {2, 0}), expectedNfcHal);
739 EXPECT_EQ(*vm.getHal("android.hardware.nfc", {2, 1}), expectedNfcHal);
740
741 EXPECT_EQ(vm.getHal("non-existent", {1, 0}), nullptr);
742 EXPECT_EQ(vm.getHal("android.hardware.camera", {2, 1}), nullptr);
743 EXPECT_EQ(vm.getHal("android.hardware.camera", {1, 3}), nullptr);
744 EXPECT_EQ(vm.getHal("android.hardware.nfc", {1, 1}), nullptr);
745 EXPECT_EQ(vm.getHal("android.hardware.nfc", {3, 0}), nullptr);
746}
747
748TEST_F(LibVintfTest, CompatibilityMatrixGetHals) {
749 CompatibilityMatrix cm;
750 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
751 "android.hardware.camera",
752 {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
753 false /* optional */,
754 testHalInterfaces()}));
755 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
756 "android.hardware.nfc",
757 {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
758 true /* optional */,
759 testHalInterfaces()}));
760
761 MatrixHal expectedCameraHal = MatrixHal{
762 HalFormat::NATIVE,
763 "android.hardware.camera",
764 {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
765 false /* optional */,
766 testHalInterfaces(),
767 };
768 MatrixHal expectedNfcHal = MatrixHal{HalFormat::NATIVE,
769 "android.hardware.nfc",
770 {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
771 true /* optional */,
772 testHalInterfaces()};
773 auto cameraHals = cm.getHals("android.hardware.camera");
774 EXPECT_EQ((int)cameraHals.size(), 1);
775 EXPECT_EQ(*cameraHals[0], expectedCameraHal);
776 auto nfcHals = cm.getHals("android.hardware.nfc");
777 EXPECT_EQ((int)nfcHals.size(), 1);
778 EXPECT_EQ(*nfcHals[0], expectedNfcHal);
779
780 EXPECT_EQ(*cm.getHal("android.hardware.camera", {1, 2}), expectedCameraHal);
781 EXPECT_EQ(*cm.getHal("android.hardware.camera", {1, 3}), expectedCameraHal);
782 EXPECT_EQ(*cm.getHal("android.hardware.camera", {4, 5}), expectedCameraHal);
783 EXPECT_EQ(*cm.getHal("android.hardware.nfc", {4, 5}), expectedNfcHal);
784 EXPECT_EQ(*cm.getHal("android.hardware.nfc", {10, 12}), expectedNfcHal);
785
786 EXPECT_EQ(cm.getHal("non-existent", {1, 0}), nullptr);
787 EXPECT_EQ(cm.getHal("android.hardware.camera", {2, 1}), nullptr);
788 EXPECT_EQ(cm.getHal("android.hardware.camera", {1, 0}), nullptr);
789 EXPECT_EQ(cm.getHal("android.hardware.nfc", {3, 0}), nullptr);
790 EXPECT_EQ(cm.getHal("android.hardware.nfc", {4, 7}), nullptr);
791}
792
Yifan Honga7201e72017-02-17 10:09:59 -0800793TEST_F(LibVintfTest, RuntimeInfo) {
794 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800795 using KernelConfigs = std::vector<KernelConfig>;
796 const KernelConfigs configs {
797 KernelConfig{"CONFIG_64BIT", Tristate::YES},
798 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
799 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
800 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
801 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
802 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
803 };
804
805 auto testMatrix = [&] (MatrixKernel &&kernel) {
806 CompatibilityMatrix cm;
807 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700808 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700809 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800810 return cm;
811 };
812
813 std::string error;
814
815 {
816 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
817 CompatibilityMatrix cm = testMatrix(std::move(kernel));
818 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
819 }
820
821 {
Yifan Hong5f996502017-08-23 14:46:44 -0700822 MatrixKernel kernel(KernelVersion{3, 18, 60}, KernelConfigs(configs));
823 CompatibilityMatrix cm = testMatrix(std::move(kernel));
824 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
825 }
826
827 {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800828 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
829 CompatibilityMatrix cm = testMatrix(std::move(kernel));
830 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
831 }
832
833 {
834 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
835 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700836 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800837 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
838 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700839 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800840 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
841 << "kernel-sepolicy-version shouldn't match";
842 }
843
844 {
845 KernelConfigs newConfigs(configs);
846 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
847 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
848 CompatibilityMatrix cm = testMatrix(std::move(kernel));
849 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
850 }
851
852 {
853 KernelConfigs newConfigs(configs);
854 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
855 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
856 CompatibilityMatrix cm = testMatrix(std::move(kernel));
857 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
858 }
859
860 {
861 KernelConfigs newConfigs(configs);
862 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
863 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
864 CompatibilityMatrix cm = testMatrix(std::move(kernel));
865 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
866 }
867
868 {
869 KernelConfigs newConfigs(configs);
870 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
871 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
872 CompatibilityMatrix cm = testMatrix(std::move(kernel));
873 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
874 }
875
876 {
877 KernelConfigs newConfigs(configs);
878 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
879 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
880 CompatibilityMatrix cm = testMatrix(std::move(kernel));
881 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
882 }
Yifan Hongdb6423e2017-09-11 14:38:46 -0700883
Yifan Hongf3029302017-04-12 17:23:49 -0700884 RuntimeInfo badAvb = testRuntimeInfo();
885 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
886 {
887 setAvb(badAvb, {1, 0}, {2, 1});
888 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
Michael Schwartz5cfbc922017-05-08 14:06:49 -0700889 EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
Yifan Hongf3029302017-04-12 17:23:49 -0700890 }
891 {
892 setAvb(badAvb, {2, 1}, {3, 0});
893 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
894 }
895 {
896 setAvb(badAvb, {2, 1}, {2, 3});
897 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
898 }
899 {
900 setAvb(badAvb, {2, 3}, {2, 1});
901 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
902 }
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800903}
904
Yifan Hong19e0a2a2017-04-14 17:30:53 -0700905TEST_F(LibVintfTest, MissingAvb) {
906 std::string xml =
907 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
908 " <kernel version=\"3.18.31\"></kernel>"
909 " <sepolicy>\n"
910 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
911 " <sepolicy-version>25.5</sepolicy-version>\n"
912 " </sepolicy>\n"
913 "</compatibility-matrix>\n";
914 CompatibilityMatrix cm;
915 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
916 EXPECT_EQ(getAvb(cm), Version(0, 0));
917}
918
Yifan Hongdb6423e2017-09-11 14:38:46 -0700919TEST_F(LibVintfTest, DisableAvb) {
920 std::string xml =
921 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
922 " <kernel version=\"3.18.31\"></kernel>"
923 " <sepolicy>\n"
924 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
925 " <sepolicy-version>25.5</sepolicy-version>\n"
926 " </sepolicy>\n"
927 " <avb>\n"
928 " <vbmeta-version>1.0</vbmeta-version>\n"
929 " </avb>\n"
930 "</compatibility-matrix>\n";
931 CompatibilityMatrix cm;
932 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
933 RuntimeInfo ki = testRuntimeInfo();
934 std::string error;
935 EXPECT_FALSE(ki.checkCompatibility(cm, &error));
936 EXPECT_STREQ(error.c_str(), "AVB version 2.1 does not match framework matrix 1.0");
937 EXPECT_TRUE(ki.checkCompatibility(cm, &error, DISABLE_AVB_CHECK)) << error;
938}
939
Yifan Hong08e984c2017-05-18 12:50:04 -0700940// This is the test extracted from VINTF Object doc
941TEST_F(LibVintfTest, HalCompat) {
942 CompatibilityMatrix matrix;
943 std::string error;
944
945 std::string matrixXml =
946 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
947 " <hal format=\"hidl\" optional=\"false\">\n"
948 " <name>android.hardware.foo</name>\n"
949 " <version>1.0</version>\n"
950 " <version>3.1-2</version>\n"
951 " <interface>\n"
952 " <name>IFoo</name>\n"
953 " <instance>default</instance>\n"
954 " <instance>specific</instance>\n"
955 " </interface>\n"
956 " </hal>\n"
957 " <hal format=\"hidl\" optional=\"false\">\n"
958 " <name>android.hardware.foo</name>\n"
959 " <version>2.0</version>\n"
960 " <interface>\n"
961 " <name>IBar</name>\n"
962 " <instance>default</instance>\n"
963 " </interface>\n"
964 " </hal>\n"
965 " <sepolicy>\n"
966 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
967 " <sepolicy-version>25.5</sepolicy-version>\n"
968 " </sepolicy>\n"
969 "</compatibility-matrix>\n";
970 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
971 << gCompatibilityMatrixConverter.lastError();
972
973 {
974 std::string manifestXml =
975 "<manifest version=\"1.0\" type=\"device\">\n"
976 " <hal format=\"hidl\">\n"
977 " <name>android.hardware.foo</name>\n"
978 " <transport>hwbinder</transport>\n"
979 " <version>1.0</version>\n"
980 " <interface>\n"
981 " <name>IFoo</name>\n"
982 " <instance>default</instance>\n"
983 " <instance>specific</instance>\n"
984 " </interface>\n"
985 " </hal>\n"
986 " <hal format=\"hidl\">\n"
987 " <name>android.hardware.foo</name>\n"
988 " <transport>hwbinder</transport>\n"
989 " <version>2.0</version>\n"
990 " <interface>\n"
991 " <name>IBar</name>\n"
992 " <instance>default</instance>\n"
993 " </interface>\n"
994 " </hal>\n"
995 " <sepolicy>\n"
996 " <version>25.5</version>\n"
997 " </sepolicy>\n"
998 "</manifest>\n";
999
1000 HalManifest manifest;
1001 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1002 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1003 }
1004
1005 {
1006 std::string manifestXml =
1007 "<manifest version=\"1.0\" type=\"device\">\n"
1008 " <hal format=\"hidl\">\n"
1009 " <name>android.hardware.foo</name>\n"
1010 " <transport>hwbinder</transport>\n"
1011 " <version>1.0</version>\n"
1012 " <interface>\n"
1013 " <name>IFoo</name>\n"
1014 " <instance>default</instance>\n"
1015 " <instance>specific</instance>\n"
1016 " </interface>\n"
1017 " </hal>\n"
1018 " <sepolicy>\n"
1019 " <version>25.5</version>\n"
1020 " </sepolicy>\n"
1021 "</manifest>\n";
1022 HalManifest manifest;
1023 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1024 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1025 << "should not be compatible because IBar is missing";
1026 }
1027
1028 {
1029 std::string manifestXml =
1030 "<manifest version=\"1.0\" type=\"device\">\n"
1031 " <hal format=\"hidl\">\n"
1032 " <name>android.hardware.foo</name>\n"
1033 " <transport>hwbinder</transport>\n"
1034 " <version>1.0</version>\n"
1035 " <interface>\n"
1036 " <name>IFoo</name>\n"
1037 " <instance>default</instance>\n"
1038 " </interface>\n"
1039 " </hal>\n"
1040 " <hal format=\"hidl\">\n"
1041 " <name>android.hardware.foo</name>\n"
1042 " <transport>hwbinder</transport>\n"
1043 " <version>2.0</version>\n"
1044 " <interface>\n"
1045 " <name>IBar</name>\n"
1046 " <instance>default</instance>\n"
1047 " </interface>\n"
1048 " </hal>\n"
1049 " <sepolicy>\n"
1050 " <version>25.5</version>\n"
1051 " </sepolicy>\n"
1052 "</manifest>\n";
1053 HalManifest manifest;
1054 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1055 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1056 << "should not be compatible because IFoo/default is missing";
1057 }
1058
1059 {
1060 std::string manifestXml =
1061 "<manifest version=\"1.0\" type=\"device\">\n"
1062 " <hal format=\"hidl\">\n"
1063 " <name>android.hardware.foo</name>\n"
1064 " <transport>hwbinder</transport>\n"
1065 " <version>3.3</version>\n"
1066 " <interface>\n"
1067 " <name>IFoo</name>\n"
1068 " <instance>default</instance>\n"
1069 " <instance>specific</instance>\n"
1070 " </interface>\n"
1071 " </hal>\n"
1072 " <hal format=\"hidl\">\n"
1073 " <name>android.hardware.foo</name>\n"
1074 " <transport>hwbinder</transport>\n"
1075 " <version>2.0</version>\n"
1076 " <interface>\n"
1077 " <name>IBar</name>\n"
1078 " <instance>default</instance>\n"
1079 " </interface>\n"
1080 " </hal>\n"
1081 " <sepolicy>\n"
1082 " <version>25.5</version>\n"
1083 " </sepolicy>\n"
1084 "</manifest>\n";
1085 HalManifest manifest;
1086 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1087 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1088 }
1089
1090 {
1091 std::string manifestXml =
1092 "<manifest version=\"1.0\" type=\"device\">\n"
1093 " <hal format=\"hidl\">\n"
1094 " <name>android.hardware.foo</name>\n"
1095 " <transport>hwbinder</transport>\n"
1096 " <version>1.0</version>\n"
1097 " <interface>\n"
1098 " <name>IFoo</name>\n"
1099 " <instance>default</instance>\n"
1100 " </interface>\n"
1101 " </hal>\n"
1102 " <hal format=\"hidl\">\n"
1103 " <name>android.hardware.foo</name>\n"
1104 " <transport>hwbinder</transport>\n"
1105 " <version>3.2</version>\n"
1106 " <interface>\n"
1107 " <name>IFoo</name>\n"
1108 " <instance>specific</instance>\n"
1109 " </interface>\n"
1110 " </hal>\n"
1111 " <hal format=\"hidl\">\n"
1112 " <name>android.hardware.foo</name>\n"
1113 " <transport>hwbinder</transport>\n"
1114 " <version>2.0</version>\n"
1115 " <interface>\n"
1116 " <name>IBar</name>\n"
1117 " <instance>default</instance>\n"
1118 " </interface>\n"
1119 " </hal>\n"
1120 " <sepolicy>\n"
1121 " <version>25.5</version>\n"
1122 " </sepolicy>\n"
1123 "</manifest>\n";
1124 HalManifest manifest;
1125 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1126 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1127 << "should not be compatible even though @1.0::IFoo/default "
1128 << "and @3.2::IFoo/specific present";
1129 }
1130
1131 {
1132 std::string manifestXml =
1133 "<manifest version=\"1.0\" type=\"device\">\n"
1134 " <hal format=\"hidl\">\n"
1135 " <name>android.hardware.foo</name>\n"
1136 " <transport>hwbinder</transport>\n"
1137 " <version>1.0</version>\n"
1138 " <interface>\n"
1139 " <name>IFoo</name>\n"
1140 " <instance>default</instance>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001141 " <instance>specific</instance>\n"
1142 " </interface>\n"
1143 " </hal>\n"
1144 " <hal format=\"hidl\">\n"
1145 " <name>android.hardware.foo</name>\n"
1146 " <transport>hwbinder</transport>\n"
1147 " <version>2.0</version>\n"
1148 " <interface>\n"
1149 " <name>IBar</name>\n"
1150 " <instance>default</instance>\n"
1151 " </interface>\n"
1152 " </hal>\n"
1153 " <sepolicy>\n"
1154 " <version>25.5</version>\n"
1155 " </sepolicy>\n"
1156 "</manifest>\n";
1157 HalManifest manifest;
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001158 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml))
1159 << gHalManifestConverter.lastError();
1160 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
Yifan Hong08e984c2017-05-18 12:50:04 -07001161 }
1162}
1163
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001164TEST_F(LibVintfTest, Compat) {
1165 std::string manifestXml =
1166 "<manifest version=\"1.0\" type=\"device\">\n"
1167 " <hal format=\"hidl\">\n"
1168 " <name>android.hardware.camera</name>\n"
1169 " <transport>hwbinder</transport>\n"
1170 " <version>3.5</version>\n"
1171 " <interface>\n"
1172 " <name>IBetterCamera</name>\n"
1173 " <instance>camera</instance>\n"
1174 " </interface>\n"
1175 " <interface>\n"
1176 " <name>ICamera</name>\n"
1177 " <instance>default</instance>\n"
1178 " <instance>legacy/0</instance>\n"
1179 " </interface>\n"
1180 " </hal>\n"
1181 " <hal format=\"hidl\">\n"
1182 " <name>android.hardware.nfc</name>\n"
1183 " <transport>hwbinder</transport>\n"
1184 " <version>1.0</version>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001185 " <interface>\n"
1186 " <name>INfc</name>\n"
1187 " <instance>nfc_nci</instance>\n"
1188 " </interface>\n"
1189 " </hal>\n"
1190 " <hal format=\"hidl\">\n"
1191 " <name>android.hardware.nfc</name>\n"
1192 " <transport>hwbinder</transport>\n"
1193 " <version>2.0</version>\n"
1194 " <interface>\n"
1195 " <name>INfc</name>\n"
1196 " <instance>default</instance>\n"
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001197 " <instance>nfc_nci</instance>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001198 " </interface>\n"
1199 " </hal>\n"
1200 " <sepolicy>\n"
1201 " <version>25.5</version>\n"
1202 " </sepolicy>\n"
1203 "</manifest>\n";
1204
1205 std::string matrixXml =
1206 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1207 " <hal format=\"hidl\" optional=\"false\">\n"
1208 " <name>android.hardware.camera</name>\n"
1209 " <version>2.0-5</version>\n"
1210 " <version>3.4-16</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001211 " <interface>\n"
1212 " <name>IBetterCamera</name>\n"
1213 " <instance>camera</instance>\n"
1214 " </interface>\n"
1215 " <interface>\n"
1216 " <name>ICamera</name>\n"
1217 " <instance>default</instance>\n"
1218 " <instance>legacy/0</instance>\n"
1219 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001220 " </hal>\n"
1221 " <hal format=\"hidl\" optional=\"false\">\n"
1222 " <name>android.hardware.nfc</name>\n"
1223 " <version>1.0</version>\n"
1224 " <version>2.0</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001225 " <interface>\n"
1226 " <name>INfc</name>\n"
1227 " <instance>nfc_nci</instance>\n"
1228 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001229 " </hal>\n"
1230 " <hal format=\"hidl\" optional=\"true\">\n"
1231 " <name>android.hardware.foo</name>\n"
1232 " <version>1.0</version>\n"
1233 " </hal>\n"
1234 " <sepolicy>\n"
1235 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1236 " <sepolicy-version>25.5</sepolicy-version>\n"
1237 " <sepolicy-version>26.0-3</sepolicy-version>\n"
1238 " </sepolicy>\n"
1239 " <avb>\n"
1240 " <vbmeta-version>2.1</vbmeta-version>\n"
1241 " </avb>\n"
1242 "</compatibility-matrix>\n";
1243
1244 HalManifest manifest;
1245 CompatibilityMatrix matrix;
1246 std::string error;
1247 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1248 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1249 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1250
1251 // some smaller test cases
1252 matrixXml =
1253 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1254 " <hal format=\"hidl\" optional=\"false\">\n"
1255 " <name>android.hardware.camera</name>\n"
1256 " <version>3.4</version>\n"
1257 " </hal>\n"
1258 " <sepolicy>\n"
1259 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1260 " <sepolicy-version>25.5</sepolicy-version>\n"
1261 " </sepolicy>\n"
1262 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1263 "</compatibility-matrix>\n";
1264 matrix = {};
1265 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1266 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1267 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
1268 EXPECT_NE(camera, nullptr);
1269 camera->versionRanges[0] = {3, 5};
1270 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1271 camera->versionRanges[0] = {3, 6};
1272 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1273
1274 // reset it
1275 matrix = {};
1276 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1277 set(matrix, Sepolicy{30, {{26, 0}}});
1278 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1279 set(matrix, Sepolicy{30, {{25, 6}}});
1280 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1281 set(matrix, Sepolicy{30, {{25, 4}}});
1282 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1283}
1284
Yifan Hongd4857902017-06-13 14:13:56 -07001285/////////////////// xmlfile tests
1286
1287TEST_F(LibVintfTest, HalManifestConverterXmlFile) {
1288 HalManifest vm = testDeviceManifestWithXmlFile();
1289 std::string xml = gHalManifestConverter(vm);
1290 EXPECT_EQ(xml,
1291 "<manifest version=\"1.0\" type=\"device\">\n"
1292 " <hal format=\"hidl\">\n"
1293 " <name>android.hardware.camera</name>\n"
1294 " <transport>hwbinder</transport>\n"
1295 " <version>2.0</version>\n"
1296 " <interface>\n"
1297 " <name>IBetterCamera</name>\n"
1298 " <instance>camera</instance>\n"
1299 " </interface>\n"
1300 " <interface>\n"
1301 " <name>ICamera</name>\n"
1302 " <instance>default</instance>\n"
1303 " <instance>legacy/0</instance>\n"
1304 " </interface>\n"
1305 " </hal>\n"
1306 " <hal format=\"hidl\">\n"
1307 " <name>android.hardware.nfc</name>\n"
1308 " <transport arch=\"32+64\">passthrough</transport>\n"
1309 " <version>1.0</version>\n"
1310 " <interface>\n"
1311 " <name>INfc</name>\n"
1312 " <instance>default</instance>\n"
1313 " </interface>\n"
1314 " </hal>\n"
1315 " <sepolicy>\n"
1316 " <version>25.0</version>\n"
1317 " </sepolicy>\n"
1318 " <xmlfile>\n"
1319 " <name>media_profile</name>\n"
1320 " <version>1.0</version>\n"
1321 " </xmlfile>\n"
1322 "</manifest>\n");
1323 HalManifest vm2;
1324 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
1325 EXPECT_EQ(vm, vm2);
1326}
1327
1328TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile) {
1329 CompatibilityMatrix cm;
1330 addXmlFile(cm, "media_profile", {1, 0});
1331 std::string xml = gCompatibilityMatrixConverter(cm);
1332 EXPECT_EQ(xml,
1333 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1334 " <sepolicy>\n"
1335 " <kernel-sepolicy-version>0</kernel-sepolicy-version>\n"
1336 " </sepolicy>\n"
1337 " <avb>\n"
1338 " <vbmeta-version>0.0</vbmeta-version>\n"
1339 " </avb>\n"
1340 " <xmlfile format=\"dtd\" optional=\"true\">\n"
1341 " <name>media_profile</name>\n"
1342 " <version>1.0</version>\n"
1343 " </xmlfile>\n"
1344 "</compatibility-matrix>\n");
1345 CompatibilityMatrix cm2;
1346 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
1347 EXPECT_EQ(cm, cm2);
1348}
1349
1350TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile2) {
1351 std::string xml =
1352 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1353 " <xmlfile format=\"dtd\" optional=\"false\">\n"
1354 " <name>media_profile</name>\n"
1355 " <version>1.0</version>\n"
1356 " </xmlfile>\n"
1357 "</compatibility-matrix>\n";
1358 CompatibilityMatrix cm;
1359 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml));
1360 EXPECT_EQ(
1361 "compatibility-matrix.xmlfile entry media_profile has to be optional for "
1362 "compatibility matrix version 1.0",
1363 gCompatibilityMatrixConverter.lastError());
1364}
1365
Yifan Hongbbfff302017-06-06 17:10:13 -07001366TEST_F(LibVintfTest, ManifestXmlFilePathDevice) {
1367 std::string manifestXml =
1368 "<manifest version=\"1.0\" type=\"device\">"
1369 " <xmlfile>"
1370 " <name>media_profile</name>"
1371 " <version>1.0</version>"
1372 " </xmlfile>"
1373 "</manifest>";
1374 HalManifest manifest;
1375 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1376 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1377 "/vendor/etc/media_profile_V1_0.xml");
1378}
1379
1380TEST_F(LibVintfTest, ManifestXmlFilePathFramework) {
1381 std::string manifestXml =
1382 "<manifest version=\"1.0\" type=\"framework\">"
1383 " <xmlfile>"
1384 " <name>media_profile</name>"
1385 " <version>1.0</version>"
1386 " </xmlfile>"
1387 "</manifest>";
1388 HalManifest manifest;
1389 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1390 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1391 "/system/etc/media_profile_V1_0.xml");
1392}
1393
1394TEST_F(LibVintfTest, ManifestXmlFilePathOverride) {
1395 std::string manifestXml =
1396 "<manifest version=\"1.0\" type=\"device\">"
1397 " <xmlfile>"
1398 " <name>media_profile</name>"
1399 " <version>1.0</version>"
1400 " <path>/vendor/etc/foo.xml</path>"
1401 " </xmlfile>"
1402 "</manifest>";
1403 HalManifest manifest;
1404 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1405 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "/vendor/etc/foo.xml");
1406}
1407
1408TEST_F(LibVintfTest, ManifestXmlFilePathMissing) {
1409 std::string manifestXml =
1410 "<manifest version=\"1.0\" type=\"device\">"
1411 " <xmlfile>"
1412 " <name>media_profile</name>"
1413 " <version>1.1</version>"
1414 " </xmlfile>"
1415 "</manifest>";
1416 HalManifest manifest;
1417 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1418 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "");
1419}
1420
1421TEST_F(LibVintfTest, MatrixXmlFilePathFramework) {
1422 std::string matrixXml =
1423 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1424 " <xmlfile format=\"dtd\" optional=\"true\">"
1425 " <name>media_profile</name>"
1426 " <version>2.0-1</version>"
1427 " </xmlfile>"
1428 "</compatibility-matrix>";
1429 CompatibilityMatrix matrix;
1430 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1431 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 1}),
1432 "/system/etc/media_profile_V2_1.dtd");
1433}
1434
1435TEST_F(LibVintfTest, MatrixXmlFilePathDevice) {
1436 std::string matrixXml =
1437 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1438 " <xmlfile format=\"xsd\" optional=\"true\">"
1439 " <name>media_profile</name>"
1440 " <version>2.0-1</version>"
1441 " </xmlfile>"
1442 "</compatibility-matrix>";
1443 CompatibilityMatrix matrix;
1444 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1445 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}),
1446 "/vendor/etc/media_profile_V2_1.xsd");
1447}
1448
1449TEST_F(LibVintfTest, MatrixXmlFilePathOverride) {
1450 std::string matrixXml =
1451 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1452 " <xmlfile format=\"xsd\" optional=\"true\">"
1453 " <name>media_profile</name>"
1454 " <version>2.0-1</version>"
1455 " <path>/system/etc/foo.xsd</path>"
1456 " </xmlfile>"
1457 "</compatibility-matrix>";
1458 CompatibilityMatrix matrix;
1459 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1460 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "/system/etc/foo.xsd");
1461}
1462
1463TEST_F(LibVintfTest, MatrixXmlFilePathMissing) {
1464 std::string matrixXml =
1465 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1466 " <xmlfile format=\"dtd\" optional=\"true\">"
1467 " <name>media_profile</name>"
1468 " <version>2.1</version>"
1469 " </xmlfile>"
1470 "</compatibility-matrix>";
1471 CompatibilityMatrix matrix;
1472 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1473 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "");
1474}
1475
Yifan Hong02e94002017-07-10 15:41:56 -07001476std::pair<KernelConfigParser, status_t> processData(const std::string& data, bool processComments,
1477 bool relaxedFormat = false) {
1478 KernelConfigParser parser(processComments, relaxedFormat);
Yifan Hongd8cee082017-07-05 16:06:09 -07001479 const char* p = data.c_str();
1480 size_t n = 0;
1481 size_t chunkSize;
Yifan Hong6209d172017-07-07 16:18:19 -07001482 status_t status = OK;
Yifan Hongd8cee082017-07-05 16:06:09 -07001483 for (; n < data.size(); p += chunkSize, n += chunkSize) {
1484 chunkSize = std::min<size_t>(5, data.size() - n);
Yifan Hong6209d172017-07-07 16:18:19 -07001485 if ((status = parser.process(p, chunkSize)) != OK) {
1486 break;
1487 }
Yifan Hongd8cee082017-07-05 16:06:09 -07001488 }
Yifan Hong6209d172017-07-07 16:18:19 -07001489 return {std::move(parser), status};
Yifan Hongd8cee082017-07-05 16:06:09 -07001490}
1491
1492TEST_F(LibVintfTest, KernelConfigParser) {
1493 // usage in /proc/config.gz
1494 const std::string data =
1495 "# CONFIG_NOT_SET is not set\n"
1496 "CONFIG_ONE=1\n"
1497 "CONFIG_Y=y\n"
1498 "CONFIG_STR=\"string\"\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001499 auto pair = processData(data, false /* processComments */);
1500 ASSERT_EQ(OK, pair.second) << pair.first.error();
1501 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001502
1503 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1504 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1505 EXPECT_EQ(configs.find("CONFIG_STR")->second, "\"string\"");
1506 EXPECT_EQ(configs.find("CONFIG_NOT_SET"), configs.end());
1507}
1508
1509TEST_F(LibVintfTest, KernelConfigParser2) {
1510 // usage in android-base.cfg
1511 const std::string data =
1512 "# CONFIG_NOT_SET is not set\n"
1513 "CONFIG_ONE=1\n"
1514 "CONFIG_Y=y\n"
1515 "CONFIG_STR=string\n"
1516 "# ignore_thiscomment\n"
1517 "# CONFIG_NOT_SET2 is not set\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001518 auto pair = processData(data, true /* processComments */);
1519 ASSERT_EQ(OK, pair.second) << pair.first.error();
1520 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001521
1522 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1523 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1524 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1525 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1526 EXPECT_EQ(configs.find("CONFIG_NOT_SET2")->second, "n");
1527}
1528
Yifan Hongc1889722017-07-07 16:19:52 -07001529TEST_F(LibVintfTest, KernelConfigParserSpace) {
1530 // usage in android-base.cfg
1531 const std::string data =
1532 " # CONFIG_NOT_SET is not set \n"
1533 " CONFIG_ONE=1 # 'tis a one!\n"
1534 " CONFIG_TWO=2 #'tis a two! \n"
1535 " CONFIG_THREE=3#'tis a three! \n"
1536 " CONFIG_233=233#'tis a three! \n"
1537 "#yey! random comments\n"
1538 "CONFIG_Y=y \n"
1539 " CONFIG_YES=y#YES! \n"
1540 "CONFIG_STR=string\n"
1541 "CONFIG_HELLO=hello world! #still works\n"
1542 "CONFIG_WORLD=hello world! \n"
1543 "CONFIG_GOOD = good morning! #comments here\n"
1544 " CONFIG_MORNING = good morning! \n";
Yifan Hong02e94002017-07-10 15:41:56 -07001545 auto pair = processData(data, true /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07001546 ASSERT_EQ(OK, pair.second) << pair.first.error();
1547 const auto& configs = pair.first.configs();
1548
1549 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1550 EXPECT_EQ(configs.find("CONFIG_TWO")->second, "2");
1551 EXPECT_EQ(configs.find("CONFIG_THREE")->second, "3");
1552 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1553 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1554 EXPECT_EQ(configs.find("CONFIG_HELLO")->second, "hello world!")
1555 << "Value should be \"hello world!\" without trailing spaces";
1556 EXPECT_EQ(configs.find("CONFIG_WORLD")->second, "hello world!")
1557 << "Value should be \"hello world!\" without trailing spaces";
1558 EXPECT_EQ(configs.find("CONFIG_GOOD")->second, "good morning!")
1559 << "Value should be \"good morning!\" without leading or trailing spaces";
1560 EXPECT_EQ(configs.find("CONFIG_MORNING")->second, "good morning!")
1561 << "Value should be \"good morning!\" without leading or trailing spaces";
1562 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1563}
1564
Yifan Hongd9e46432017-08-15 17:14:52 -07001565TEST_F(LibVintfTest, NetutilsWrapperMatrix) {
1566 std::string matrixXml;
1567 CompatibilityMatrix matrix;
1568
1569 matrixXml =
1570 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1571 " <hal format=\"native\" optional=\"false\">"
1572 " <name>netutils-wrapper</name>"
1573 " <version>1.0</version>"
1574 " </hal>"
1575 "</compatibility-matrix>";
1576 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
1577 << gCompatibilityMatrixConverter.lastError();
1578
1579// only host libvintf hardcodes netutils-wrapper version requirements
1580#ifdef LIBVINTF_HOST
1581
1582 matrixXml =
1583 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1584 " <hal format=\"native\" optional=\"false\">"
1585 " <name>netutils-wrapper</name>"
1586 " <version>1.0-1</version>"
1587 " </hal>"
1588 "</compatibility-matrix>";
1589 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1590 EXPECT_CONTAINS(
1591 gCompatibilityMatrixConverter.lastError(),
1592 "netutils-wrapper HAL must specify exactly one version x.0, but a range is provided. "
1593 "Perhaps you mean '1.0'?");
1594
1595 matrixXml =
1596 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1597 " <hal format=\"native\" optional=\"false\">"
1598 " <name>netutils-wrapper</name>"
1599 " <version>1.1</version>"
1600 " </hal>"
1601 "</compatibility-matrix>";
1602 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1603 EXPECT_CONTAINS(
1604 gCompatibilityMatrixConverter.lastError(),
1605 "netutils-wrapper HAL must specify exactly one version x.0, but minor version is not 0. "
1606 "Perhaps you mean '1.0'?");
1607
1608 matrixXml =
1609 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1610 " <hal format=\"native\" optional=\"false\">"
1611 " <name>netutils-wrapper</name>"
1612 " <version>1.0</version>"
1613 " <version>2.0</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 multiple <version> element "
1620 "is specified.");
1621
1622#endif // LIBVINTF_HOST
1623}
1624
1625TEST_F(LibVintfTest, NetutilsWrapperManifest) {
1626 std::string manifestXml;
1627 HalManifest manifest;
1628
1629 manifestXml =
1630 "<manifest version=\"1.0\" type=\"framework\">"
1631 " <hal format=\"native\">"
1632 " <name>netutils-wrapper</name>"
1633 " <version>1.0</version>"
1634 " <version>2.0</version>"
1635 " </hal>"
1636 "</manifest>";
1637 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml)) << gHalManifestConverter.lastError();
1638
1639// only host libvintf hardcodes netutils-wrapper version requirements
1640#ifdef LIBVINTF_HOST
1641
1642 manifestXml =
1643 "<manifest version=\"1.0\" type=\"framework\">"
1644 " <hal format=\"native\">"
1645 " <name>netutils-wrapper</name>"
1646 " <version>1.1</version>"
1647 " </hal>"
1648 "</manifest>";
1649 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1650 EXPECT_CONTAINS(
1651 gCompatibilityMatrixConverter.lastError(),
1652 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1653 "is specified.");
1654
1655 manifestXml =
1656 "<manifest version=\"1.0\" type=\"framework\">"
1657 " <hal format=\"native\">"
1658 " <name>netutils-wrapper</name>"
1659 " <version>1.0</version>"
1660 " <version>2.1</version>"
1661 " </hal>"
1662 "</manifest>";
1663 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1664 EXPECT_CONTAINS(
1665 gCompatibilityMatrixConverter.lastError(),
1666 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1667 "is specified.");
1668
1669#endif // LIBVINTF_HOST
1670}
1671
Yifan Hong5f996502017-08-23 14:46:44 -07001672TEST_F(LibVintfTest, KernelConfigConditionTest) {
1673 std::string xml =
1674 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1675 " <kernel version=\"3.18.22\"/>\n"
1676 " <kernel version=\"3.18.22\">\n"
1677 " <conditions>\n"
1678 " <config>\n"
1679 " <key>CONFIG_ARM</key>\n"
1680 " <value type=\"tristate\">y</value>\n"
1681 " </config>\n"
1682 " </conditions>\n"
1683 " <config>\n"
1684 " <key>CONFIG_FOO</key>\n"
1685 " <value type=\"tristate\">y</value>\n"
1686 " </config>\n"
1687 " </kernel>\n"
1688 " <sepolicy>\n"
1689 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1690 " <sepolicy-version>25.0</sepolicy-version>\n"
1691 " </sepolicy>\n"
1692 " <avb>\n"
1693 " <vbmeta-version>2.1</vbmeta-version>\n"
1694 " </avb>\n"
1695 "</compatibility-matrix>\n";
1696
1697 CompatibilityMatrix cm;
1698 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1699 << gCompatibilityMatrixConverter.lastError();
1700 const auto& kernels = getKernels(cm);
1701 ASSERT_GE(kernels.size(), 2u);
1702 ASSERT_TRUE(kernels[0].conditions().empty());
1703 const auto& kernel = kernels[1];
1704 const auto& cond = kernel.conditions();
1705 ASSERT_FALSE(cond.empty());
1706 EXPECT_EQ("CONFIG_ARM", cond.begin()->first);
1707 EXPECT_EQ(KernelConfigTypedValue(Tristate::YES), cond.begin()->second);
1708 EXPECT_FALSE(kernel.configs().empty());
1709
1710 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
1711}
1712
1713TEST_F(LibVintfTest, KernelConfigConditionEmptyTest) {
1714 std::string xml =
1715 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1716 " <kernel version=\"4.4.0\"/>\n"
1717 " <kernel version=\"3.18.22\">\n"
1718 " <conditions>\n"
1719 " <config>\n"
1720 " <key>CONFIG_ARM</key>\n"
1721 " <value type=\"tristate\">y</value>\n"
1722 " </config>\n"
1723 " </conditions>\n"
1724 " </kernel>\n"
1725 "</compatibility-matrix>\n";
1726
1727 CompatibilityMatrix cm;
1728 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml))
1729 << "Should not accept first kernel version with non-empty conditions";
1730 EXPECT_EQ(
1731 "First <kernel> for version 3.18 must have empty <conditions> "
1732 "for backwards compatibility.",
1733 gCompatibilityMatrixConverter.lastError());
1734}
1735
1736TEST_F(LibVintfTest, KernelConfigConditionMatch) {
1737 RuntimeInfo runtime = testRuntimeInfo();
1738 std::string error;
1739 std::string xml;
1740 CompatibilityMatrix cm;
1741
1742 xml =
1743 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1744 " <kernel version=\"3.18.22\"/>\n"
1745 " <kernel version=\"3.18.22\">\n"
1746 " <conditions>\n"
1747 " <config>\n"
1748 " <key>CONFIG_64BIT</key>\n"
1749 " <value type=\"tristate\">y</value>\n"
1750 " </config>\n"
1751 " </conditions>\n"
1752 " <config>\n"
1753 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1754 " <value type=\"int\">24</value>\n"
1755 " </config>\n"
1756 " </kernel>\n"
1757 " <sepolicy>\n"
1758 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1759 " </sepolicy>\n"
1760 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1761 "</compatibility-matrix>\n";
1762
1763 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1764 << gCompatibilityMatrixConverter.lastError();
1765 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1766
1767 xml =
1768 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1769 " <kernel version=\"3.18.22\"/>\n"
1770 " <kernel version=\"3.18.22\">\n"
1771 " <conditions>\n"
1772 " <config>\n"
1773 " <key>CONFIG_64BIT</key>\n"
1774 " <value type=\"tristate\">y</value>\n"
1775 " </config>\n"
1776 " </conditions>\n"
1777 " <config>\n"
1778 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1779 " <value type=\"int\">26</value>\n"
1780 " </config>\n"
1781 " </kernel>\n"
1782 " <sepolicy>\n"
1783 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1784 " </sepolicy>\n"
1785 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1786 "</compatibility-matrix>\n";
1787
1788 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1789 << gCompatibilityMatrixConverter.lastError();
1790 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1791 << "conditions met, so CONFIG_ARCH_MMAP_RND_BITS should not match";
1792
1793 xml =
1794 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1795 " <kernel version=\"3.18.22\"/>\n"
1796 " <kernel version=\"3.18.22\">\n"
1797 " <conditions>\n"
1798 " <config>\n"
1799 " <key>CONFIG_64BIT</key>\n"
1800 " <value type=\"tristate\">n</value>\n"
1801 " </config>\n"
1802 " </conditions>\n"
1803 " <config>\n"
1804 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1805 " <value type=\"int\">26</value>\n"
1806 " </config>\n"
1807 " </kernel>\n"
1808 " <sepolicy>\n"
1809 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1810 " </sepolicy>\n"
1811 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1812 "</compatibility-matrix>\n";
1813
1814 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1815 << gCompatibilityMatrixConverter.lastError();
1816 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1817 xml =
1818 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1819 " <kernel version=\"3.18.22\"/>\n"
1820 " <kernel version=\"3.18.22\">\n"
1821 " <conditions>\n"
1822 " <config>\n"
1823 " <key>CONFIG_64BIT</key>\n"
1824 " <value type=\"tristate\">y</value>\n"
1825 " </config>\n"
1826 " <config>\n"
1827 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1828 " <value type=\"int\">24</value>\n"
1829 " </config>\n"
1830 " </conditions>\n"
1831 " <config>\n"
1832 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1833 " <value type=\"int\">0xdead000000000000</value>\n"
1834 " </config>\n"
1835 " </kernel>\n"
1836 " <sepolicy>\n"
1837 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1838 " </sepolicy>\n"
1839 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1840 "</compatibility-matrix>\n";
1841
1842 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1843 << gCompatibilityMatrixConverter.lastError();
1844 EXPECT_TRUE(runtime.checkCompatibility(cm, &error));
1845
1846 xml =
1847 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1848 " <kernel version=\"3.18.22\"/>\n"
1849 " <kernel version=\"3.18.22\">\n"
1850 " <conditions>\n"
1851 " <config>\n"
1852 " <key>CONFIG_64BIT</key>\n"
1853 " <value type=\"tristate\">y</value>\n"
1854 " </config>\n"
1855 " <config>\n"
1856 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1857 " <value type=\"int\">24</value>\n"
1858 " </config>\n"
1859 " </conditions>\n"
1860 " <config>\n"
1861 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1862 " <value type=\"int\">0xbeaf000000000000</value>\n"
1863 " </config>\n"
1864 " </kernel>\n"
1865 " <sepolicy>\n"
1866 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1867 " </sepolicy>\n"
1868 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1869 "</compatibility-matrix>\n";
1870
1871 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1872 << gCompatibilityMatrixConverter.lastError();
1873 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1874 << "conditions have 'and' relationship, so CONFIG_ILLEGAL_POINTER_VALUE should not match";
1875
1876 xml =
1877 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1878 " <kernel version=\"3.18.22\"/>\n"
1879 " <kernel version=\"3.18.22\">\n"
1880 " <conditions>\n"
1881 " <config>\n"
1882 " <key>CONFIG_64BIT</key>\n"
1883 " <value type=\"tristate\">y</value>\n"
1884 " </config>\n"
1885 " <config>\n"
1886 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1887 " <value type=\"int\">26</value>\n"
1888 " </config>\n"
1889 " </conditions>\n"
1890 " <config>\n"
1891 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1892 " <value type=\"int\">0xbeaf000000000000</value>\n"
1893 " </config>\n"
1894 " </kernel>\n"
1895 " <sepolicy>\n"
1896 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1897 " </sepolicy>\n"
1898 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1899 "</compatibility-matrix>\n";
1900
1901 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1902 << gCompatibilityMatrixConverter.lastError();
1903 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1904
1905 xml =
1906 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1907 " <kernel version=\"3.18.22\">\n"
1908 " <config>\n"
1909 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1910 " <value type=\"string\"/>\n"
1911 " </config>\n"
1912 " </kernel>\n"
1913 " <kernel version=\"3.18.22\">\n"
1914 " <conditions>\n"
1915 " <config>\n"
1916 " <key>CONFIG_64BIT</key>\n"
1917 " <value type=\"tristate\">y</value>\n"
1918 " </config>\n"
1919 " </conditions>\n"
1920 " <config>\n"
1921 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1922 " <value type=\"int\">0xdead000000000000</value>\n"
1923 " </config>\n"
1924 " </kernel>\n"
1925 " <kernel version=\"3.18.22\">\n"
1926 " <conditions>\n"
1927 " <config>\n"
1928 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1929 " <value type=\"int\">24</value>\n"
1930 " </config>\n"
1931 " </conditions>\n"
1932 " <config>\n"
1933 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1934 " <value type=\"string\">binder,hwbinder</value>\n"
1935 " </config>\n"
1936 " </kernel>\n"
1937 " <sepolicy>\n"
1938 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1939 " </sepolicy>\n"
1940 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1941 "</compatibility-matrix>\n";
1942
1943 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1944 << gCompatibilityMatrixConverter.lastError();
1945 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1946
1947 xml =
1948 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1949 " <kernel version=\"3.18.22\">\n"
1950 " <config>\n"
1951 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1952 " <value type=\"string\"/>\n"
1953 " </config>\n"
1954 " </kernel>\n"
1955 " <kernel version=\"3.18.22\">\n"
1956 " <conditions>\n"
1957 " <config>\n"
1958 " <key>CONFIG_64BIT</key>\n"
1959 " <value type=\"tristate\">y</value>\n"
1960 " </config>\n"
1961 " </conditions>\n"
1962 " <config>\n"
1963 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1964 " <value type=\"int\">0xbeaf000000000000</value>\n"
1965 " </config>\n"
1966 " </kernel>\n"
1967 " <kernel version=\"3.18.22\">\n"
1968 " <conditions>\n"
1969 " <config>\n"
1970 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1971 " <value type=\"int\">24</value>\n"
1972 " </config>\n"
1973 " </conditions>\n"
1974 " <config>\n"
1975 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1976 " <value type=\"string\">binder,hwbinder</value>\n"
1977 " </config>\n"
1978 " </kernel>\n"
1979 " <sepolicy>\n"
1980 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1981 " </sepolicy>\n"
1982 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1983 "</compatibility-matrix>\n";
1984
1985 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1986 << gCompatibilityMatrixConverter.lastError();
1987 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used.";
1988
1989 xml =
1990 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1991 " <kernel version=\"3.18.22\">\n"
1992 " <config>\n"
1993 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1994 " <value type=\"string\"/>\n"
1995 " </config>\n"
1996 " </kernel>\n"
1997 " <kernel version=\"3.18.22\">\n"
1998 " <conditions>\n"
1999 " <config>\n"
2000 " <key>CONFIG_64BIT</key>\n"
2001 " <value type=\"tristate\">y</value>\n"
2002 " </config>\n"
2003 " </conditions>\n"
2004 " <config>\n"
2005 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
2006 " <value type=\"int\">0xdead000000000000</value>\n"
2007 " </config>\n"
2008 " </kernel>\n"
2009 " <kernel version=\"3.18.22\">\n"
2010 " <conditions>\n"
2011 " <config>\n"
2012 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
2013 " <value type=\"int\">24</value>\n"
2014 " </config>\n"
2015 " </conditions>\n"
2016 " <config>\n"
2017 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
2018 " <value type=\"string\">binder</value>\n"
2019 " </config>\n"
2020 " </kernel>\n"
2021 " <sepolicy>\n"
2022 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2023 " </sepolicy>\n"
2024 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2025 "</compatibility-matrix>\n";
2026
2027 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2028 << gCompatibilityMatrixConverter.lastError();
2029 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used";
2030}
2031
Yifan Hongc1889722017-07-07 16:19:52 -07002032// Run KernelConfigParserInvalidTest on processComments = {true, false}
2033class KernelConfigParserInvalidTest : public ::testing::TestWithParam<bool> {};
2034
2035TEST_P(KernelConfigParserInvalidTest, NonSet1) {
2036 const std::string data = "# CONFIG_NOT_EXIST is not sat\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002037 auto pair = processData(data, GetParam() /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07002038 ASSERT_EQ(OK, pair.second) << pair.first.error();
2039 const auto& configs = pair.first.configs();
2040 EXPECT_EQ(configs.find("CONFIG_NOT_EXIST"), configs.end())
2041 << "CONFIG_NOT_EXIST should not exist because of typo";
2042}
2043
2044TEST_P(KernelConfigParserInvalidTest, InvalidLine1) {
2045 const std::string data = "FOO_CONFIG=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002046 ASSERT_NE(OK,
2047 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07002048}
2049
2050TEST_P(KernelConfigParserInvalidTest, InvalidLine2) {
2051 const std::string data = "CONFIG_BAR-BAZ=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002052 ASSERT_NE(OK,
2053 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07002054}
2055
2056INSTANTIATE_TEST_CASE_P(KernelConfigParser, KernelConfigParserInvalidTest, ::testing::Bool());
2057
Yifan Hong2027a492017-12-11 15:21:19 -08002058TEST_F(LibVintfTest, MatrixLevel) {
2059 CompatibilityMatrix cm;
2060 std::string xml;
2061
2062 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\"/>";
2063 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2064 << gCompatibilityMatrixConverter.lastError();
2065 EXPECT_EQ(Level::UNSPECIFIED, cm.level());
2066
2067 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"legacy\"/>";
2068 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2069 << gCompatibilityMatrixConverter.lastError();
2070 EXPECT_EQ(Level::LEGACY, cm.level());
2071
2072 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
2073 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2074 << gCompatibilityMatrixConverter.lastError();
2075 EXPECT_EQ(1u, cm.level());
2076}
2077
2078TEST_F(LibVintfTest, ManifestLevel) {
2079 HalManifest manifest;
2080 std::string xml;
2081
2082 xml = "<manifest version=\"1.0\" type=\"device\"/>";
2083 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2084 EXPECT_EQ(Level::UNSPECIFIED, manifest.level());
2085
2086 xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"legacy\"/>";
2087 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2088 EXPECT_EQ(Level::LEGACY, manifest.level());
2089
2090 xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"1\"/>";
2091 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2092 EXPECT_EQ(1u, manifest.level());
2093}
2094
Yifan Hongdbe9db32017-12-11 19:06:11 -08002095TEST_F(LibVintfTest, AddOptionalHal) {
2096 CompatibilityMatrix cm1;
2097 CompatibilityMatrix cm2;
2098 std::string error;
2099 std::string xml;
2100
2101 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
2102 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2103 << gCompatibilityMatrixConverter.lastError();
2104
2105 xml =
2106 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2107 " <hal format=\"hidl\" optional=\"false\">\n"
2108 " <name>android.hardware.foo</name>\n"
2109 " <version>1.0-1</version>\n"
2110 " <interface>\n"
2111 " <name>IFoo</name>\n"
2112 " <instance>default</instance>\n"
2113 " </interface>\n"
2114 " </hal>\n"
2115 "</compatibility-matrix>\n";
2116 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2117 << gCompatibilityMatrixConverter.lastError();
2118
2119 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2120 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2121 EXPECT_EQ(xml,
2122 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2123 " <hal format=\"hidl\" optional=\"true\">\n"
2124 " <name>android.hardware.foo</name>\n"
2125 " <version>1.0-1</version>\n"
2126 " <interface>\n"
2127 " <name>IFoo</name>\n"
2128 " <instance>default</instance>\n"
2129 " </interface>\n"
2130 " </hal>\n"
2131 "</compatibility-matrix>\n");
2132}
2133
2134TEST_F(LibVintfTest, AddOptionalHalMinorVersion) {
2135 CompatibilityMatrix cm1;
2136 CompatibilityMatrix cm2;
2137 std::string error;
2138 std::string xml;
2139
2140 xml =
2141 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2142 " <hal format=\"hidl\" optional=\"false\">\n"
2143 " <name>android.hardware.foo</name>\n"
2144 " <version>1.2-3</version>\n"
2145 " <interface>\n"
2146 " <name>IFoo</name>\n"
2147 " <instance>default</instance>\n"
2148 " </interface>\n"
2149 " </hal>\n"
2150 "</compatibility-matrix>\n";
2151 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2152 << gCompatibilityMatrixConverter.lastError();
2153
2154 xml =
2155 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2156 " <hal format=\"hidl\" optional=\"false\">\n"
2157 " <name>android.hardware.foo</name>\n"
2158 " <version>1.0-4</version>\n"
2159 " <interface>\n"
2160 " <name>IFoo</name>\n"
2161 " <instance>default</instance>\n"
2162 " </interface>\n"
2163 " </hal>\n"
2164 "</compatibility-matrix>\n";
2165 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2166 << gCompatibilityMatrixConverter.lastError();
2167
2168 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2169 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2170 EXPECT_EQ(xml,
2171 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2172 " <hal format=\"hidl\" optional=\"false\">\n"
2173 " <name>android.hardware.foo</name>\n"
2174 " <version>1.2-4</version>\n"
2175 " <interface>\n"
2176 " <name>IFoo</name>\n"
2177 " <instance>default</instance>\n"
2178 " </interface>\n"
2179 " </hal>\n"
2180 "</compatibility-matrix>\n");
2181}
2182
2183TEST_F(LibVintfTest, AddOptionalHalMajorVersion) {
2184 CompatibilityMatrix cm1;
2185 CompatibilityMatrix cm2;
2186 std::string error;
2187 std::string xml;
2188
2189 xml =
2190 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2191 " <hal format=\"hidl\" optional=\"false\">\n"
2192 " <name>android.hardware.foo</name>\n"
2193 " <version>1.2-3</version>\n"
2194 " <interface>\n"
2195 " <name>IFoo</name>\n"
2196 " <instance>default</instance>\n"
2197 " </interface>\n"
2198 " </hal>\n"
2199 "</compatibility-matrix>\n";
2200 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2201 << gCompatibilityMatrixConverter.lastError();
2202
2203 xml =
2204 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2205 " <hal format=\"hidl\" optional=\"false\">\n"
2206 " <name>android.hardware.foo</name>\n"
Yifan Hongd8eea9e2017-12-22 15:13:42 -08002207 " <version>1.2-3</version>\n"
Yifan Hongdbe9db32017-12-11 19:06:11 -08002208 " <version>2.0-4</version>\n"
2209 " <interface>\n"
2210 " <name>IFoo</name>\n"
2211 " <instance>default</instance>\n"
2212 " </interface>\n"
2213 " </hal>\n"
2214 "</compatibility-matrix>\n";
2215 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2216 << gCompatibilityMatrixConverter.lastError();
2217
2218 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2219 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2220 EXPECT_EQ(xml,
2221 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2222 " <hal format=\"hidl\" optional=\"false\">\n"
2223 " <name>android.hardware.foo</name>\n"
2224 " <version>1.2-3</version>\n"
2225 " <interface>\n"
2226 " <name>IFoo</name>\n"
2227 " <instance>default</instance>\n"
2228 " </interface>\n"
2229 " </hal>\n"
2230 " <hal format=\"hidl\" optional=\"true\">\n"
2231 " <name>android.hardware.foo</name>\n"
2232 " <version>2.0-4</version>\n"
2233 " <interface>\n"
2234 " <name>IFoo</name>\n"
2235 " <instance>default</instance>\n"
2236 " </interface>\n"
2237 " </hal>\n"
2238 "</compatibility-matrix>\n");
2239}
2240
Yifan Hongd4b92fe2017-12-20 15:29:03 -08002241TEST_F(LibVintfTest, AddOptionalXmlFile) {
2242 CompatibilityMatrix cm1;
2243 CompatibilityMatrix cm2;
2244 std::string error;
2245 std::string xml;
2246
2247 xml =
2248 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2249 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2250 " <name>foo</name>\n"
2251 " <version>1.0-2</version>\n"
2252 " <path>/foo/bar/baz.xsd</path>\n"
2253 " </xmlfile>\n"
2254 "</compatibility-matrix>\n";
2255 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2256 << gCompatibilityMatrixConverter.lastError();
2257
2258 xml =
2259 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2260 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2261 " <name>foo</name>\n"
2262 " <version>1.1-3</version>\n"
2263 " <path>/foo/bar/quux.xsd</path>\n"
2264 " </xmlfile>\n"
2265 "</compatibility-matrix>\n";
2266 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2267 << gCompatibilityMatrixConverter.lastError();
2268
2269 EXPECT_TRUE(addAllXmlFilesAsOptional(&cm1, &cm2, &error)) << error;
2270 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::XMLFILES_ONLY);
2271 EXPECT_EQ(xml,
2272 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2273 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2274 " <name>foo</name>\n"
2275 " <version>1.0-2</version>\n"
2276 " <path>/foo/bar/baz.xsd</path>\n"
2277 " </xmlfile>\n"
2278 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2279 " <name>foo</name>\n"
2280 " <version>1.1-3</version>\n"
2281 " <path>/foo/bar/quux.xsd</path>\n"
2282 " </xmlfile>\n"
2283 "</compatibility-matrix>\n");
2284}
2285
Yifan Hongfeb454e2018-01-09 16:16:40 -08002286TEST_F(LibVintfTest, VendorNdk) {
2287 CompatibilityMatrix cm;
2288 std::string error;
2289 std::string xml;
2290
2291 xml =
2292 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
2293 " <vendor-ndk>\n"
2294 " <version>P</version>\n"
2295 " <library>libbase.so</library>\n"
2296 " <library>libjpeg.so</library>\n"
2297 " </vendor-ndk>\n"
2298 "</compatibility-matrix>\n";
2299 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2300 << gCompatibilityMatrixConverter.lastError();
2301 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
2302
2303 {
2304 HalManifest manifest;
2305 xml =
2306 "<manifest version=\"1.0\" type=\"framework\">\n"
2307 " <vendor-ndk>\n"
2308 " <version>27</version>\n"
2309 " <library>libbase.so</library>\n"
2310 " <library>libjpeg.so</library>\n"
2311 " </vendor-ndk>\n"
2312 " <vendor-ndk>\n"
2313 " <version>P</version>\n"
2314 " <library>libbase.so</library>\n"
2315 " <library>libjpeg.so</library>\n"
2316 " <library>libtinyxml2.so</library>\n"
2317 " </vendor-ndk>\n"
2318 "</manifest>\n";
2319
2320 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2321 EXPECT_EQ(xml, gHalManifestConverter(manifest));
2322 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2323 }
2324
2325 {
2326 HalManifest manifest;
2327 xml =
2328 "<manifest version=\"1.0\" type=\"framework\">\n"
2329 " <vendor-ndk>\n"
2330 " <version>27</version>\n"
2331 " <library>libbase.so</library>\n"
2332 " <library>libjpeg.so</library>\n"
2333 " </vendor-ndk>\n"
2334 "</manifest>\n";
2335
2336 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2337 EXPECT_EQ(xml, gHalManifestConverter(manifest));
2338 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2339 EXPECT_IN("Vndk version P is not supported.", error);
2340 }
2341
2342 {
2343 HalManifest manifest;
2344 xml =
2345 "<manifest version=\"1.0\" type=\"framework\">\n"
2346 " <vendor-ndk>\n"
2347 " <version>P</version>\n"
2348 " <library>libbase.so</library>\n"
2349 " </vendor-ndk>\n"
2350 "</manifest>\n";
2351
2352 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2353 EXPECT_EQ(xml, gHalManifestConverter(manifest));
2354 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2355 EXPECT_IN("Vndk libs incompatible for version P.", error);
2356 EXPECT_IN("libjpeg.so", error);
2357 }
2358}
2359
2360TEST_F(LibVintfTest, MissingVendorNdkInMatrix) {
2361 CompatibilityMatrix cm;
2362 std::string xml;
2363 std::string error;
2364
2365 xml = "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n";
2366 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2367 << gCompatibilityMatrixConverter.lastError();
2368
2369 {
2370 HalManifest manifest;
2371 xml = "<manifest version=\"1.0\" type=\"framework\"/>\n";
2372 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2373
2374 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2375 }
2376
2377 {
2378 HalManifest manifest;
2379 xml =
2380 "<manifest version=\"1.0\" type=\"framework\">\n"
2381 " <vendor-ndk>\n"
2382 " <version>P</version>\n"
2383 " <library>libbase.so</library>\n"
2384 " </vendor-ndk>\n"
2385 "</manifest>\n";
2386 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2387
2388 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2389 }
2390}
2391
Yifan Hong68d23062018-01-17 16:09:46 -08002392TEST_F(LibVintfTest, ManifestHalOverride) {
2393 HalManifest manifest;
2394 std::string xml =
2395 "<manifest version=\"1.0\" type=\"device\">\n"
2396 " <hal format=\"hidl\" override=\"true\">\n"
2397 " <name>android.hardware.foo</name>\n"
2398 " <transport>hwbinder</transport>\n"
2399 " <version>1.0</version>\n"
2400 " </hal>\n"
2401 " <hal format=\"hidl\">\n"
2402 " <name>android.hardware.bar</name>\n"
2403 " <transport>hwbinder</transport>\n"
2404 " <version>1.0</version>\n"
2405 " </hal>\n"
2406 "</manifest>\n";
2407 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2408 const ManifestHal* foo = manifest.getHal("android.hardware.foo", {1, 0});
2409 ASSERT_NE(nullptr, foo);
2410 EXPECT_TRUE(foo->isOverride);
2411 const ManifestHal* bar = manifest.getHal("android.hardware.bar", {1, 0});
2412 ASSERT_NE(nullptr, bar);
2413 EXPECT_FALSE(bar->isOverride);
2414}
2415
Yifan Honga9993572017-01-24 19:33:15 -08002416} // namespace vintf
2417} // namespace android
2418
Yifan Hong676447a2016-11-15 12:57:23 -08002419int main(int argc, char **argv) {
2420 ::testing::InitGoogleTest(&argc, argv);
2421 return RUN_ALL_TESTS();
2422}