blob: 495b35cb7d9b84260b10820998dbe09c5af28240 [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 Hongd9e46432017-08-15 17:14:52 -070042static bool Contains(const std::string& str, const std::string& sub) {
43 return str.find(sub) != std::string::npos;
44}
45#define EXPECT_CONTAINS(str, sub) \
46 EXPECT_TRUE(Contains((str), (sub))) << "Cannot find \"" << (sub) << "\" in \"" << (str) << "\""
47
Yifan Honga9993572017-01-24 19:33:15 -080048struct LibVintfTest : public ::testing::Test {
Yifan Hong676447a2016-11-15 12:57:23 -080049public:
50 virtual void SetUp() override {
51 }
52 virtual void TearDown() override {
53 }
Yifan Honga9993572017-01-24 19:33:15 -080054 bool add(CompatibilityMatrix &cm, MatrixHal &&hal) {
55 return cm.add(std::move(hal));
56 }
57 bool add(CompatibilityMatrix &cm, MatrixKernel &&kernel) {
58 return cm.add(std::move(kernel));
59 }
Yifan Hongd2b7e642017-02-17 10:15:32 -080060 bool add(HalManifest &vm, ManifestHal &&hal) {
Yifan Honga9993572017-01-24 19:33:15 -080061 return vm.add(std::move(hal));
62 }
Yifan Hongd4857902017-06-13 14:13:56 -070063 void addXmlFile(CompatibilityMatrix& cm, std::string name, VersionRange range) {
64 MatrixXmlFile f;
65 f.mName = name;
66 f.mVersionRange = range;
67 f.mFormat = XmlSchemaFormat::DTD;
68 f.mOptional = true;
69 cm.addXmlFile(std::move(f));
70 }
Yifan Hong558380a2017-02-09 15:37:32 -080071 void set(CompatibilityMatrix &cm, Sepolicy &&sepolicy) {
Yifan Hong7c7d7062017-04-04 16:26:51 -070072 cm.framework.mSepolicy = sepolicy;
Yifan Hong558380a2017-02-09 15:37:32 -080073 }
Yifan Hong03d2d4a2017-04-12 17:34:14 -070074 void set(CompatibilityMatrix &cm, SchemaType type) {
75 cm.mType = type;
76 }
77 void set(CompatibilityMatrix &cm, VndkVersionRange &&range, std::set<std::string> &&libs) {
78 cm.device.mVndk.mVersionRange = range;
79 cm.device.mVndk.mLibraries = libs;
80 }
Yifan Hong881a9e452017-04-27 19:31:13 -070081 void setAvb(RuntimeInfo &ki, Version vbmeta, Version boot) {
82 ki.mBootVbmetaAvbVersion = vbmeta;
83 ki.mBootAvbVersion = boot;
Yifan Hongf3029302017-04-12 17:23:49 -070084 }
85 void setAvb(CompatibilityMatrix &cm, Version &&avbVersion) {
86 cm.framework.mAvbMetaVersion = avbVersion;
87 }
Yifan Hong19e0a2a2017-04-14 17:30:53 -070088 Version getAvb(CompatibilityMatrix &cm) {
89 return cm.framework.mAvbMetaVersion;
90 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070091 const ManifestHal *getAnyHal(HalManifest &vm, const std::string &name) {
92 return vm.getAnyHal(name);
Yifan Honga9993572017-01-24 19:33:15 -080093 }
Yifan Hongd0cbf1f2017-04-12 19:47:06 -070094 MatrixHal *getAnyHal(CompatibilityMatrix &cm, const std::string &name) {
95 return cm.getAnyHal(name);
96 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070097 ConstMultiMapValueIterable<std::string, ManifestHal> getHals(HalManifest &vm) {
Yifan Honga9993572017-01-24 19:33:15 -080098 return vm.getHals();
99 }
Yifan Hong5a06ef72017-01-24 19:54:24 -0800100 bool isValid(const ManifestHal &mh) {
101 return mh.isValid();
102 }
Yifan Hong5f996502017-08-23 14:46:44 -0700103 std::vector<MatrixKernel>& getKernels(CompatibilityMatrix& cm) { return cm.framework.mKernels; }
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700104
105 std::map<std::string, HalInterface> testHalInterfaces() {
106 HalInterface intf;
107 intf.name = "IFoo";
108 intf.instances.insert("default");
109 std::map<std::string, HalInterface> map;
110 map[intf.name] = intf;
111 return map;
112 }
113
Yifan Honga04e1472017-04-05 13:15:34 -0700114 HalManifest testDeviceManifest() {
Yifan Hongd2b7e642017-02-17 10:15:32 -0800115 HalManifest vm;
Yifan Hong7c7d7062017-04-04 16:26:51 -0700116 vm.mType = SchemaType::DEVICE;
Yifan Hong2a3dd082017-04-04 17:15:35 -0700117 vm.device.mSepolicyVersion = {25, 0};
Yifan Hong2059ffc2017-02-24 11:32:02 -0800118 vm.add(ManifestHal{
119 .format = HalFormat::HIDL,
120 .name = "android.hardware.camera",
121 .versions = {Version(2, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800122 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800123 .interfaces = {
124 {"ICamera", {"ICamera", {"legacy/0", "default"}}},
125 {"IBetterCamera", {"IBetterCamera", {"camera"}}}
126 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800127 });
128 vm.add(ManifestHal{
129 .format = HalFormat::HIDL,
130 .name = "android.hardware.nfc",
131 .versions = {Version(1, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800132 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800133 .interfaces = {
134 {"INfc", {"INfc", {"default"}}}
135 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800136 });
Yifan Honga9993572017-01-24 19:33:15 -0800137
138 return vm;
139 }
Yifan Hongd4857902017-06-13 14:13:56 -0700140 HalManifest testDeviceManifestWithXmlFile() {
141 HalManifest vm = testDeviceManifest();
142 ManifestXmlFile xmlFile;
143 xmlFile.mName = "media_profile";
144 xmlFile.mVersion = {1, 0};
145 vm.addXmlFile(std::move(xmlFile));
146 return vm;
147 }
Yifan Honga04e1472017-04-05 13:15:34 -0700148 HalManifest testFrameworkManfiest() {
149 HalManifest vm;
150 vm.mType = SchemaType::FRAMEWORK;
151 vm.add(ManifestHal{
152 .format = HalFormat::HIDL,
153 .name = "android.hidl.manager",
154 .versions = {Version(1, 0)},
155 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
156 .interfaces = {
157 {"IServiceManager", {"IServiceManager", {"default"}}},
158 }
159 });
160 Vndk vndk2505;
161 vndk2505.mVersionRange = {25, 0, 5};
162 vndk2505.mLibraries = { "libjpeg.so", "libbase.so" };
163 Vndk vndk2513;
164 vndk2513.mVersionRange = {25, 1, 3};
165 vndk2513.mLibraries = { "libjpeg.so", "libbase.so", "libtinyxml2.so" };
166 vm.framework.mVndks = { std::move(vndk2505), std::move(vndk2513) };
167
168 return vm;
169 }
Yifan Honga7201e72017-02-17 10:09:59 -0800170 RuntimeInfo testRuntimeInfo() {
171 RuntimeInfo info;
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800172 info.mOsName = "Linux";
173 info.mNodeName = "localhost";
174 info.mOsRelease = "3.18.31-g936f9a479d0f";
175 info.mKernelVersion = {3, 18, 31};
176 info.mOsVersion = "#4 SMP PREEMPT Wed Feb 1 18:10:52 PST 2017";
177 info.mHardwareId = "aarch64";
178 info.mKernelSepolicyVersion = 30;
Yifan Hongf1af7522017-02-16 18:00:55 -0800179 info.mKernelConfigs = {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800180 {"CONFIG_64BIT", "y"},
181 {"CONFIG_ANDROID_BINDER_DEVICES", "\"binder,hwbinder\""},
182 {"CONFIG_ARCH_MMAP_RND_BITS", "24"},
183 {"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", "\"\""},
184 {"CONFIG_ILLEGAL_POINTER_VALUE", "0xdead000000000000"}
185 };
Yifan Hong881a9e452017-04-27 19:31:13 -0700186 setAvb(info, {2, 1}, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800187 return info;
188 }
Yifan Hong676447a2016-11-15 12:57:23 -0800189};
190
Yifan Hongd5cd0482017-06-19 12:25:48 -0700191TEST_F(LibVintfTest, ArchOperatorOr) {
192 Arch a = Arch::ARCH_EMPTY;
193 a |= Arch::ARCH_32;
194 EXPECT_EQ(Arch::ARCH_32, a);
195
196 a |= Arch::ARCH_64;
197 EXPECT_EQ(Arch::ARCH_32_64, a);
198
199 a = Arch::ARCH_EMPTY;
200 a |= Arch::ARCH_64;
201 EXPECT_EQ(Arch::ARCH_64, a);
202}
Yifan Hongef6d4d32017-01-23 14:12:28 -0800203
204TEST_F(LibVintfTest, Stringify) {
Yifan Honga04e1472017-04-05 13:15:34 -0700205 HalManifest vm = testDeviceManifest();
Yifan Hong974ad9c2017-04-04 15:37:39 -0700206 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/2.0:"
207 "hidl/android.hardware.nfc/passthrough32+64/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -0800208
209 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
210 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
211
212 VersionRange v(1, 2, 3);
213 EXPECT_EQ(to_string(v), "1.2-3");
214 VersionRange v2;
215 EXPECT_TRUE(parse("1.2-3", &v2));
216 EXPECT_EQ(v, v2);
217}
218
Yifan Hong9bbdb282017-04-12 21:53:59 -0700219TEST_F(LibVintfTest, GetTransport) {
220 HalManifest vm = testDeviceManifest();
221 EXPECT_EQ(Transport::HWBINDER, vm.getTransport("android.hardware.camera",
222 {2, 0}, "ICamera", "default"));
223}
224
Yifan Hongd2b7e642017-02-17 10:15:32 -0800225TEST_F(LibVintfTest, HalManifestConverter) {
Yifan Honga04e1472017-04-05 13:15:34 -0700226 HalManifest vm = testDeviceManifest();
Yifan Hongd2b7e642017-02-17 10:15:32 -0800227 std::string xml = gHalManifestConverter(vm);
Yifan Hong676447a2016-11-15 12:57:23 -0800228 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700229 "<manifest version=\"1.0\" type=\"device\">\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800230 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800231 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800232 " <transport>hwbinder</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800233 " <version>2.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800234 " <interface>\n"
235 " <name>IBetterCamera</name>\n"
236 " <instance>camera</instance>\n"
237 " </interface>\n"
238 " <interface>\n"
239 " <name>ICamera</name>\n"
240 " <instance>default</instance>\n"
241 " <instance>legacy/0</instance>\n"
242 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800243 " </hal>\n"
244 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800245 " <name>android.hardware.nfc</name>\n"
Yifan Hongc54d32c2017-03-07 19:12:26 -0800246 " <transport arch=\"32+64\">passthrough</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800247 " <version>1.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800248 " <interface>\n"
249 " <name>INfc</name>\n"
250 " <instance>default</instance>\n"
251 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800252 " </hal>\n"
Yifan Hong2a3dd082017-04-04 17:15:35 -0700253 " <sepolicy>\n"
254 " <version>25.0</version>\n"
255 " </sepolicy>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800256 "</manifest>\n");
Yifan Hongfb7469c2017-04-05 19:15:21 -0700257 HalManifest vm2;
258 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
259 EXPECT_EQ(vm, vm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800260}
261
Yifan Honga04e1472017-04-05 13:15:34 -0700262TEST_F(LibVintfTest, HalManifestConverterFramework) {
263 HalManifest vm = testFrameworkManfiest();
264 std::string xml = gHalManifestConverter(vm);
265 EXPECT_EQ(xml,
266 "<manifest version=\"1.0\" type=\"framework\">\n"
267 " <hal format=\"hidl\">\n"
268 " <name>android.hidl.manager</name>\n"
269 " <transport>hwbinder</transport>\n"
270 " <version>1.0</version>\n"
271 " <interface>\n"
272 " <name>IServiceManager</name>\n"
273 " <instance>default</instance>\n"
274 " </interface>\n"
275 " </hal>\n"
276 " <vndk>\n"
277 " <version>25.0.5</version>\n"
278 " <library>libbase.so</library>\n"
279 " <library>libjpeg.so</library>\n"
280 " </vndk>\n"
281 " <vndk>\n"
282 " <version>25.1.3</version>\n"
283 " <library>libbase.so</library>\n"
284 " <library>libjpeg.so</library>\n"
285 " <library>libtinyxml2.so</library>\n"
286 " </vndk>\n"
287 "</manifest>\n");
288 HalManifest vm2;
289 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700290 EXPECT_EQ(vm, vm2);
Yifan Honga04e1472017-04-05 13:15:34 -0700291}
292
Yifan Hong8e9c6692017-02-28 14:07:42 -0800293TEST_F(LibVintfTest, HalManifestOptional) {
294 HalManifest vm;
295 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700296 "<manifest version=\"1.0\" type=\"device\"></manifest>"));
Yifan Hong8e9c6692017-02-28 14:07:42 -0800297 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700298 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800299 " <hal>"
300 " <name>android.hidl.manager</name>"
301 " <transport>hwbinder</transport>"
302 " <version>1.0</version>"
303 " </hal>"
304 "</manifest>"));
305 EXPECT_FALSE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700306 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800307 " <hal>"
308 " <name>android.hidl.manager</name>"
309 " <version>1.0</version>"
310 " </hal>"
311 "</manifest>"));
312}
313
Yifan Honge0bb98d2017-08-07 14:40:19 -0700314TEST_F(LibVintfTest, HalManifestNative) {
315 HalManifest vm;
316 EXPECT_TRUE(gHalManifestConverter(&vm,
317 "<manifest version=\"1.0\" type=\"device\">"
318 " <hal format=\"native\">"
319 " <name>foo</name>"
320 " <version>1.0</version>"
321 " </hal>"
322 "</manifest>"))
323 << gHalManifestConverter.lastError();
324 EXPECT_FALSE(gHalManifestConverter(&vm,
325 "<manifest version=\"1.0\" type=\"device\">"
326 " <hal format=\"native\">"
327 " <name>foo</name>"
328 " <version>1.0</version>"
329 " <transport>hwbinder</transport>"
330 " </hal>"
331 "</manifest>"));
332 EXPECT_TRUE(gHalManifestConverter.lastError().find(
333 "Native HAL 'foo' should not have <transport> defined") != std::string::npos);
334}
335
Yifan Hong79dcc1f2017-05-22 14:35:19 -0700336TEST_F(LibVintfTest, HalManifestDuplicate) {
337 HalManifest vm;
338 EXPECT_FALSE(gHalManifestConverter(&vm,
339 "<manifest version=\"1.0\" type=\"device\">"
340 " <hal>"
341 " <name>android.hidl.manager</name>"
342 " <transport>hwbinder</transport>"
343 " <version>1.0</version>"
344 " <version>1.1</version>"
345 " </hal>"
346 "</manifest>"))
347 << "Should not allow duplicated major version in <hal>";
348 EXPECT_FALSE(gHalManifestConverter(&vm,
349 "<manifest version=\"1.0\" type=\"device\">"
350 " <hal>"
351 " <name>android.hidl.manager</name>"
352 " <transport>hwbinder</transport>"
353 " <version>1.0</version>"
354 " </hal>"
355 " <hal>"
356 " <name>android.hidl.manager</name>"
357 " <transport arch=\"32+64\">passthrough</transport>"
358 " <version>1.1</version>"
359 " </hal>"
360 "</manifest>"))
361 << "Should not allow duplicated major version across <hal>";
362}
363
364TEST_F(LibVintfTest, HalManifestGetTransport) {
365 HalManifest vm;
366 EXPECT_TRUE(gHalManifestConverter(&vm,
367 "<manifest version=\"1.0\" type=\"device\">"
368 " <hal>"
369 " <name>android.hidl.manager</name>"
370 " <transport>hwbinder</transport>"
371 " <version>1.0</version>"
372 " <interface>"
373 " <name>IServiceManager</name>"
374 " <instance>default</instance>"
375 " </interface>"
376 " </hal>"
377 " <hal>"
378 " <name>android.hidl.manager</name>"
379 " <transport arch=\"32+64\">passthrough</transport>"
380 " <version>2.1</version>"
381 " <interface>"
382 " <name>IServiceManager</name>"
383 " <instance>default</instance>"
384 " </interface>"
385 " </hal>"
386 "</manifest>"));
387 EXPECT_EQ(Transport::PASSTHROUGH,
388 vm.getTransport("android.hidl.manager", {2, 1}, "IServiceManager", "default"));
389 EXPECT_EQ(Transport::PASSTHROUGH,
390 vm.getTransport("android.hidl.manager", {2, 0}, "IServiceManager", "default"));
391 EXPECT_EQ(Transport::EMPTY,
392 vm.getTransport("android.hidl.manager", {2, 2}, "IServiceManager", "default"));
393 EXPECT_EQ(Transport::HWBINDER,
394 vm.getTransport("android.hidl.manager", {1, 0}, "IServiceManager", "default"));
395}
396
Yifan Hongec3b9b72017-02-23 13:24:42 -0800397TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700398 HalManifest vm = testDeviceManifest();
Yifan Hongec3b9b72017-02-23 13:24:42 -0800399 EXPECT_EQ(vm.getInstances("android.hardware.camera", "ICamera"),
400 std::set<std::string>({"default", "legacy/0"}));
401 EXPECT_EQ(vm.getInstances("android.hardware.camera", "IBetterCamera"),
402 std::set<std::string>({"camera"}));
403 EXPECT_EQ(vm.getInstances("android.hardware.camera", "INotExist"),
Yifan Hong9bbdb282017-04-12 21:53:59 -0700404 std::set<std::string>({}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800405 EXPECT_EQ(vm.getInstances("android.hardware.nfc", "INfc"),
406 std::set<std::string>({"default"}));
407
408 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "default"));
409 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "legacy/0"));
410 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "camera"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800411 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", "INfc", "default"));
412
Yifan Hong9bbdb282017-04-12 21:53:59 -0700413 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800414 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "ICamera", "notexist"));
415 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "default"));
416 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "notexist"));
417 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", "INfc", "notexist"));
418}
419
Yifan Hong676447a2016-11-15 12:57:23 -0800420TEST_F(LibVintfTest, VersionConverter) {
421 Version v(3, 6);
422 std::string xml = gVersionConverter(v);
423 EXPECT_EQ(xml, "<version>3.6</version>\n");
424 Version v2;
425 EXPECT_TRUE(gVersionConverter(&v2, xml));
426 EXPECT_EQ(v, v2);
427}
428
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700429static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
430 std::string name{intf.name};
431 return map->emplace(std::move(name), std::move(intf)).second;
432}
433
Yifan Hong676447a2016-11-15 12:57:23 -0800434TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800435 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800436 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700437 false /* optional */, {}};
438 EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
439 EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800440 std::string xml = gMatrixHalConverter(mh);
441 EXPECT_EQ(xml,
442 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800443 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800444 " <version>1.2-3</version>\n"
445 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700446 " <interface>\n"
447 " <name>IBetterCamera</name>\n"
448 " <instance>default</instance>\n"
449 " <instance>great</instance>\n"
450 " </interface>\n"
451 " <interface>\n"
452 " <name>ICamera</name>\n"
453 " <instance>default</instance>\n"
454 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800455 "</hal>\n");
456 MatrixHal mh2;
457 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
458 EXPECT_EQ(mh, mh2);
459}
460
Yifan Hong3f5489a2017-02-08 11:14:21 -0800461TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
462
463 KernelConfigTypedValue converted;
464
465 auto testOne = [] (const KernelConfigTypedValue &original,
466 const std::string &expectXml) {
467 std::string xml;
468 KernelConfigTypedValue converted;
469 xml = gKernelConfigTypedValueConverter(original);
470 EXPECT_EQ(xml, expectXml);
471 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
472 EXPECT_EQ(original, converted);
473 };
474
475 auto testParse = [] (const KernelConfigTypedValue &original,
476 const std::string &xml) {
477 KernelConfigTypedValue converted;
478 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
479 EXPECT_EQ(original, converted);
480 };
481
482 testOne(KernelConfigTypedValue("stringvalue"),
483 "<value type=\"string\">stringvalue</value>\n");
484 testOne(KernelConfigTypedValue(""),
485 "<value type=\"string\"></value>\n");
486
487 testOne(KernelConfigTypedValue(Tristate::YES),
488 "<value type=\"tristate\">y</value>\n");
489 testOne(KernelConfigTypedValue(Tristate::NO),
490 "<value type=\"tristate\">n</value>\n");
491 testOne(KernelConfigTypedValue(Tristate::MODULE),
492 "<value type=\"tristate\">m</value>\n");
493 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
494 "<value type=\"tristate\">q</value>\n"));
495
496 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
497 "<value type=\"range\">4-20</value>\n");
498 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
499 "<value type=\"range\">0-18446744073709551615</value>\n");
500 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
501 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
502
503 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
504 "<value type=\"int\">-18446744073709551616</value>\n"));
505
506 testOne(KernelConfigTypedValue(INT64_MIN),
507 "<value type=\"int\">-9223372036854775808</value>\n");
508 testParse(KernelConfigTypedValue(INT64_MIN),
509 "<value type=\"int\">0x8000000000000000</value>\n");
510 testParse(KernelConfigTypedValue(INT64_MIN),
511 "<value type=\"int\">-0X8000000000000000</value>\n");
512
513 testParse(KernelConfigTypedValue(INT64_MIN + 1),
514 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
515
516 testParse(KernelConfigTypedValue(-0x50),
517 "<value type=\"int\">-0x50</value>\n");
518
519 testOne(KernelConfigTypedValue(0),
520 "<value type=\"int\">0</value>\n");
521
522 // Truncation for underflow.
523 testParse(KernelConfigTypedValue(1),
524 "<value type=\"int\">-0xffffffffffffffff</value>\n");
525 testParse(KernelConfigTypedValue(1),
526 "<value type=\"int\">-18446744073709551615</value>\n");
527
528 testOne(KernelConfigTypedValue(INT64_MAX),
529 "<value type=\"int\">9223372036854775807</value>\n");
530 testParse(KernelConfigTypedValue(INT64_MAX),
531 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
532 // Truncation for underflow.
533 testParse(KernelConfigTypedValue(INT64_MAX),
534 "<value type=\"int\">-9223372036854775809</value>\n");
535
536 testParse(KernelConfigTypedValue(-1),
537 "<value type=\"int\">18446744073709551615</value>\n");
538 testParse(KernelConfigTypedValue(-1),
539 "<value type=\"int\">0xffffffffffffffff</value>\n");
540
541 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
542 "<value type=\"int\">18446744073709551616</value>\n"));
543}
544
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700545TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
Yifan Hong676447a2016-11-15 12:57:23 -0800546 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800547 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800548 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700549 false /* optional */, testHalInterfaces()}));
Yifan Honga9993572017-01-24 19:33:15 -0800550 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800551 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700552 true /* optional */, testHalInterfaces()}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800553 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
554 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
555 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
556 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700557 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700558 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800559 std::string xml = gCompatibilityMatrixConverter(cm);
560 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700561 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800562 " <hal format=\"native\" optional=\"false\">\n"
563 " <name>android.hardware.camera</name>\n"
564 " <version>1.2-3</version>\n"
565 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700566 " <interface>\n"
567 " <name>IFoo</name>\n"
568 " <instance>default</instance>\n"
569 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800570 " </hal>\n"
571 " <hal format=\"native\" optional=\"true\">\n"
572 " <name>android.hardware.nfc</name>\n"
573 " <version>4.5-6</version>\n"
574 " <version>10.11-12</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"
Yifan Hongc3066892017-02-24 10:42:02 -0800580 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800581 " <config>\n"
582 " <key>CONFIG_FOO</key>\n"
583 " <value type=\"tristate\">y</value>\n"
584 " </config>\n"
585 " <config>\n"
586 " <key>CONFIG_BAR</key>\n"
587 " <value type=\"string\">stringvalue</value>\n"
588 " </config>\n"
589 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800590 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800591 " <config>\n"
592 " <key>CONFIG_BAZ</key>\n"
593 " <value type=\"int\">20</value>\n"
594 " </config>\n"
595 " <config>\n"
596 " <key>CONFIG_BAR</key>\n"
597 " <value type=\"range\">3-5</value>\n"
598 " </config>\n"
599 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800600 " <sepolicy>\n"
601 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700602 " <sepolicy-version>25.0</sepolicy-version>\n"
603 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800604 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700605 " <avb>\n"
606 " <vbmeta-version>2.1</vbmeta-version>\n"
607 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800608 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800609 CompatibilityMatrix cm2;
610 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700611 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800612}
613
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700614TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
615 CompatibilityMatrix cm;
616 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
617 {{VersionRange(1,0)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700618 false /* optional */, testHalInterfaces()}));
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700619 set(cm, SchemaType::DEVICE);
620 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
621 std::string xml = gCompatibilityMatrixConverter(cm);
622 EXPECT_EQ(xml,
623 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
624 " <hal format=\"native\" optional=\"false\">\n"
625 " <name>android.hidl.manager</name>\n"
626 " <version>1.0</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700627 " <interface>\n"
628 " <name>IFoo</name>\n"
629 " <instance>default</instance>\n"
630 " </interface>\n"
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700631 " </hal>\n"
632 " <vndk>\n"
633 " <version>25.0.1-5</version>\n"
634 " <library>libbase.so</library>\n"
635 " <library>libjpeg.so</library>\n"
636 " </vndk>\n"
637 "</compatibility-matrix>\n");
638 CompatibilityMatrix cm2;
639 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
640 EXPECT_EQ(cm, cm2);
641}
642
Yifan Hong676447a2016-11-15 12:57:23 -0800643TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800644 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800645
Yifan Hong2059ffc2017-02-24 11:32:02 -0800646 ManifestHal invalidHal{
647 .format = HalFormat::HIDL,
648 .name = "android.hardware.camera",
649 .versions = {{Version(2, 0), Version(2, 1)}},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800650 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64}
Yifan Hong2059ffc2017-02-24 11:32:02 -0800651 };
652
Yifan Hong5a06ef72017-01-24 19:54:24 -0800653 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800654 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800655 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800656}
657
Tri Vod0143942017-03-24 17:51:23 -0700658TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700659 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700660 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
661 {"android.hardware.camera", "android.hardware.nfc"}));
662}
663
664TEST_F(LibVintfTest, HalManifestGetInterfaceNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700665 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700666 EXPECT_EQ(vm.getInterfaceNames("android.hardware.camera"),
667 std::set<std::string>({"ICamera", "IBetterCamera"}));
668 EXPECT_EQ(vm.getInterfaceNames("android.hardware.nfc"),
669 std::set<std::string>({"INfc"}));
670}
671
Yifan Hongd2b7e642017-02-17 10:15:32 -0800672TEST_F(LibVintfTest, HalManifestGetHal) {
Yifan Honga04e1472017-04-05 13:15:34 -0700673 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700674 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
675 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800676
677 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
678 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800679 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800680 EXPECT_EQ(hal.name, arr[i++]);
681 }
682}
683
Yifan Honga7201e72017-02-17 10:09:59 -0800684TEST_F(LibVintfTest, RuntimeInfo) {
685 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800686 using KernelConfigs = std::vector<KernelConfig>;
687 const KernelConfigs configs {
688 KernelConfig{"CONFIG_64BIT", Tristate::YES},
689 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
690 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
691 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
692 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
693 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
694 };
695
696 auto testMatrix = [&] (MatrixKernel &&kernel) {
697 CompatibilityMatrix cm;
698 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700699 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700700 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800701 return cm;
702 };
703
704 std::string error;
705
706 {
707 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
708 CompatibilityMatrix cm = testMatrix(std::move(kernel));
709 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
710 }
711
712 {
Yifan Hong5f996502017-08-23 14:46:44 -0700713 MatrixKernel kernel(KernelVersion{3, 18, 60}, KernelConfigs(configs));
714 CompatibilityMatrix cm = testMatrix(std::move(kernel));
715 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
716 }
717
718 {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800719 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
720 CompatibilityMatrix cm = testMatrix(std::move(kernel));
721 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
722 }
723
724 {
725 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
726 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700727 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800728 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
729 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700730 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800731 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
732 << "kernel-sepolicy-version shouldn't match";
733 }
734
735 {
736 KernelConfigs newConfigs(configs);
737 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
738 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
739 CompatibilityMatrix cm = testMatrix(std::move(kernel));
740 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
741 }
742
743 {
744 KernelConfigs newConfigs(configs);
745 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
746 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
747 CompatibilityMatrix cm = testMatrix(std::move(kernel));
748 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
749 }
750
751 {
752 KernelConfigs newConfigs(configs);
753 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
754 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
755 CompatibilityMatrix cm = testMatrix(std::move(kernel));
756 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
757 }
758
759 {
760 KernelConfigs newConfigs(configs);
761 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
762 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
763 CompatibilityMatrix cm = testMatrix(std::move(kernel));
764 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
765 }
766
767 {
768 KernelConfigs newConfigs(configs);
769 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
770 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
771 CompatibilityMatrix cm = testMatrix(std::move(kernel));
772 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
773 }
Yifan Hongdb6423e2017-09-11 14:38:46 -0700774
Yifan Hongf3029302017-04-12 17:23:49 -0700775 RuntimeInfo badAvb = testRuntimeInfo();
776 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
777 {
778 setAvb(badAvb, {1, 0}, {2, 1});
779 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
Michael Schwartz5cfbc922017-05-08 14:06:49 -0700780 EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
Yifan Hongf3029302017-04-12 17:23:49 -0700781 }
782 {
783 setAvb(badAvb, {2, 1}, {3, 0});
784 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
785 }
786 {
787 setAvb(badAvb, {2, 1}, {2, 3});
788 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
789 }
790 {
791 setAvb(badAvb, {2, 3}, {2, 1});
792 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
793 }
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800794}
795
Yifan Hong19e0a2a2017-04-14 17:30:53 -0700796TEST_F(LibVintfTest, MissingAvb) {
797 std::string xml =
798 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
799 " <kernel version=\"3.18.31\"></kernel>"
800 " <sepolicy>\n"
801 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
802 " <sepolicy-version>25.5</sepolicy-version>\n"
803 " </sepolicy>\n"
804 "</compatibility-matrix>\n";
805 CompatibilityMatrix cm;
806 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
807 EXPECT_EQ(getAvb(cm), Version(0, 0));
808}
809
Yifan Hongdb6423e2017-09-11 14:38:46 -0700810TEST_F(LibVintfTest, DisableAvb) {
811 std::string xml =
812 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
813 " <kernel version=\"3.18.31\"></kernel>"
814 " <sepolicy>\n"
815 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
816 " <sepolicy-version>25.5</sepolicy-version>\n"
817 " </sepolicy>\n"
818 " <avb>\n"
819 " <vbmeta-version>1.0</vbmeta-version>\n"
820 " </avb>\n"
821 "</compatibility-matrix>\n";
822 CompatibilityMatrix cm;
823 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
824 RuntimeInfo ki = testRuntimeInfo();
825 std::string error;
826 EXPECT_FALSE(ki.checkCompatibility(cm, &error));
827 EXPECT_STREQ(error.c_str(), "AVB version 2.1 does not match framework matrix 1.0");
828 EXPECT_TRUE(ki.checkCompatibility(cm, &error, DISABLE_AVB_CHECK)) << error;
829}
830
Yifan Hong08e984c2017-05-18 12:50:04 -0700831// This is the test extracted from VINTF Object doc
832TEST_F(LibVintfTest, HalCompat) {
833 CompatibilityMatrix matrix;
834 std::string error;
835
836 std::string matrixXml =
837 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
838 " <hal format=\"hidl\" optional=\"false\">\n"
839 " <name>android.hardware.foo</name>\n"
840 " <version>1.0</version>\n"
841 " <version>3.1-2</version>\n"
842 " <interface>\n"
843 " <name>IFoo</name>\n"
844 " <instance>default</instance>\n"
845 " <instance>specific</instance>\n"
846 " </interface>\n"
847 " </hal>\n"
848 " <hal format=\"hidl\" optional=\"false\">\n"
849 " <name>android.hardware.foo</name>\n"
850 " <version>2.0</version>\n"
851 " <interface>\n"
852 " <name>IBar</name>\n"
853 " <instance>default</instance>\n"
854 " </interface>\n"
855 " </hal>\n"
856 " <sepolicy>\n"
857 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
858 " <sepolicy-version>25.5</sepolicy-version>\n"
859 " </sepolicy>\n"
860 "</compatibility-matrix>\n";
861 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
862 << gCompatibilityMatrixConverter.lastError();
863
864 {
865 std::string manifestXml =
866 "<manifest version=\"1.0\" type=\"device\">\n"
867 " <hal format=\"hidl\">\n"
868 " <name>android.hardware.foo</name>\n"
869 " <transport>hwbinder</transport>\n"
870 " <version>1.0</version>\n"
871 " <interface>\n"
872 " <name>IFoo</name>\n"
873 " <instance>default</instance>\n"
874 " <instance>specific</instance>\n"
875 " </interface>\n"
876 " </hal>\n"
877 " <hal format=\"hidl\">\n"
878 " <name>android.hardware.foo</name>\n"
879 " <transport>hwbinder</transport>\n"
880 " <version>2.0</version>\n"
881 " <interface>\n"
882 " <name>IBar</name>\n"
883 " <instance>default</instance>\n"
884 " </interface>\n"
885 " </hal>\n"
886 " <sepolicy>\n"
887 " <version>25.5</version>\n"
888 " </sepolicy>\n"
889 "</manifest>\n";
890
891 HalManifest manifest;
892 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
893 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
894 }
895
896 {
897 std::string manifestXml =
898 "<manifest version=\"1.0\" type=\"device\">\n"
899 " <hal format=\"hidl\">\n"
900 " <name>android.hardware.foo</name>\n"
901 " <transport>hwbinder</transport>\n"
902 " <version>1.0</version>\n"
903 " <interface>\n"
904 " <name>IFoo</name>\n"
905 " <instance>default</instance>\n"
906 " <instance>specific</instance>\n"
907 " </interface>\n"
908 " </hal>\n"
909 " <sepolicy>\n"
910 " <version>25.5</version>\n"
911 " </sepolicy>\n"
912 "</manifest>\n";
913 HalManifest manifest;
914 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
915 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
916 << "should not be compatible because IBar is missing";
917 }
918
919 {
920 std::string manifestXml =
921 "<manifest version=\"1.0\" type=\"device\">\n"
922 " <hal format=\"hidl\">\n"
923 " <name>android.hardware.foo</name>\n"
924 " <transport>hwbinder</transport>\n"
925 " <version>1.0</version>\n"
926 " <interface>\n"
927 " <name>IFoo</name>\n"
928 " <instance>default</instance>\n"
929 " </interface>\n"
930 " </hal>\n"
931 " <hal format=\"hidl\">\n"
932 " <name>android.hardware.foo</name>\n"
933 " <transport>hwbinder</transport>\n"
934 " <version>2.0</version>\n"
935 " <interface>\n"
936 " <name>IBar</name>\n"
937 " <instance>default</instance>\n"
938 " </interface>\n"
939 " </hal>\n"
940 " <sepolicy>\n"
941 " <version>25.5</version>\n"
942 " </sepolicy>\n"
943 "</manifest>\n";
944 HalManifest manifest;
945 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
946 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
947 << "should not be compatible because IFoo/default is missing";
948 }
949
950 {
951 std::string manifestXml =
952 "<manifest version=\"1.0\" type=\"device\">\n"
953 " <hal format=\"hidl\">\n"
954 " <name>android.hardware.foo</name>\n"
955 " <transport>hwbinder</transport>\n"
956 " <version>3.3</version>\n"
957 " <interface>\n"
958 " <name>IFoo</name>\n"
959 " <instance>default</instance>\n"
960 " <instance>specific</instance>\n"
961 " </interface>\n"
962 " </hal>\n"
963 " <hal format=\"hidl\">\n"
964 " <name>android.hardware.foo</name>\n"
965 " <transport>hwbinder</transport>\n"
966 " <version>2.0</version>\n"
967 " <interface>\n"
968 " <name>IBar</name>\n"
969 " <instance>default</instance>\n"
970 " </interface>\n"
971 " </hal>\n"
972 " <sepolicy>\n"
973 " <version>25.5</version>\n"
974 " </sepolicy>\n"
975 "</manifest>\n";
976 HalManifest manifest;
977 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
978 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
979 }
980
981 {
982 std::string manifestXml =
983 "<manifest version=\"1.0\" type=\"device\">\n"
984 " <hal format=\"hidl\">\n"
985 " <name>android.hardware.foo</name>\n"
986 " <transport>hwbinder</transport>\n"
987 " <version>1.0</version>\n"
988 " <interface>\n"
989 " <name>IFoo</name>\n"
990 " <instance>default</instance>\n"
991 " </interface>\n"
992 " </hal>\n"
993 " <hal format=\"hidl\">\n"
994 " <name>android.hardware.foo</name>\n"
995 " <transport>hwbinder</transport>\n"
996 " <version>3.2</version>\n"
997 " <interface>\n"
998 " <name>IFoo</name>\n"
999 " <instance>specific</instance>\n"
1000 " </interface>\n"
1001 " </hal>\n"
1002 " <hal format=\"hidl\">\n"
1003 " <name>android.hardware.foo</name>\n"
1004 " <transport>hwbinder</transport>\n"
1005 " <version>2.0</version>\n"
1006 " <interface>\n"
1007 " <name>IBar</name>\n"
1008 " <instance>default</instance>\n"
1009 " </interface>\n"
1010 " </hal>\n"
1011 " <sepolicy>\n"
1012 " <version>25.5</version>\n"
1013 " </sepolicy>\n"
1014 "</manifest>\n";
1015 HalManifest manifest;
1016 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1017 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1018 << "should not be compatible even though @1.0::IFoo/default "
1019 << "and @3.2::IFoo/specific present";
1020 }
1021
1022 {
1023 std::string manifestXml =
1024 "<manifest version=\"1.0\" type=\"device\">\n"
1025 " <hal format=\"hidl\">\n"
1026 " <name>android.hardware.foo</name>\n"
1027 " <transport>hwbinder</transport>\n"
1028 " <version>1.0</version>\n"
1029 " <interface>\n"
1030 " <name>IFoo</name>\n"
1031 " <instance>default</instance>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001032 " <instance>specific</instance>\n"
1033 " </interface>\n"
1034 " </hal>\n"
1035 " <hal format=\"hidl\">\n"
1036 " <name>android.hardware.foo</name>\n"
1037 " <transport>hwbinder</transport>\n"
1038 " <version>2.0</version>\n"
1039 " <interface>\n"
1040 " <name>IBar</name>\n"
1041 " <instance>default</instance>\n"
1042 " </interface>\n"
1043 " </hal>\n"
1044 " <sepolicy>\n"
1045 " <version>25.5</version>\n"
1046 " </sepolicy>\n"
1047 "</manifest>\n";
1048 HalManifest manifest;
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001049 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml))
1050 << gHalManifestConverter.lastError();
1051 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
Yifan Hong08e984c2017-05-18 12:50:04 -07001052 }
1053}
1054
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001055TEST_F(LibVintfTest, Compat) {
1056 std::string manifestXml =
1057 "<manifest version=\"1.0\" type=\"device\">\n"
1058 " <hal format=\"hidl\">\n"
1059 " <name>android.hardware.camera</name>\n"
1060 " <transport>hwbinder</transport>\n"
1061 " <version>3.5</version>\n"
1062 " <interface>\n"
1063 " <name>IBetterCamera</name>\n"
1064 " <instance>camera</instance>\n"
1065 " </interface>\n"
1066 " <interface>\n"
1067 " <name>ICamera</name>\n"
1068 " <instance>default</instance>\n"
1069 " <instance>legacy/0</instance>\n"
1070 " </interface>\n"
1071 " </hal>\n"
1072 " <hal format=\"hidl\">\n"
1073 " <name>android.hardware.nfc</name>\n"
1074 " <transport>hwbinder</transport>\n"
1075 " <version>1.0</version>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001076 " <interface>\n"
1077 " <name>INfc</name>\n"
1078 " <instance>nfc_nci</instance>\n"
1079 " </interface>\n"
1080 " </hal>\n"
1081 " <hal format=\"hidl\">\n"
1082 " <name>android.hardware.nfc</name>\n"
1083 " <transport>hwbinder</transport>\n"
1084 " <version>2.0</version>\n"
1085 " <interface>\n"
1086 " <name>INfc</name>\n"
1087 " <instance>default</instance>\n"
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001088 " <instance>nfc_nci</instance>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001089 " </interface>\n"
1090 " </hal>\n"
1091 " <sepolicy>\n"
1092 " <version>25.5</version>\n"
1093 " </sepolicy>\n"
1094 "</manifest>\n";
1095
1096 std::string matrixXml =
1097 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1098 " <hal format=\"hidl\" optional=\"false\">\n"
1099 " <name>android.hardware.camera</name>\n"
1100 " <version>2.0-5</version>\n"
1101 " <version>3.4-16</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001102 " <interface>\n"
1103 " <name>IBetterCamera</name>\n"
1104 " <instance>camera</instance>\n"
1105 " </interface>\n"
1106 " <interface>\n"
1107 " <name>ICamera</name>\n"
1108 " <instance>default</instance>\n"
1109 " <instance>legacy/0</instance>\n"
1110 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001111 " </hal>\n"
1112 " <hal format=\"hidl\" optional=\"false\">\n"
1113 " <name>android.hardware.nfc</name>\n"
1114 " <version>1.0</version>\n"
1115 " <version>2.0</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001116 " <interface>\n"
1117 " <name>INfc</name>\n"
1118 " <instance>nfc_nci</instance>\n"
1119 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001120 " </hal>\n"
1121 " <hal format=\"hidl\" optional=\"true\">\n"
1122 " <name>android.hardware.foo</name>\n"
1123 " <version>1.0</version>\n"
1124 " </hal>\n"
1125 " <sepolicy>\n"
1126 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1127 " <sepolicy-version>25.5</sepolicy-version>\n"
1128 " <sepolicy-version>26.0-3</sepolicy-version>\n"
1129 " </sepolicy>\n"
1130 " <avb>\n"
1131 " <vbmeta-version>2.1</vbmeta-version>\n"
1132 " </avb>\n"
1133 "</compatibility-matrix>\n";
1134
1135 HalManifest manifest;
1136 CompatibilityMatrix matrix;
1137 std::string error;
1138 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1139 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1140 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1141
1142 // some smaller test cases
1143 matrixXml =
1144 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1145 " <hal format=\"hidl\" optional=\"false\">\n"
1146 " <name>android.hardware.camera</name>\n"
1147 " <version>3.4</version>\n"
1148 " </hal>\n"
1149 " <sepolicy>\n"
1150 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1151 " <sepolicy-version>25.5</sepolicy-version>\n"
1152 " </sepolicy>\n"
1153 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1154 "</compatibility-matrix>\n";
1155 matrix = {};
1156 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1157 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1158 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
1159 EXPECT_NE(camera, nullptr);
1160 camera->versionRanges[0] = {3, 5};
1161 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1162 camera->versionRanges[0] = {3, 6};
1163 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1164
1165 // reset it
1166 matrix = {};
1167 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1168 set(matrix, Sepolicy{30, {{26, 0}}});
1169 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1170 set(matrix, Sepolicy{30, {{25, 6}}});
1171 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1172 set(matrix, Sepolicy{30, {{25, 4}}});
1173 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1174}
1175
Yifan Hongd4857902017-06-13 14:13:56 -07001176/////////////////// xmlfile tests
1177
1178TEST_F(LibVintfTest, HalManifestConverterXmlFile) {
1179 HalManifest vm = testDeviceManifestWithXmlFile();
1180 std::string xml = gHalManifestConverter(vm);
1181 EXPECT_EQ(xml,
1182 "<manifest version=\"1.0\" type=\"device\">\n"
1183 " <hal format=\"hidl\">\n"
1184 " <name>android.hardware.camera</name>\n"
1185 " <transport>hwbinder</transport>\n"
1186 " <version>2.0</version>\n"
1187 " <interface>\n"
1188 " <name>IBetterCamera</name>\n"
1189 " <instance>camera</instance>\n"
1190 " </interface>\n"
1191 " <interface>\n"
1192 " <name>ICamera</name>\n"
1193 " <instance>default</instance>\n"
1194 " <instance>legacy/0</instance>\n"
1195 " </interface>\n"
1196 " </hal>\n"
1197 " <hal format=\"hidl\">\n"
1198 " <name>android.hardware.nfc</name>\n"
1199 " <transport arch=\"32+64\">passthrough</transport>\n"
1200 " <version>1.0</version>\n"
1201 " <interface>\n"
1202 " <name>INfc</name>\n"
1203 " <instance>default</instance>\n"
1204 " </interface>\n"
1205 " </hal>\n"
1206 " <sepolicy>\n"
1207 " <version>25.0</version>\n"
1208 " </sepolicy>\n"
1209 " <xmlfile>\n"
1210 " <name>media_profile</name>\n"
1211 " <version>1.0</version>\n"
1212 " </xmlfile>\n"
1213 "</manifest>\n");
1214 HalManifest vm2;
1215 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
1216 EXPECT_EQ(vm, vm2);
1217}
1218
1219TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile) {
1220 CompatibilityMatrix cm;
1221 addXmlFile(cm, "media_profile", {1, 0});
1222 std::string xml = gCompatibilityMatrixConverter(cm);
1223 EXPECT_EQ(xml,
1224 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1225 " <sepolicy>\n"
1226 " <kernel-sepolicy-version>0</kernel-sepolicy-version>\n"
1227 " </sepolicy>\n"
1228 " <avb>\n"
1229 " <vbmeta-version>0.0</vbmeta-version>\n"
1230 " </avb>\n"
1231 " <xmlfile format=\"dtd\" optional=\"true\">\n"
1232 " <name>media_profile</name>\n"
1233 " <version>1.0</version>\n"
1234 " </xmlfile>\n"
1235 "</compatibility-matrix>\n");
1236 CompatibilityMatrix cm2;
1237 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
1238 EXPECT_EQ(cm, cm2);
1239}
1240
1241TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile2) {
1242 std::string xml =
1243 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1244 " <xmlfile format=\"dtd\" optional=\"false\">\n"
1245 " <name>media_profile</name>\n"
1246 " <version>1.0</version>\n"
1247 " </xmlfile>\n"
1248 "</compatibility-matrix>\n";
1249 CompatibilityMatrix cm;
1250 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml));
1251 EXPECT_EQ(
1252 "compatibility-matrix.xmlfile entry media_profile has to be optional for "
1253 "compatibility matrix version 1.0",
1254 gCompatibilityMatrixConverter.lastError());
1255}
1256
Yifan Hongbbfff302017-06-06 17:10:13 -07001257TEST_F(LibVintfTest, ManifestXmlFilePathDevice) {
1258 std::string manifestXml =
1259 "<manifest version=\"1.0\" type=\"device\">"
1260 " <xmlfile>"
1261 " <name>media_profile</name>"
1262 " <version>1.0</version>"
1263 " </xmlfile>"
1264 "</manifest>";
1265 HalManifest manifest;
1266 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1267 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1268 "/vendor/etc/media_profile_V1_0.xml");
1269}
1270
1271TEST_F(LibVintfTest, ManifestXmlFilePathFramework) {
1272 std::string manifestXml =
1273 "<manifest version=\"1.0\" type=\"framework\">"
1274 " <xmlfile>"
1275 " <name>media_profile</name>"
1276 " <version>1.0</version>"
1277 " </xmlfile>"
1278 "</manifest>";
1279 HalManifest manifest;
1280 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1281 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1282 "/system/etc/media_profile_V1_0.xml");
1283}
1284
1285TEST_F(LibVintfTest, ManifestXmlFilePathOverride) {
1286 std::string manifestXml =
1287 "<manifest version=\"1.0\" type=\"device\">"
1288 " <xmlfile>"
1289 " <name>media_profile</name>"
1290 " <version>1.0</version>"
1291 " <path>/vendor/etc/foo.xml</path>"
1292 " </xmlfile>"
1293 "</manifest>";
1294 HalManifest manifest;
1295 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1296 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "/vendor/etc/foo.xml");
1297}
1298
1299TEST_F(LibVintfTest, ManifestXmlFilePathMissing) {
1300 std::string manifestXml =
1301 "<manifest version=\"1.0\" type=\"device\">"
1302 " <xmlfile>"
1303 " <name>media_profile</name>"
1304 " <version>1.1</version>"
1305 " </xmlfile>"
1306 "</manifest>";
1307 HalManifest manifest;
1308 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1309 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "");
1310}
1311
1312TEST_F(LibVintfTest, MatrixXmlFilePathFramework) {
1313 std::string matrixXml =
1314 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1315 " <xmlfile format=\"dtd\" optional=\"true\">"
1316 " <name>media_profile</name>"
1317 " <version>2.0-1</version>"
1318 " </xmlfile>"
1319 "</compatibility-matrix>";
1320 CompatibilityMatrix matrix;
1321 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1322 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 1}),
1323 "/system/etc/media_profile_V2_1.dtd");
1324}
1325
1326TEST_F(LibVintfTest, MatrixXmlFilePathDevice) {
1327 std::string matrixXml =
1328 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1329 " <xmlfile format=\"xsd\" optional=\"true\">"
1330 " <name>media_profile</name>"
1331 " <version>2.0-1</version>"
1332 " </xmlfile>"
1333 "</compatibility-matrix>";
1334 CompatibilityMatrix matrix;
1335 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1336 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}),
1337 "/vendor/etc/media_profile_V2_1.xsd");
1338}
1339
1340TEST_F(LibVintfTest, MatrixXmlFilePathOverride) {
1341 std::string matrixXml =
1342 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1343 " <xmlfile format=\"xsd\" optional=\"true\">"
1344 " <name>media_profile</name>"
1345 " <version>2.0-1</version>"
1346 " <path>/system/etc/foo.xsd</path>"
1347 " </xmlfile>"
1348 "</compatibility-matrix>";
1349 CompatibilityMatrix matrix;
1350 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1351 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "/system/etc/foo.xsd");
1352}
1353
1354TEST_F(LibVintfTest, MatrixXmlFilePathMissing) {
1355 std::string matrixXml =
1356 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1357 " <xmlfile format=\"dtd\" optional=\"true\">"
1358 " <name>media_profile</name>"
1359 " <version>2.1</version>"
1360 " </xmlfile>"
1361 "</compatibility-matrix>";
1362 CompatibilityMatrix matrix;
1363 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1364 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "");
1365}
1366
Yifan Hong02e94002017-07-10 15:41:56 -07001367std::pair<KernelConfigParser, status_t> processData(const std::string& data, bool processComments,
1368 bool relaxedFormat = false) {
1369 KernelConfigParser parser(processComments, relaxedFormat);
Yifan Hongd8cee082017-07-05 16:06:09 -07001370 const char* p = data.c_str();
1371 size_t n = 0;
1372 size_t chunkSize;
Yifan Hong6209d172017-07-07 16:18:19 -07001373 status_t status = OK;
Yifan Hongd8cee082017-07-05 16:06:09 -07001374 for (; n < data.size(); p += chunkSize, n += chunkSize) {
1375 chunkSize = std::min<size_t>(5, data.size() - n);
Yifan Hong6209d172017-07-07 16:18:19 -07001376 if ((status = parser.process(p, chunkSize)) != OK) {
1377 break;
1378 }
Yifan Hongd8cee082017-07-05 16:06:09 -07001379 }
Yifan Hong6209d172017-07-07 16:18:19 -07001380 return {std::move(parser), status};
Yifan Hongd8cee082017-07-05 16:06:09 -07001381}
1382
1383TEST_F(LibVintfTest, KernelConfigParser) {
1384 // usage in /proc/config.gz
1385 const std::string data =
1386 "# CONFIG_NOT_SET is not set\n"
1387 "CONFIG_ONE=1\n"
1388 "CONFIG_Y=y\n"
1389 "CONFIG_STR=\"string\"\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001390 auto pair = processData(data, false /* processComments */);
1391 ASSERT_EQ(OK, pair.second) << pair.first.error();
1392 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001393
1394 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1395 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1396 EXPECT_EQ(configs.find("CONFIG_STR")->second, "\"string\"");
1397 EXPECT_EQ(configs.find("CONFIG_NOT_SET"), configs.end());
1398}
1399
1400TEST_F(LibVintfTest, KernelConfigParser2) {
1401 // usage in android-base.cfg
1402 const std::string data =
1403 "# CONFIG_NOT_SET is not set\n"
1404 "CONFIG_ONE=1\n"
1405 "CONFIG_Y=y\n"
1406 "CONFIG_STR=string\n"
1407 "# ignore_thiscomment\n"
1408 "# CONFIG_NOT_SET2 is not set\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001409 auto pair = processData(data, true /* processComments */);
1410 ASSERT_EQ(OK, pair.second) << pair.first.error();
1411 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001412
1413 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1414 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1415 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1416 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1417 EXPECT_EQ(configs.find("CONFIG_NOT_SET2")->second, "n");
1418}
1419
Yifan Hongc1889722017-07-07 16:19:52 -07001420TEST_F(LibVintfTest, KernelConfigParserSpace) {
1421 // usage in android-base.cfg
1422 const std::string data =
1423 " # CONFIG_NOT_SET is not set \n"
1424 " CONFIG_ONE=1 # 'tis a one!\n"
1425 " CONFIG_TWO=2 #'tis a two! \n"
1426 " CONFIG_THREE=3#'tis a three! \n"
1427 " CONFIG_233=233#'tis a three! \n"
1428 "#yey! random comments\n"
1429 "CONFIG_Y=y \n"
1430 " CONFIG_YES=y#YES! \n"
1431 "CONFIG_STR=string\n"
1432 "CONFIG_HELLO=hello world! #still works\n"
1433 "CONFIG_WORLD=hello world! \n"
1434 "CONFIG_GOOD = good morning! #comments here\n"
1435 " CONFIG_MORNING = good morning! \n";
Yifan Hong02e94002017-07-10 15:41:56 -07001436 auto pair = processData(data, true /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07001437 ASSERT_EQ(OK, pair.second) << pair.first.error();
1438 const auto& configs = pair.first.configs();
1439
1440 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1441 EXPECT_EQ(configs.find("CONFIG_TWO")->second, "2");
1442 EXPECT_EQ(configs.find("CONFIG_THREE")->second, "3");
1443 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1444 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1445 EXPECT_EQ(configs.find("CONFIG_HELLO")->second, "hello world!")
1446 << "Value should be \"hello world!\" without trailing spaces";
1447 EXPECT_EQ(configs.find("CONFIG_WORLD")->second, "hello world!")
1448 << "Value should be \"hello world!\" without trailing spaces";
1449 EXPECT_EQ(configs.find("CONFIG_GOOD")->second, "good morning!")
1450 << "Value should be \"good morning!\" without leading or trailing spaces";
1451 EXPECT_EQ(configs.find("CONFIG_MORNING")->second, "good morning!")
1452 << "Value should be \"good morning!\" without leading or trailing spaces";
1453 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1454}
1455
Yifan Hongd9e46432017-08-15 17:14:52 -07001456TEST_F(LibVintfTest, NetutilsWrapperMatrix) {
1457 std::string matrixXml;
1458 CompatibilityMatrix matrix;
1459
1460 matrixXml =
1461 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1462 " <hal format=\"native\" optional=\"false\">"
1463 " <name>netutils-wrapper</name>"
1464 " <version>1.0</version>"
1465 " </hal>"
1466 "</compatibility-matrix>";
1467 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
1468 << gCompatibilityMatrixConverter.lastError();
1469
1470// only host libvintf hardcodes netutils-wrapper version requirements
1471#ifdef LIBVINTF_HOST
1472
1473 matrixXml =
1474 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1475 " <hal format=\"native\" optional=\"false\">"
1476 " <name>netutils-wrapper</name>"
1477 " <version>1.0-1</version>"
1478 " </hal>"
1479 "</compatibility-matrix>";
1480 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1481 EXPECT_CONTAINS(
1482 gCompatibilityMatrixConverter.lastError(),
1483 "netutils-wrapper HAL must specify exactly one version x.0, but a range is provided. "
1484 "Perhaps you mean '1.0'?");
1485
1486 matrixXml =
1487 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1488 " <hal format=\"native\" optional=\"false\">"
1489 " <name>netutils-wrapper</name>"
1490 " <version>1.1</version>"
1491 " </hal>"
1492 "</compatibility-matrix>";
1493 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1494 EXPECT_CONTAINS(
1495 gCompatibilityMatrixConverter.lastError(),
1496 "netutils-wrapper HAL must specify exactly one version x.0, but minor version is not 0. "
1497 "Perhaps you mean '1.0'?");
1498
1499 matrixXml =
1500 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1501 " <hal format=\"native\" optional=\"false\">"
1502 " <name>netutils-wrapper</name>"
1503 " <version>1.0</version>"
1504 " <version>2.0</version>"
1505 " </hal>"
1506 "</compatibility-matrix>";
1507 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1508 EXPECT_CONTAINS(
1509 gCompatibilityMatrixConverter.lastError(),
1510 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1511 "is specified.");
1512
1513#endif // LIBVINTF_HOST
1514}
1515
1516TEST_F(LibVintfTest, NetutilsWrapperManifest) {
1517 std::string manifestXml;
1518 HalManifest manifest;
1519
1520 manifestXml =
1521 "<manifest version=\"1.0\" type=\"framework\">"
1522 " <hal format=\"native\">"
1523 " <name>netutils-wrapper</name>"
1524 " <version>1.0</version>"
1525 " <version>2.0</version>"
1526 " </hal>"
1527 "</manifest>";
1528 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml)) << gHalManifestConverter.lastError();
1529
1530// only host libvintf hardcodes netutils-wrapper version requirements
1531#ifdef LIBVINTF_HOST
1532
1533 manifestXml =
1534 "<manifest version=\"1.0\" type=\"framework\">"
1535 " <hal format=\"native\">"
1536 " <name>netutils-wrapper</name>"
1537 " <version>1.1</version>"
1538 " </hal>"
1539 "</manifest>";
1540 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1541 EXPECT_CONTAINS(
1542 gCompatibilityMatrixConverter.lastError(),
1543 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1544 "is specified.");
1545
1546 manifestXml =
1547 "<manifest version=\"1.0\" type=\"framework\">"
1548 " <hal format=\"native\">"
1549 " <name>netutils-wrapper</name>"
1550 " <version>1.0</version>"
1551 " <version>2.1</version>"
1552 " </hal>"
1553 "</manifest>";
1554 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1555 EXPECT_CONTAINS(
1556 gCompatibilityMatrixConverter.lastError(),
1557 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1558 "is specified.");
1559
1560#endif // LIBVINTF_HOST
1561}
1562
Yifan Hong5f996502017-08-23 14:46:44 -07001563TEST_F(LibVintfTest, KernelConfigConditionTest) {
1564 std::string xml =
1565 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1566 " <kernel version=\"3.18.22\"/>\n"
1567 " <kernel version=\"3.18.22\">\n"
1568 " <conditions>\n"
1569 " <config>\n"
1570 " <key>CONFIG_ARM</key>\n"
1571 " <value type=\"tristate\">y</value>\n"
1572 " </config>\n"
1573 " </conditions>\n"
1574 " <config>\n"
1575 " <key>CONFIG_FOO</key>\n"
1576 " <value type=\"tristate\">y</value>\n"
1577 " </config>\n"
1578 " </kernel>\n"
1579 " <sepolicy>\n"
1580 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1581 " <sepolicy-version>25.0</sepolicy-version>\n"
1582 " </sepolicy>\n"
1583 " <avb>\n"
1584 " <vbmeta-version>2.1</vbmeta-version>\n"
1585 " </avb>\n"
1586 "</compatibility-matrix>\n";
1587
1588 CompatibilityMatrix cm;
1589 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1590 << gCompatibilityMatrixConverter.lastError();
1591 const auto& kernels = getKernels(cm);
1592 ASSERT_GE(kernels.size(), 2u);
1593 ASSERT_TRUE(kernels[0].conditions().empty());
1594 const auto& kernel = kernels[1];
1595 const auto& cond = kernel.conditions();
1596 ASSERT_FALSE(cond.empty());
1597 EXPECT_EQ("CONFIG_ARM", cond.begin()->first);
1598 EXPECT_EQ(KernelConfigTypedValue(Tristate::YES), cond.begin()->second);
1599 EXPECT_FALSE(kernel.configs().empty());
1600
1601 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
1602}
1603
1604TEST_F(LibVintfTest, KernelConfigConditionEmptyTest) {
1605 std::string xml =
1606 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1607 " <kernel version=\"4.4.0\"/>\n"
1608 " <kernel version=\"3.18.22\">\n"
1609 " <conditions>\n"
1610 " <config>\n"
1611 " <key>CONFIG_ARM</key>\n"
1612 " <value type=\"tristate\">y</value>\n"
1613 " </config>\n"
1614 " </conditions>\n"
1615 " </kernel>\n"
1616 "</compatibility-matrix>\n";
1617
1618 CompatibilityMatrix cm;
1619 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml))
1620 << "Should not accept first kernel version with non-empty conditions";
1621 EXPECT_EQ(
1622 "First <kernel> for version 3.18 must have empty <conditions> "
1623 "for backwards compatibility.",
1624 gCompatibilityMatrixConverter.lastError());
1625}
1626
1627TEST_F(LibVintfTest, KernelConfigConditionMatch) {
1628 RuntimeInfo runtime = testRuntimeInfo();
1629 std::string error;
1630 std::string xml;
1631 CompatibilityMatrix cm;
1632
1633 xml =
1634 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1635 " <kernel version=\"3.18.22\"/>\n"
1636 " <kernel version=\"3.18.22\">\n"
1637 " <conditions>\n"
1638 " <config>\n"
1639 " <key>CONFIG_64BIT</key>\n"
1640 " <value type=\"tristate\">y</value>\n"
1641 " </config>\n"
1642 " </conditions>\n"
1643 " <config>\n"
1644 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1645 " <value type=\"int\">24</value>\n"
1646 " </config>\n"
1647 " </kernel>\n"
1648 " <sepolicy>\n"
1649 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1650 " </sepolicy>\n"
1651 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1652 "</compatibility-matrix>\n";
1653
1654 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1655 << gCompatibilityMatrixConverter.lastError();
1656 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1657
1658 xml =
1659 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1660 " <kernel version=\"3.18.22\"/>\n"
1661 " <kernel version=\"3.18.22\">\n"
1662 " <conditions>\n"
1663 " <config>\n"
1664 " <key>CONFIG_64BIT</key>\n"
1665 " <value type=\"tristate\">y</value>\n"
1666 " </config>\n"
1667 " </conditions>\n"
1668 " <config>\n"
1669 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1670 " <value type=\"int\">26</value>\n"
1671 " </config>\n"
1672 " </kernel>\n"
1673 " <sepolicy>\n"
1674 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1675 " </sepolicy>\n"
1676 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1677 "</compatibility-matrix>\n";
1678
1679 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1680 << gCompatibilityMatrixConverter.lastError();
1681 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1682 << "conditions met, so CONFIG_ARCH_MMAP_RND_BITS should not match";
1683
1684 xml =
1685 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1686 " <kernel version=\"3.18.22\"/>\n"
1687 " <kernel version=\"3.18.22\">\n"
1688 " <conditions>\n"
1689 " <config>\n"
1690 " <key>CONFIG_64BIT</key>\n"
1691 " <value type=\"tristate\">n</value>\n"
1692 " </config>\n"
1693 " </conditions>\n"
1694 " <config>\n"
1695 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1696 " <value type=\"int\">26</value>\n"
1697 " </config>\n"
1698 " </kernel>\n"
1699 " <sepolicy>\n"
1700 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1701 " </sepolicy>\n"
1702 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1703 "</compatibility-matrix>\n";
1704
1705 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1706 << gCompatibilityMatrixConverter.lastError();
1707 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1708 xml =
1709 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1710 " <kernel version=\"3.18.22\"/>\n"
1711 " <kernel version=\"3.18.22\">\n"
1712 " <conditions>\n"
1713 " <config>\n"
1714 " <key>CONFIG_64BIT</key>\n"
1715 " <value type=\"tristate\">y</value>\n"
1716 " </config>\n"
1717 " <config>\n"
1718 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1719 " <value type=\"int\">24</value>\n"
1720 " </config>\n"
1721 " </conditions>\n"
1722 " <config>\n"
1723 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1724 " <value type=\"int\">0xdead000000000000</value>\n"
1725 " </config>\n"
1726 " </kernel>\n"
1727 " <sepolicy>\n"
1728 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1729 " </sepolicy>\n"
1730 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1731 "</compatibility-matrix>\n";
1732
1733 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1734 << gCompatibilityMatrixConverter.lastError();
1735 EXPECT_TRUE(runtime.checkCompatibility(cm, &error));
1736
1737 xml =
1738 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1739 " <kernel version=\"3.18.22\"/>\n"
1740 " <kernel version=\"3.18.22\">\n"
1741 " <conditions>\n"
1742 " <config>\n"
1743 " <key>CONFIG_64BIT</key>\n"
1744 " <value type=\"tristate\">y</value>\n"
1745 " </config>\n"
1746 " <config>\n"
1747 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1748 " <value type=\"int\">24</value>\n"
1749 " </config>\n"
1750 " </conditions>\n"
1751 " <config>\n"
1752 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1753 " <value type=\"int\">0xbeaf000000000000</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_FALSE(runtime.checkCompatibility(cm, &error))
1765 << "conditions have 'and' relationship, so CONFIG_ILLEGAL_POINTER_VALUE should not match";
1766
1767 xml =
1768 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1769 " <kernel version=\"3.18.22\"/>\n"
1770 " <kernel version=\"3.18.22\">\n"
1771 " <conditions>\n"
1772 " <config>\n"
1773 " <key>CONFIG_64BIT</key>\n"
1774 " <value type=\"tristate\">y</value>\n"
1775 " </config>\n"
1776 " <config>\n"
1777 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1778 " <value type=\"int\">26</value>\n"
1779 " </config>\n"
1780 " </conditions>\n"
1781 " <config>\n"
1782 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1783 " <value type=\"int\">0xbeaf000000000000</value>\n"
1784 " </config>\n"
1785 " </kernel>\n"
1786 " <sepolicy>\n"
1787 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1788 " </sepolicy>\n"
1789 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1790 "</compatibility-matrix>\n";
1791
1792 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1793 << gCompatibilityMatrixConverter.lastError();
1794 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1795
1796 xml =
1797 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1798 " <kernel version=\"3.18.22\">\n"
1799 " <config>\n"
1800 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1801 " <value type=\"string\"/>\n"
1802 " </config>\n"
1803 " </kernel>\n"
1804 " <kernel version=\"3.18.22\">\n"
1805 " <conditions>\n"
1806 " <config>\n"
1807 " <key>CONFIG_64BIT</key>\n"
1808 " <value type=\"tristate\">y</value>\n"
1809 " </config>\n"
1810 " </conditions>\n"
1811 " <config>\n"
1812 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1813 " <value type=\"int\">0xdead000000000000</value>\n"
1814 " </config>\n"
1815 " </kernel>\n"
1816 " <kernel version=\"3.18.22\">\n"
1817 " <conditions>\n"
1818 " <config>\n"
1819 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1820 " <value type=\"int\">24</value>\n"
1821 " </config>\n"
1822 " </conditions>\n"
1823 " <config>\n"
1824 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1825 " <value type=\"string\">binder,hwbinder</value>\n"
1826 " </config>\n"
1827 " </kernel>\n"
1828 " <sepolicy>\n"
1829 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1830 " </sepolicy>\n"
1831 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1832 "</compatibility-matrix>\n";
1833
1834 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1835 << gCompatibilityMatrixConverter.lastError();
1836 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1837
1838 xml =
1839 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1840 " <kernel version=\"3.18.22\">\n"
1841 " <config>\n"
1842 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1843 " <value type=\"string\"/>\n"
1844 " </config>\n"
1845 " </kernel>\n"
1846 " <kernel version=\"3.18.22\">\n"
1847 " <conditions>\n"
1848 " <config>\n"
1849 " <key>CONFIG_64BIT</key>\n"
1850 " <value type=\"tristate\">y</value>\n"
1851 " </config>\n"
1852 " </conditions>\n"
1853 " <config>\n"
1854 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1855 " <value type=\"int\">0xbeaf000000000000</value>\n"
1856 " </config>\n"
1857 " </kernel>\n"
1858 " <kernel version=\"3.18.22\">\n"
1859 " <conditions>\n"
1860 " <config>\n"
1861 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1862 " <value type=\"int\">24</value>\n"
1863 " </config>\n"
1864 " </conditions>\n"
1865 " <config>\n"
1866 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1867 " <value type=\"string\">binder,hwbinder</value>\n"
1868 " </config>\n"
1869 " </kernel>\n"
1870 " <sepolicy>\n"
1871 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1872 " </sepolicy>\n"
1873 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1874 "</compatibility-matrix>\n";
1875
1876 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1877 << gCompatibilityMatrixConverter.lastError();
1878 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used.";
1879
1880 xml =
1881 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1882 " <kernel version=\"3.18.22\">\n"
1883 " <config>\n"
1884 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1885 " <value type=\"string\"/>\n"
1886 " </config>\n"
1887 " </kernel>\n"
1888 " <kernel version=\"3.18.22\">\n"
1889 " <conditions>\n"
1890 " <config>\n"
1891 " <key>CONFIG_64BIT</key>\n"
1892 " <value type=\"tristate\">y</value>\n"
1893 " </config>\n"
1894 " </conditions>\n"
1895 " <config>\n"
1896 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1897 " <value type=\"int\">0xdead000000000000</value>\n"
1898 " </config>\n"
1899 " </kernel>\n"
1900 " <kernel version=\"3.18.22\">\n"
1901 " <conditions>\n"
1902 " <config>\n"
1903 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1904 " <value type=\"int\">24</value>\n"
1905 " </config>\n"
1906 " </conditions>\n"
1907 " <config>\n"
1908 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1909 " <value type=\"string\">binder</value>\n"
1910 " </config>\n"
1911 " </kernel>\n"
1912 " <sepolicy>\n"
1913 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1914 " </sepolicy>\n"
1915 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1916 "</compatibility-matrix>\n";
1917
1918 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1919 << gCompatibilityMatrixConverter.lastError();
1920 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used";
1921}
1922
Yifan Hongc1889722017-07-07 16:19:52 -07001923// Run KernelConfigParserInvalidTest on processComments = {true, false}
1924class KernelConfigParserInvalidTest : public ::testing::TestWithParam<bool> {};
1925
1926TEST_P(KernelConfigParserInvalidTest, NonSet1) {
1927 const std::string data = "# CONFIG_NOT_EXIST is not sat\n";
Yifan Hong02e94002017-07-10 15:41:56 -07001928 auto pair = processData(data, GetParam() /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07001929 ASSERT_EQ(OK, pair.second) << pair.first.error();
1930 const auto& configs = pair.first.configs();
1931 EXPECT_EQ(configs.find("CONFIG_NOT_EXIST"), configs.end())
1932 << "CONFIG_NOT_EXIST should not exist because of typo";
1933}
1934
1935TEST_P(KernelConfigParserInvalidTest, InvalidLine1) {
1936 const std::string data = "FOO_CONFIG=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07001937 ASSERT_NE(OK,
1938 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07001939}
1940
1941TEST_P(KernelConfigParserInvalidTest, InvalidLine2) {
1942 const std::string data = "CONFIG_BAR-BAZ=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07001943 ASSERT_NE(OK,
1944 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07001945}
1946
1947INSTANTIATE_TEST_CASE_P(KernelConfigParser, KernelConfigParserInvalidTest, ::testing::Bool());
1948
Yifan Honga9993572017-01-24 19:33:15 -08001949} // namespace vintf
1950} // namespace android
1951
Yifan Hong676447a2016-11-15 12:57:23 -08001952int main(int argc, char **argv) {
1953 ::testing::InitGoogleTest(&argc, argv);
1954 return RUN_ALL_TESTS();
1955}