blob: 8c0707556f73b46695e52e7d5b8f76c3579c3a4a [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 Honga67b2092017-10-09 13:24:54 -070042#ifdef LIBVINTF_HOST
Yifan Hongd9e46432017-08-15 17:14:52 -070043static bool Contains(const std::string& str, const std::string& sub) {
44 return str.find(sub) != std::string::npos;
45}
46#define EXPECT_CONTAINS(str, sub) \
47 EXPECT_TRUE(Contains((str), (sub))) << "Cannot find \"" << (sub) << "\" in \"" << (str) << "\""
Yifan Honga67b2092017-10-09 13:24:54 -070048#endif
Yifan Hongd9e46432017-08-15 17:14:52 -070049
Yifan Honga9993572017-01-24 19:33:15 -080050struct LibVintfTest : public ::testing::Test {
Yifan Hong676447a2016-11-15 12:57:23 -080051public:
52 virtual void SetUp() override {
53 }
54 virtual void TearDown() override {
55 }
Yifan Honga9993572017-01-24 19:33:15 -080056 bool add(CompatibilityMatrix &cm, MatrixHal &&hal) {
57 return cm.add(std::move(hal));
58 }
59 bool add(CompatibilityMatrix &cm, MatrixKernel &&kernel) {
60 return cm.add(std::move(kernel));
61 }
Yifan Hongd2b7e642017-02-17 10:15:32 -080062 bool add(HalManifest &vm, ManifestHal &&hal) {
Yifan Honga9993572017-01-24 19:33:15 -080063 return vm.add(std::move(hal));
64 }
Yifan Hongd4857902017-06-13 14:13:56 -070065 void addXmlFile(CompatibilityMatrix& cm, std::string name, VersionRange range) {
66 MatrixXmlFile f;
67 f.mName = name;
68 f.mVersionRange = range;
69 f.mFormat = XmlSchemaFormat::DTD;
70 f.mOptional = true;
71 cm.addXmlFile(std::move(f));
72 }
Yifan Hong558380a2017-02-09 15:37:32 -080073 void set(CompatibilityMatrix &cm, Sepolicy &&sepolicy) {
Yifan Hong7c7d7062017-04-04 16:26:51 -070074 cm.framework.mSepolicy = sepolicy;
Yifan Hong558380a2017-02-09 15:37:32 -080075 }
Yifan Hong03d2d4a2017-04-12 17:34:14 -070076 void set(CompatibilityMatrix &cm, SchemaType type) {
77 cm.mType = type;
78 }
79 void set(CompatibilityMatrix &cm, VndkVersionRange &&range, std::set<std::string> &&libs) {
80 cm.device.mVndk.mVersionRange = range;
81 cm.device.mVndk.mLibraries = libs;
82 }
Yifan Hong881a9e452017-04-27 19:31:13 -070083 void setAvb(RuntimeInfo &ki, Version vbmeta, Version boot) {
84 ki.mBootVbmetaAvbVersion = vbmeta;
85 ki.mBootAvbVersion = boot;
Yifan Hongf3029302017-04-12 17:23:49 -070086 }
87 void setAvb(CompatibilityMatrix &cm, Version &&avbVersion) {
88 cm.framework.mAvbMetaVersion = avbVersion;
89 }
Yifan Hong19e0a2a2017-04-14 17:30:53 -070090 Version getAvb(CompatibilityMatrix &cm) {
91 return cm.framework.mAvbMetaVersion;
92 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070093 const ManifestHal *getAnyHal(HalManifest &vm, const std::string &name) {
94 return vm.getAnyHal(name);
Yifan Honga9993572017-01-24 19:33:15 -080095 }
Yifan Hongd0cbf1f2017-04-12 19:47:06 -070096 MatrixHal *getAnyHal(CompatibilityMatrix &cm, const std::string &name) {
97 return cm.getAnyHal(name);
98 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070099 ConstMultiMapValueIterable<std::string, ManifestHal> getHals(HalManifest &vm) {
Yifan Honga9993572017-01-24 19:33:15 -0800100 return vm.getHals();
101 }
Yifan Hong5a06ef72017-01-24 19:54:24 -0800102 bool isValid(const ManifestHal &mh) {
103 return mh.isValid();
104 }
Yifan Hong5f996502017-08-23 14:46:44 -0700105 std::vector<MatrixKernel>& getKernels(CompatibilityMatrix& cm) { return cm.framework.mKernels; }
Yifan Hongdbe9db32017-12-11 19:06:11 -0800106 bool addAllHalsAsOptional(CompatibilityMatrix* cm1, CompatibilityMatrix* cm2, std::string* e) {
107 return cm1->addAllHalsAsOptional(cm2, e);
108 }
Yifan Hongd4b92fe2017-12-20 15:29:03 -0800109 bool addAllXmlFilesAsOptional(CompatibilityMatrix* cm1, CompatibilityMatrix* cm2,
110 std::string* e) {
111 return cm1->addAllXmlFilesAsOptional(cm2, e);
112 }
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700113
114 std::map<std::string, HalInterface> testHalInterfaces() {
115 HalInterface intf;
116 intf.name = "IFoo";
117 intf.instances.insert("default");
118 std::map<std::string, HalInterface> map;
119 map[intf.name] = intf;
120 return map;
121 }
122
Yifan Honga04e1472017-04-05 13:15:34 -0700123 HalManifest testDeviceManifest() {
Yifan Hongd2b7e642017-02-17 10:15:32 -0800124 HalManifest vm;
Yifan Hong7c7d7062017-04-04 16:26:51 -0700125 vm.mType = SchemaType::DEVICE;
Yifan Hong2a3dd082017-04-04 17:15:35 -0700126 vm.device.mSepolicyVersion = {25, 0};
Yifan Hong2059ffc2017-02-24 11:32:02 -0800127 vm.add(ManifestHal{
128 .format = HalFormat::HIDL,
129 .name = "android.hardware.camera",
130 .versions = {Version(2, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800131 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800132 .interfaces = {
133 {"ICamera", {"ICamera", {"legacy/0", "default"}}},
134 {"IBetterCamera", {"IBetterCamera", {"camera"}}}
135 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800136 });
137 vm.add(ManifestHal{
138 .format = HalFormat::HIDL,
139 .name = "android.hardware.nfc",
140 .versions = {Version(1, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800141 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800142 .interfaces = {
143 {"INfc", {"INfc", {"default"}}}
144 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800145 });
Yifan Honga9993572017-01-24 19:33:15 -0800146
147 return vm;
148 }
Yifan Hongd4857902017-06-13 14:13:56 -0700149 HalManifest testDeviceManifestWithXmlFile() {
150 HalManifest vm = testDeviceManifest();
151 ManifestXmlFile xmlFile;
152 xmlFile.mName = "media_profile";
153 xmlFile.mVersion = {1, 0};
154 vm.addXmlFile(std::move(xmlFile));
155 return vm;
156 }
Yifan Honga04e1472017-04-05 13:15:34 -0700157 HalManifest testFrameworkManfiest() {
158 HalManifest vm;
159 vm.mType = SchemaType::FRAMEWORK;
160 vm.add(ManifestHal{
161 .format = HalFormat::HIDL,
162 .name = "android.hidl.manager",
163 .versions = {Version(1, 0)},
164 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
165 .interfaces = {
166 {"IServiceManager", {"IServiceManager", {"default"}}},
167 }
168 });
169 Vndk vndk2505;
170 vndk2505.mVersionRange = {25, 0, 5};
171 vndk2505.mLibraries = { "libjpeg.so", "libbase.so" };
172 Vndk vndk2513;
173 vndk2513.mVersionRange = {25, 1, 3};
174 vndk2513.mLibraries = { "libjpeg.so", "libbase.so", "libtinyxml2.so" };
175 vm.framework.mVndks = { std::move(vndk2505), std::move(vndk2513) };
176
177 return vm;
178 }
Yifan Honga7201e72017-02-17 10:09:59 -0800179 RuntimeInfo testRuntimeInfo() {
180 RuntimeInfo info;
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800181 info.mOsName = "Linux";
182 info.mNodeName = "localhost";
183 info.mOsRelease = "3.18.31-g936f9a479d0f";
184 info.mKernelVersion = {3, 18, 31};
185 info.mOsVersion = "#4 SMP PREEMPT Wed Feb 1 18:10:52 PST 2017";
186 info.mHardwareId = "aarch64";
187 info.mKernelSepolicyVersion = 30;
Yifan Hongf1af7522017-02-16 18:00:55 -0800188 info.mKernelConfigs = {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800189 {"CONFIG_64BIT", "y"},
190 {"CONFIG_ANDROID_BINDER_DEVICES", "\"binder,hwbinder\""},
191 {"CONFIG_ARCH_MMAP_RND_BITS", "24"},
192 {"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", "\"\""},
193 {"CONFIG_ILLEGAL_POINTER_VALUE", "0xdead000000000000"}
194 };
Yifan Hong881a9e452017-04-27 19:31:13 -0700195 setAvb(info, {2, 1}, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800196 return info;
197 }
Yifan Hong676447a2016-11-15 12:57:23 -0800198};
199
Yifan Hongd5cd0482017-06-19 12:25:48 -0700200TEST_F(LibVintfTest, ArchOperatorOr) {
201 Arch a = Arch::ARCH_EMPTY;
202 a |= Arch::ARCH_32;
203 EXPECT_EQ(Arch::ARCH_32, a);
204
205 a |= Arch::ARCH_64;
206 EXPECT_EQ(Arch::ARCH_32_64, a);
207
208 a = Arch::ARCH_EMPTY;
209 a |= Arch::ARCH_64;
210 EXPECT_EQ(Arch::ARCH_64, a);
211}
Yifan Hongef6d4d32017-01-23 14:12:28 -0800212
213TEST_F(LibVintfTest, Stringify) {
Yifan Honga04e1472017-04-05 13:15:34 -0700214 HalManifest vm = testDeviceManifest();
Yifan Hong974ad9c2017-04-04 15:37:39 -0700215 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/2.0:"
216 "hidl/android.hardware.nfc/passthrough32+64/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -0800217
218 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
219 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
220
221 VersionRange v(1, 2, 3);
222 EXPECT_EQ(to_string(v), "1.2-3");
223 VersionRange v2;
224 EXPECT_TRUE(parse("1.2-3", &v2));
225 EXPECT_EQ(v, v2);
226}
227
Yifan Hong9bbdb282017-04-12 21:53:59 -0700228TEST_F(LibVintfTest, GetTransport) {
229 HalManifest vm = testDeviceManifest();
230 EXPECT_EQ(Transport::HWBINDER, vm.getTransport("android.hardware.camera",
231 {2, 0}, "ICamera", "default"));
232}
233
Yifan Hongd2b7e642017-02-17 10:15:32 -0800234TEST_F(LibVintfTest, HalManifestConverter) {
Yifan Honga04e1472017-04-05 13:15:34 -0700235 HalManifest vm = testDeviceManifest();
Yifan Hongd2b7e642017-02-17 10:15:32 -0800236 std::string xml = gHalManifestConverter(vm);
Yifan Hong676447a2016-11-15 12:57:23 -0800237 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700238 "<manifest version=\"1.0\" type=\"device\">\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800239 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800240 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800241 " <transport>hwbinder</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800242 " <version>2.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800243 " <interface>\n"
244 " <name>IBetterCamera</name>\n"
245 " <instance>camera</instance>\n"
246 " </interface>\n"
247 " <interface>\n"
248 " <name>ICamera</name>\n"
249 " <instance>default</instance>\n"
250 " <instance>legacy/0</instance>\n"
251 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800252 " </hal>\n"
253 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800254 " <name>android.hardware.nfc</name>\n"
Yifan Hongc54d32c2017-03-07 19:12:26 -0800255 " <transport arch=\"32+64\">passthrough</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800256 " <version>1.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800257 " <interface>\n"
258 " <name>INfc</name>\n"
259 " <instance>default</instance>\n"
260 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800261 " </hal>\n"
Yifan Hong2a3dd082017-04-04 17:15:35 -0700262 " <sepolicy>\n"
263 " <version>25.0</version>\n"
264 " </sepolicy>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800265 "</manifest>\n");
Yifan Hongfb7469c2017-04-05 19:15:21 -0700266 HalManifest vm2;
267 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
268 EXPECT_EQ(vm, vm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800269}
270
Yifan Honga04e1472017-04-05 13:15:34 -0700271TEST_F(LibVintfTest, HalManifestConverterFramework) {
272 HalManifest vm = testFrameworkManfiest();
273 std::string xml = gHalManifestConverter(vm);
274 EXPECT_EQ(xml,
275 "<manifest version=\"1.0\" type=\"framework\">\n"
276 " <hal format=\"hidl\">\n"
277 " <name>android.hidl.manager</name>\n"
278 " <transport>hwbinder</transport>\n"
279 " <version>1.0</version>\n"
280 " <interface>\n"
281 " <name>IServiceManager</name>\n"
282 " <instance>default</instance>\n"
283 " </interface>\n"
284 " </hal>\n"
285 " <vndk>\n"
286 " <version>25.0.5</version>\n"
287 " <library>libbase.so</library>\n"
288 " <library>libjpeg.so</library>\n"
289 " </vndk>\n"
290 " <vndk>\n"
291 " <version>25.1.3</version>\n"
292 " <library>libbase.so</library>\n"
293 " <library>libjpeg.so</library>\n"
294 " <library>libtinyxml2.so</library>\n"
295 " </vndk>\n"
296 "</manifest>\n");
297 HalManifest vm2;
298 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700299 EXPECT_EQ(vm, vm2);
Yifan Honga04e1472017-04-05 13:15:34 -0700300}
301
Yifan Hong8e9c6692017-02-28 14:07:42 -0800302TEST_F(LibVintfTest, HalManifestOptional) {
303 HalManifest vm;
304 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700305 "<manifest version=\"1.0\" type=\"device\"></manifest>"));
Yifan Hong8e9c6692017-02-28 14:07:42 -0800306 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700307 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800308 " <hal>"
309 " <name>android.hidl.manager</name>"
310 " <transport>hwbinder</transport>"
311 " <version>1.0</version>"
312 " </hal>"
313 "</manifest>"));
314 EXPECT_FALSE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700315 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800316 " <hal>"
317 " <name>android.hidl.manager</name>"
318 " <version>1.0</version>"
319 " </hal>"
320 "</manifest>"));
321}
322
Yifan Honge0bb98d2017-08-07 14:40:19 -0700323TEST_F(LibVintfTest, HalManifestNative) {
324 HalManifest vm;
325 EXPECT_TRUE(gHalManifestConverter(&vm,
326 "<manifest version=\"1.0\" type=\"device\">"
327 " <hal format=\"native\">"
328 " <name>foo</name>"
329 " <version>1.0</version>"
330 " </hal>"
331 "</manifest>"))
332 << gHalManifestConverter.lastError();
333 EXPECT_FALSE(gHalManifestConverter(&vm,
334 "<manifest version=\"1.0\" type=\"device\">"
335 " <hal format=\"native\">"
336 " <name>foo</name>"
337 " <version>1.0</version>"
338 " <transport>hwbinder</transport>"
339 " </hal>"
340 "</manifest>"));
341 EXPECT_TRUE(gHalManifestConverter.lastError().find(
342 "Native HAL 'foo' should not have <transport> defined") != std::string::npos);
343}
344
Yifan Hong79dcc1f2017-05-22 14:35:19 -0700345TEST_F(LibVintfTest, HalManifestDuplicate) {
346 HalManifest vm;
347 EXPECT_FALSE(gHalManifestConverter(&vm,
348 "<manifest version=\"1.0\" type=\"device\">"
349 " <hal>"
350 " <name>android.hidl.manager</name>"
351 " <transport>hwbinder</transport>"
352 " <version>1.0</version>"
353 " <version>1.1</version>"
354 " </hal>"
355 "</manifest>"))
356 << "Should not allow duplicated major version in <hal>";
357 EXPECT_FALSE(gHalManifestConverter(&vm,
358 "<manifest version=\"1.0\" type=\"device\">"
359 " <hal>"
360 " <name>android.hidl.manager</name>"
361 " <transport>hwbinder</transport>"
362 " <version>1.0</version>"
363 " </hal>"
364 " <hal>"
365 " <name>android.hidl.manager</name>"
366 " <transport arch=\"32+64\">passthrough</transport>"
367 " <version>1.1</version>"
368 " </hal>"
369 "</manifest>"))
370 << "Should not allow duplicated major version across <hal>";
371}
372
373TEST_F(LibVintfTest, HalManifestGetTransport) {
374 HalManifest vm;
375 EXPECT_TRUE(gHalManifestConverter(&vm,
376 "<manifest version=\"1.0\" type=\"device\">"
377 " <hal>"
378 " <name>android.hidl.manager</name>"
379 " <transport>hwbinder</transport>"
380 " <version>1.0</version>"
381 " <interface>"
382 " <name>IServiceManager</name>"
383 " <instance>default</instance>"
384 " </interface>"
385 " </hal>"
386 " <hal>"
387 " <name>android.hidl.manager</name>"
388 " <transport arch=\"32+64\">passthrough</transport>"
389 " <version>2.1</version>"
390 " <interface>"
391 " <name>IServiceManager</name>"
392 " <instance>default</instance>"
393 " </interface>"
394 " </hal>"
395 "</manifest>"));
396 EXPECT_EQ(Transport::PASSTHROUGH,
397 vm.getTransport("android.hidl.manager", {2, 1}, "IServiceManager", "default"));
398 EXPECT_EQ(Transport::PASSTHROUGH,
399 vm.getTransport("android.hidl.manager", {2, 0}, "IServiceManager", "default"));
400 EXPECT_EQ(Transport::EMPTY,
401 vm.getTransport("android.hidl.manager", {2, 2}, "IServiceManager", "default"));
402 EXPECT_EQ(Transport::HWBINDER,
403 vm.getTransport("android.hidl.manager", {1, 0}, "IServiceManager", "default"));
404}
405
Yifan Hongec3b9b72017-02-23 13:24:42 -0800406TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700407 HalManifest vm = testDeviceManifest();
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700408 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "ICamera"),
409 std::set<std::string>({"default", "legacy/0"}));
410 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "IBetterCamera"),
411 std::set<std::string>({"camera"}));
412 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "INotExist"),
413 std::set<std::string>({}));
414 EXPECT_EQ(vm.getInstances("android.hardware.nfc", {1, 0}, "INfc"),
415 std::set<std::string>({"default"}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800416
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700417 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "default"));
418 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "legacy/0"));
419 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "camera"));
420 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", {1, 0}, "INfc", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800421
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700422 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "INotExist", "default"));
423 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "notexist"));
424 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "default"));
425 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "INotExist", "notexist"));
426 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", {1, 0}, "INfc", "notexist"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800427}
428
Yifan Hong676447a2016-11-15 12:57:23 -0800429TEST_F(LibVintfTest, VersionConverter) {
430 Version v(3, 6);
431 std::string xml = gVersionConverter(v);
432 EXPECT_EQ(xml, "<version>3.6</version>\n");
433 Version v2;
434 EXPECT_TRUE(gVersionConverter(&v2, xml));
435 EXPECT_EQ(v, v2);
436}
437
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700438static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
439 std::string name{intf.name};
440 return map->emplace(std::move(name), std::move(intf)).second;
441}
442
Yifan Hong676447a2016-11-15 12:57:23 -0800443TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800444 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800445 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700446 false /* optional */, {}};
447 EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
448 EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800449 std::string xml = gMatrixHalConverter(mh);
450 EXPECT_EQ(xml,
451 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800452 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800453 " <version>1.2-3</version>\n"
454 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700455 " <interface>\n"
456 " <name>IBetterCamera</name>\n"
457 " <instance>default</instance>\n"
458 " <instance>great</instance>\n"
459 " </interface>\n"
460 " <interface>\n"
461 " <name>ICamera</name>\n"
462 " <instance>default</instance>\n"
463 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800464 "</hal>\n");
465 MatrixHal mh2;
466 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
467 EXPECT_EQ(mh, mh2);
468}
469
Yifan Hong3f5489a2017-02-08 11:14:21 -0800470TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
471
472 KernelConfigTypedValue converted;
473
474 auto testOne = [] (const KernelConfigTypedValue &original,
475 const std::string &expectXml) {
476 std::string xml;
477 KernelConfigTypedValue converted;
478 xml = gKernelConfigTypedValueConverter(original);
479 EXPECT_EQ(xml, expectXml);
480 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
481 EXPECT_EQ(original, converted);
482 };
483
484 auto testParse = [] (const KernelConfigTypedValue &original,
485 const std::string &xml) {
486 KernelConfigTypedValue converted;
487 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
488 EXPECT_EQ(original, converted);
489 };
490
491 testOne(KernelConfigTypedValue("stringvalue"),
492 "<value type=\"string\">stringvalue</value>\n");
493 testOne(KernelConfigTypedValue(""),
494 "<value type=\"string\"></value>\n");
495
496 testOne(KernelConfigTypedValue(Tristate::YES),
497 "<value type=\"tristate\">y</value>\n");
498 testOne(KernelConfigTypedValue(Tristate::NO),
499 "<value type=\"tristate\">n</value>\n");
500 testOne(KernelConfigTypedValue(Tristate::MODULE),
501 "<value type=\"tristate\">m</value>\n");
502 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
503 "<value type=\"tristate\">q</value>\n"));
504
505 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
506 "<value type=\"range\">4-20</value>\n");
507 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
508 "<value type=\"range\">0-18446744073709551615</value>\n");
509 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
510 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
511
512 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
513 "<value type=\"int\">-18446744073709551616</value>\n"));
514
515 testOne(KernelConfigTypedValue(INT64_MIN),
516 "<value type=\"int\">-9223372036854775808</value>\n");
517 testParse(KernelConfigTypedValue(INT64_MIN),
518 "<value type=\"int\">0x8000000000000000</value>\n");
519 testParse(KernelConfigTypedValue(INT64_MIN),
520 "<value type=\"int\">-0X8000000000000000</value>\n");
521
522 testParse(KernelConfigTypedValue(INT64_MIN + 1),
523 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
524
525 testParse(KernelConfigTypedValue(-0x50),
526 "<value type=\"int\">-0x50</value>\n");
527
528 testOne(KernelConfigTypedValue(0),
529 "<value type=\"int\">0</value>\n");
530
531 // Truncation for underflow.
532 testParse(KernelConfigTypedValue(1),
533 "<value type=\"int\">-0xffffffffffffffff</value>\n");
534 testParse(KernelConfigTypedValue(1),
535 "<value type=\"int\">-18446744073709551615</value>\n");
536
537 testOne(KernelConfigTypedValue(INT64_MAX),
538 "<value type=\"int\">9223372036854775807</value>\n");
539 testParse(KernelConfigTypedValue(INT64_MAX),
540 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
541 // Truncation for underflow.
542 testParse(KernelConfigTypedValue(INT64_MAX),
543 "<value type=\"int\">-9223372036854775809</value>\n");
544
545 testParse(KernelConfigTypedValue(-1),
546 "<value type=\"int\">18446744073709551615</value>\n");
547 testParse(KernelConfigTypedValue(-1),
548 "<value type=\"int\">0xffffffffffffffff</value>\n");
549
550 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
551 "<value type=\"int\">18446744073709551616</value>\n"));
552}
553
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700554TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
Yifan Hong676447a2016-11-15 12:57:23 -0800555 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800556 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800557 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700558 false /* optional */, testHalInterfaces()}));
Yifan Honga9993572017-01-24 19:33:15 -0800559 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800560 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700561 true /* optional */, testHalInterfaces()}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800562 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
563 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
564 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
565 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700566 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700567 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800568 std::string xml = gCompatibilityMatrixConverter(cm);
569 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700570 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800571 " <hal format=\"native\" optional=\"false\">\n"
572 " <name>android.hardware.camera</name>\n"
573 " <version>1.2-3</version>\n"
574 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700575 " <interface>\n"
576 " <name>IFoo</name>\n"
577 " <instance>default</instance>\n"
578 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800579 " </hal>\n"
580 " <hal format=\"native\" optional=\"true\">\n"
581 " <name>android.hardware.nfc</name>\n"
582 " <version>4.5-6</version>\n"
583 " <version>10.11-12</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700584 " <interface>\n"
585 " <name>IFoo</name>\n"
586 " <instance>default</instance>\n"
587 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800588 " </hal>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800589 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800590 " <config>\n"
591 " <key>CONFIG_FOO</key>\n"
592 " <value type=\"tristate\">y</value>\n"
593 " </config>\n"
594 " <config>\n"
595 " <key>CONFIG_BAR</key>\n"
596 " <value type=\"string\">stringvalue</value>\n"
597 " </config>\n"
598 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800599 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800600 " <config>\n"
601 " <key>CONFIG_BAZ</key>\n"
602 " <value type=\"int\">20</value>\n"
603 " </config>\n"
604 " <config>\n"
605 " <key>CONFIG_BAR</key>\n"
606 " <value type=\"range\">3-5</value>\n"
607 " </config>\n"
608 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800609 " <sepolicy>\n"
610 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700611 " <sepolicy-version>25.0</sepolicy-version>\n"
612 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800613 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700614 " <avb>\n"
615 " <vbmeta-version>2.1</vbmeta-version>\n"
616 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800617 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800618 CompatibilityMatrix cm2;
619 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700620 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800621}
622
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700623TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
624 CompatibilityMatrix cm;
625 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
626 {{VersionRange(1,0)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700627 false /* optional */, testHalInterfaces()}));
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700628 set(cm, SchemaType::DEVICE);
629 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
630 std::string xml = gCompatibilityMatrixConverter(cm);
631 EXPECT_EQ(xml,
632 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
633 " <hal format=\"native\" optional=\"false\">\n"
634 " <name>android.hidl.manager</name>\n"
635 " <version>1.0</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700636 " <interface>\n"
637 " <name>IFoo</name>\n"
638 " <instance>default</instance>\n"
639 " </interface>\n"
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700640 " </hal>\n"
641 " <vndk>\n"
642 " <version>25.0.1-5</version>\n"
643 " <library>libbase.so</library>\n"
644 " <library>libjpeg.so</library>\n"
645 " </vndk>\n"
646 "</compatibility-matrix>\n");
647 CompatibilityMatrix cm2;
648 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
649 EXPECT_EQ(cm, cm2);
650}
651
Yifan Hong676447a2016-11-15 12:57:23 -0800652TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800653 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800654
Yifan Hong2059ffc2017-02-24 11:32:02 -0800655 ManifestHal invalidHal{
656 .format = HalFormat::HIDL,
657 .name = "android.hardware.camera",
658 .versions = {{Version(2, 0), Version(2, 1)}},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800659 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64}
Yifan Hong2059ffc2017-02-24 11:32:02 -0800660 };
661
Yifan Hong5a06ef72017-01-24 19:54:24 -0800662 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800663 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800664 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800665}
666
Tri Vod0143942017-03-24 17:51:23 -0700667TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700668 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700669 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
670 {"android.hardware.camera", "android.hardware.nfc"}));
671}
672
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700673TEST_F(LibVintfTest, HalManifestGetAllHals) {
Yifan Honga04e1472017-04-05 13:15:34 -0700674 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700675 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
676 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800677
678 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
679 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800680 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800681 EXPECT_EQ(hal.name, arr[i++]);
682 }
683}
684
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700685TEST_F(LibVintfTest, HalManifestGetHals) {
686 HalManifest vm;
687 EXPECT_TRUE(
688 add(vm, ManifestHal{.format = HalFormat::HIDL,
689 .name = "android.hardware.camera",
690 .versions = {Version(1, 2)},
691 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
692 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
693 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}}));
694 EXPECT_TRUE(
695 add(vm, ManifestHal{.format = HalFormat::HIDL,
696 .name = "android.hardware.camera",
697 .versions = {Version(2, 0)},
698 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
699 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
700 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}}));
701 EXPECT_TRUE(add(vm, ManifestHal{.format = HalFormat::HIDL,
702 .name = "android.hardware.nfc",
703 .versions = {Version(1, 0), Version(2, 1)},
704 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
705 .interfaces = {{"INfc", {"INfc", {"default"}}}}}));
706 ManifestHal expectedCameraHalV1_2 =
707 ManifestHal{.format = HalFormat::HIDL,
708 .name = "android.hardware.camera",
709 .versions = {Version(1, 2)},
710 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
711 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
712 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}};
713 ManifestHal expectedCameraHalV2_0 =
714 ManifestHal{.format = HalFormat::HIDL,
715 .name = "android.hardware.camera",
716 .versions = {Version(2, 0)},
717 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
718 .interfaces = {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
719 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}};
720 ManifestHal expectedNfcHal =
721 ManifestHal{.format = HalFormat::HIDL,
722 .name = "android.hardware.nfc",
723 .versions = {Version(1, 0), Version(2, 1)},
724 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
725 .interfaces = {{"INfc", {"INfc", {"default"}}}}};
726 auto cameraHals = vm.getHals("android.hardware.camera");
727 EXPECT_EQ((int)cameraHals.size(), 2);
728 EXPECT_EQ(*cameraHals[0], expectedCameraHalV1_2);
729 EXPECT_EQ(*cameraHals[1], expectedCameraHalV2_0);
730 auto nfcHals = vm.getHals("android.hardware.nfc");
731 EXPECT_EQ((int)nfcHals.size(), 1);
732 EXPECT_EQ(*nfcHals[0], expectedNfcHal);
733
734 EXPECT_EQ(*vm.getHal("android.hardware.camera", {1, 1}), expectedCameraHalV1_2);
735 EXPECT_EQ(*vm.getHal("android.hardware.camera", {2, 0}), expectedCameraHalV2_0);
736 EXPECT_EQ(*vm.getHal("android.hardware.nfc", {1, 0}), expectedNfcHal);
737 EXPECT_EQ(*vm.getHal("android.hardware.nfc", {2, 0}), expectedNfcHal);
738 EXPECT_EQ(*vm.getHal("android.hardware.nfc", {2, 1}), expectedNfcHal);
739
740 EXPECT_EQ(vm.getHal("non-existent", {1, 0}), nullptr);
741 EXPECT_EQ(vm.getHal("android.hardware.camera", {2, 1}), nullptr);
742 EXPECT_EQ(vm.getHal("android.hardware.camera", {1, 3}), nullptr);
743 EXPECT_EQ(vm.getHal("android.hardware.nfc", {1, 1}), nullptr);
744 EXPECT_EQ(vm.getHal("android.hardware.nfc", {3, 0}), nullptr);
745}
746
747TEST_F(LibVintfTest, CompatibilityMatrixGetHals) {
748 CompatibilityMatrix cm;
749 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
750 "android.hardware.camera",
751 {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
752 false /* optional */,
753 testHalInterfaces()}));
754 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
755 "android.hardware.nfc",
756 {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
757 true /* optional */,
758 testHalInterfaces()}));
759
760 MatrixHal expectedCameraHal = MatrixHal{
761 HalFormat::NATIVE,
762 "android.hardware.camera",
763 {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
764 false /* optional */,
765 testHalInterfaces(),
766 };
767 MatrixHal expectedNfcHal = MatrixHal{HalFormat::NATIVE,
768 "android.hardware.nfc",
769 {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
770 true /* optional */,
771 testHalInterfaces()};
772 auto cameraHals = cm.getHals("android.hardware.camera");
773 EXPECT_EQ((int)cameraHals.size(), 1);
774 EXPECT_EQ(*cameraHals[0], expectedCameraHal);
775 auto nfcHals = cm.getHals("android.hardware.nfc");
776 EXPECT_EQ((int)nfcHals.size(), 1);
777 EXPECT_EQ(*nfcHals[0], expectedNfcHal);
778
779 EXPECT_EQ(*cm.getHal("android.hardware.camera", {1, 2}), expectedCameraHal);
780 EXPECT_EQ(*cm.getHal("android.hardware.camera", {1, 3}), expectedCameraHal);
781 EXPECT_EQ(*cm.getHal("android.hardware.camera", {4, 5}), expectedCameraHal);
782 EXPECT_EQ(*cm.getHal("android.hardware.nfc", {4, 5}), expectedNfcHal);
783 EXPECT_EQ(*cm.getHal("android.hardware.nfc", {10, 12}), expectedNfcHal);
784
785 EXPECT_EQ(cm.getHal("non-existent", {1, 0}), nullptr);
786 EXPECT_EQ(cm.getHal("android.hardware.camera", {2, 1}), nullptr);
787 EXPECT_EQ(cm.getHal("android.hardware.camera", {1, 0}), nullptr);
788 EXPECT_EQ(cm.getHal("android.hardware.nfc", {3, 0}), nullptr);
789 EXPECT_EQ(cm.getHal("android.hardware.nfc", {4, 7}), nullptr);
790}
791
Yifan Honga7201e72017-02-17 10:09:59 -0800792TEST_F(LibVintfTest, RuntimeInfo) {
793 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800794 using KernelConfigs = std::vector<KernelConfig>;
795 const KernelConfigs configs {
796 KernelConfig{"CONFIG_64BIT", Tristate::YES},
797 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
798 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
799 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
800 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
801 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
802 };
803
804 auto testMatrix = [&] (MatrixKernel &&kernel) {
805 CompatibilityMatrix cm;
806 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700807 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700808 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800809 return cm;
810 };
811
812 std::string error;
813
814 {
815 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
816 CompatibilityMatrix cm = testMatrix(std::move(kernel));
817 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
818 }
819
820 {
Yifan Hong5f996502017-08-23 14:46:44 -0700821 MatrixKernel kernel(KernelVersion{3, 18, 60}, KernelConfigs(configs));
822 CompatibilityMatrix cm = testMatrix(std::move(kernel));
823 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
824 }
825
826 {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800827 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
828 CompatibilityMatrix cm = testMatrix(std::move(kernel));
829 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
830 }
831
832 {
833 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
834 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700835 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800836 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
837 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700838 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800839 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
840 << "kernel-sepolicy-version shouldn't match";
841 }
842
843 {
844 KernelConfigs newConfigs(configs);
845 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
846 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
847 CompatibilityMatrix cm = testMatrix(std::move(kernel));
848 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
849 }
850
851 {
852 KernelConfigs newConfigs(configs);
853 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
854 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
855 CompatibilityMatrix cm = testMatrix(std::move(kernel));
856 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
857 }
858
859 {
860 KernelConfigs newConfigs(configs);
861 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
862 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
863 CompatibilityMatrix cm = testMatrix(std::move(kernel));
864 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
865 }
866
867 {
868 KernelConfigs newConfigs(configs);
869 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
870 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
871 CompatibilityMatrix cm = testMatrix(std::move(kernel));
872 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
873 }
874
875 {
876 KernelConfigs newConfigs(configs);
877 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
878 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
879 CompatibilityMatrix cm = testMatrix(std::move(kernel));
880 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
881 }
Yifan Hongdb6423e2017-09-11 14:38:46 -0700882
Yifan Hongf3029302017-04-12 17:23:49 -0700883 RuntimeInfo badAvb = testRuntimeInfo();
884 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
885 {
886 setAvb(badAvb, {1, 0}, {2, 1});
887 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
Michael Schwartz5cfbc922017-05-08 14:06:49 -0700888 EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
Yifan Hongf3029302017-04-12 17:23:49 -0700889 }
890 {
891 setAvb(badAvb, {2, 1}, {3, 0});
892 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
893 }
894 {
895 setAvb(badAvb, {2, 1}, {2, 3});
896 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
897 }
898 {
899 setAvb(badAvb, {2, 3}, {2, 1});
900 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
901 }
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800902}
903
Yifan Hong19e0a2a2017-04-14 17:30:53 -0700904TEST_F(LibVintfTest, MissingAvb) {
905 std::string xml =
906 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
907 " <kernel version=\"3.18.31\"></kernel>"
908 " <sepolicy>\n"
909 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
910 " <sepolicy-version>25.5</sepolicy-version>\n"
911 " </sepolicy>\n"
912 "</compatibility-matrix>\n";
913 CompatibilityMatrix cm;
914 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
915 EXPECT_EQ(getAvb(cm), Version(0, 0));
916}
917
Yifan Hongdb6423e2017-09-11 14:38:46 -0700918TEST_F(LibVintfTest, DisableAvb) {
919 std::string xml =
920 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
921 " <kernel version=\"3.18.31\"></kernel>"
922 " <sepolicy>\n"
923 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
924 " <sepolicy-version>25.5</sepolicy-version>\n"
925 " </sepolicy>\n"
926 " <avb>\n"
927 " <vbmeta-version>1.0</vbmeta-version>\n"
928 " </avb>\n"
929 "</compatibility-matrix>\n";
930 CompatibilityMatrix cm;
931 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
932 RuntimeInfo ki = testRuntimeInfo();
933 std::string error;
934 EXPECT_FALSE(ki.checkCompatibility(cm, &error));
935 EXPECT_STREQ(error.c_str(), "AVB version 2.1 does not match framework matrix 1.0");
936 EXPECT_TRUE(ki.checkCompatibility(cm, &error, DISABLE_AVB_CHECK)) << error;
937}
938
Yifan Hong08e984c2017-05-18 12:50:04 -0700939// This is the test extracted from VINTF Object doc
940TEST_F(LibVintfTest, HalCompat) {
941 CompatibilityMatrix matrix;
942 std::string error;
943
944 std::string matrixXml =
945 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
946 " <hal format=\"hidl\" optional=\"false\">\n"
947 " <name>android.hardware.foo</name>\n"
948 " <version>1.0</version>\n"
949 " <version>3.1-2</version>\n"
950 " <interface>\n"
951 " <name>IFoo</name>\n"
952 " <instance>default</instance>\n"
953 " <instance>specific</instance>\n"
954 " </interface>\n"
955 " </hal>\n"
956 " <hal format=\"hidl\" optional=\"false\">\n"
957 " <name>android.hardware.foo</name>\n"
958 " <version>2.0</version>\n"
959 " <interface>\n"
960 " <name>IBar</name>\n"
961 " <instance>default</instance>\n"
962 " </interface>\n"
963 " </hal>\n"
964 " <sepolicy>\n"
965 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
966 " <sepolicy-version>25.5</sepolicy-version>\n"
967 " </sepolicy>\n"
968 "</compatibility-matrix>\n";
969 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
970 << gCompatibilityMatrixConverter.lastError();
971
972 {
973 std::string manifestXml =
974 "<manifest version=\"1.0\" type=\"device\">\n"
975 " <hal format=\"hidl\">\n"
976 " <name>android.hardware.foo</name>\n"
977 " <transport>hwbinder</transport>\n"
978 " <version>1.0</version>\n"
979 " <interface>\n"
980 " <name>IFoo</name>\n"
981 " <instance>default</instance>\n"
982 " <instance>specific</instance>\n"
983 " </interface>\n"
984 " </hal>\n"
985 " <hal format=\"hidl\">\n"
986 " <name>android.hardware.foo</name>\n"
987 " <transport>hwbinder</transport>\n"
988 " <version>2.0</version>\n"
989 " <interface>\n"
990 " <name>IBar</name>\n"
991 " <instance>default</instance>\n"
992 " </interface>\n"
993 " </hal>\n"
994 " <sepolicy>\n"
995 " <version>25.5</version>\n"
996 " </sepolicy>\n"
997 "</manifest>\n";
998
999 HalManifest manifest;
1000 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1001 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1002 }
1003
1004 {
1005 std::string manifestXml =
1006 "<manifest version=\"1.0\" type=\"device\">\n"
1007 " <hal format=\"hidl\">\n"
1008 " <name>android.hardware.foo</name>\n"
1009 " <transport>hwbinder</transport>\n"
1010 " <version>1.0</version>\n"
1011 " <interface>\n"
1012 " <name>IFoo</name>\n"
1013 " <instance>default</instance>\n"
1014 " <instance>specific</instance>\n"
1015 " </interface>\n"
1016 " </hal>\n"
1017 " <sepolicy>\n"
1018 " <version>25.5</version>\n"
1019 " </sepolicy>\n"
1020 "</manifest>\n";
1021 HalManifest manifest;
1022 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1023 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1024 << "should not be compatible because IBar is missing";
1025 }
1026
1027 {
1028 std::string manifestXml =
1029 "<manifest version=\"1.0\" type=\"device\">\n"
1030 " <hal format=\"hidl\">\n"
1031 " <name>android.hardware.foo</name>\n"
1032 " <transport>hwbinder</transport>\n"
1033 " <version>1.0</version>\n"
1034 " <interface>\n"
1035 " <name>IFoo</name>\n"
1036 " <instance>default</instance>\n"
1037 " </interface>\n"
1038 " </hal>\n"
1039 " <hal format=\"hidl\">\n"
1040 " <name>android.hardware.foo</name>\n"
1041 " <transport>hwbinder</transport>\n"
1042 " <version>2.0</version>\n"
1043 " <interface>\n"
1044 " <name>IBar</name>\n"
1045 " <instance>default</instance>\n"
1046 " </interface>\n"
1047 " </hal>\n"
1048 " <sepolicy>\n"
1049 " <version>25.5</version>\n"
1050 " </sepolicy>\n"
1051 "</manifest>\n";
1052 HalManifest manifest;
1053 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1054 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1055 << "should not be compatible because IFoo/default is missing";
1056 }
1057
1058 {
1059 std::string manifestXml =
1060 "<manifest version=\"1.0\" type=\"device\">\n"
1061 " <hal format=\"hidl\">\n"
1062 " <name>android.hardware.foo</name>\n"
1063 " <transport>hwbinder</transport>\n"
1064 " <version>3.3</version>\n"
1065 " <interface>\n"
1066 " <name>IFoo</name>\n"
1067 " <instance>default</instance>\n"
1068 " <instance>specific</instance>\n"
1069 " </interface>\n"
1070 " </hal>\n"
1071 " <hal format=\"hidl\">\n"
1072 " <name>android.hardware.foo</name>\n"
1073 " <transport>hwbinder</transport>\n"
1074 " <version>2.0</version>\n"
1075 " <interface>\n"
1076 " <name>IBar</name>\n"
1077 " <instance>default</instance>\n"
1078 " </interface>\n"
1079 " </hal>\n"
1080 " <sepolicy>\n"
1081 " <version>25.5</version>\n"
1082 " </sepolicy>\n"
1083 "</manifest>\n";
1084 HalManifest manifest;
1085 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1086 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1087 }
1088
1089 {
1090 std::string manifestXml =
1091 "<manifest version=\"1.0\" type=\"device\">\n"
1092 " <hal format=\"hidl\">\n"
1093 " <name>android.hardware.foo</name>\n"
1094 " <transport>hwbinder</transport>\n"
1095 " <version>1.0</version>\n"
1096 " <interface>\n"
1097 " <name>IFoo</name>\n"
1098 " <instance>default</instance>\n"
1099 " </interface>\n"
1100 " </hal>\n"
1101 " <hal format=\"hidl\">\n"
1102 " <name>android.hardware.foo</name>\n"
1103 " <transport>hwbinder</transport>\n"
1104 " <version>3.2</version>\n"
1105 " <interface>\n"
1106 " <name>IFoo</name>\n"
1107 " <instance>specific</instance>\n"
1108 " </interface>\n"
1109 " </hal>\n"
1110 " <hal format=\"hidl\">\n"
1111 " <name>android.hardware.foo</name>\n"
1112 " <transport>hwbinder</transport>\n"
1113 " <version>2.0</version>\n"
1114 " <interface>\n"
1115 " <name>IBar</name>\n"
1116 " <instance>default</instance>\n"
1117 " </interface>\n"
1118 " </hal>\n"
1119 " <sepolicy>\n"
1120 " <version>25.5</version>\n"
1121 " </sepolicy>\n"
1122 "</manifest>\n";
1123 HalManifest manifest;
1124 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1125 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1126 << "should not be compatible even though @1.0::IFoo/default "
1127 << "and @3.2::IFoo/specific present";
1128 }
1129
1130 {
1131 std::string manifestXml =
1132 "<manifest version=\"1.0\" type=\"device\">\n"
1133 " <hal format=\"hidl\">\n"
1134 " <name>android.hardware.foo</name>\n"
1135 " <transport>hwbinder</transport>\n"
1136 " <version>1.0</version>\n"
1137 " <interface>\n"
1138 " <name>IFoo</name>\n"
1139 " <instance>default</instance>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001140 " <instance>specific</instance>\n"
1141 " </interface>\n"
1142 " </hal>\n"
1143 " <hal format=\"hidl\">\n"
1144 " <name>android.hardware.foo</name>\n"
1145 " <transport>hwbinder</transport>\n"
1146 " <version>2.0</version>\n"
1147 " <interface>\n"
1148 " <name>IBar</name>\n"
1149 " <instance>default</instance>\n"
1150 " </interface>\n"
1151 " </hal>\n"
1152 " <sepolicy>\n"
1153 " <version>25.5</version>\n"
1154 " </sepolicy>\n"
1155 "</manifest>\n";
1156 HalManifest manifest;
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001157 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml))
1158 << gHalManifestConverter.lastError();
1159 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
Yifan Hong08e984c2017-05-18 12:50:04 -07001160 }
1161}
1162
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001163TEST_F(LibVintfTest, Compat) {
1164 std::string manifestXml =
1165 "<manifest version=\"1.0\" type=\"device\">\n"
1166 " <hal format=\"hidl\">\n"
1167 " <name>android.hardware.camera</name>\n"
1168 " <transport>hwbinder</transport>\n"
1169 " <version>3.5</version>\n"
1170 " <interface>\n"
1171 " <name>IBetterCamera</name>\n"
1172 " <instance>camera</instance>\n"
1173 " </interface>\n"
1174 " <interface>\n"
1175 " <name>ICamera</name>\n"
1176 " <instance>default</instance>\n"
1177 " <instance>legacy/0</instance>\n"
1178 " </interface>\n"
1179 " </hal>\n"
1180 " <hal format=\"hidl\">\n"
1181 " <name>android.hardware.nfc</name>\n"
1182 " <transport>hwbinder</transport>\n"
1183 " <version>1.0</version>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001184 " <interface>\n"
1185 " <name>INfc</name>\n"
1186 " <instance>nfc_nci</instance>\n"
1187 " </interface>\n"
1188 " </hal>\n"
1189 " <hal format=\"hidl\">\n"
1190 " <name>android.hardware.nfc</name>\n"
1191 " <transport>hwbinder</transport>\n"
1192 " <version>2.0</version>\n"
1193 " <interface>\n"
1194 " <name>INfc</name>\n"
1195 " <instance>default</instance>\n"
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001196 " <instance>nfc_nci</instance>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001197 " </interface>\n"
1198 " </hal>\n"
1199 " <sepolicy>\n"
1200 " <version>25.5</version>\n"
1201 " </sepolicy>\n"
1202 "</manifest>\n";
1203
1204 std::string matrixXml =
1205 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1206 " <hal format=\"hidl\" optional=\"false\">\n"
1207 " <name>android.hardware.camera</name>\n"
1208 " <version>2.0-5</version>\n"
1209 " <version>3.4-16</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001210 " <interface>\n"
1211 " <name>IBetterCamera</name>\n"
1212 " <instance>camera</instance>\n"
1213 " </interface>\n"
1214 " <interface>\n"
1215 " <name>ICamera</name>\n"
1216 " <instance>default</instance>\n"
1217 " <instance>legacy/0</instance>\n"
1218 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001219 " </hal>\n"
1220 " <hal format=\"hidl\" optional=\"false\">\n"
1221 " <name>android.hardware.nfc</name>\n"
1222 " <version>1.0</version>\n"
1223 " <version>2.0</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001224 " <interface>\n"
1225 " <name>INfc</name>\n"
1226 " <instance>nfc_nci</instance>\n"
1227 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001228 " </hal>\n"
1229 " <hal format=\"hidl\" optional=\"true\">\n"
1230 " <name>android.hardware.foo</name>\n"
1231 " <version>1.0</version>\n"
1232 " </hal>\n"
1233 " <sepolicy>\n"
1234 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1235 " <sepolicy-version>25.5</sepolicy-version>\n"
1236 " <sepolicy-version>26.0-3</sepolicy-version>\n"
1237 " </sepolicy>\n"
1238 " <avb>\n"
1239 " <vbmeta-version>2.1</vbmeta-version>\n"
1240 " </avb>\n"
1241 "</compatibility-matrix>\n";
1242
1243 HalManifest manifest;
1244 CompatibilityMatrix matrix;
1245 std::string error;
1246 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1247 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1248 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1249
1250 // some smaller test cases
1251 matrixXml =
1252 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1253 " <hal format=\"hidl\" optional=\"false\">\n"
1254 " <name>android.hardware.camera</name>\n"
1255 " <version>3.4</version>\n"
1256 " </hal>\n"
1257 " <sepolicy>\n"
1258 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1259 " <sepolicy-version>25.5</sepolicy-version>\n"
1260 " </sepolicy>\n"
1261 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1262 "</compatibility-matrix>\n";
1263 matrix = {};
1264 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1265 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1266 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
1267 EXPECT_NE(camera, nullptr);
1268 camera->versionRanges[0] = {3, 5};
1269 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1270 camera->versionRanges[0] = {3, 6};
1271 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1272
1273 // reset it
1274 matrix = {};
1275 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1276 set(matrix, Sepolicy{30, {{26, 0}}});
1277 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1278 set(matrix, Sepolicy{30, {{25, 6}}});
1279 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1280 set(matrix, Sepolicy{30, {{25, 4}}});
1281 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1282}
1283
Yifan Hongd4857902017-06-13 14:13:56 -07001284/////////////////// xmlfile tests
1285
1286TEST_F(LibVintfTest, HalManifestConverterXmlFile) {
1287 HalManifest vm = testDeviceManifestWithXmlFile();
1288 std::string xml = gHalManifestConverter(vm);
1289 EXPECT_EQ(xml,
1290 "<manifest version=\"1.0\" type=\"device\">\n"
1291 " <hal format=\"hidl\">\n"
1292 " <name>android.hardware.camera</name>\n"
1293 " <transport>hwbinder</transport>\n"
1294 " <version>2.0</version>\n"
1295 " <interface>\n"
1296 " <name>IBetterCamera</name>\n"
1297 " <instance>camera</instance>\n"
1298 " </interface>\n"
1299 " <interface>\n"
1300 " <name>ICamera</name>\n"
1301 " <instance>default</instance>\n"
1302 " <instance>legacy/0</instance>\n"
1303 " </interface>\n"
1304 " </hal>\n"
1305 " <hal format=\"hidl\">\n"
1306 " <name>android.hardware.nfc</name>\n"
1307 " <transport arch=\"32+64\">passthrough</transport>\n"
1308 " <version>1.0</version>\n"
1309 " <interface>\n"
1310 " <name>INfc</name>\n"
1311 " <instance>default</instance>\n"
1312 " </interface>\n"
1313 " </hal>\n"
1314 " <sepolicy>\n"
1315 " <version>25.0</version>\n"
1316 " </sepolicy>\n"
1317 " <xmlfile>\n"
1318 " <name>media_profile</name>\n"
1319 " <version>1.0</version>\n"
1320 " </xmlfile>\n"
1321 "</manifest>\n");
1322 HalManifest vm2;
1323 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
1324 EXPECT_EQ(vm, vm2);
1325}
1326
1327TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile) {
1328 CompatibilityMatrix cm;
1329 addXmlFile(cm, "media_profile", {1, 0});
1330 std::string xml = gCompatibilityMatrixConverter(cm);
1331 EXPECT_EQ(xml,
1332 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1333 " <sepolicy>\n"
1334 " <kernel-sepolicy-version>0</kernel-sepolicy-version>\n"
1335 " </sepolicy>\n"
1336 " <avb>\n"
1337 " <vbmeta-version>0.0</vbmeta-version>\n"
1338 " </avb>\n"
1339 " <xmlfile format=\"dtd\" optional=\"true\">\n"
1340 " <name>media_profile</name>\n"
1341 " <version>1.0</version>\n"
1342 " </xmlfile>\n"
1343 "</compatibility-matrix>\n");
1344 CompatibilityMatrix cm2;
1345 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
1346 EXPECT_EQ(cm, cm2);
1347}
1348
1349TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile2) {
1350 std::string xml =
1351 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1352 " <xmlfile format=\"dtd\" optional=\"false\">\n"
1353 " <name>media_profile</name>\n"
1354 " <version>1.0</version>\n"
1355 " </xmlfile>\n"
1356 "</compatibility-matrix>\n";
1357 CompatibilityMatrix cm;
1358 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml));
1359 EXPECT_EQ(
1360 "compatibility-matrix.xmlfile entry media_profile has to be optional for "
1361 "compatibility matrix version 1.0",
1362 gCompatibilityMatrixConverter.lastError());
1363}
1364
Yifan Hongbbfff302017-06-06 17:10:13 -07001365TEST_F(LibVintfTest, ManifestXmlFilePathDevice) {
1366 std::string manifestXml =
1367 "<manifest version=\"1.0\" type=\"device\">"
1368 " <xmlfile>"
1369 " <name>media_profile</name>"
1370 " <version>1.0</version>"
1371 " </xmlfile>"
1372 "</manifest>";
1373 HalManifest manifest;
1374 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1375 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1376 "/vendor/etc/media_profile_V1_0.xml");
1377}
1378
1379TEST_F(LibVintfTest, ManifestXmlFilePathFramework) {
1380 std::string manifestXml =
1381 "<manifest version=\"1.0\" type=\"framework\">"
1382 " <xmlfile>"
1383 " <name>media_profile</name>"
1384 " <version>1.0</version>"
1385 " </xmlfile>"
1386 "</manifest>";
1387 HalManifest manifest;
1388 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1389 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1390 "/system/etc/media_profile_V1_0.xml");
1391}
1392
1393TEST_F(LibVintfTest, ManifestXmlFilePathOverride) {
1394 std::string manifestXml =
1395 "<manifest version=\"1.0\" type=\"device\">"
1396 " <xmlfile>"
1397 " <name>media_profile</name>"
1398 " <version>1.0</version>"
1399 " <path>/vendor/etc/foo.xml</path>"
1400 " </xmlfile>"
1401 "</manifest>";
1402 HalManifest manifest;
1403 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1404 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "/vendor/etc/foo.xml");
1405}
1406
1407TEST_F(LibVintfTest, ManifestXmlFilePathMissing) {
1408 std::string manifestXml =
1409 "<manifest version=\"1.0\" type=\"device\">"
1410 " <xmlfile>"
1411 " <name>media_profile</name>"
1412 " <version>1.1</version>"
1413 " </xmlfile>"
1414 "</manifest>";
1415 HalManifest manifest;
1416 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1417 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "");
1418}
1419
1420TEST_F(LibVintfTest, MatrixXmlFilePathFramework) {
1421 std::string matrixXml =
1422 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1423 " <xmlfile format=\"dtd\" optional=\"true\">"
1424 " <name>media_profile</name>"
1425 " <version>2.0-1</version>"
1426 " </xmlfile>"
1427 "</compatibility-matrix>";
1428 CompatibilityMatrix matrix;
1429 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1430 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 1}),
1431 "/system/etc/media_profile_V2_1.dtd");
1432}
1433
1434TEST_F(LibVintfTest, MatrixXmlFilePathDevice) {
1435 std::string matrixXml =
1436 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1437 " <xmlfile format=\"xsd\" optional=\"true\">"
1438 " <name>media_profile</name>"
1439 " <version>2.0-1</version>"
1440 " </xmlfile>"
1441 "</compatibility-matrix>";
1442 CompatibilityMatrix matrix;
1443 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1444 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}),
1445 "/vendor/etc/media_profile_V2_1.xsd");
1446}
1447
1448TEST_F(LibVintfTest, MatrixXmlFilePathOverride) {
1449 std::string matrixXml =
1450 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1451 " <xmlfile format=\"xsd\" optional=\"true\">"
1452 " <name>media_profile</name>"
1453 " <version>2.0-1</version>"
1454 " <path>/system/etc/foo.xsd</path>"
1455 " </xmlfile>"
1456 "</compatibility-matrix>";
1457 CompatibilityMatrix matrix;
1458 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1459 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "/system/etc/foo.xsd");
1460}
1461
1462TEST_F(LibVintfTest, MatrixXmlFilePathMissing) {
1463 std::string matrixXml =
1464 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1465 " <xmlfile format=\"dtd\" optional=\"true\">"
1466 " <name>media_profile</name>"
1467 " <version>2.1</version>"
1468 " </xmlfile>"
1469 "</compatibility-matrix>";
1470 CompatibilityMatrix matrix;
1471 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1472 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "");
1473}
1474
Yifan Hong02e94002017-07-10 15:41:56 -07001475std::pair<KernelConfigParser, status_t> processData(const std::string& data, bool processComments,
1476 bool relaxedFormat = false) {
1477 KernelConfigParser parser(processComments, relaxedFormat);
Yifan Hongd8cee082017-07-05 16:06:09 -07001478 const char* p = data.c_str();
1479 size_t n = 0;
1480 size_t chunkSize;
Yifan Hong6209d172017-07-07 16:18:19 -07001481 status_t status = OK;
Yifan Hongd8cee082017-07-05 16:06:09 -07001482 for (; n < data.size(); p += chunkSize, n += chunkSize) {
1483 chunkSize = std::min<size_t>(5, data.size() - n);
Yifan Hong6209d172017-07-07 16:18:19 -07001484 if ((status = parser.process(p, chunkSize)) != OK) {
1485 break;
1486 }
Yifan Hongd8cee082017-07-05 16:06:09 -07001487 }
Yifan Hong6209d172017-07-07 16:18:19 -07001488 return {std::move(parser), status};
Yifan Hongd8cee082017-07-05 16:06:09 -07001489}
1490
1491TEST_F(LibVintfTest, KernelConfigParser) {
1492 // usage in /proc/config.gz
1493 const std::string data =
1494 "# CONFIG_NOT_SET is not set\n"
1495 "CONFIG_ONE=1\n"
1496 "CONFIG_Y=y\n"
1497 "CONFIG_STR=\"string\"\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001498 auto pair = processData(data, false /* processComments */);
1499 ASSERT_EQ(OK, pair.second) << pair.first.error();
1500 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001501
1502 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1503 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1504 EXPECT_EQ(configs.find("CONFIG_STR")->second, "\"string\"");
1505 EXPECT_EQ(configs.find("CONFIG_NOT_SET"), configs.end());
1506}
1507
1508TEST_F(LibVintfTest, KernelConfigParser2) {
1509 // usage in android-base.cfg
1510 const std::string data =
1511 "# CONFIG_NOT_SET is not set\n"
1512 "CONFIG_ONE=1\n"
1513 "CONFIG_Y=y\n"
1514 "CONFIG_STR=string\n"
1515 "# ignore_thiscomment\n"
1516 "# CONFIG_NOT_SET2 is not set\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001517 auto pair = processData(data, true /* processComments */);
1518 ASSERT_EQ(OK, pair.second) << pair.first.error();
1519 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001520
1521 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1522 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1523 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1524 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1525 EXPECT_EQ(configs.find("CONFIG_NOT_SET2")->second, "n");
1526}
1527
Yifan Hongc1889722017-07-07 16:19:52 -07001528TEST_F(LibVintfTest, KernelConfigParserSpace) {
1529 // usage in android-base.cfg
1530 const std::string data =
1531 " # CONFIG_NOT_SET is not set \n"
1532 " CONFIG_ONE=1 # 'tis a one!\n"
1533 " CONFIG_TWO=2 #'tis a two! \n"
1534 " CONFIG_THREE=3#'tis a three! \n"
1535 " CONFIG_233=233#'tis a three! \n"
1536 "#yey! random comments\n"
1537 "CONFIG_Y=y \n"
1538 " CONFIG_YES=y#YES! \n"
1539 "CONFIG_STR=string\n"
1540 "CONFIG_HELLO=hello world! #still works\n"
1541 "CONFIG_WORLD=hello world! \n"
1542 "CONFIG_GOOD = good morning! #comments here\n"
1543 " CONFIG_MORNING = good morning! \n";
Yifan Hong02e94002017-07-10 15:41:56 -07001544 auto pair = processData(data, true /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07001545 ASSERT_EQ(OK, pair.second) << pair.first.error();
1546 const auto& configs = pair.first.configs();
1547
1548 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1549 EXPECT_EQ(configs.find("CONFIG_TWO")->second, "2");
1550 EXPECT_EQ(configs.find("CONFIG_THREE")->second, "3");
1551 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1552 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1553 EXPECT_EQ(configs.find("CONFIG_HELLO")->second, "hello world!")
1554 << "Value should be \"hello world!\" without trailing spaces";
1555 EXPECT_EQ(configs.find("CONFIG_WORLD")->second, "hello world!")
1556 << "Value should be \"hello world!\" without trailing spaces";
1557 EXPECT_EQ(configs.find("CONFIG_GOOD")->second, "good morning!")
1558 << "Value should be \"good morning!\" without leading or trailing spaces";
1559 EXPECT_EQ(configs.find("CONFIG_MORNING")->second, "good morning!")
1560 << "Value should be \"good morning!\" without leading or trailing spaces";
1561 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1562}
1563
Yifan Hongd9e46432017-08-15 17:14:52 -07001564TEST_F(LibVintfTest, NetutilsWrapperMatrix) {
1565 std::string matrixXml;
1566 CompatibilityMatrix matrix;
1567
1568 matrixXml =
1569 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1570 " <hal format=\"native\" optional=\"false\">"
1571 " <name>netutils-wrapper</name>"
1572 " <version>1.0</version>"
1573 " </hal>"
1574 "</compatibility-matrix>";
1575 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
1576 << gCompatibilityMatrixConverter.lastError();
1577
1578// only host libvintf hardcodes netutils-wrapper version requirements
1579#ifdef LIBVINTF_HOST
1580
1581 matrixXml =
1582 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1583 " <hal format=\"native\" optional=\"false\">"
1584 " <name>netutils-wrapper</name>"
1585 " <version>1.0-1</version>"
1586 " </hal>"
1587 "</compatibility-matrix>";
1588 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1589 EXPECT_CONTAINS(
1590 gCompatibilityMatrixConverter.lastError(),
1591 "netutils-wrapper HAL must specify exactly one version x.0, but a range is provided. "
1592 "Perhaps you mean '1.0'?");
1593
1594 matrixXml =
1595 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1596 " <hal format=\"native\" optional=\"false\">"
1597 " <name>netutils-wrapper</name>"
1598 " <version>1.1</version>"
1599 " </hal>"
1600 "</compatibility-matrix>";
1601 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1602 EXPECT_CONTAINS(
1603 gCompatibilityMatrixConverter.lastError(),
1604 "netutils-wrapper HAL must specify exactly one version x.0, but minor version is not 0. "
1605 "Perhaps you mean '1.0'?");
1606
1607 matrixXml =
1608 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1609 " <hal format=\"native\" optional=\"false\">"
1610 " <name>netutils-wrapper</name>"
1611 " <version>1.0</version>"
1612 " <version>2.0</version>"
1613 " </hal>"
1614 "</compatibility-matrix>";
1615 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1616 EXPECT_CONTAINS(
1617 gCompatibilityMatrixConverter.lastError(),
1618 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1619 "is specified.");
1620
1621#endif // LIBVINTF_HOST
1622}
1623
1624TEST_F(LibVintfTest, NetutilsWrapperManifest) {
1625 std::string manifestXml;
1626 HalManifest manifest;
1627
1628 manifestXml =
1629 "<manifest version=\"1.0\" type=\"framework\">"
1630 " <hal format=\"native\">"
1631 " <name>netutils-wrapper</name>"
1632 " <version>1.0</version>"
1633 " <version>2.0</version>"
1634 " </hal>"
1635 "</manifest>";
1636 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml)) << gHalManifestConverter.lastError();
1637
1638// only host libvintf hardcodes netutils-wrapper version requirements
1639#ifdef LIBVINTF_HOST
1640
1641 manifestXml =
1642 "<manifest version=\"1.0\" type=\"framework\">"
1643 " <hal format=\"native\">"
1644 " <name>netutils-wrapper</name>"
1645 " <version>1.1</version>"
1646 " </hal>"
1647 "</manifest>";
1648 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1649 EXPECT_CONTAINS(
1650 gCompatibilityMatrixConverter.lastError(),
1651 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1652 "is specified.");
1653
1654 manifestXml =
1655 "<manifest version=\"1.0\" type=\"framework\">"
1656 " <hal format=\"native\">"
1657 " <name>netutils-wrapper</name>"
1658 " <version>1.0</version>"
1659 " <version>2.1</version>"
1660 " </hal>"
1661 "</manifest>";
1662 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1663 EXPECT_CONTAINS(
1664 gCompatibilityMatrixConverter.lastError(),
1665 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1666 "is specified.");
1667
1668#endif // LIBVINTF_HOST
1669}
1670
Yifan Hong5f996502017-08-23 14:46:44 -07001671TEST_F(LibVintfTest, KernelConfigConditionTest) {
1672 std::string xml =
1673 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1674 " <kernel version=\"3.18.22\"/>\n"
1675 " <kernel version=\"3.18.22\">\n"
1676 " <conditions>\n"
1677 " <config>\n"
1678 " <key>CONFIG_ARM</key>\n"
1679 " <value type=\"tristate\">y</value>\n"
1680 " </config>\n"
1681 " </conditions>\n"
1682 " <config>\n"
1683 " <key>CONFIG_FOO</key>\n"
1684 " <value type=\"tristate\">y</value>\n"
1685 " </config>\n"
1686 " </kernel>\n"
1687 " <sepolicy>\n"
1688 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1689 " <sepolicy-version>25.0</sepolicy-version>\n"
1690 " </sepolicy>\n"
1691 " <avb>\n"
1692 " <vbmeta-version>2.1</vbmeta-version>\n"
1693 " </avb>\n"
1694 "</compatibility-matrix>\n";
1695
1696 CompatibilityMatrix cm;
1697 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1698 << gCompatibilityMatrixConverter.lastError();
1699 const auto& kernels = getKernels(cm);
1700 ASSERT_GE(kernels.size(), 2u);
1701 ASSERT_TRUE(kernels[0].conditions().empty());
1702 const auto& kernel = kernels[1];
1703 const auto& cond = kernel.conditions();
1704 ASSERT_FALSE(cond.empty());
1705 EXPECT_EQ("CONFIG_ARM", cond.begin()->first);
1706 EXPECT_EQ(KernelConfigTypedValue(Tristate::YES), cond.begin()->second);
1707 EXPECT_FALSE(kernel.configs().empty());
1708
1709 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
1710}
1711
1712TEST_F(LibVintfTest, KernelConfigConditionEmptyTest) {
1713 std::string xml =
1714 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1715 " <kernel version=\"4.4.0\"/>\n"
1716 " <kernel version=\"3.18.22\">\n"
1717 " <conditions>\n"
1718 " <config>\n"
1719 " <key>CONFIG_ARM</key>\n"
1720 " <value type=\"tristate\">y</value>\n"
1721 " </config>\n"
1722 " </conditions>\n"
1723 " </kernel>\n"
1724 "</compatibility-matrix>\n";
1725
1726 CompatibilityMatrix cm;
1727 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml))
1728 << "Should not accept first kernel version with non-empty conditions";
1729 EXPECT_EQ(
1730 "First <kernel> for version 3.18 must have empty <conditions> "
1731 "for backwards compatibility.",
1732 gCompatibilityMatrixConverter.lastError());
1733}
1734
1735TEST_F(LibVintfTest, KernelConfigConditionMatch) {
1736 RuntimeInfo runtime = testRuntimeInfo();
1737 std::string error;
1738 std::string xml;
1739 CompatibilityMatrix cm;
1740
1741 xml =
1742 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1743 " <kernel version=\"3.18.22\"/>\n"
1744 " <kernel version=\"3.18.22\">\n"
1745 " <conditions>\n"
1746 " <config>\n"
1747 " <key>CONFIG_64BIT</key>\n"
1748 " <value type=\"tristate\">y</value>\n"
1749 " </config>\n"
1750 " </conditions>\n"
1751 " <config>\n"
1752 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1753 " <value type=\"int\">24</value>\n"
1754 " </config>\n"
1755 " </kernel>\n"
1756 " <sepolicy>\n"
1757 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1758 " </sepolicy>\n"
1759 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1760 "</compatibility-matrix>\n";
1761
1762 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1763 << gCompatibilityMatrixConverter.lastError();
1764 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1765
1766 xml =
1767 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1768 " <kernel version=\"3.18.22\"/>\n"
1769 " <kernel version=\"3.18.22\">\n"
1770 " <conditions>\n"
1771 " <config>\n"
1772 " <key>CONFIG_64BIT</key>\n"
1773 " <value type=\"tristate\">y</value>\n"
1774 " </config>\n"
1775 " </conditions>\n"
1776 " <config>\n"
1777 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1778 " <value type=\"int\">26</value>\n"
1779 " </config>\n"
1780 " </kernel>\n"
1781 " <sepolicy>\n"
1782 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1783 " </sepolicy>\n"
1784 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1785 "</compatibility-matrix>\n";
1786
1787 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1788 << gCompatibilityMatrixConverter.lastError();
1789 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1790 << "conditions met, so CONFIG_ARCH_MMAP_RND_BITS should not match";
1791
1792 xml =
1793 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1794 " <kernel version=\"3.18.22\"/>\n"
1795 " <kernel version=\"3.18.22\">\n"
1796 " <conditions>\n"
1797 " <config>\n"
1798 " <key>CONFIG_64BIT</key>\n"
1799 " <value type=\"tristate\">n</value>\n"
1800 " </config>\n"
1801 " </conditions>\n"
1802 " <config>\n"
1803 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1804 " <value type=\"int\">26</value>\n"
1805 " </config>\n"
1806 " </kernel>\n"
1807 " <sepolicy>\n"
1808 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1809 " </sepolicy>\n"
1810 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1811 "</compatibility-matrix>\n";
1812
1813 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1814 << gCompatibilityMatrixConverter.lastError();
1815 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1816 xml =
1817 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1818 " <kernel version=\"3.18.22\"/>\n"
1819 " <kernel version=\"3.18.22\">\n"
1820 " <conditions>\n"
1821 " <config>\n"
1822 " <key>CONFIG_64BIT</key>\n"
1823 " <value type=\"tristate\">y</value>\n"
1824 " </config>\n"
1825 " <config>\n"
1826 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1827 " <value type=\"int\">24</value>\n"
1828 " </config>\n"
1829 " </conditions>\n"
1830 " <config>\n"
1831 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1832 " <value type=\"int\">0xdead000000000000</value>\n"
1833 " </config>\n"
1834 " </kernel>\n"
1835 " <sepolicy>\n"
1836 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1837 " </sepolicy>\n"
1838 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1839 "</compatibility-matrix>\n";
1840
1841 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1842 << gCompatibilityMatrixConverter.lastError();
1843 EXPECT_TRUE(runtime.checkCompatibility(cm, &error));
1844
1845 xml =
1846 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1847 " <kernel version=\"3.18.22\"/>\n"
1848 " <kernel version=\"3.18.22\">\n"
1849 " <conditions>\n"
1850 " <config>\n"
1851 " <key>CONFIG_64BIT</key>\n"
1852 " <value type=\"tristate\">y</value>\n"
1853 " </config>\n"
1854 " <config>\n"
1855 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1856 " <value type=\"int\">24</value>\n"
1857 " </config>\n"
1858 " </conditions>\n"
1859 " <config>\n"
1860 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1861 " <value type=\"int\">0xbeaf000000000000</value>\n"
1862 " </config>\n"
1863 " </kernel>\n"
1864 " <sepolicy>\n"
1865 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1866 " </sepolicy>\n"
1867 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1868 "</compatibility-matrix>\n";
1869
1870 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1871 << gCompatibilityMatrixConverter.lastError();
1872 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1873 << "conditions have 'and' relationship, so CONFIG_ILLEGAL_POINTER_VALUE should not match";
1874
1875 xml =
1876 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1877 " <kernel version=\"3.18.22\"/>\n"
1878 " <kernel version=\"3.18.22\">\n"
1879 " <conditions>\n"
1880 " <config>\n"
1881 " <key>CONFIG_64BIT</key>\n"
1882 " <value type=\"tristate\">y</value>\n"
1883 " </config>\n"
1884 " <config>\n"
1885 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1886 " <value type=\"int\">26</value>\n"
1887 " </config>\n"
1888 " </conditions>\n"
1889 " <config>\n"
1890 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1891 " <value type=\"int\">0xbeaf000000000000</value>\n"
1892 " </config>\n"
1893 " </kernel>\n"
1894 " <sepolicy>\n"
1895 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1896 " </sepolicy>\n"
1897 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1898 "</compatibility-matrix>\n";
1899
1900 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1901 << gCompatibilityMatrixConverter.lastError();
1902 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1903
1904 xml =
1905 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1906 " <kernel version=\"3.18.22\">\n"
1907 " <config>\n"
1908 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1909 " <value type=\"string\"/>\n"
1910 " </config>\n"
1911 " </kernel>\n"
1912 " <kernel version=\"3.18.22\">\n"
1913 " <conditions>\n"
1914 " <config>\n"
1915 " <key>CONFIG_64BIT</key>\n"
1916 " <value type=\"tristate\">y</value>\n"
1917 " </config>\n"
1918 " </conditions>\n"
1919 " <config>\n"
1920 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1921 " <value type=\"int\">0xdead000000000000</value>\n"
1922 " </config>\n"
1923 " </kernel>\n"
1924 " <kernel version=\"3.18.22\">\n"
1925 " <conditions>\n"
1926 " <config>\n"
1927 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1928 " <value type=\"int\">24</value>\n"
1929 " </config>\n"
1930 " </conditions>\n"
1931 " <config>\n"
1932 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1933 " <value type=\"string\">binder,hwbinder</value>\n"
1934 " </config>\n"
1935 " </kernel>\n"
1936 " <sepolicy>\n"
1937 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1938 " </sepolicy>\n"
1939 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1940 "</compatibility-matrix>\n";
1941
1942 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1943 << gCompatibilityMatrixConverter.lastError();
1944 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1945
1946 xml =
1947 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1948 " <kernel version=\"3.18.22\">\n"
1949 " <config>\n"
1950 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1951 " <value type=\"string\"/>\n"
1952 " </config>\n"
1953 " </kernel>\n"
1954 " <kernel version=\"3.18.22\">\n"
1955 " <conditions>\n"
1956 " <config>\n"
1957 " <key>CONFIG_64BIT</key>\n"
1958 " <value type=\"tristate\">y</value>\n"
1959 " </config>\n"
1960 " </conditions>\n"
1961 " <config>\n"
1962 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1963 " <value type=\"int\">0xbeaf000000000000</value>\n"
1964 " </config>\n"
1965 " </kernel>\n"
1966 " <kernel version=\"3.18.22\">\n"
1967 " <conditions>\n"
1968 " <config>\n"
1969 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1970 " <value type=\"int\">24</value>\n"
1971 " </config>\n"
1972 " </conditions>\n"
1973 " <config>\n"
1974 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1975 " <value type=\"string\">binder,hwbinder</value>\n"
1976 " </config>\n"
1977 " </kernel>\n"
1978 " <sepolicy>\n"
1979 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1980 " </sepolicy>\n"
1981 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1982 "</compatibility-matrix>\n";
1983
1984 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1985 << gCompatibilityMatrixConverter.lastError();
1986 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used.";
1987
1988 xml =
1989 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1990 " <kernel version=\"3.18.22\">\n"
1991 " <config>\n"
1992 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1993 " <value type=\"string\"/>\n"
1994 " </config>\n"
1995 " </kernel>\n"
1996 " <kernel version=\"3.18.22\">\n"
1997 " <conditions>\n"
1998 " <config>\n"
1999 " <key>CONFIG_64BIT</key>\n"
2000 " <value type=\"tristate\">y</value>\n"
2001 " </config>\n"
2002 " </conditions>\n"
2003 " <config>\n"
2004 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
2005 " <value type=\"int\">0xdead000000000000</value>\n"
2006 " </config>\n"
2007 " </kernel>\n"
2008 " <kernel version=\"3.18.22\">\n"
2009 " <conditions>\n"
2010 " <config>\n"
2011 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
2012 " <value type=\"int\">24</value>\n"
2013 " </config>\n"
2014 " </conditions>\n"
2015 " <config>\n"
2016 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
2017 " <value type=\"string\">binder</value>\n"
2018 " </config>\n"
2019 " </kernel>\n"
2020 " <sepolicy>\n"
2021 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2022 " </sepolicy>\n"
2023 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2024 "</compatibility-matrix>\n";
2025
2026 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2027 << gCompatibilityMatrixConverter.lastError();
2028 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used";
2029}
2030
Yifan Hongc1889722017-07-07 16:19:52 -07002031// Run KernelConfigParserInvalidTest on processComments = {true, false}
2032class KernelConfigParserInvalidTest : public ::testing::TestWithParam<bool> {};
2033
2034TEST_P(KernelConfigParserInvalidTest, NonSet1) {
2035 const std::string data = "# CONFIG_NOT_EXIST is not sat\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002036 auto pair = processData(data, GetParam() /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07002037 ASSERT_EQ(OK, pair.second) << pair.first.error();
2038 const auto& configs = pair.first.configs();
2039 EXPECT_EQ(configs.find("CONFIG_NOT_EXIST"), configs.end())
2040 << "CONFIG_NOT_EXIST should not exist because of typo";
2041}
2042
2043TEST_P(KernelConfigParserInvalidTest, InvalidLine1) {
2044 const std::string data = "FOO_CONFIG=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002045 ASSERT_NE(OK,
2046 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07002047}
2048
2049TEST_P(KernelConfigParserInvalidTest, InvalidLine2) {
2050 const std::string data = "CONFIG_BAR-BAZ=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002051 ASSERT_NE(OK,
2052 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07002053}
2054
2055INSTANTIATE_TEST_CASE_P(KernelConfigParser, KernelConfigParserInvalidTest, ::testing::Bool());
2056
Yifan Hong2027a492017-12-11 15:21:19 -08002057TEST_F(LibVintfTest, MatrixLevel) {
2058 CompatibilityMatrix cm;
2059 std::string xml;
2060
2061 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\"/>";
2062 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2063 << gCompatibilityMatrixConverter.lastError();
2064 EXPECT_EQ(Level::UNSPECIFIED, cm.level());
2065
2066 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"legacy\"/>";
2067 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2068 << gCompatibilityMatrixConverter.lastError();
2069 EXPECT_EQ(Level::LEGACY, cm.level());
2070
2071 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
2072 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2073 << gCompatibilityMatrixConverter.lastError();
2074 EXPECT_EQ(1u, cm.level());
2075}
2076
2077TEST_F(LibVintfTest, ManifestLevel) {
2078 HalManifest manifest;
2079 std::string xml;
2080
2081 xml = "<manifest version=\"1.0\" type=\"device\"/>";
2082 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2083 EXPECT_EQ(Level::UNSPECIFIED, manifest.level());
2084
2085 xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"legacy\"/>";
2086 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2087 EXPECT_EQ(Level::LEGACY, manifest.level());
2088
2089 xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"1\"/>";
2090 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2091 EXPECT_EQ(1u, manifest.level());
2092}
2093
Yifan Hongdbe9db32017-12-11 19:06:11 -08002094TEST_F(LibVintfTest, AddOptionalHal) {
2095 CompatibilityMatrix cm1;
2096 CompatibilityMatrix cm2;
2097 std::string error;
2098 std::string xml;
2099
2100 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
2101 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2102 << gCompatibilityMatrixConverter.lastError();
2103
2104 xml =
2105 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2106 " <hal format=\"hidl\" optional=\"false\">\n"
2107 " <name>android.hardware.foo</name>\n"
2108 " <version>1.0-1</version>\n"
2109 " <interface>\n"
2110 " <name>IFoo</name>\n"
2111 " <instance>default</instance>\n"
2112 " </interface>\n"
2113 " </hal>\n"
2114 "</compatibility-matrix>\n";
2115 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2116 << gCompatibilityMatrixConverter.lastError();
2117
2118 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2119 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2120 EXPECT_EQ(xml,
2121 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2122 " <hal format=\"hidl\" optional=\"true\">\n"
2123 " <name>android.hardware.foo</name>\n"
2124 " <version>1.0-1</version>\n"
2125 " <interface>\n"
2126 " <name>IFoo</name>\n"
2127 " <instance>default</instance>\n"
2128 " </interface>\n"
2129 " </hal>\n"
2130 "</compatibility-matrix>\n");
2131}
2132
2133TEST_F(LibVintfTest, AddOptionalHalMinorVersion) {
2134 CompatibilityMatrix cm1;
2135 CompatibilityMatrix cm2;
2136 std::string error;
2137 std::string xml;
2138
2139 xml =
2140 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2141 " <hal format=\"hidl\" optional=\"false\">\n"
2142 " <name>android.hardware.foo</name>\n"
2143 " <version>1.2-3</version>\n"
2144 " <interface>\n"
2145 " <name>IFoo</name>\n"
2146 " <instance>default</instance>\n"
2147 " </interface>\n"
2148 " </hal>\n"
2149 "</compatibility-matrix>\n";
2150 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2151 << gCompatibilityMatrixConverter.lastError();
2152
2153 xml =
2154 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2155 " <hal format=\"hidl\" optional=\"false\">\n"
2156 " <name>android.hardware.foo</name>\n"
2157 " <version>1.0-4</version>\n"
2158 " <interface>\n"
2159 " <name>IFoo</name>\n"
2160 " <instance>default</instance>\n"
2161 " </interface>\n"
2162 " </hal>\n"
2163 "</compatibility-matrix>\n";
2164 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2165 << gCompatibilityMatrixConverter.lastError();
2166
2167 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2168 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2169 EXPECT_EQ(xml,
2170 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2171 " <hal format=\"hidl\" optional=\"false\">\n"
2172 " <name>android.hardware.foo</name>\n"
2173 " <version>1.2-4</version>\n"
2174 " <interface>\n"
2175 " <name>IFoo</name>\n"
2176 " <instance>default</instance>\n"
2177 " </interface>\n"
2178 " </hal>\n"
2179 "</compatibility-matrix>\n");
2180}
2181
2182TEST_F(LibVintfTest, AddOptionalHalMajorVersion) {
2183 CompatibilityMatrix cm1;
2184 CompatibilityMatrix cm2;
2185 std::string error;
2186 std::string xml;
2187
2188 xml =
2189 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2190 " <hal format=\"hidl\" optional=\"false\">\n"
2191 " <name>android.hardware.foo</name>\n"
2192 " <version>1.2-3</version>\n"
2193 " <interface>\n"
2194 " <name>IFoo</name>\n"
2195 " <instance>default</instance>\n"
2196 " </interface>\n"
2197 " </hal>\n"
2198 "</compatibility-matrix>\n";
2199 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2200 << gCompatibilityMatrixConverter.lastError();
2201
2202 xml =
2203 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2204 " <hal format=\"hidl\" optional=\"false\">\n"
2205 " <name>android.hardware.foo</name>\n"
2206 " <version>2.0-4</version>\n"
2207 " <interface>\n"
2208 " <name>IFoo</name>\n"
2209 " <instance>default</instance>\n"
2210 " </interface>\n"
2211 " </hal>\n"
2212 "</compatibility-matrix>\n";
2213 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2214 << gCompatibilityMatrixConverter.lastError();
2215
2216 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2217 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2218 EXPECT_EQ(xml,
2219 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2220 " <hal format=\"hidl\" optional=\"false\">\n"
2221 " <name>android.hardware.foo</name>\n"
2222 " <version>1.2-3</version>\n"
2223 " <interface>\n"
2224 " <name>IFoo</name>\n"
2225 " <instance>default</instance>\n"
2226 " </interface>\n"
2227 " </hal>\n"
2228 " <hal format=\"hidl\" optional=\"true\">\n"
2229 " <name>android.hardware.foo</name>\n"
2230 " <version>2.0-4</version>\n"
2231 " <interface>\n"
2232 " <name>IFoo</name>\n"
2233 " <instance>default</instance>\n"
2234 " </interface>\n"
2235 " </hal>\n"
2236 "</compatibility-matrix>\n");
2237}
2238
Yifan Hongd4b92fe2017-12-20 15:29:03 -08002239TEST_F(LibVintfTest, AddOptionalXmlFile) {
2240 CompatibilityMatrix cm1;
2241 CompatibilityMatrix cm2;
2242 std::string error;
2243 std::string xml;
2244
2245 xml =
2246 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2247 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2248 " <name>foo</name>\n"
2249 " <version>1.0-2</version>\n"
2250 " <path>/foo/bar/baz.xsd</path>\n"
2251 " </xmlfile>\n"
2252 "</compatibility-matrix>\n";
2253 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2254 << gCompatibilityMatrixConverter.lastError();
2255
2256 xml =
2257 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2258 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2259 " <name>foo</name>\n"
2260 " <version>1.1-3</version>\n"
2261 " <path>/foo/bar/quux.xsd</path>\n"
2262 " </xmlfile>\n"
2263 "</compatibility-matrix>\n";
2264 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2265 << gCompatibilityMatrixConverter.lastError();
2266
2267 EXPECT_TRUE(addAllXmlFilesAsOptional(&cm1, &cm2, &error)) << error;
2268 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::XMLFILES_ONLY);
2269 EXPECT_EQ(xml,
2270 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2271 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2272 " <name>foo</name>\n"
2273 " <version>1.0-2</version>\n"
2274 " <path>/foo/bar/baz.xsd</path>\n"
2275 " </xmlfile>\n"
2276 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2277 " <name>foo</name>\n"
2278 " <version>1.1-3</version>\n"
2279 " <path>/foo/bar/quux.xsd</path>\n"
2280 " </xmlfile>\n"
2281 "</compatibility-matrix>\n");
2282}
2283
Yifan Honga9993572017-01-24 19:33:15 -08002284} // namespace vintf
2285} // namespace android
2286
Yifan Hong676447a2016-11-15 12:57:23 -08002287int main(int argc, char **argv) {
2288 ::testing::InitGoogleTest(&argc, argv);
2289 return RUN_ALL_TESTS();
2290}