blob: 507e0d150b9667bb7edba945064db85a9b078c84 [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
17#define LOG_TAG "LibHidlTest"
18
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 Hong9cd9eb02017-05-17 18:36:08 -0700106
107 std::map<std::string, HalInterface> testHalInterfaces() {
108 HalInterface intf;
109 intf.name = "IFoo";
110 intf.instances.insert("default");
111 std::map<std::string, HalInterface> map;
112 map[intf.name] = intf;
113 return map;
114 }
115
Yifan Honga04e1472017-04-05 13:15:34 -0700116 HalManifest testDeviceManifest() {
Yifan Hongd2b7e642017-02-17 10:15:32 -0800117 HalManifest vm;
Yifan Hong7c7d7062017-04-04 16:26:51 -0700118 vm.mType = SchemaType::DEVICE;
Yifan Hong2a3dd082017-04-04 17:15:35 -0700119 vm.device.mSepolicyVersion = {25, 0};
Yifan Hong2059ffc2017-02-24 11:32:02 -0800120 vm.add(ManifestHal{
121 .format = HalFormat::HIDL,
122 .name = "android.hardware.camera",
123 .versions = {Version(2, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800124 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800125 .interfaces = {
126 {"ICamera", {"ICamera", {"legacy/0", "default"}}},
127 {"IBetterCamera", {"IBetterCamera", {"camera"}}}
128 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800129 });
130 vm.add(ManifestHal{
131 .format = HalFormat::HIDL,
132 .name = "android.hardware.nfc",
133 .versions = {Version(1, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800134 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800135 .interfaces = {
136 {"INfc", {"INfc", {"default"}}}
137 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800138 });
Yifan Honga9993572017-01-24 19:33:15 -0800139
140 return vm;
141 }
Yifan Hongd4857902017-06-13 14:13:56 -0700142 HalManifest testDeviceManifestWithXmlFile() {
143 HalManifest vm = testDeviceManifest();
144 ManifestXmlFile xmlFile;
145 xmlFile.mName = "media_profile";
146 xmlFile.mVersion = {1, 0};
147 vm.addXmlFile(std::move(xmlFile));
148 return vm;
149 }
Yifan Honga04e1472017-04-05 13:15:34 -0700150 HalManifest testFrameworkManfiest() {
151 HalManifest vm;
152 vm.mType = SchemaType::FRAMEWORK;
153 vm.add(ManifestHal{
154 .format = HalFormat::HIDL,
155 .name = "android.hidl.manager",
156 .versions = {Version(1, 0)},
157 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
158 .interfaces = {
159 {"IServiceManager", {"IServiceManager", {"default"}}},
160 }
161 });
162 Vndk vndk2505;
163 vndk2505.mVersionRange = {25, 0, 5};
164 vndk2505.mLibraries = { "libjpeg.so", "libbase.so" };
165 Vndk vndk2513;
166 vndk2513.mVersionRange = {25, 1, 3};
167 vndk2513.mLibraries = { "libjpeg.so", "libbase.so", "libtinyxml2.so" };
168 vm.framework.mVndks = { std::move(vndk2505), std::move(vndk2513) };
169
170 return vm;
171 }
Yifan Honga7201e72017-02-17 10:09:59 -0800172 RuntimeInfo testRuntimeInfo() {
173 RuntimeInfo info;
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800174 info.mOsName = "Linux";
175 info.mNodeName = "localhost";
176 info.mOsRelease = "3.18.31-g936f9a479d0f";
177 info.mKernelVersion = {3, 18, 31};
178 info.mOsVersion = "#4 SMP PREEMPT Wed Feb 1 18:10:52 PST 2017";
179 info.mHardwareId = "aarch64";
180 info.mKernelSepolicyVersion = 30;
Yifan Hongf1af7522017-02-16 18:00:55 -0800181 info.mKernelConfigs = {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800182 {"CONFIG_64BIT", "y"},
183 {"CONFIG_ANDROID_BINDER_DEVICES", "\"binder,hwbinder\""},
184 {"CONFIG_ARCH_MMAP_RND_BITS", "24"},
185 {"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", "\"\""},
186 {"CONFIG_ILLEGAL_POINTER_VALUE", "0xdead000000000000"}
187 };
Yifan Hong881a9e452017-04-27 19:31:13 -0700188 setAvb(info, {2, 1}, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800189 return info;
190 }
Yifan Hong676447a2016-11-15 12:57:23 -0800191};
192
Yifan Hongd5cd0482017-06-19 12:25:48 -0700193TEST_F(LibVintfTest, ArchOperatorOr) {
194 Arch a = Arch::ARCH_EMPTY;
195 a |= Arch::ARCH_32;
196 EXPECT_EQ(Arch::ARCH_32, a);
197
198 a |= Arch::ARCH_64;
199 EXPECT_EQ(Arch::ARCH_32_64, a);
200
201 a = Arch::ARCH_EMPTY;
202 a |= Arch::ARCH_64;
203 EXPECT_EQ(Arch::ARCH_64, a);
204}
Yifan Hongef6d4d32017-01-23 14:12:28 -0800205
206TEST_F(LibVintfTest, Stringify) {
Yifan Honga04e1472017-04-05 13:15:34 -0700207 HalManifest vm = testDeviceManifest();
Yifan Hong974ad9c2017-04-04 15:37:39 -0700208 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/2.0:"
209 "hidl/android.hardware.nfc/passthrough32+64/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -0800210
211 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
212 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
213
214 VersionRange v(1, 2, 3);
215 EXPECT_EQ(to_string(v), "1.2-3");
216 VersionRange v2;
217 EXPECT_TRUE(parse("1.2-3", &v2));
218 EXPECT_EQ(v, v2);
219}
220
Yifan Hong9bbdb282017-04-12 21:53:59 -0700221TEST_F(LibVintfTest, GetTransport) {
222 HalManifest vm = testDeviceManifest();
223 EXPECT_EQ(Transport::HWBINDER, vm.getTransport("android.hardware.camera",
224 {2, 0}, "ICamera", "default"));
225}
226
Yifan Hongd2b7e642017-02-17 10:15:32 -0800227TEST_F(LibVintfTest, HalManifestConverter) {
Yifan Honga04e1472017-04-05 13:15:34 -0700228 HalManifest vm = testDeviceManifest();
Yifan Hongd2b7e642017-02-17 10:15:32 -0800229 std::string xml = gHalManifestConverter(vm);
Yifan Hong676447a2016-11-15 12:57:23 -0800230 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700231 "<manifest version=\"1.0\" type=\"device\">\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800232 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800233 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800234 " <transport>hwbinder</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800235 " <version>2.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800236 " <interface>\n"
237 " <name>IBetterCamera</name>\n"
238 " <instance>camera</instance>\n"
239 " </interface>\n"
240 " <interface>\n"
241 " <name>ICamera</name>\n"
242 " <instance>default</instance>\n"
243 " <instance>legacy/0</instance>\n"
244 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800245 " </hal>\n"
246 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800247 " <name>android.hardware.nfc</name>\n"
Yifan Hongc54d32c2017-03-07 19:12:26 -0800248 " <transport arch=\"32+64\">passthrough</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800249 " <version>1.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800250 " <interface>\n"
251 " <name>INfc</name>\n"
252 " <instance>default</instance>\n"
253 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800254 " </hal>\n"
Yifan Hong2a3dd082017-04-04 17:15:35 -0700255 " <sepolicy>\n"
256 " <version>25.0</version>\n"
257 " </sepolicy>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800258 "</manifest>\n");
Yifan Hongfb7469c2017-04-05 19:15:21 -0700259 HalManifest vm2;
260 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
261 EXPECT_EQ(vm, vm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800262}
263
Yifan Honga04e1472017-04-05 13:15:34 -0700264TEST_F(LibVintfTest, HalManifestConverterFramework) {
265 HalManifest vm = testFrameworkManfiest();
266 std::string xml = gHalManifestConverter(vm);
267 EXPECT_EQ(xml,
268 "<manifest version=\"1.0\" type=\"framework\">\n"
269 " <hal format=\"hidl\">\n"
270 " <name>android.hidl.manager</name>\n"
271 " <transport>hwbinder</transport>\n"
272 " <version>1.0</version>\n"
273 " <interface>\n"
274 " <name>IServiceManager</name>\n"
275 " <instance>default</instance>\n"
276 " </interface>\n"
277 " </hal>\n"
278 " <vndk>\n"
279 " <version>25.0.5</version>\n"
280 " <library>libbase.so</library>\n"
281 " <library>libjpeg.so</library>\n"
282 " </vndk>\n"
283 " <vndk>\n"
284 " <version>25.1.3</version>\n"
285 " <library>libbase.so</library>\n"
286 " <library>libjpeg.so</library>\n"
287 " <library>libtinyxml2.so</library>\n"
288 " </vndk>\n"
289 "</manifest>\n");
290 HalManifest vm2;
291 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700292 EXPECT_EQ(vm, vm2);
Yifan Honga04e1472017-04-05 13:15:34 -0700293}
294
Yifan Hong8e9c6692017-02-28 14:07:42 -0800295TEST_F(LibVintfTest, HalManifestOptional) {
296 HalManifest vm;
297 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700298 "<manifest version=\"1.0\" type=\"device\"></manifest>"));
Yifan Hong8e9c6692017-02-28 14:07:42 -0800299 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700300 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800301 " <hal>"
302 " <name>android.hidl.manager</name>"
303 " <transport>hwbinder</transport>"
304 " <version>1.0</version>"
305 " </hal>"
306 "</manifest>"));
307 EXPECT_FALSE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700308 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800309 " <hal>"
310 " <name>android.hidl.manager</name>"
311 " <version>1.0</version>"
312 " </hal>"
313 "</manifest>"));
314}
315
Yifan Honge0bb98d2017-08-07 14:40:19 -0700316TEST_F(LibVintfTest, HalManifestNative) {
317 HalManifest vm;
318 EXPECT_TRUE(gHalManifestConverter(&vm,
319 "<manifest version=\"1.0\" type=\"device\">"
320 " <hal format=\"native\">"
321 " <name>foo</name>"
322 " <version>1.0</version>"
323 " </hal>"
324 "</manifest>"))
325 << gHalManifestConverter.lastError();
326 EXPECT_FALSE(gHalManifestConverter(&vm,
327 "<manifest version=\"1.0\" type=\"device\">"
328 " <hal format=\"native\">"
329 " <name>foo</name>"
330 " <version>1.0</version>"
331 " <transport>hwbinder</transport>"
332 " </hal>"
333 "</manifest>"));
334 EXPECT_TRUE(gHalManifestConverter.lastError().find(
335 "Native HAL 'foo' should not have <transport> defined") != std::string::npos);
336}
337
Yifan Hong79dcc1f2017-05-22 14:35:19 -0700338TEST_F(LibVintfTest, HalManifestDuplicate) {
339 HalManifest vm;
340 EXPECT_FALSE(gHalManifestConverter(&vm,
341 "<manifest version=\"1.0\" type=\"device\">"
342 " <hal>"
343 " <name>android.hidl.manager</name>"
344 " <transport>hwbinder</transport>"
345 " <version>1.0</version>"
346 " <version>1.1</version>"
347 " </hal>"
348 "</manifest>"))
349 << "Should not allow duplicated major version in <hal>";
350 EXPECT_FALSE(gHalManifestConverter(&vm,
351 "<manifest version=\"1.0\" type=\"device\">"
352 " <hal>"
353 " <name>android.hidl.manager</name>"
354 " <transport>hwbinder</transport>"
355 " <version>1.0</version>"
356 " </hal>"
357 " <hal>"
358 " <name>android.hidl.manager</name>"
359 " <transport arch=\"32+64\">passthrough</transport>"
360 " <version>1.1</version>"
361 " </hal>"
362 "</manifest>"))
363 << "Should not allow duplicated major version across <hal>";
364}
365
366TEST_F(LibVintfTest, HalManifestGetTransport) {
367 HalManifest vm;
368 EXPECT_TRUE(gHalManifestConverter(&vm,
369 "<manifest version=\"1.0\" type=\"device\">"
370 " <hal>"
371 " <name>android.hidl.manager</name>"
372 " <transport>hwbinder</transport>"
373 " <version>1.0</version>"
374 " <interface>"
375 " <name>IServiceManager</name>"
376 " <instance>default</instance>"
377 " </interface>"
378 " </hal>"
379 " <hal>"
380 " <name>android.hidl.manager</name>"
381 " <transport arch=\"32+64\">passthrough</transport>"
382 " <version>2.1</version>"
383 " <interface>"
384 " <name>IServiceManager</name>"
385 " <instance>default</instance>"
386 " </interface>"
387 " </hal>"
388 "</manifest>"));
389 EXPECT_EQ(Transport::PASSTHROUGH,
390 vm.getTransport("android.hidl.manager", {2, 1}, "IServiceManager", "default"));
391 EXPECT_EQ(Transport::PASSTHROUGH,
392 vm.getTransport("android.hidl.manager", {2, 0}, "IServiceManager", "default"));
393 EXPECT_EQ(Transport::EMPTY,
394 vm.getTransport("android.hidl.manager", {2, 2}, "IServiceManager", "default"));
395 EXPECT_EQ(Transport::HWBINDER,
396 vm.getTransport("android.hidl.manager", {1, 0}, "IServiceManager", "default"));
397}
398
Yifan Hongec3b9b72017-02-23 13:24:42 -0800399TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700400 HalManifest vm = testDeviceManifest();
Yifan Hongec3b9b72017-02-23 13:24:42 -0800401 EXPECT_EQ(vm.getInstances("android.hardware.camera", "ICamera"),
402 std::set<std::string>({"default", "legacy/0"}));
403 EXPECT_EQ(vm.getInstances("android.hardware.camera", "IBetterCamera"),
404 std::set<std::string>({"camera"}));
405 EXPECT_EQ(vm.getInstances("android.hardware.camera", "INotExist"),
Yifan Hong9bbdb282017-04-12 21:53:59 -0700406 std::set<std::string>({}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800407 EXPECT_EQ(vm.getInstances("android.hardware.nfc", "INfc"),
408 std::set<std::string>({"default"}));
409
410 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "default"));
411 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "legacy/0"));
412 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "camera"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800413 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", "INfc", "default"));
414
Yifan Hong9bbdb282017-04-12 21:53:59 -0700415 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800416 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "ICamera", "notexist"));
417 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "default"));
418 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "notexist"));
419 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", "INfc", "notexist"));
420}
421
Yifan Hong676447a2016-11-15 12:57:23 -0800422TEST_F(LibVintfTest, VersionConverter) {
423 Version v(3, 6);
424 std::string xml = gVersionConverter(v);
425 EXPECT_EQ(xml, "<version>3.6</version>\n");
426 Version v2;
427 EXPECT_TRUE(gVersionConverter(&v2, xml));
428 EXPECT_EQ(v, v2);
429}
430
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700431static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
432 std::string name{intf.name};
433 return map->emplace(std::move(name), std::move(intf)).second;
434}
435
Yifan Hong676447a2016-11-15 12:57:23 -0800436TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800437 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800438 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700439 false /* optional */, {}};
440 EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
441 EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800442 std::string xml = gMatrixHalConverter(mh);
443 EXPECT_EQ(xml,
444 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800445 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800446 " <version>1.2-3</version>\n"
447 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700448 " <interface>\n"
449 " <name>IBetterCamera</name>\n"
450 " <instance>default</instance>\n"
451 " <instance>great</instance>\n"
452 " </interface>\n"
453 " <interface>\n"
454 " <name>ICamera</name>\n"
455 " <instance>default</instance>\n"
456 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800457 "</hal>\n");
458 MatrixHal mh2;
459 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
460 EXPECT_EQ(mh, mh2);
461}
462
Yifan Hong3f5489a2017-02-08 11:14:21 -0800463TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
464
465 KernelConfigTypedValue converted;
466
467 auto testOne = [] (const KernelConfigTypedValue &original,
468 const std::string &expectXml) {
469 std::string xml;
470 KernelConfigTypedValue converted;
471 xml = gKernelConfigTypedValueConverter(original);
472 EXPECT_EQ(xml, expectXml);
473 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
474 EXPECT_EQ(original, converted);
475 };
476
477 auto testParse = [] (const KernelConfigTypedValue &original,
478 const std::string &xml) {
479 KernelConfigTypedValue converted;
480 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
481 EXPECT_EQ(original, converted);
482 };
483
484 testOne(KernelConfigTypedValue("stringvalue"),
485 "<value type=\"string\">stringvalue</value>\n");
486 testOne(KernelConfigTypedValue(""),
487 "<value type=\"string\"></value>\n");
488
489 testOne(KernelConfigTypedValue(Tristate::YES),
490 "<value type=\"tristate\">y</value>\n");
491 testOne(KernelConfigTypedValue(Tristate::NO),
492 "<value type=\"tristate\">n</value>\n");
493 testOne(KernelConfigTypedValue(Tristate::MODULE),
494 "<value type=\"tristate\">m</value>\n");
495 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
496 "<value type=\"tristate\">q</value>\n"));
497
498 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
499 "<value type=\"range\">4-20</value>\n");
500 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
501 "<value type=\"range\">0-18446744073709551615</value>\n");
502 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
503 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
504
505 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
506 "<value type=\"int\">-18446744073709551616</value>\n"));
507
508 testOne(KernelConfigTypedValue(INT64_MIN),
509 "<value type=\"int\">-9223372036854775808</value>\n");
510 testParse(KernelConfigTypedValue(INT64_MIN),
511 "<value type=\"int\">0x8000000000000000</value>\n");
512 testParse(KernelConfigTypedValue(INT64_MIN),
513 "<value type=\"int\">-0X8000000000000000</value>\n");
514
515 testParse(KernelConfigTypedValue(INT64_MIN + 1),
516 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
517
518 testParse(KernelConfigTypedValue(-0x50),
519 "<value type=\"int\">-0x50</value>\n");
520
521 testOne(KernelConfigTypedValue(0),
522 "<value type=\"int\">0</value>\n");
523
524 // Truncation for underflow.
525 testParse(KernelConfigTypedValue(1),
526 "<value type=\"int\">-0xffffffffffffffff</value>\n");
527 testParse(KernelConfigTypedValue(1),
528 "<value type=\"int\">-18446744073709551615</value>\n");
529
530 testOne(KernelConfigTypedValue(INT64_MAX),
531 "<value type=\"int\">9223372036854775807</value>\n");
532 testParse(KernelConfigTypedValue(INT64_MAX),
533 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
534 // Truncation for underflow.
535 testParse(KernelConfigTypedValue(INT64_MAX),
536 "<value type=\"int\">-9223372036854775809</value>\n");
537
538 testParse(KernelConfigTypedValue(-1),
539 "<value type=\"int\">18446744073709551615</value>\n");
540 testParse(KernelConfigTypedValue(-1),
541 "<value type=\"int\">0xffffffffffffffff</value>\n");
542
543 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
544 "<value type=\"int\">18446744073709551616</value>\n"));
545}
546
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700547TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
Yifan Hong676447a2016-11-15 12:57:23 -0800548 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800549 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800550 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700551 false /* optional */, testHalInterfaces()}));
Yifan Honga9993572017-01-24 19:33:15 -0800552 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800553 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700554 true /* optional */, testHalInterfaces()}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800555 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
556 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
557 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
558 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700559 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700560 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800561 std::string xml = gCompatibilityMatrixConverter(cm);
562 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700563 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800564 " <hal format=\"native\" optional=\"false\">\n"
565 " <name>android.hardware.camera</name>\n"
566 " <version>1.2-3</version>\n"
567 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700568 " <interface>\n"
569 " <name>IFoo</name>\n"
570 " <instance>default</instance>\n"
571 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800572 " </hal>\n"
573 " <hal format=\"native\" optional=\"true\">\n"
574 " <name>android.hardware.nfc</name>\n"
575 " <version>4.5-6</version>\n"
576 " <version>10.11-12</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700577 " <interface>\n"
578 " <name>IFoo</name>\n"
579 " <instance>default</instance>\n"
580 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800581 " </hal>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800582 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800583 " <config>\n"
584 " <key>CONFIG_FOO</key>\n"
585 " <value type=\"tristate\">y</value>\n"
586 " </config>\n"
587 " <config>\n"
588 " <key>CONFIG_BAR</key>\n"
589 " <value type=\"string\">stringvalue</value>\n"
590 " </config>\n"
591 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800592 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800593 " <config>\n"
594 " <key>CONFIG_BAZ</key>\n"
595 " <value type=\"int\">20</value>\n"
596 " </config>\n"
597 " <config>\n"
598 " <key>CONFIG_BAR</key>\n"
599 " <value type=\"range\">3-5</value>\n"
600 " </config>\n"
601 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800602 " <sepolicy>\n"
603 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700604 " <sepolicy-version>25.0</sepolicy-version>\n"
605 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800606 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700607 " <avb>\n"
608 " <vbmeta-version>2.1</vbmeta-version>\n"
609 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800610 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800611 CompatibilityMatrix cm2;
612 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700613 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800614}
615
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700616TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
617 CompatibilityMatrix cm;
618 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
619 {{VersionRange(1,0)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700620 false /* optional */, testHalInterfaces()}));
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700621 set(cm, SchemaType::DEVICE);
622 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
623 std::string xml = gCompatibilityMatrixConverter(cm);
624 EXPECT_EQ(xml,
625 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
626 " <hal format=\"native\" optional=\"false\">\n"
627 " <name>android.hidl.manager</name>\n"
628 " <version>1.0</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700629 " <interface>\n"
630 " <name>IFoo</name>\n"
631 " <instance>default</instance>\n"
632 " </interface>\n"
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700633 " </hal>\n"
634 " <vndk>\n"
635 " <version>25.0.1-5</version>\n"
636 " <library>libbase.so</library>\n"
637 " <library>libjpeg.so</library>\n"
638 " </vndk>\n"
639 "</compatibility-matrix>\n");
640 CompatibilityMatrix cm2;
641 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
642 EXPECT_EQ(cm, cm2);
643}
644
Yifan Hong676447a2016-11-15 12:57:23 -0800645TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800646 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800647
Yifan Hong2059ffc2017-02-24 11:32:02 -0800648 ManifestHal invalidHal{
649 .format = HalFormat::HIDL,
650 .name = "android.hardware.camera",
651 .versions = {{Version(2, 0), Version(2, 1)}},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800652 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64}
Yifan Hong2059ffc2017-02-24 11:32:02 -0800653 };
654
Yifan Hong5a06ef72017-01-24 19:54:24 -0800655 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800656 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800657 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800658}
659
Tri Vod0143942017-03-24 17:51:23 -0700660TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700661 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700662 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
663 {"android.hardware.camera", "android.hardware.nfc"}));
664}
665
666TEST_F(LibVintfTest, HalManifestGetInterfaceNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700667 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700668 EXPECT_EQ(vm.getInterfaceNames("android.hardware.camera"),
669 std::set<std::string>({"ICamera", "IBetterCamera"}));
670 EXPECT_EQ(vm.getInterfaceNames("android.hardware.nfc"),
671 std::set<std::string>({"INfc"}));
672}
673
Yifan Hongd2b7e642017-02-17 10:15:32 -0800674TEST_F(LibVintfTest, HalManifestGetHal) {
Yifan Honga04e1472017-04-05 13:15:34 -0700675 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700676 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
677 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800678
679 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
680 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800681 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800682 EXPECT_EQ(hal.name, arr[i++]);
683 }
684}
685
Yifan Honga7201e72017-02-17 10:09:59 -0800686TEST_F(LibVintfTest, RuntimeInfo) {
687 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800688 using KernelConfigs = std::vector<KernelConfig>;
689 const KernelConfigs configs {
690 KernelConfig{"CONFIG_64BIT", Tristate::YES},
691 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
692 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
693 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
694 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
695 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
696 };
697
698 auto testMatrix = [&] (MatrixKernel &&kernel) {
699 CompatibilityMatrix cm;
700 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700701 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700702 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800703 return cm;
704 };
705
706 std::string error;
707
708 {
709 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
710 CompatibilityMatrix cm = testMatrix(std::move(kernel));
711 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
712 }
713
714 {
Yifan Hong5f996502017-08-23 14:46:44 -0700715 MatrixKernel kernel(KernelVersion{3, 18, 60}, KernelConfigs(configs));
716 CompatibilityMatrix cm = testMatrix(std::move(kernel));
717 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
718 }
719
720 {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800721 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
722 CompatibilityMatrix cm = testMatrix(std::move(kernel));
723 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
724 }
725
726 {
727 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
728 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700729 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800730 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
731 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700732 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800733 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
734 << "kernel-sepolicy-version shouldn't match";
735 }
736
737 {
738 KernelConfigs newConfigs(configs);
739 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
740 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
741 CompatibilityMatrix cm = testMatrix(std::move(kernel));
742 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
743 }
744
745 {
746 KernelConfigs newConfigs(configs);
747 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
748 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
749 CompatibilityMatrix cm = testMatrix(std::move(kernel));
750 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
751 }
752
753 {
754 KernelConfigs newConfigs(configs);
755 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
756 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
757 CompatibilityMatrix cm = testMatrix(std::move(kernel));
758 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
759 }
760
761 {
762 KernelConfigs newConfigs(configs);
763 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
764 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
765 CompatibilityMatrix cm = testMatrix(std::move(kernel));
766 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
767 }
768
769 {
770 KernelConfigs newConfigs(configs);
771 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
772 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
773 CompatibilityMatrix cm = testMatrix(std::move(kernel));
774 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
775 }
Yifan Hongdb6423e2017-09-11 14:38:46 -0700776
Yifan Hongf3029302017-04-12 17:23:49 -0700777 RuntimeInfo badAvb = testRuntimeInfo();
778 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
779 {
780 setAvb(badAvb, {1, 0}, {2, 1});
781 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
Michael Schwartz5cfbc922017-05-08 14:06:49 -0700782 EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
Yifan Hongf3029302017-04-12 17:23:49 -0700783 }
784 {
785 setAvb(badAvb, {2, 1}, {3, 0});
786 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
787 }
788 {
789 setAvb(badAvb, {2, 1}, {2, 3});
790 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
791 }
792 {
793 setAvb(badAvb, {2, 3}, {2, 1});
794 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
795 }
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800796}
797
Yifan Hong19e0a2a2017-04-14 17:30:53 -0700798TEST_F(LibVintfTest, MissingAvb) {
799 std::string xml =
800 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
801 " <kernel version=\"3.18.31\"></kernel>"
802 " <sepolicy>\n"
803 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
804 " <sepolicy-version>25.5</sepolicy-version>\n"
805 " </sepolicy>\n"
806 "</compatibility-matrix>\n";
807 CompatibilityMatrix cm;
808 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
809 EXPECT_EQ(getAvb(cm), Version(0, 0));
810}
811
Yifan Hongdb6423e2017-09-11 14:38:46 -0700812TEST_F(LibVintfTest, DisableAvb) {
813 std::string xml =
814 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
815 " <kernel version=\"3.18.31\"></kernel>"
816 " <sepolicy>\n"
817 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
818 " <sepolicy-version>25.5</sepolicy-version>\n"
819 " </sepolicy>\n"
820 " <avb>\n"
821 " <vbmeta-version>1.0</vbmeta-version>\n"
822 " </avb>\n"
823 "</compatibility-matrix>\n";
824 CompatibilityMatrix cm;
825 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
826 RuntimeInfo ki = testRuntimeInfo();
827 std::string error;
828 EXPECT_FALSE(ki.checkCompatibility(cm, &error));
829 EXPECT_STREQ(error.c_str(), "AVB version 2.1 does not match framework matrix 1.0");
830 EXPECT_TRUE(ki.checkCompatibility(cm, &error, DISABLE_AVB_CHECK)) << error;
831}
832
Yifan Hong08e984c2017-05-18 12:50:04 -0700833// This is the test extracted from VINTF Object doc
834TEST_F(LibVintfTest, HalCompat) {
835 CompatibilityMatrix matrix;
836 std::string error;
837
838 std::string matrixXml =
839 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
840 " <hal format=\"hidl\" optional=\"false\">\n"
841 " <name>android.hardware.foo</name>\n"
842 " <version>1.0</version>\n"
843 " <version>3.1-2</version>\n"
844 " <interface>\n"
845 " <name>IFoo</name>\n"
846 " <instance>default</instance>\n"
847 " <instance>specific</instance>\n"
848 " </interface>\n"
849 " </hal>\n"
850 " <hal format=\"hidl\" optional=\"false\">\n"
851 " <name>android.hardware.foo</name>\n"
852 " <version>2.0</version>\n"
853 " <interface>\n"
854 " <name>IBar</name>\n"
855 " <instance>default</instance>\n"
856 " </interface>\n"
857 " </hal>\n"
858 " <sepolicy>\n"
859 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
860 " <sepolicy-version>25.5</sepolicy-version>\n"
861 " </sepolicy>\n"
862 "</compatibility-matrix>\n";
863 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
864 << gCompatibilityMatrixConverter.lastError();
865
866 {
867 std::string manifestXml =
868 "<manifest version=\"1.0\" type=\"device\">\n"
869 " <hal format=\"hidl\">\n"
870 " <name>android.hardware.foo</name>\n"
871 " <transport>hwbinder</transport>\n"
872 " <version>1.0</version>\n"
873 " <interface>\n"
874 " <name>IFoo</name>\n"
875 " <instance>default</instance>\n"
876 " <instance>specific</instance>\n"
877 " </interface>\n"
878 " </hal>\n"
879 " <hal format=\"hidl\">\n"
880 " <name>android.hardware.foo</name>\n"
881 " <transport>hwbinder</transport>\n"
882 " <version>2.0</version>\n"
883 " <interface>\n"
884 " <name>IBar</name>\n"
885 " <instance>default</instance>\n"
886 " </interface>\n"
887 " </hal>\n"
888 " <sepolicy>\n"
889 " <version>25.5</version>\n"
890 " </sepolicy>\n"
891 "</manifest>\n";
892
893 HalManifest manifest;
894 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
895 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
896 }
897
898 {
899 std::string manifestXml =
900 "<manifest version=\"1.0\" type=\"device\">\n"
901 " <hal format=\"hidl\">\n"
902 " <name>android.hardware.foo</name>\n"
903 " <transport>hwbinder</transport>\n"
904 " <version>1.0</version>\n"
905 " <interface>\n"
906 " <name>IFoo</name>\n"
907 " <instance>default</instance>\n"
908 " <instance>specific</instance>\n"
909 " </interface>\n"
910 " </hal>\n"
911 " <sepolicy>\n"
912 " <version>25.5</version>\n"
913 " </sepolicy>\n"
914 "</manifest>\n";
915 HalManifest manifest;
916 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
917 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
918 << "should not be compatible because IBar is missing";
919 }
920
921 {
922 std::string manifestXml =
923 "<manifest version=\"1.0\" type=\"device\">\n"
924 " <hal format=\"hidl\">\n"
925 " <name>android.hardware.foo</name>\n"
926 " <transport>hwbinder</transport>\n"
927 " <version>1.0</version>\n"
928 " <interface>\n"
929 " <name>IFoo</name>\n"
930 " <instance>default</instance>\n"
931 " </interface>\n"
932 " </hal>\n"
933 " <hal format=\"hidl\">\n"
934 " <name>android.hardware.foo</name>\n"
935 " <transport>hwbinder</transport>\n"
936 " <version>2.0</version>\n"
937 " <interface>\n"
938 " <name>IBar</name>\n"
939 " <instance>default</instance>\n"
940 " </interface>\n"
941 " </hal>\n"
942 " <sepolicy>\n"
943 " <version>25.5</version>\n"
944 " </sepolicy>\n"
945 "</manifest>\n";
946 HalManifest manifest;
947 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
948 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
949 << "should not be compatible because IFoo/default is missing";
950 }
951
952 {
953 std::string manifestXml =
954 "<manifest version=\"1.0\" type=\"device\">\n"
955 " <hal format=\"hidl\">\n"
956 " <name>android.hardware.foo</name>\n"
957 " <transport>hwbinder</transport>\n"
958 " <version>3.3</version>\n"
959 " <interface>\n"
960 " <name>IFoo</name>\n"
961 " <instance>default</instance>\n"
962 " <instance>specific</instance>\n"
963 " </interface>\n"
964 " </hal>\n"
965 " <hal format=\"hidl\">\n"
966 " <name>android.hardware.foo</name>\n"
967 " <transport>hwbinder</transport>\n"
968 " <version>2.0</version>\n"
969 " <interface>\n"
970 " <name>IBar</name>\n"
971 " <instance>default</instance>\n"
972 " </interface>\n"
973 " </hal>\n"
974 " <sepolicy>\n"
975 " <version>25.5</version>\n"
976 " </sepolicy>\n"
977 "</manifest>\n";
978 HalManifest manifest;
979 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
980 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
981 }
982
983 {
984 std::string manifestXml =
985 "<manifest version=\"1.0\" type=\"device\">\n"
986 " <hal format=\"hidl\">\n"
987 " <name>android.hardware.foo</name>\n"
988 " <transport>hwbinder</transport>\n"
989 " <version>1.0</version>\n"
990 " <interface>\n"
991 " <name>IFoo</name>\n"
992 " <instance>default</instance>\n"
993 " </interface>\n"
994 " </hal>\n"
995 " <hal format=\"hidl\">\n"
996 " <name>android.hardware.foo</name>\n"
997 " <transport>hwbinder</transport>\n"
998 " <version>3.2</version>\n"
999 " <interface>\n"
1000 " <name>IFoo</name>\n"
1001 " <instance>specific</instance>\n"
1002 " </interface>\n"
1003 " </hal>\n"
1004 " <hal format=\"hidl\">\n"
1005 " <name>android.hardware.foo</name>\n"
1006 " <transport>hwbinder</transport>\n"
1007 " <version>2.0</version>\n"
1008 " <interface>\n"
1009 " <name>IBar</name>\n"
1010 " <instance>default</instance>\n"
1011 " </interface>\n"
1012 " </hal>\n"
1013 " <sepolicy>\n"
1014 " <version>25.5</version>\n"
1015 " </sepolicy>\n"
1016 "</manifest>\n";
1017 HalManifest manifest;
1018 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1019 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1020 << "should not be compatible even though @1.0::IFoo/default "
1021 << "and @3.2::IFoo/specific present";
1022 }
1023
1024 {
1025 std::string manifestXml =
1026 "<manifest version=\"1.0\" type=\"device\">\n"
1027 " <hal format=\"hidl\">\n"
1028 " <name>android.hardware.foo</name>\n"
1029 " <transport>hwbinder</transport>\n"
1030 " <version>1.0</version>\n"
1031 " <interface>\n"
1032 " <name>IFoo</name>\n"
1033 " <instance>default</instance>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001034 " <instance>specific</instance>\n"
1035 " </interface>\n"
1036 " </hal>\n"
1037 " <hal format=\"hidl\">\n"
1038 " <name>android.hardware.foo</name>\n"
1039 " <transport>hwbinder</transport>\n"
1040 " <version>2.0</version>\n"
1041 " <interface>\n"
1042 " <name>IBar</name>\n"
1043 " <instance>default</instance>\n"
1044 " </interface>\n"
1045 " </hal>\n"
1046 " <sepolicy>\n"
1047 " <version>25.5</version>\n"
1048 " </sepolicy>\n"
1049 "</manifest>\n";
1050 HalManifest manifest;
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001051 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml))
1052 << gHalManifestConverter.lastError();
1053 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
Yifan Hong08e984c2017-05-18 12:50:04 -07001054 }
1055}
1056
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001057TEST_F(LibVintfTest, Compat) {
1058 std::string manifestXml =
1059 "<manifest version=\"1.0\" type=\"device\">\n"
1060 " <hal format=\"hidl\">\n"
1061 " <name>android.hardware.camera</name>\n"
1062 " <transport>hwbinder</transport>\n"
1063 " <version>3.5</version>\n"
1064 " <interface>\n"
1065 " <name>IBetterCamera</name>\n"
1066 " <instance>camera</instance>\n"
1067 " </interface>\n"
1068 " <interface>\n"
1069 " <name>ICamera</name>\n"
1070 " <instance>default</instance>\n"
1071 " <instance>legacy/0</instance>\n"
1072 " </interface>\n"
1073 " </hal>\n"
1074 " <hal format=\"hidl\">\n"
1075 " <name>android.hardware.nfc</name>\n"
1076 " <transport>hwbinder</transport>\n"
1077 " <version>1.0</version>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001078 " <interface>\n"
1079 " <name>INfc</name>\n"
1080 " <instance>nfc_nci</instance>\n"
1081 " </interface>\n"
1082 " </hal>\n"
1083 " <hal format=\"hidl\">\n"
1084 " <name>android.hardware.nfc</name>\n"
1085 " <transport>hwbinder</transport>\n"
1086 " <version>2.0</version>\n"
1087 " <interface>\n"
1088 " <name>INfc</name>\n"
1089 " <instance>default</instance>\n"
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001090 " <instance>nfc_nci</instance>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001091 " </interface>\n"
1092 " </hal>\n"
1093 " <sepolicy>\n"
1094 " <version>25.5</version>\n"
1095 " </sepolicy>\n"
1096 "</manifest>\n";
1097
1098 std::string matrixXml =
1099 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1100 " <hal format=\"hidl\" optional=\"false\">\n"
1101 " <name>android.hardware.camera</name>\n"
1102 " <version>2.0-5</version>\n"
1103 " <version>3.4-16</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001104 " <interface>\n"
1105 " <name>IBetterCamera</name>\n"
1106 " <instance>camera</instance>\n"
1107 " </interface>\n"
1108 " <interface>\n"
1109 " <name>ICamera</name>\n"
1110 " <instance>default</instance>\n"
1111 " <instance>legacy/0</instance>\n"
1112 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001113 " </hal>\n"
1114 " <hal format=\"hidl\" optional=\"false\">\n"
1115 " <name>android.hardware.nfc</name>\n"
1116 " <version>1.0</version>\n"
1117 " <version>2.0</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001118 " <interface>\n"
1119 " <name>INfc</name>\n"
1120 " <instance>nfc_nci</instance>\n"
1121 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001122 " </hal>\n"
1123 " <hal format=\"hidl\" optional=\"true\">\n"
1124 " <name>android.hardware.foo</name>\n"
1125 " <version>1.0</version>\n"
1126 " </hal>\n"
1127 " <sepolicy>\n"
1128 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1129 " <sepolicy-version>25.5</sepolicy-version>\n"
1130 " <sepolicy-version>26.0-3</sepolicy-version>\n"
1131 " </sepolicy>\n"
1132 " <avb>\n"
1133 " <vbmeta-version>2.1</vbmeta-version>\n"
1134 " </avb>\n"
1135 "</compatibility-matrix>\n";
1136
1137 HalManifest manifest;
1138 CompatibilityMatrix matrix;
1139 std::string error;
1140 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1141 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1142 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1143
1144 // some smaller test cases
1145 matrixXml =
1146 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1147 " <hal format=\"hidl\" optional=\"false\">\n"
1148 " <name>android.hardware.camera</name>\n"
1149 " <version>3.4</version>\n"
1150 " </hal>\n"
1151 " <sepolicy>\n"
1152 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1153 " <sepolicy-version>25.5</sepolicy-version>\n"
1154 " </sepolicy>\n"
1155 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1156 "</compatibility-matrix>\n";
1157 matrix = {};
1158 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1159 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1160 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
1161 EXPECT_NE(camera, nullptr);
1162 camera->versionRanges[0] = {3, 5};
1163 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1164 camera->versionRanges[0] = {3, 6};
1165 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1166
1167 // reset it
1168 matrix = {};
1169 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1170 set(matrix, Sepolicy{30, {{26, 0}}});
1171 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1172 set(matrix, Sepolicy{30, {{25, 6}}});
1173 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1174 set(matrix, Sepolicy{30, {{25, 4}}});
1175 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1176}
1177
Yifan Hongd4857902017-06-13 14:13:56 -07001178/////////////////// xmlfile tests
1179
1180TEST_F(LibVintfTest, HalManifestConverterXmlFile) {
1181 HalManifest vm = testDeviceManifestWithXmlFile();
1182 std::string xml = gHalManifestConverter(vm);
1183 EXPECT_EQ(xml,
1184 "<manifest version=\"1.0\" type=\"device\">\n"
1185 " <hal format=\"hidl\">\n"
1186 " <name>android.hardware.camera</name>\n"
1187 " <transport>hwbinder</transport>\n"
1188 " <version>2.0</version>\n"
1189 " <interface>\n"
1190 " <name>IBetterCamera</name>\n"
1191 " <instance>camera</instance>\n"
1192 " </interface>\n"
1193 " <interface>\n"
1194 " <name>ICamera</name>\n"
1195 " <instance>default</instance>\n"
1196 " <instance>legacy/0</instance>\n"
1197 " </interface>\n"
1198 " </hal>\n"
1199 " <hal format=\"hidl\">\n"
1200 " <name>android.hardware.nfc</name>\n"
1201 " <transport arch=\"32+64\">passthrough</transport>\n"
1202 " <version>1.0</version>\n"
1203 " <interface>\n"
1204 " <name>INfc</name>\n"
1205 " <instance>default</instance>\n"
1206 " </interface>\n"
1207 " </hal>\n"
1208 " <sepolicy>\n"
1209 " <version>25.0</version>\n"
1210 " </sepolicy>\n"
1211 " <xmlfile>\n"
1212 " <name>media_profile</name>\n"
1213 " <version>1.0</version>\n"
1214 " </xmlfile>\n"
1215 "</manifest>\n");
1216 HalManifest vm2;
1217 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
1218 EXPECT_EQ(vm, vm2);
1219}
1220
1221TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile) {
1222 CompatibilityMatrix cm;
1223 addXmlFile(cm, "media_profile", {1, 0});
1224 std::string xml = gCompatibilityMatrixConverter(cm);
1225 EXPECT_EQ(xml,
1226 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1227 " <sepolicy>\n"
1228 " <kernel-sepolicy-version>0</kernel-sepolicy-version>\n"
1229 " </sepolicy>\n"
1230 " <avb>\n"
1231 " <vbmeta-version>0.0</vbmeta-version>\n"
1232 " </avb>\n"
1233 " <xmlfile format=\"dtd\" optional=\"true\">\n"
1234 " <name>media_profile</name>\n"
1235 " <version>1.0</version>\n"
1236 " </xmlfile>\n"
1237 "</compatibility-matrix>\n");
1238 CompatibilityMatrix cm2;
1239 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
1240 EXPECT_EQ(cm, cm2);
1241}
1242
1243TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile2) {
1244 std::string xml =
1245 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1246 " <xmlfile format=\"dtd\" optional=\"false\">\n"
1247 " <name>media_profile</name>\n"
1248 " <version>1.0</version>\n"
1249 " </xmlfile>\n"
1250 "</compatibility-matrix>\n";
1251 CompatibilityMatrix cm;
1252 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml));
1253 EXPECT_EQ(
1254 "compatibility-matrix.xmlfile entry media_profile has to be optional for "
1255 "compatibility matrix version 1.0",
1256 gCompatibilityMatrixConverter.lastError());
1257}
1258
Yifan Hongbbfff302017-06-06 17:10:13 -07001259TEST_F(LibVintfTest, ManifestXmlFilePathDevice) {
1260 std::string manifestXml =
1261 "<manifest version=\"1.0\" type=\"device\">"
1262 " <xmlfile>"
1263 " <name>media_profile</name>"
1264 " <version>1.0</version>"
1265 " </xmlfile>"
1266 "</manifest>";
1267 HalManifest manifest;
1268 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1269 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1270 "/vendor/etc/media_profile_V1_0.xml");
1271}
1272
1273TEST_F(LibVintfTest, ManifestXmlFilePathFramework) {
1274 std::string manifestXml =
1275 "<manifest version=\"1.0\" type=\"framework\">"
1276 " <xmlfile>"
1277 " <name>media_profile</name>"
1278 " <version>1.0</version>"
1279 " </xmlfile>"
1280 "</manifest>";
1281 HalManifest manifest;
1282 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1283 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1284 "/system/etc/media_profile_V1_0.xml");
1285}
1286
1287TEST_F(LibVintfTest, ManifestXmlFilePathOverride) {
1288 std::string manifestXml =
1289 "<manifest version=\"1.0\" type=\"device\">"
1290 " <xmlfile>"
1291 " <name>media_profile</name>"
1292 " <version>1.0</version>"
1293 " <path>/vendor/etc/foo.xml</path>"
1294 " </xmlfile>"
1295 "</manifest>";
1296 HalManifest manifest;
1297 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1298 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "/vendor/etc/foo.xml");
1299}
1300
1301TEST_F(LibVintfTest, ManifestXmlFilePathMissing) {
1302 std::string manifestXml =
1303 "<manifest version=\"1.0\" type=\"device\">"
1304 " <xmlfile>"
1305 " <name>media_profile</name>"
1306 " <version>1.1</version>"
1307 " </xmlfile>"
1308 "</manifest>";
1309 HalManifest manifest;
1310 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1311 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "");
1312}
1313
1314TEST_F(LibVintfTest, MatrixXmlFilePathFramework) {
1315 std::string matrixXml =
1316 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1317 " <xmlfile format=\"dtd\" optional=\"true\">"
1318 " <name>media_profile</name>"
1319 " <version>2.0-1</version>"
1320 " </xmlfile>"
1321 "</compatibility-matrix>";
1322 CompatibilityMatrix matrix;
1323 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1324 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 1}),
1325 "/system/etc/media_profile_V2_1.dtd");
1326}
1327
1328TEST_F(LibVintfTest, MatrixXmlFilePathDevice) {
1329 std::string matrixXml =
1330 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1331 " <xmlfile format=\"xsd\" optional=\"true\">"
1332 " <name>media_profile</name>"
1333 " <version>2.0-1</version>"
1334 " </xmlfile>"
1335 "</compatibility-matrix>";
1336 CompatibilityMatrix matrix;
1337 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1338 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}),
1339 "/vendor/etc/media_profile_V2_1.xsd");
1340}
1341
1342TEST_F(LibVintfTest, MatrixXmlFilePathOverride) {
1343 std::string matrixXml =
1344 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1345 " <xmlfile format=\"xsd\" optional=\"true\">"
1346 " <name>media_profile</name>"
1347 " <version>2.0-1</version>"
1348 " <path>/system/etc/foo.xsd</path>"
1349 " </xmlfile>"
1350 "</compatibility-matrix>";
1351 CompatibilityMatrix matrix;
1352 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1353 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "/system/etc/foo.xsd");
1354}
1355
1356TEST_F(LibVintfTest, MatrixXmlFilePathMissing) {
1357 std::string matrixXml =
1358 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1359 " <xmlfile format=\"dtd\" optional=\"true\">"
1360 " <name>media_profile</name>"
1361 " <version>2.1</version>"
1362 " </xmlfile>"
1363 "</compatibility-matrix>";
1364 CompatibilityMatrix matrix;
1365 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1366 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "");
1367}
1368
Yifan Hong02e94002017-07-10 15:41:56 -07001369std::pair<KernelConfigParser, status_t> processData(const std::string& data, bool processComments,
1370 bool relaxedFormat = false) {
1371 KernelConfigParser parser(processComments, relaxedFormat);
Yifan Hongd8cee082017-07-05 16:06:09 -07001372 const char* p = data.c_str();
1373 size_t n = 0;
1374 size_t chunkSize;
Yifan Hong6209d172017-07-07 16:18:19 -07001375 status_t status = OK;
Yifan Hongd8cee082017-07-05 16:06:09 -07001376 for (; n < data.size(); p += chunkSize, n += chunkSize) {
1377 chunkSize = std::min<size_t>(5, data.size() - n);
Yifan Hong6209d172017-07-07 16:18:19 -07001378 if ((status = parser.process(p, chunkSize)) != OK) {
1379 break;
1380 }
Yifan Hongd8cee082017-07-05 16:06:09 -07001381 }
Yifan Hong6209d172017-07-07 16:18:19 -07001382 return {std::move(parser), status};
Yifan Hongd8cee082017-07-05 16:06:09 -07001383}
1384
1385TEST_F(LibVintfTest, KernelConfigParser) {
1386 // usage in /proc/config.gz
1387 const std::string data =
1388 "# CONFIG_NOT_SET is not set\n"
1389 "CONFIG_ONE=1\n"
1390 "CONFIG_Y=y\n"
1391 "CONFIG_STR=\"string\"\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001392 auto pair = processData(data, false /* processComments */);
1393 ASSERT_EQ(OK, pair.second) << pair.first.error();
1394 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001395
1396 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1397 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1398 EXPECT_EQ(configs.find("CONFIG_STR")->second, "\"string\"");
1399 EXPECT_EQ(configs.find("CONFIG_NOT_SET"), configs.end());
1400}
1401
1402TEST_F(LibVintfTest, KernelConfigParser2) {
1403 // usage in android-base.cfg
1404 const std::string data =
1405 "# CONFIG_NOT_SET is not set\n"
1406 "CONFIG_ONE=1\n"
1407 "CONFIG_Y=y\n"
1408 "CONFIG_STR=string\n"
1409 "# ignore_thiscomment\n"
1410 "# CONFIG_NOT_SET2 is not set\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001411 auto pair = processData(data, true /* processComments */);
1412 ASSERT_EQ(OK, pair.second) << pair.first.error();
1413 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001414
1415 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1416 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1417 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1418 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1419 EXPECT_EQ(configs.find("CONFIG_NOT_SET2")->second, "n");
1420}
1421
Yifan Hongc1889722017-07-07 16:19:52 -07001422TEST_F(LibVintfTest, KernelConfigParserSpace) {
1423 // usage in android-base.cfg
1424 const std::string data =
1425 " # CONFIG_NOT_SET is not set \n"
1426 " CONFIG_ONE=1 # 'tis a one!\n"
1427 " CONFIG_TWO=2 #'tis a two! \n"
1428 " CONFIG_THREE=3#'tis a three! \n"
1429 " CONFIG_233=233#'tis a three! \n"
1430 "#yey! random comments\n"
1431 "CONFIG_Y=y \n"
1432 " CONFIG_YES=y#YES! \n"
1433 "CONFIG_STR=string\n"
1434 "CONFIG_HELLO=hello world! #still works\n"
1435 "CONFIG_WORLD=hello world! \n"
1436 "CONFIG_GOOD = good morning! #comments here\n"
1437 " CONFIG_MORNING = good morning! \n";
Yifan Hong02e94002017-07-10 15:41:56 -07001438 auto pair = processData(data, true /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07001439 ASSERT_EQ(OK, pair.second) << pair.first.error();
1440 const auto& configs = pair.first.configs();
1441
1442 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1443 EXPECT_EQ(configs.find("CONFIG_TWO")->second, "2");
1444 EXPECT_EQ(configs.find("CONFIG_THREE")->second, "3");
1445 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1446 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1447 EXPECT_EQ(configs.find("CONFIG_HELLO")->second, "hello world!")
1448 << "Value should be \"hello world!\" without trailing spaces";
1449 EXPECT_EQ(configs.find("CONFIG_WORLD")->second, "hello world!")
1450 << "Value should be \"hello world!\" without trailing spaces";
1451 EXPECT_EQ(configs.find("CONFIG_GOOD")->second, "good morning!")
1452 << "Value should be \"good morning!\" without leading or trailing spaces";
1453 EXPECT_EQ(configs.find("CONFIG_MORNING")->second, "good morning!")
1454 << "Value should be \"good morning!\" without leading or trailing spaces";
1455 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1456}
1457
Yifan Hongd9e46432017-08-15 17:14:52 -07001458TEST_F(LibVintfTest, NetutilsWrapperMatrix) {
1459 std::string matrixXml;
1460 CompatibilityMatrix matrix;
1461
1462 matrixXml =
1463 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1464 " <hal format=\"native\" optional=\"false\">"
1465 " <name>netutils-wrapper</name>"
1466 " <version>1.0</version>"
1467 " </hal>"
1468 "</compatibility-matrix>";
1469 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
1470 << gCompatibilityMatrixConverter.lastError();
1471
1472// only host libvintf hardcodes netutils-wrapper version requirements
1473#ifdef LIBVINTF_HOST
1474
1475 matrixXml =
1476 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1477 " <hal format=\"native\" optional=\"false\">"
1478 " <name>netutils-wrapper</name>"
1479 " <version>1.0-1</version>"
1480 " </hal>"
1481 "</compatibility-matrix>";
1482 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1483 EXPECT_CONTAINS(
1484 gCompatibilityMatrixConverter.lastError(),
1485 "netutils-wrapper HAL must specify exactly one version x.0, but a range is provided. "
1486 "Perhaps you mean '1.0'?");
1487
1488 matrixXml =
1489 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1490 " <hal format=\"native\" optional=\"false\">"
1491 " <name>netutils-wrapper</name>"
1492 " <version>1.1</version>"
1493 " </hal>"
1494 "</compatibility-matrix>";
1495 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1496 EXPECT_CONTAINS(
1497 gCompatibilityMatrixConverter.lastError(),
1498 "netutils-wrapper HAL must specify exactly one version x.0, but minor version is not 0. "
1499 "Perhaps you mean '1.0'?");
1500
1501 matrixXml =
1502 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1503 " <hal format=\"native\" optional=\"false\">"
1504 " <name>netutils-wrapper</name>"
1505 " <version>1.0</version>"
1506 " <version>2.0</version>"
1507 " </hal>"
1508 "</compatibility-matrix>";
1509 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1510 EXPECT_CONTAINS(
1511 gCompatibilityMatrixConverter.lastError(),
1512 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1513 "is specified.");
1514
1515#endif // LIBVINTF_HOST
1516}
1517
1518TEST_F(LibVintfTest, NetutilsWrapperManifest) {
1519 std::string manifestXml;
1520 HalManifest manifest;
1521
1522 manifestXml =
1523 "<manifest version=\"1.0\" type=\"framework\">"
1524 " <hal format=\"native\">"
1525 " <name>netutils-wrapper</name>"
1526 " <version>1.0</version>"
1527 " <version>2.0</version>"
1528 " </hal>"
1529 "</manifest>";
1530 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml)) << gHalManifestConverter.lastError();
1531
1532// only host libvintf hardcodes netutils-wrapper version requirements
1533#ifdef LIBVINTF_HOST
1534
1535 manifestXml =
1536 "<manifest version=\"1.0\" type=\"framework\">"
1537 " <hal format=\"native\">"
1538 " <name>netutils-wrapper</name>"
1539 " <version>1.1</version>"
1540 " </hal>"
1541 "</manifest>";
1542 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1543 EXPECT_CONTAINS(
1544 gCompatibilityMatrixConverter.lastError(),
1545 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1546 "is specified.");
1547
1548 manifestXml =
1549 "<manifest version=\"1.0\" type=\"framework\">"
1550 " <hal format=\"native\">"
1551 " <name>netutils-wrapper</name>"
1552 " <version>1.0</version>"
1553 " <version>2.1</version>"
1554 " </hal>"
1555 "</manifest>";
1556 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1557 EXPECT_CONTAINS(
1558 gCompatibilityMatrixConverter.lastError(),
1559 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1560 "is specified.");
1561
1562#endif // LIBVINTF_HOST
1563}
1564
Yifan Hong5f996502017-08-23 14:46:44 -07001565TEST_F(LibVintfTest, KernelConfigConditionTest) {
1566 std::string xml =
1567 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1568 " <kernel version=\"3.18.22\"/>\n"
1569 " <kernel version=\"3.18.22\">\n"
1570 " <conditions>\n"
1571 " <config>\n"
1572 " <key>CONFIG_ARM</key>\n"
1573 " <value type=\"tristate\">y</value>\n"
1574 " </config>\n"
1575 " </conditions>\n"
1576 " <config>\n"
1577 " <key>CONFIG_FOO</key>\n"
1578 " <value type=\"tristate\">y</value>\n"
1579 " </config>\n"
1580 " </kernel>\n"
1581 " <sepolicy>\n"
1582 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1583 " <sepolicy-version>25.0</sepolicy-version>\n"
1584 " </sepolicy>\n"
1585 " <avb>\n"
1586 " <vbmeta-version>2.1</vbmeta-version>\n"
1587 " </avb>\n"
1588 "</compatibility-matrix>\n";
1589
1590 CompatibilityMatrix cm;
1591 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1592 << gCompatibilityMatrixConverter.lastError();
1593 const auto& kernels = getKernels(cm);
1594 ASSERT_GE(kernels.size(), 2u);
1595 ASSERT_TRUE(kernels[0].conditions().empty());
1596 const auto& kernel = kernels[1];
1597 const auto& cond = kernel.conditions();
1598 ASSERT_FALSE(cond.empty());
1599 EXPECT_EQ("CONFIG_ARM", cond.begin()->first);
1600 EXPECT_EQ(KernelConfigTypedValue(Tristate::YES), cond.begin()->second);
1601 EXPECT_FALSE(kernel.configs().empty());
1602
1603 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
1604}
1605
1606TEST_F(LibVintfTest, KernelConfigConditionEmptyTest) {
1607 std::string xml =
1608 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1609 " <kernel version=\"4.4.0\"/>\n"
1610 " <kernel version=\"3.18.22\">\n"
1611 " <conditions>\n"
1612 " <config>\n"
1613 " <key>CONFIG_ARM</key>\n"
1614 " <value type=\"tristate\">y</value>\n"
1615 " </config>\n"
1616 " </conditions>\n"
1617 " </kernel>\n"
1618 "</compatibility-matrix>\n";
1619
1620 CompatibilityMatrix cm;
1621 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml))
1622 << "Should not accept first kernel version with non-empty conditions";
1623 EXPECT_EQ(
1624 "First <kernel> for version 3.18 must have empty <conditions> "
1625 "for backwards compatibility.",
1626 gCompatibilityMatrixConverter.lastError());
1627}
1628
1629TEST_F(LibVintfTest, KernelConfigConditionMatch) {
1630 RuntimeInfo runtime = testRuntimeInfo();
1631 std::string error;
1632 std::string xml;
1633 CompatibilityMatrix cm;
1634
1635 xml =
1636 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1637 " <kernel version=\"3.18.22\"/>\n"
1638 " <kernel version=\"3.18.22\">\n"
1639 " <conditions>\n"
1640 " <config>\n"
1641 " <key>CONFIG_64BIT</key>\n"
1642 " <value type=\"tristate\">y</value>\n"
1643 " </config>\n"
1644 " </conditions>\n"
1645 " <config>\n"
1646 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1647 " <value type=\"int\">24</value>\n"
1648 " </config>\n"
1649 " </kernel>\n"
1650 " <sepolicy>\n"
1651 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1652 " </sepolicy>\n"
1653 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1654 "</compatibility-matrix>\n";
1655
1656 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1657 << gCompatibilityMatrixConverter.lastError();
1658 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1659
1660 xml =
1661 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1662 " <kernel version=\"3.18.22\"/>\n"
1663 " <kernel version=\"3.18.22\">\n"
1664 " <conditions>\n"
1665 " <config>\n"
1666 " <key>CONFIG_64BIT</key>\n"
1667 " <value type=\"tristate\">y</value>\n"
1668 " </config>\n"
1669 " </conditions>\n"
1670 " <config>\n"
1671 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1672 " <value type=\"int\">26</value>\n"
1673 " </config>\n"
1674 " </kernel>\n"
1675 " <sepolicy>\n"
1676 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1677 " </sepolicy>\n"
1678 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1679 "</compatibility-matrix>\n";
1680
1681 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1682 << gCompatibilityMatrixConverter.lastError();
1683 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1684 << "conditions met, so CONFIG_ARCH_MMAP_RND_BITS should not match";
1685
1686 xml =
1687 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1688 " <kernel version=\"3.18.22\"/>\n"
1689 " <kernel version=\"3.18.22\">\n"
1690 " <conditions>\n"
1691 " <config>\n"
1692 " <key>CONFIG_64BIT</key>\n"
1693 " <value type=\"tristate\">n</value>\n"
1694 " </config>\n"
1695 " </conditions>\n"
1696 " <config>\n"
1697 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1698 " <value type=\"int\">26</value>\n"
1699 " </config>\n"
1700 " </kernel>\n"
1701 " <sepolicy>\n"
1702 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1703 " </sepolicy>\n"
1704 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1705 "</compatibility-matrix>\n";
1706
1707 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1708 << gCompatibilityMatrixConverter.lastError();
1709 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1710 xml =
1711 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1712 " <kernel version=\"3.18.22\"/>\n"
1713 " <kernel version=\"3.18.22\">\n"
1714 " <conditions>\n"
1715 " <config>\n"
1716 " <key>CONFIG_64BIT</key>\n"
1717 " <value type=\"tristate\">y</value>\n"
1718 " </config>\n"
1719 " <config>\n"
1720 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1721 " <value type=\"int\">24</value>\n"
1722 " </config>\n"
1723 " </conditions>\n"
1724 " <config>\n"
1725 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1726 " <value type=\"int\">0xdead000000000000</value>\n"
1727 " </config>\n"
1728 " </kernel>\n"
1729 " <sepolicy>\n"
1730 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1731 " </sepolicy>\n"
1732 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1733 "</compatibility-matrix>\n";
1734
1735 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1736 << gCompatibilityMatrixConverter.lastError();
1737 EXPECT_TRUE(runtime.checkCompatibility(cm, &error));
1738
1739 xml =
1740 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1741 " <kernel version=\"3.18.22\"/>\n"
1742 " <kernel version=\"3.18.22\">\n"
1743 " <conditions>\n"
1744 " <config>\n"
1745 " <key>CONFIG_64BIT</key>\n"
1746 " <value type=\"tristate\">y</value>\n"
1747 " </config>\n"
1748 " <config>\n"
1749 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1750 " <value type=\"int\">24</value>\n"
1751 " </config>\n"
1752 " </conditions>\n"
1753 " <config>\n"
1754 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1755 " <value type=\"int\">0xbeaf000000000000</value>\n"
1756 " </config>\n"
1757 " </kernel>\n"
1758 " <sepolicy>\n"
1759 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1760 " </sepolicy>\n"
1761 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1762 "</compatibility-matrix>\n";
1763
1764 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1765 << gCompatibilityMatrixConverter.lastError();
1766 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1767 << "conditions have 'and' relationship, so CONFIG_ILLEGAL_POINTER_VALUE should not match";
1768
1769 xml =
1770 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1771 " <kernel version=\"3.18.22\"/>\n"
1772 " <kernel version=\"3.18.22\">\n"
1773 " <conditions>\n"
1774 " <config>\n"
1775 " <key>CONFIG_64BIT</key>\n"
1776 " <value type=\"tristate\">y</value>\n"
1777 " </config>\n"
1778 " <config>\n"
1779 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1780 " <value type=\"int\">26</value>\n"
1781 " </config>\n"
1782 " </conditions>\n"
1783 " <config>\n"
1784 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1785 " <value type=\"int\">0xbeaf000000000000</value>\n"
1786 " </config>\n"
1787 " </kernel>\n"
1788 " <sepolicy>\n"
1789 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1790 " </sepolicy>\n"
1791 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1792 "</compatibility-matrix>\n";
1793
1794 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1795 << gCompatibilityMatrixConverter.lastError();
1796 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1797
1798 xml =
1799 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1800 " <kernel version=\"3.18.22\">\n"
1801 " <config>\n"
1802 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1803 " <value type=\"string\"/>\n"
1804 " </config>\n"
1805 " </kernel>\n"
1806 " <kernel version=\"3.18.22\">\n"
1807 " <conditions>\n"
1808 " <config>\n"
1809 " <key>CONFIG_64BIT</key>\n"
1810 " <value type=\"tristate\">y</value>\n"
1811 " </config>\n"
1812 " </conditions>\n"
1813 " <config>\n"
1814 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1815 " <value type=\"int\">0xdead000000000000</value>\n"
1816 " </config>\n"
1817 " </kernel>\n"
1818 " <kernel version=\"3.18.22\">\n"
1819 " <conditions>\n"
1820 " <config>\n"
1821 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1822 " <value type=\"int\">24</value>\n"
1823 " </config>\n"
1824 " </conditions>\n"
1825 " <config>\n"
1826 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1827 " <value type=\"string\">binder,hwbinder</value>\n"
1828 " </config>\n"
1829 " </kernel>\n"
1830 " <sepolicy>\n"
1831 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1832 " </sepolicy>\n"
1833 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1834 "</compatibility-matrix>\n";
1835
1836 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1837 << gCompatibilityMatrixConverter.lastError();
1838 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1839
1840 xml =
1841 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1842 " <kernel version=\"3.18.22\">\n"
1843 " <config>\n"
1844 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1845 " <value type=\"string\"/>\n"
1846 " </config>\n"
1847 " </kernel>\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 " </conditions>\n"
1855 " <config>\n"
1856 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1857 " <value type=\"int\">0xbeaf000000000000</value>\n"
1858 " </config>\n"
1859 " </kernel>\n"
1860 " <kernel version=\"3.18.22\">\n"
1861 " <conditions>\n"
1862 " <config>\n"
1863 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1864 " <value type=\"int\">24</value>\n"
1865 " </config>\n"
1866 " </conditions>\n"
1867 " <config>\n"
1868 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1869 " <value type=\"string\">binder,hwbinder</value>\n"
1870 " </config>\n"
1871 " </kernel>\n"
1872 " <sepolicy>\n"
1873 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1874 " </sepolicy>\n"
1875 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1876 "</compatibility-matrix>\n";
1877
1878 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1879 << gCompatibilityMatrixConverter.lastError();
1880 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used.";
1881
1882 xml =
1883 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1884 " <kernel version=\"3.18.22\">\n"
1885 " <config>\n"
1886 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1887 " <value type=\"string\"/>\n"
1888 " </config>\n"
1889 " </kernel>\n"
1890 " <kernel version=\"3.18.22\">\n"
1891 " <conditions>\n"
1892 " <config>\n"
1893 " <key>CONFIG_64BIT</key>\n"
1894 " <value type=\"tristate\">y</value>\n"
1895 " </config>\n"
1896 " </conditions>\n"
1897 " <config>\n"
1898 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1899 " <value type=\"int\">0xdead000000000000</value>\n"
1900 " </config>\n"
1901 " </kernel>\n"
1902 " <kernel version=\"3.18.22\">\n"
1903 " <conditions>\n"
1904 " <config>\n"
1905 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1906 " <value type=\"int\">24</value>\n"
1907 " </config>\n"
1908 " </conditions>\n"
1909 " <config>\n"
1910 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1911 " <value type=\"string\">binder</value>\n"
1912 " </config>\n"
1913 " </kernel>\n"
1914 " <sepolicy>\n"
1915 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1916 " </sepolicy>\n"
1917 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1918 "</compatibility-matrix>\n";
1919
1920 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1921 << gCompatibilityMatrixConverter.lastError();
1922 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used";
1923}
1924
Yifan Hongc1889722017-07-07 16:19:52 -07001925// Run KernelConfigParserInvalidTest on processComments = {true, false}
1926class KernelConfigParserInvalidTest : public ::testing::TestWithParam<bool> {};
1927
1928TEST_P(KernelConfigParserInvalidTest, NonSet1) {
1929 const std::string data = "# CONFIG_NOT_EXIST is not sat\n";
Yifan Hong02e94002017-07-10 15:41:56 -07001930 auto pair = processData(data, GetParam() /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07001931 ASSERT_EQ(OK, pair.second) << pair.first.error();
1932 const auto& configs = pair.first.configs();
1933 EXPECT_EQ(configs.find("CONFIG_NOT_EXIST"), configs.end())
1934 << "CONFIG_NOT_EXIST should not exist because of typo";
1935}
1936
1937TEST_P(KernelConfigParserInvalidTest, InvalidLine1) {
1938 const std::string data = "FOO_CONFIG=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07001939 ASSERT_NE(OK,
1940 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07001941}
1942
1943TEST_P(KernelConfigParserInvalidTest, InvalidLine2) {
1944 const std::string data = "CONFIG_BAR-BAZ=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07001945 ASSERT_NE(OK,
1946 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07001947}
1948
1949INSTANTIATE_TEST_CASE_P(KernelConfigParser, KernelConfigParserInvalidTest, ::testing::Bool());
1950
Yifan Honga9993572017-01-24 19:33:15 -08001951} // namespace vintf
1952} // namespace android
1953
Yifan Hong676447a2016-11-15 12:57:23 -08001954int main(int argc, char **argv) {
1955 ::testing::InitGoogleTest(&argc, argv);
1956 return RUN_ALL_TESTS();
1957}