blob: 7c645c24e23d963ce92b87238fe4268a4a1d7ef3 [file] [log] [blame]
Yifan Hong676447a2016-11-15 12:57:23 -08001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Yifan Honge4770332017-12-20 10:44:07 -080017#define LOG_TAG "LibVintfTest"
Yifan Hong676447a2016-11-15 12:57:23 -080018
Yifan Hongd8cee082017-07-05 16:06:09 -070019#include <algorithm>
Yifan Hong398f4c72017-04-13 20:18:01 -070020#include <functional>
21
Yifan Hongd8cee082017-07-05 16:06:09 -070022#include <vintf/CompatibilityMatrix.h>
23#include <vintf/KernelConfigParser.h>
24#include <vintf/VintfObject.h>
Yifan Hong676447a2016-11-15 12:57:23 -080025#include <vintf/parse_string.h>
26#include <vintf/parse_xml.h>
Yifan Hong676447a2016-11-15 12:57:23 -080027
28#include <android-base/logging.h>
Yifan Hong3f5489a2017-02-08 11:14:21 -080029#include <android-base/parseint.h>
Yifan Hong676447a2016-11-15 12:57:23 -080030#include <gtest/gtest.h>
31
Yifan Honga9993572017-01-24 19:33:15 -080032namespace android {
33namespace vintf {
Yifan Hong676447a2016-11-15 12:57:23 -080034
Yifan Hong94757062018-02-09 16:36:31 -080035extern XmlConverter<Version>& gVersionConverter;
36extern XmlConverter<ManifestHal>& gManifestHalConverter;
37extern XmlConverter<MatrixHal>& gMatrixHalConverter;
38extern XmlConverter<KernelConfigTypedValue>& gKernelConfigTypedValueConverter;
39extern XmlConverter<HalManifest>& gHalManifestConverter;
40extern XmlConverter<CompatibilityMatrix>& gCompatibilityMatrixConverter;
Yifan Hong4a5eb7b2017-02-16 18:19:26 -080041
Yifan Hongfeb454e2018-01-09 16:16:40 -080042static bool In(const std::string& sub, const std::string& str) {
Yifan Hongd9e46432017-08-15 17:14:52 -070043 return str.find(sub) != std::string::npos;
44}
Yifan Hongfeb454e2018-01-09 16:16:40 -080045#define EXPECT_IN(sub, str) EXPECT_TRUE(In((sub), (str))) << (str);
46
Yifan Hong6bce1a62018-01-31 13:30:04 -080047#ifndef LIBVINTF_TARGET
Yifan Hongfeb454e2018-01-09 16:16:40 -080048#define EXPECT_CONTAINS(str, sub) EXPECT_IN(sub, str);
Yifan Honga67b2092017-10-09 13:24:54 -070049#endif
Yifan Hongd9e46432017-08-15 17:14:52 -070050
Yifan Honga9993572017-01-24 19:33:15 -080051struct LibVintfTest : public ::testing::Test {
Yifan Hong676447a2016-11-15 12:57:23 -080052public:
53 virtual void SetUp() override {
54 }
55 virtual void TearDown() override {
56 }
Yifan Honga9993572017-01-24 19:33:15 -080057 bool add(CompatibilityMatrix &cm, MatrixHal &&hal) {
58 return cm.add(std::move(hal));
59 }
60 bool add(CompatibilityMatrix &cm, MatrixKernel &&kernel) {
61 return cm.add(std::move(kernel));
62 }
Yifan Hongd2b7e642017-02-17 10:15:32 -080063 bool add(HalManifest &vm, ManifestHal &&hal) {
Yifan Honga9993572017-01-24 19:33:15 -080064 return vm.add(std::move(hal));
65 }
Yifan Hongd4857902017-06-13 14:13:56 -070066 void addXmlFile(CompatibilityMatrix& cm, std::string name, VersionRange range) {
67 MatrixXmlFile f;
68 f.mName = name;
69 f.mVersionRange = range;
70 f.mFormat = XmlSchemaFormat::DTD;
71 f.mOptional = true;
72 cm.addXmlFile(std::move(f));
73 }
Yifan Hong558380a2017-02-09 15:37:32 -080074 void set(CompatibilityMatrix &cm, Sepolicy &&sepolicy) {
Yifan Hong7c7d7062017-04-04 16:26:51 -070075 cm.framework.mSepolicy = sepolicy;
Yifan Hong558380a2017-02-09 15:37:32 -080076 }
Yifan Hong03d2d4a2017-04-12 17:34:14 -070077 void set(CompatibilityMatrix &cm, SchemaType type) {
78 cm.mType = type;
79 }
80 void set(CompatibilityMatrix &cm, VndkVersionRange &&range, std::set<std::string> &&libs) {
81 cm.device.mVndk.mVersionRange = range;
82 cm.device.mVndk.mLibraries = libs;
83 }
Yifan Hong881a9e452017-04-27 19:31:13 -070084 void setAvb(RuntimeInfo &ki, Version vbmeta, Version boot) {
85 ki.mBootVbmetaAvbVersion = vbmeta;
86 ki.mBootAvbVersion = boot;
Yifan Hongf3029302017-04-12 17:23:49 -070087 }
88 void setAvb(CompatibilityMatrix &cm, Version &&avbVersion) {
89 cm.framework.mAvbMetaVersion = avbVersion;
90 }
Yifan Hong19e0a2a2017-04-14 17:30:53 -070091 Version getAvb(CompatibilityMatrix &cm) {
92 return cm.framework.mAvbMetaVersion;
93 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070094 const ManifestHal *getAnyHal(HalManifest &vm, const std::string &name) {
95 return vm.getAnyHal(name);
Yifan Honga9993572017-01-24 19:33:15 -080096 }
Yifan Hongd0cbf1f2017-04-12 19:47:06 -070097 MatrixHal *getAnyHal(CompatibilityMatrix &cm, const std::string &name) {
98 return cm.getAnyHal(name);
99 }
Yifan Hong9bbdb282017-04-12 21:53:59 -0700100 ConstMultiMapValueIterable<std::string, ManifestHal> getHals(HalManifest &vm) {
Yifan Honga9993572017-01-24 19:33:15 -0800101 return vm.getHals();
102 }
Yifan Hong5a06ef72017-01-24 19:54:24 -0800103 bool isValid(const ManifestHal &mh) {
104 return mh.isValid();
105 }
Yifan Hong5f996502017-08-23 14:46:44 -0700106 std::vector<MatrixKernel>& getKernels(CompatibilityMatrix& cm) { return cm.framework.mKernels; }
Yifan Hongdbe9db32017-12-11 19:06:11 -0800107 bool addAllHalsAsOptional(CompatibilityMatrix* cm1, CompatibilityMatrix* cm2, std::string* e) {
108 return cm1->addAllHalsAsOptional(cm2, e);
109 }
Yifan Hongd4b92fe2017-12-20 15:29:03 -0800110 bool addAllXmlFilesAsOptional(CompatibilityMatrix* cm1, CompatibilityMatrix* cm2,
111 std::string* e) {
112 return cm1->addAllXmlFilesAsOptional(cm2, e);
113 }
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700114
115 std::map<std::string, HalInterface> testHalInterfaces() {
116 HalInterface intf;
117 intf.name = "IFoo";
118 intf.instances.insert("default");
119 std::map<std::string, HalInterface> map;
120 map[intf.name] = intf;
121 return map;
122 }
123
Yifan Honga04e1472017-04-05 13:15:34 -0700124 HalManifest testDeviceManifest() {
Yifan Hongd2b7e642017-02-17 10:15:32 -0800125 HalManifest vm;
Yifan Hong7c7d7062017-04-04 16:26:51 -0700126 vm.mType = SchemaType::DEVICE;
Yifan Hong2a3dd082017-04-04 17:15:35 -0700127 vm.device.mSepolicyVersion = {25, 0};
Yifan Hong8ec6f3f2018-03-13 13:58:56 -0700128 vm.add(ManifestHal{HalFormat::HIDL,
129 "android.hardware.camera",
130 {Version(2, 0)},
131 {Transport::HWBINDER, Arch::ARCH_EMPTY},
132 {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
133 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}});
134 vm.add(ManifestHal{HalFormat::HIDL,
135 "android.hardware.nfc",
136 {Version(1, 0)},
137 {Transport::PASSTHROUGH, Arch::ARCH_32_64},
138 {{"INfc", {"INfc", {"default"}}}}});
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;
Yifan Hong8ec6f3f2018-03-13 13:58:56 -0700153 vm.add(ManifestHal{HalFormat::HIDL,
154 "android.hidl.manager",
155 {Version(1, 0)},
156 {Transport::HWBINDER, Arch::ARCH_EMPTY},
157 {
158 {"IServiceManager", {"IServiceManager", {"default"}}},
159 }});
Yifan Honga04e1472017-04-05 13:15:34 -0700160 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
Steven Morelanddd135ec2018-01-22 16:37:34 -0800225TEST_F(LibVintfTest, FutureManifestCompatible) {
226 HalManifest expectedManifest;
Yifan Hong8ec6f3f2018-03-13 13:58:56 -0700227 expectedManifest.add(ManifestHal{HalFormat::HIDL,
228 "android.hardware.foo",
229 {Version(1, 0)},
230 {Transport::HWBINDER, Arch::ARCH_EMPTY},
231 {
Steven Morelanddd135ec2018-01-22 16:37:34 -0800232 {"IFoo", {"IFoo", {"default"}}},
233 }});
234 std::string manifestXml =
235 "<manifest version=\"1.0\" type=\"device\" might_add=\"true\">\n"
236 " <hal format=\"hidl\" attribuet_might_be_added=\"value\">\n"
237 " <name>android.hardware.foo</name>\n"
238 " <transport>hwbinder</transport>\n"
239 " <version>1.0</version>\n"
240 " <interface>\n"
241 " <name>IFoo</name>\n"
242 " <instance>default</instance>\n"
243 " </interface>\n"
244 " </hal>\n"
245 " <tag_might_be_added/>\n"
246 "</manifest>\n";
247 HalManifest manifest;
248 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
249 EXPECT_EQ(expectedManifest, manifest);
250}
251
Yifan Hongd2b7e642017-02-17 10:15:32 -0800252TEST_F(LibVintfTest, HalManifestConverter) {
Yifan Honga04e1472017-04-05 13:15:34 -0700253 HalManifest vm = testDeviceManifest();
Yifan Honga1fae892018-03-13 12:36:38 -0700254 std::string xml =
255 gHalManifestConverter(vm, SerializeFlag::HALS_NO_FQNAME & SerializeFlag::SEPOLICY_ONLY);
Yifan Hong676447a2016-11-15 12:57:23 -0800256 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700257 "<manifest version=\"1.0\" type=\"device\">\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800258 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800259 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800260 " <transport>hwbinder</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800261 " <version>2.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800262 " <interface>\n"
263 " <name>IBetterCamera</name>\n"
264 " <instance>camera</instance>\n"
265 " </interface>\n"
266 " <interface>\n"
267 " <name>ICamera</name>\n"
268 " <instance>default</instance>\n"
269 " <instance>legacy/0</instance>\n"
270 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800271 " </hal>\n"
272 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800273 " <name>android.hardware.nfc</name>\n"
Yifan Hongc54d32c2017-03-07 19:12:26 -0800274 " <transport arch=\"32+64\">passthrough</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800275 " <version>1.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800276 " <interface>\n"
277 " <name>INfc</name>\n"
278 " <instance>default</instance>\n"
279 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800280 " </hal>\n"
Yifan Hong2a3dd082017-04-04 17:15:35 -0700281 " <sepolicy>\n"
282 " <version>25.0</version>\n"
283 " </sepolicy>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800284 "</manifest>\n");
Yifan Hongfb7469c2017-04-05 19:15:21 -0700285 HalManifest vm2;
286 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
287 EXPECT_EQ(vm, vm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800288}
289
Yifan Honga04e1472017-04-05 13:15:34 -0700290TEST_F(LibVintfTest, HalManifestConverterFramework) {
291 HalManifest vm = testFrameworkManfiest();
Yifan Honga1fae892018-03-13 12:36:38 -0700292 std::string xml =
293 gHalManifestConverter(vm, SerializeFlag::HALS_NO_FQNAME & SerializeFlag::VNDK_ONLY);
Yifan Honga04e1472017-04-05 13:15:34 -0700294 EXPECT_EQ(xml,
295 "<manifest version=\"1.0\" type=\"framework\">\n"
296 " <hal format=\"hidl\">\n"
297 " <name>android.hidl.manager</name>\n"
298 " <transport>hwbinder</transport>\n"
299 " <version>1.0</version>\n"
300 " <interface>\n"
301 " <name>IServiceManager</name>\n"
302 " <instance>default</instance>\n"
303 " </interface>\n"
304 " </hal>\n"
305 " <vndk>\n"
306 " <version>25.0.5</version>\n"
307 " <library>libbase.so</library>\n"
308 " <library>libjpeg.so</library>\n"
309 " </vndk>\n"
310 " <vndk>\n"
311 " <version>25.1.3</version>\n"
312 " <library>libbase.so</library>\n"
313 " <library>libjpeg.so</library>\n"
314 " <library>libtinyxml2.so</library>\n"
315 " </vndk>\n"
316 "</manifest>\n");
317 HalManifest vm2;
318 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700319 EXPECT_EQ(vm, vm2);
Yifan Honga04e1472017-04-05 13:15:34 -0700320}
321
Yifan Hong8e9c6692017-02-28 14:07:42 -0800322TEST_F(LibVintfTest, HalManifestOptional) {
323 HalManifest vm;
324 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700325 "<manifest version=\"1.0\" type=\"device\"></manifest>"));
Yifan Hong8e9c6692017-02-28 14:07:42 -0800326 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700327 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800328 " <hal>"
329 " <name>android.hidl.manager</name>"
330 " <transport>hwbinder</transport>"
331 " <version>1.0</version>"
332 " </hal>"
333 "</manifest>"));
334 EXPECT_FALSE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700335 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800336 " <hal>"
337 " <name>android.hidl.manager</name>"
338 " <version>1.0</version>"
339 " </hal>"
340 "</manifest>"));
341}
342
Yifan Honge0bb98d2017-08-07 14:40:19 -0700343TEST_F(LibVintfTest, HalManifestNative) {
344 HalManifest vm;
345 EXPECT_TRUE(gHalManifestConverter(&vm,
346 "<manifest version=\"1.0\" type=\"device\">"
347 " <hal format=\"native\">"
348 " <name>foo</name>"
349 " <version>1.0</version>"
350 " </hal>"
351 "</manifest>"))
352 << gHalManifestConverter.lastError();
353 EXPECT_FALSE(gHalManifestConverter(&vm,
354 "<manifest version=\"1.0\" type=\"device\">"
355 " <hal format=\"native\">"
356 " <name>foo</name>"
357 " <version>1.0</version>"
358 " <transport>hwbinder</transport>"
359 " </hal>"
360 "</manifest>"));
361 EXPECT_TRUE(gHalManifestConverter.lastError().find(
362 "Native HAL 'foo' should not have <transport> defined") != std::string::npos);
363}
364
Yifan Hong79dcc1f2017-05-22 14:35:19 -0700365TEST_F(LibVintfTest, HalManifestDuplicate) {
366 HalManifest vm;
367 EXPECT_FALSE(gHalManifestConverter(&vm,
368 "<manifest version=\"1.0\" type=\"device\">"
369 " <hal>"
370 " <name>android.hidl.manager</name>"
371 " <transport>hwbinder</transport>"
372 " <version>1.0</version>"
373 " <version>1.1</version>"
374 " </hal>"
375 "</manifest>"))
376 << "Should not allow duplicated major version in <hal>";
377 EXPECT_FALSE(gHalManifestConverter(&vm,
378 "<manifest version=\"1.0\" type=\"device\">"
379 " <hal>"
380 " <name>android.hidl.manager</name>"
381 " <transport>hwbinder</transport>"
382 " <version>1.0</version>"
383 " </hal>"
384 " <hal>"
385 " <name>android.hidl.manager</name>"
386 " <transport arch=\"32+64\">passthrough</transport>"
387 " <version>1.1</version>"
388 " </hal>"
389 "</manifest>"))
390 << "Should not allow duplicated major version across <hal>";
391}
392
393TEST_F(LibVintfTest, HalManifestGetTransport) {
394 HalManifest vm;
395 EXPECT_TRUE(gHalManifestConverter(&vm,
396 "<manifest version=\"1.0\" type=\"device\">"
397 " <hal>"
398 " <name>android.hidl.manager</name>"
399 " <transport>hwbinder</transport>"
400 " <version>1.0</version>"
401 " <interface>"
402 " <name>IServiceManager</name>"
403 " <instance>default</instance>"
404 " </interface>"
405 " </hal>"
406 " <hal>"
407 " <name>android.hidl.manager</name>"
408 " <transport arch=\"32+64\">passthrough</transport>"
409 " <version>2.1</version>"
410 " <interface>"
411 " <name>IServiceManager</name>"
412 " <instance>default</instance>"
413 " </interface>"
414 " </hal>"
415 "</manifest>"));
416 EXPECT_EQ(Transport::PASSTHROUGH,
417 vm.getTransport("android.hidl.manager", {2, 1}, "IServiceManager", "default"));
418 EXPECT_EQ(Transport::PASSTHROUGH,
419 vm.getTransport("android.hidl.manager", {2, 0}, "IServiceManager", "default"));
420 EXPECT_EQ(Transport::EMPTY,
421 vm.getTransport("android.hidl.manager", {2, 2}, "IServiceManager", "default"));
422 EXPECT_EQ(Transport::HWBINDER,
423 vm.getTransport("android.hidl.manager", {1, 0}, "IServiceManager", "default"));
424}
425
Yifan Hongec3b9b72017-02-23 13:24:42 -0800426TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700427 HalManifest vm = testDeviceManifest();
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700428 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "ICamera"),
429 std::set<std::string>({"default", "legacy/0"}));
430 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "IBetterCamera"),
431 std::set<std::string>({"camera"}));
432 EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "INotExist"),
433 std::set<std::string>({}));
434 EXPECT_EQ(vm.getInstances("android.hardware.nfc", {1, 0}, "INfc"),
435 std::set<std::string>({"default"}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800436
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700437 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "default"));
438 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "legacy/0"));
439 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "camera"));
440 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", {1, 0}, "INfc", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800441
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700442 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "INotExist", "default"));
443 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "notexist"));
444 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "default"));
445 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "INotExist", "notexist"));
446 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", {1, 0}, "INfc", "notexist"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800447}
448
Yifan Hong676447a2016-11-15 12:57:23 -0800449TEST_F(LibVintfTest, VersionConverter) {
450 Version v(3, 6);
451 std::string xml = gVersionConverter(v);
452 EXPECT_EQ(xml, "<version>3.6</version>\n");
453 Version v2;
454 EXPECT_TRUE(gVersionConverter(&v2, xml));
455 EXPECT_EQ(v, v2);
456}
457
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700458static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
459 std::string name{intf.name};
460 return map->emplace(std::move(name), std::move(intf)).second;
461}
462
Yifan Hong676447a2016-11-15 12:57:23 -0800463TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800464 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800465 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700466 false /* optional */, {}};
467 EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
468 EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800469 std::string xml = gMatrixHalConverter(mh);
470 EXPECT_EQ(xml,
471 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800472 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800473 " <version>1.2-3</version>\n"
474 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700475 " <interface>\n"
476 " <name>IBetterCamera</name>\n"
477 " <instance>default</instance>\n"
478 " <instance>great</instance>\n"
479 " </interface>\n"
480 " <interface>\n"
481 " <name>ICamera</name>\n"
482 " <instance>default</instance>\n"
483 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800484 "</hal>\n");
485 MatrixHal mh2;
486 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
487 EXPECT_EQ(mh, mh2);
488}
489
Yifan Hong3f5489a2017-02-08 11:14:21 -0800490TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
491
492 KernelConfigTypedValue converted;
493
494 auto testOne = [] (const KernelConfigTypedValue &original,
495 const std::string &expectXml) {
496 std::string xml;
497 KernelConfigTypedValue converted;
498 xml = gKernelConfigTypedValueConverter(original);
499 EXPECT_EQ(xml, expectXml);
500 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
501 EXPECT_EQ(original, converted);
502 };
503
504 auto testParse = [] (const KernelConfigTypedValue &original,
505 const std::string &xml) {
506 KernelConfigTypedValue converted;
507 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
508 EXPECT_EQ(original, converted);
509 };
510
511 testOne(KernelConfigTypedValue("stringvalue"),
512 "<value type=\"string\">stringvalue</value>\n");
513 testOne(KernelConfigTypedValue(""),
514 "<value type=\"string\"></value>\n");
515
516 testOne(KernelConfigTypedValue(Tristate::YES),
517 "<value type=\"tristate\">y</value>\n");
518 testOne(KernelConfigTypedValue(Tristate::NO),
519 "<value type=\"tristate\">n</value>\n");
520 testOne(KernelConfigTypedValue(Tristate::MODULE),
521 "<value type=\"tristate\">m</value>\n");
522 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
523 "<value type=\"tristate\">q</value>\n"));
524
525 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
526 "<value type=\"range\">4-20</value>\n");
527 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
528 "<value type=\"range\">0-18446744073709551615</value>\n");
529 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
530 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
531
532 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
533 "<value type=\"int\">-18446744073709551616</value>\n"));
534
535 testOne(KernelConfigTypedValue(INT64_MIN),
536 "<value type=\"int\">-9223372036854775808</value>\n");
537 testParse(KernelConfigTypedValue(INT64_MIN),
538 "<value type=\"int\">0x8000000000000000</value>\n");
539 testParse(KernelConfigTypedValue(INT64_MIN),
540 "<value type=\"int\">-0X8000000000000000</value>\n");
541
542 testParse(KernelConfigTypedValue(INT64_MIN + 1),
543 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
544
545 testParse(KernelConfigTypedValue(-0x50),
546 "<value type=\"int\">-0x50</value>\n");
547
548 testOne(KernelConfigTypedValue(0),
549 "<value type=\"int\">0</value>\n");
550
551 // Truncation for underflow.
552 testParse(KernelConfigTypedValue(1),
553 "<value type=\"int\">-0xffffffffffffffff</value>\n");
554 testParse(KernelConfigTypedValue(1),
555 "<value type=\"int\">-18446744073709551615</value>\n");
556
557 testOne(KernelConfigTypedValue(INT64_MAX),
558 "<value type=\"int\">9223372036854775807</value>\n");
559 testParse(KernelConfigTypedValue(INT64_MAX),
560 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
561 // Truncation for underflow.
562 testParse(KernelConfigTypedValue(INT64_MAX),
563 "<value type=\"int\">-9223372036854775809</value>\n");
564
565 testParse(KernelConfigTypedValue(-1),
566 "<value type=\"int\">18446744073709551615</value>\n");
567 testParse(KernelConfigTypedValue(-1),
568 "<value type=\"int\">0xffffffffffffffff</value>\n");
569
570 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
571 "<value type=\"int\">18446744073709551616</value>\n"));
572}
573
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700574TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
Yifan Hong676447a2016-11-15 12:57:23 -0800575 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800576 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800577 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700578 false /* optional */, testHalInterfaces()}));
Yifan Honga9993572017-01-24 19:33:15 -0800579 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800580 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700581 true /* optional */, testHalInterfaces()}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800582 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
583 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
584 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
585 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700586 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700587 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800588 std::string xml = gCompatibilityMatrixConverter(cm);
589 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700590 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800591 " <hal format=\"native\" optional=\"false\">\n"
592 " <name>android.hardware.camera</name>\n"
593 " <version>1.2-3</version>\n"
594 " <version>4.5-6</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700595 " <interface>\n"
596 " <name>IFoo</name>\n"
597 " <instance>default</instance>\n"
598 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800599 " </hal>\n"
600 " <hal format=\"native\" optional=\"true\">\n"
601 " <name>android.hardware.nfc</name>\n"
602 " <version>4.5-6</version>\n"
603 " <version>10.11-12</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700604 " <interface>\n"
605 " <name>IFoo</name>\n"
606 " <instance>default</instance>\n"
607 " </interface>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800608 " </hal>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800609 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800610 " <config>\n"
611 " <key>CONFIG_FOO</key>\n"
612 " <value type=\"tristate\">y</value>\n"
613 " </config>\n"
614 " <config>\n"
615 " <key>CONFIG_BAR</key>\n"
616 " <value type=\"string\">stringvalue</value>\n"
617 " </config>\n"
618 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800619 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800620 " <config>\n"
621 " <key>CONFIG_BAZ</key>\n"
622 " <value type=\"int\">20</value>\n"
623 " </config>\n"
624 " <config>\n"
625 " <key>CONFIG_BAR</key>\n"
626 " <value type=\"range\">3-5</value>\n"
627 " </config>\n"
628 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800629 " <sepolicy>\n"
630 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700631 " <sepolicy-version>25.0</sepolicy-version>\n"
632 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800633 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700634 " <avb>\n"
635 " <vbmeta-version>2.1</vbmeta-version>\n"
636 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800637 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800638 CompatibilityMatrix cm2;
639 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700640 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800641}
642
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700643TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
644 CompatibilityMatrix cm;
645 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
646 {{VersionRange(1,0)}},
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700647 false /* optional */, testHalInterfaces()}));
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700648 set(cm, SchemaType::DEVICE);
649 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
650 std::string xml = gCompatibilityMatrixConverter(cm);
651 EXPECT_EQ(xml,
652 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
653 " <hal format=\"native\" optional=\"false\">\n"
654 " <name>android.hidl.manager</name>\n"
655 " <version>1.0</version>\n"
Yifan Hong9cd9eb02017-05-17 18:36:08 -0700656 " <interface>\n"
657 " <name>IFoo</name>\n"
658 " <instance>default</instance>\n"
659 " </interface>\n"
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700660 " </hal>\n"
661 " <vndk>\n"
662 " <version>25.0.1-5</version>\n"
663 " <library>libbase.so</library>\n"
664 " <library>libjpeg.so</library>\n"
665 " </vndk>\n"
666 "</compatibility-matrix>\n");
667 CompatibilityMatrix cm2;
668 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
669 EXPECT_EQ(cm, cm2);
670}
671
Yifan Hong676447a2016-11-15 12:57:23 -0800672TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800673 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800674
Yifan Hong8ec6f3f2018-03-13 13:58:56 -0700675 ManifestHal invalidHal{HalFormat::HIDL,
676 "android.hardware.camera",
677 {{Version(2, 0), Version(2, 1)}},
678 {Transport::PASSTHROUGH, Arch::ARCH_32_64},
679 {}};
Yifan Hong2059ffc2017-02-24 11:32:02 -0800680
Yifan Hong5a06ef72017-01-24 19:54:24 -0800681 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800682 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800683 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800684}
685
Tri Vod0143942017-03-24 17:51:23 -0700686TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700687 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700688 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
689 {"android.hardware.camera", "android.hardware.nfc"}));
690}
691
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700692TEST_F(LibVintfTest, HalManifestGetAllHals) {
Yifan Honga04e1472017-04-05 13:15:34 -0700693 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700694 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
695 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800696
697 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
698 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800699 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800700 EXPECT_EQ(hal.name, arr[i++]);
701 }
702}
703
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700704TEST_F(LibVintfTest, HalManifestGetHals) {
705 HalManifest vm;
Yifan Hong8ec6f3f2018-03-13 13:58:56 -0700706 EXPECT_TRUE(add(vm, ManifestHal{HalFormat::HIDL,
707 "android.hardware.camera",
708 {Version(1, 2)},
709 {Transport::HWBINDER, Arch::ARCH_EMPTY},
710 {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
711 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}}));
712 EXPECT_TRUE(add(vm, ManifestHal{HalFormat::HIDL,
713 "android.hardware.camera",
714 {Version(2, 0)},
715 {Transport::HWBINDER, Arch::ARCH_EMPTY},
716 {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
717 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}}));
718 EXPECT_TRUE(add(vm, ManifestHal{HalFormat::HIDL,
719 "android.hardware.nfc",
720 {Version(1, 0), Version(2, 1)},
721 {Transport::PASSTHROUGH, Arch::ARCH_32_64},
722 {{"INfc", {"INfc", {"default"}}}}}));
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700723 ManifestHal expectedCameraHalV1_2 =
Yifan Hong8ec6f3f2018-03-13 13:58:56 -0700724 ManifestHal{HalFormat::HIDL,
725 "android.hardware.camera",
726 {Version(1, 2)},
727 {Transport::HWBINDER, Arch::ARCH_EMPTY},
728 {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
729 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}};
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700730 ManifestHal expectedCameraHalV2_0 =
Yifan Hong8ec6f3f2018-03-13 13:58:56 -0700731 ManifestHal{HalFormat::HIDL,
732 "android.hardware.camera",
733 {Version(2, 0)},
734 {Transport::HWBINDER, Arch::ARCH_EMPTY},
735 {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
736 {"IBetterCamera", {"IBetterCamera", {"camera"}}}}};
737 ManifestHal expectedNfcHal = ManifestHal{HalFormat::HIDL,
738 "android.hardware.nfc",
739 {Version(1, 0), Version(2, 1)},
740 {Transport::PASSTHROUGH, Arch::ARCH_32_64},
741 {{"INfc", {"INfc", {"default"}}}}};
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700742 auto cameraHals = vm.getHals("android.hardware.camera");
743 EXPECT_EQ((int)cameraHals.size(), 2);
744 EXPECT_EQ(*cameraHals[0], expectedCameraHalV1_2);
745 EXPECT_EQ(*cameraHals[1], expectedCameraHalV2_0);
746 auto nfcHals = vm.getHals("android.hardware.nfc");
747 EXPECT_EQ((int)nfcHals.size(), 1);
748 EXPECT_EQ(*nfcHals[0], expectedNfcHal);
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700749}
750
751TEST_F(LibVintfTest, CompatibilityMatrixGetHals) {
752 CompatibilityMatrix cm;
753 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
754 "android.hardware.camera",
755 {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
756 false /* optional */,
757 testHalInterfaces()}));
758 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
759 "android.hardware.nfc",
760 {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
761 true /* optional */,
762 testHalInterfaces()}));
763
764 MatrixHal expectedCameraHal = MatrixHal{
765 HalFormat::NATIVE,
766 "android.hardware.camera",
767 {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
768 false /* optional */,
769 testHalInterfaces(),
770 };
771 MatrixHal expectedNfcHal = MatrixHal{HalFormat::NATIVE,
772 "android.hardware.nfc",
773 {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
774 true /* optional */,
775 testHalInterfaces()};
776 auto cameraHals = cm.getHals("android.hardware.camera");
777 EXPECT_EQ((int)cameraHals.size(), 1);
778 EXPECT_EQ(*cameraHals[0], expectedCameraHal);
779 auto nfcHals = cm.getHals("android.hardware.nfc");
780 EXPECT_EQ((int)nfcHals.size(), 1);
781 EXPECT_EQ(*nfcHals[0], expectedNfcHal);
Zhuoyao Zhangc7e75bd2017-10-29 17:20:19 -0700782}
783
Yifan Honga7201e72017-02-17 10:09:59 -0800784TEST_F(LibVintfTest, RuntimeInfo) {
785 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800786 using KernelConfigs = std::vector<KernelConfig>;
787 const KernelConfigs configs {
788 KernelConfig{"CONFIG_64BIT", Tristate::YES},
789 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
790 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
791 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
792 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
793 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
794 };
795
796 auto testMatrix = [&] (MatrixKernel &&kernel) {
797 CompatibilityMatrix cm;
798 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700799 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700800 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800801 return cm;
802 };
803
804 std::string error;
805
806 {
807 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
808 CompatibilityMatrix cm = testMatrix(std::move(kernel));
809 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
810 }
811
812 {
Yifan Hong5f996502017-08-23 14:46:44 -0700813 MatrixKernel kernel(KernelVersion{3, 18, 60}, KernelConfigs(configs));
814 CompatibilityMatrix cm = testMatrix(std::move(kernel));
815 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
816 }
817
818 {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800819 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
820 CompatibilityMatrix cm = testMatrix(std::move(kernel));
821 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
822 }
823
824 {
825 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
826 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700827 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800828 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
829 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700830 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800831 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
832 << "kernel-sepolicy-version shouldn't match";
833 }
834
835 {
836 KernelConfigs newConfigs(configs);
837 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
838 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
839 CompatibilityMatrix cm = testMatrix(std::move(kernel));
840 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
841 }
842
843 {
844 KernelConfigs newConfigs(configs);
845 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
846 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
847 CompatibilityMatrix cm = testMatrix(std::move(kernel));
848 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
849 }
850
851 {
852 KernelConfigs newConfigs(configs);
853 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
854 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
855 CompatibilityMatrix cm = testMatrix(std::move(kernel));
856 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
857 }
858
859 {
860 KernelConfigs newConfigs(configs);
861 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
862 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
863 CompatibilityMatrix cm = testMatrix(std::move(kernel));
864 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
865 }
866
867 {
868 KernelConfigs newConfigs(configs);
869 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
870 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
871 CompatibilityMatrix cm = testMatrix(std::move(kernel));
872 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
873 }
Yifan Hongdb6423e2017-09-11 14:38:46 -0700874
Yifan Hongf3029302017-04-12 17:23:49 -0700875 RuntimeInfo badAvb = testRuntimeInfo();
876 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
877 {
878 setAvb(badAvb, {1, 0}, {2, 1});
879 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
Michael Schwartz5cfbc922017-05-08 14:06:49 -0700880 EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
Yifan Hongf3029302017-04-12 17:23:49 -0700881 }
882 {
883 setAvb(badAvb, {2, 1}, {3, 0});
884 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
885 }
886 {
887 setAvb(badAvb, {2, 1}, {2, 3});
888 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
889 }
890 {
891 setAvb(badAvb, {2, 3}, {2, 1});
892 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
893 }
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800894}
895
Yifan Hong19e0a2a2017-04-14 17:30:53 -0700896TEST_F(LibVintfTest, MissingAvb) {
897 std::string xml =
898 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
899 " <kernel version=\"3.18.31\"></kernel>"
900 " <sepolicy>\n"
901 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
902 " <sepolicy-version>25.5</sepolicy-version>\n"
903 " </sepolicy>\n"
904 "</compatibility-matrix>\n";
905 CompatibilityMatrix cm;
906 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
907 EXPECT_EQ(getAvb(cm), Version(0, 0));
908}
909
Yifan Hongdb6423e2017-09-11 14:38:46 -0700910TEST_F(LibVintfTest, DisableAvb) {
911 std::string xml =
912 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
913 " <kernel version=\"3.18.31\"></kernel>"
914 " <sepolicy>\n"
915 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
916 " <sepolicy-version>25.5</sepolicy-version>\n"
917 " </sepolicy>\n"
918 " <avb>\n"
919 " <vbmeta-version>1.0</vbmeta-version>\n"
920 " </avb>\n"
921 "</compatibility-matrix>\n";
922 CompatibilityMatrix cm;
923 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
924 RuntimeInfo ki = testRuntimeInfo();
925 std::string error;
926 EXPECT_FALSE(ki.checkCompatibility(cm, &error));
927 EXPECT_STREQ(error.c_str(), "AVB version 2.1 does not match framework matrix 1.0");
928 EXPECT_TRUE(ki.checkCompatibility(cm, &error, DISABLE_AVB_CHECK)) << error;
929}
930
Yifan Hong08e984c2017-05-18 12:50:04 -0700931// This is the test extracted from VINTF Object doc
932TEST_F(LibVintfTest, HalCompat) {
933 CompatibilityMatrix matrix;
934 std::string error;
935
936 std::string matrixXml =
937 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
938 " <hal format=\"hidl\" optional=\"false\">\n"
939 " <name>android.hardware.foo</name>\n"
940 " <version>1.0</version>\n"
941 " <version>3.1-2</version>\n"
942 " <interface>\n"
943 " <name>IFoo</name>\n"
944 " <instance>default</instance>\n"
945 " <instance>specific</instance>\n"
946 " </interface>\n"
947 " </hal>\n"
948 " <hal format=\"hidl\" optional=\"false\">\n"
949 " <name>android.hardware.foo</name>\n"
950 " <version>2.0</version>\n"
951 " <interface>\n"
952 " <name>IBar</name>\n"
953 " <instance>default</instance>\n"
954 " </interface>\n"
955 " </hal>\n"
956 " <sepolicy>\n"
957 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
958 " <sepolicy-version>25.5</sepolicy-version>\n"
959 " </sepolicy>\n"
960 "</compatibility-matrix>\n";
961 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
962 << gCompatibilityMatrixConverter.lastError();
963
964 {
965 std::string manifestXml =
966 "<manifest version=\"1.0\" type=\"device\">\n"
967 " <hal format=\"hidl\">\n"
968 " <name>android.hardware.foo</name>\n"
969 " <transport>hwbinder</transport>\n"
970 " <version>1.0</version>\n"
971 " <interface>\n"
972 " <name>IFoo</name>\n"
973 " <instance>default</instance>\n"
974 " <instance>specific</instance>\n"
975 " </interface>\n"
976 " </hal>\n"
977 " <hal format=\"hidl\">\n"
978 " <name>android.hardware.foo</name>\n"
979 " <transport>hwbinder</transport>\n"
980 " <version>2.0</version>\n"
981 " <interface>\n"
982 " <name>IBar</name>\n"
983 " <instance>default</instance>\n"
984 " </interface>\n"
985 " </hal>\n"
986 " <sepolicy>\n"
987 " <version>25.5</version>\n"
988 " </sepolicy>\n"
989 "</manifest>\n";
990
991 HalManifest manifest;
992 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
993 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
994 }
995
996 {
997 std::string manifestXml =
998 "<manifest version=\"1.0\" type=\"device\">\n"
999 " <hal format=\"hidl\">\n"
1000 " <name>android.hardware.foo</name>\n"
1001 " <transport>hwbinder</transport>\n"
1002 " <version>1.0</version>\n"
1003 " <interface>\n"
1004 " <name>IFoo</name>\n"
1005 " <instance>default</instance>\n"
1006 " <instance>specific</instance>\n"
1007 " </interface>\n"
1008 " </hal>\n"
1009 " <sepolicy>\n"
1010 " <version>25.5</version>\n"
1011 " </sepolicy>\n"
1012 "</manifest>\n";
1013 HalManifest manifest;
1014 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1015 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1016 << "should not be compatible because IBar is missing";
1017 }
1018
1019 {
1020 std::string manifestXml =
1021 "<manifest version=\"1.0\" type=\"device\">\n"
1022 " <hal format=\"hidl\">\n"
1023 " <name>android.hardware.foo</name>\n"
1024 " <transport>hwbinder</transport>\n"
1025 " <version>1.0</version>\n"
1026 " <interface>\n"
1027 " <name>IFoo</name>\n"
1028 " <instance>default</instance>\n"
1029 " </interface>\n"
1030 " </hal>\n"
1031 " <hal format=\"hidl\">\n"
1032 " <name>android.hardware.foo</name>\n"
1033 " <transport>hwbinder</transport>\n"
1034 " <version>2.0</version>\n"
1035 " <interface>\n"
1036 " <name>IBar</name>\n"
1037 " <instance>default</instance>\n"
1038 " </interface>\n"
1039 " </hal>\n"
1040 " <sepolicy>\n"
1041 " <version>25.5</version>\n"
1042 " </sepolicy>\n"
1043 "</manifest>\n";
1044 HalManifest manifest;
1045 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1046 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
Yifan Hong8d8264e2018-03-14 16:03:11 -07001047 << "should not be compatible because IFoo/specific is missing";
Yifan Hong08e984c2017-05-18 12:50:04 -07001048 }
1049
1050 {
1051 std::string manifestXml =
1052 "<manifest version=\"1.0\" type=\"device\">\n"
1053 " <hal format=\"hidl\">\n"
1054 " <name>android.hardware.foo</name>\n"
1055 " <transport>hwbinder</transport>\n"
1056 " <version>3.3</version>\n"
1057 " <interface>\n"
1058 " <name>IFoo</name>\n"
1059 " <instance>default</instance>\n"
1060 " <instance>specific</instance>\n"
1061 " </interface>\n"
1062 " </hal>\n"
1063 " <hal format=\"hidl\">\n"
1064 " <name>android.hardware.foo</name>\n"
1065 " <transport>hwbinder</transport>\n"
1066 " <version>2.0</version>\n"
1067 " <interface>\n"
1068 " <name>IBar</name>\n"
1069 " <instance>default</instance>\n"
1070 " </interface>\n"
1071 " </hal>\n"
1072 " <sepolicy>\n"
1073 " <version>25.5</version>\n"
1074 " </sepolicy>\n"
1075 "</manifest>\n";
1076 HalManifest manifest;
1077 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1078 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1079 }
1080
1081 {
1082 std::string manifestXml =
1083 "<manifest version=\"1.0\" type=\"device\">\n"
1084 " <hal format=\"hidl\">\n"
1085 " <name>android.hardware.foo</name>\n"
1086 " <transport>hwbinder</transport>\n"
1087 " <version>1.0</version>\n"
1088 " <interface>\n"
1089 " <name>IFoo</name>\n"
1090 " <instance>default</instance>\n"
1091 " </interface>\n"
1092 " </hal>\n"
1093 " <hal format=\"hidl\">\n"
1094 " <name>android.hardware.foo</name>\n"
1095 " <transport>hwbinder</transport>\n"
1096 " <version>3.2</version>\n"
1097 " <interface>\n"
1098 " <name>IFoo</name>\n"
1099 " <instance>specific</instance>\n"
1100 " </interface>\n"
1101 " </hal>\n"
1102 " <hal format=\"hidl\">\n"
1103 " <name>android.hardware.foo</name>\n"
1104 " <transport>hwbinder</transport>\n"
1105 " <version>2.0</version>\n"
1106 " <interface>\n"
1107 " <name>IBar</name>\n"
1108 " <instance>default</instance>\n"
1109 " </interface>\n"
1110 " </hal>\n"
1111 " <sepolicy>\n"
1112 " <version>25.5</version>\n"
1113 " </sepolicy>\n"
1114 "</manifest>\n";
1115 HalManifest manifest;
1116 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1117 EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1118 << "should not be compatible even though @1.0::IFoo/default "
1119 << "and @3.2::IFoo/specific present";
1120 }
1121
1122 {
1123 std::string manifestXml =
1124 "<manifest version=\"1.0\" type=\"device\">\n"
1125 " <hal format=\"hidl\">\n"
1126 " <name>android.hardware.foo</name>\n"
1127 " <transport>hwbinder</transport>\n"
1128 " <version>1.0</version>\n"
1129 " <interface>\n"
1130 " <name>IFoo</name>\n"
1131 " <instance>default</instance>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001132 " <instance>specific</instance>\n"
1133 " </interface>\n"
1134 " </hal>\n"
1135 " <hal format=\"hidl\">\n"
1136 " <name>android.hardware.foo</name>\n"
1137 " <transport>hwbinder</transport>\n"
1138 " <version>2.0</version>\n"
1139 " <interface>\n"
1140 " <name>IBar</name>\n"
1141 " <instance>default</instance>\n"
1142 " </interface>\n"
1143 " </hal>\n"
1144 " <sepolicy>\n"
1145 " <version>25.5</version>\n"
1146 " </sepolicy>\n"
1147 "</manifest>\n";
1148 HalManifest manifest;
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001149 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml))
1150 << gHalManifestConverter.lastError();
1151 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
Yifan Hong08e984c2017-05-18 12:50:04 -07001152 }
1153}
1154
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001155TEST_F(LibVintfTest, Compat) {
1156 std::string manifestXml =
1157 "<manifest version=\"1.0\" type=\"device\">\n"
1158 " <hal format=\"hidl\">\n"
1159 " <name>android.hardware.camera</name>\n"
1160 " <transport>hwbinder</transport>\n"
1161 " <version>3.5</version>\n"
1162 " <interface>\n"
1163 " <name>IBetterCamera</name>\n"
1164 " <instance>camera</instance>\n"
1165 " </interface>\n"
1166 " <interface>\n"
1167 " <name>ICamera</name>\n"
1168 " <instance>default</instance>\n"
1169 " <instance>legacy/0</instance>\n"
1170 " </interface>\n"
1171 " </hal>\n"
1172 " <hal format=\"hidl\">\n"
1173 " <name>android.hardware.nfc</name>\n"
1174 " <transport>hwbinder</transport>\n"
1175 " <version>1.0</version>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001176 " <interface>\n"
1177 " <name>INfc</name>\n"
1178 " <instance>nfc_nci</instance>\n"
1179 " </interface>\n"
1180 " </hal>\n"
1181 " <hal format=\"hidl\">\n"
1182 " <name>android.hardware.nfc</name>\n"
1183 " <transport>hwbinder</transport>\n"
1184 " <version>2.0</version>\n"
1185 " <interface>\n"
1186 " <name>INfc</name>\n"
1187 " <instance>default</instance>\n"
Yifan Hong79dcc1f2017-05-22 14:35:19 -07001188 " <instance>nfc_nci</instance>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001189 " </interface>\n"
1190 " </hal>\n"
1191 " <sepolicy>\n"
1192 " <version>25.5</version>\n"
1193 " </sepolicy>\n"
1194 "</manifest>\n";
1195
1196 std::string matrixXml =
1197 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1198 " <hal format=\"hidl\" optional=\"false\">\n"
1199 " <name>android.hardware.camera</name>\n"
1200 " <version>2.0-5</version>\n"
1201 " <version>3.4-16</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001202 " <interface>\n"
1203 " <name>IBetterCamera</name>\n"
1204 " <instance>camera</instance>\n"
1205 " </interface>\n"
1206 " <interface>\n"
1207 " <name>ICamera</name>\n"
1208 " <instance>default</instance>\n"
1209 " <instance>legacy/0</instance>\n"
1210 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001211 " </hal>\n"
1212 " <hal format=\"hidl\" optional=\"false\">\n"
1213 " <name>android.hardware.nfc</name>\n"
1214 " <version>1.0</version>\n"
1215 " <version>2.0</version>\n"
Yifan Hong08e984c2017-05-18 12:50:04 -07001216 " <interface>\n"
1217 " <name>INfc</name>\n"
1218 " <instance>nfc_nci</instance>\n"
1219 " </interface>\n"
Yifan Hongd0cbf1f2017-04-12 19:47:06 -07001220 " </hal>\n"
1221 " <hal format=\"hidl\" optional=\"true\">\n"
1222 " <name>android.hardware.foo</name>\n"
1223 " <version>1.0</version>\n"
1224 " </hal>\n"
1225 " <sepolicy>\n"
1226 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1227 " <sepolicy-version>25.5</sepolicy-version>\n"
1228 " <sepolicy-version>26.0-3</sepolicy-version>\n"
1229 " </sepolicy>\n"
1230 " <avb>\n"
1231 " <vbmeta-version>2.1</vbmeta-version>\n"
1232 " </avb>\n"
1233 "</compatibility-matrix>\n";
1234
1235 HalManifest manifest;
1236 CompatibilityMatrix matrix;
1237 std::string error;
1238 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1239 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1240 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1241
1242 // some smaller test cases
1243 matrixXml =
1244 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1245 " <hal format=\"hidl\" optional=\"false\">\n"
1246 " <name>android.hardware.camera</name>\n"
1247 " <version>3.4</version>\n"
1248 " </hal>\n"
1249 " <sepolicy>\n"
1250 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1251 " <sepolicy-version>25.5</sepolicy-version>\n"
1252 " </sepolicy>\n"
1253 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1254 "</compatibility-matrix>\n";
1255 matrix = {};
1256 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1257 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1258 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
1259 EXPECT_NE(camera, nullptr);
1260 camera->versionRanges[0] = {3, 5};
1261 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1262 camera->versionRanges[0] = {3, 6};
1263 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1264
1265 // reset it
1266 matrix = {};
1267 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1268 set(matrix, Sepolicy{30, {{26, 0}}});
1269 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1270 set(matrix, Sepolicy{30, {{25, 6}}});
1271 EXPECT_FALSE(manifest.checkCompatibility(matrix));
1272 set(matrix, Sepolicy{30, {{25, 4}}});
1273 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1274}
1275
Yifan Hongd4857902017-06-13 14:13:56 -07001276/////////////////// xmlfile tests
1277
1278TEST_F(LibVintfTest, HalManifestConverterXmlFile) {
1279 HalManifest vm = testDeviceManifestWithXmlFile();
Yifan Honga1fae892018-03-13 12:36:38 -07001280 std::string xml =
1281 gHalManifestConverter(vm, SerializeFlag::HALS_NO_FQNAME & SerializeFlag::SEPOLICY_ONLY &
1282 SerializeFlag::XMLFILES_ONLY);
Yifan Hongd4857902017-06-13 14:13:56 -07001283 EXPECT_EQ(xml,
1284 "<manifest version=\"1.0\" type=\"device\">\n"
1285 " <hal format=\"hidl\">\n"
1286 " <name>android.hardware.camera</name>\n"
1287 " <transport>hwbinder</transport>\n"
1288 " <version>2.0</version>\n"
1289 " <interface>\n"
1290 " <name>IBetterCamera</name>\n"
1291 " <instance>camera</instance>\n"
1292 " </interface>\n"
1293 " <interface>\n"
1294 " <name>ICamera</name>\n"
1295 " <instance>default</instance>\n"
1296 " <instance>legacy/0</instance>\n"
1297 " </interface>\n"
1298 " </hal>\n"
1299 " <hal format=\"hidl\">\n"
1300 " <name>android.hardware.nfc</name>\n"
1301 " <transport arch=\"32+64\">passthrough</transport>\n"
1302 " <version>1.0</version>\n"
1303 " <interface>\n"
1304 " <name>INfc</name>\n"
1305 " <instance>default</instance>\n"
1306 " </interface>\n"
1307 " </hal>\n"
1308 " <sepolicy>\n"
1309 " <version>25.0</version>\n"
1310 " </sepolicy>\n"
1311 " <xmlfile>\n"
1312 " <name>media_profile</name>\n"
1313 " <version>1.0</version>\n"
1314 " </xmlfile>\n"
1315 "</manifest>\n");
1316 HalManifest vm2;
1317 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
1318 EXPECT_EQ(vm, vm2);
1319}
1320
1321TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile) {
1322 CompatibilityMatrix cm;
1323 addXmlFile(cm, "media_profile", {1, 0});
Yifan Hong244970c2018-01-23 15:29:27 -08001324 std::string xml = gCompatibilityMatrixConverter(cm, SerializeFlag::XMLFILES_ONLY);
Yifan Hongd4857902017-06-13 14:13:56 -07001325 EXPECT_EQ(xml,
1326 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hongd4857902017-06-13 14:13:56 -07001327 " <xmlfile format=\"dtd\" optional=\"true\">\n"
1328 " <name>media_profile</name>\n"
1329 " <version>1.0</version>\n"
1330 " </xmlfile>\n"
1331 "</compatibility-matrix>\n");
1332 CompatibilityMatrix cm2;
1333 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
1334 EXPECT_EQ(cm, cm2);
1335}
1336
1337TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile2) {
1338 std::string xml =
1339 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1340 " <xmlfile format=\"dtd\" optional=\"false\">\n"
1341 " <name>media_profile</name>\n"
1342 " <version>1.0</version>\n"
1343 " </xmlfile>\n"
1344 "</compatibility-matrix>\n";
1345 CompatibilityMatrix cm;
1346 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml));
1347 EXPECT_EQ(
1348 "compatibility-matrix.xmlfile entry media_profile has to be optional for "
1349 "compatibility matrix version 1.0",
1350 gCompatibilityMatrixConverter.lastError());
1351}
1352
Yifan Hongbbfff302017-06-06 17:10:13 -07001353TEST_F(LibVintfTest, ManifestXmlFilePathDevice) {
1354 std::string manifestXml =
1355 "<manifest version=\"1.0\" type=\"device\">"
1356 " <xmlfile>"
1357 " <name>media_profile</name>"
1358 " <version>1.0</version>"
1359 " </xmlfile>"
1360 "</manifest>";
1361 HalManifest manifest;
1362 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1363 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1364 "/vendor/etc/media_profile_V1_0.xml");
1365}
1366
1367TEST_F(LibVintfTest, ManifestXmlFilePathFramework) {
1368 std::string manifestXml =
1369 "<manifest version=\"1.0\" type=\"framework\">"
1370 " <xmlfile>"
1371 " <name>media_profile</name>"
1372 " <version>1.0</version>"
1373 " </xmlfile>"
1374 "</manifest>";
1375 HalManifest manifest;
1376 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1377 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1378 "/system/etc/media_profile_V1_0.xml");
1379}
1380
1381TEST_F(LibVintfTest, ManifestXmlFilePathOverride) {
1382 std::string manifestXml =
1383 "<manifest version=\"1.0\" type=\"device\">"
1384 " <xmlfile>"
1385 " <name>media_profile</name>"
1386 " <version>1.0</version>"
1387 " <path>/vendor/etc/foo.xml</path>"
1388 " </xmlfile>"
1389 "</manifest>";
1390 HalManifest manifest;
1391 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1392 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "/vendor/etc/foo.xml");
1393}
1394
1395TEST_F(LibVintfTest, ManifestXmlFilePathMissing) {
1396 std::string manifestXml =
1397 "<manifest version=\"1.0\" type=\"device\">"
1398 " <xmlfile>"
1399 " <name>media_profile</name>"
1400 " <version>1.1</version>"
1401 " </xmlfile>"
1402 "</manifest>";
1403 HalManifest manifest;
1404 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
1405 EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "");
1406}
1407
1408TEST_F(LibVintfTest, MatrixXmlFilePathFramework) {
1409 std::string matrixXml =
1410 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1411 " <xmlfile format=\"dtd\" optional=\"true\">"
1412 " <name>media_profile</name>"
1413 " <version>2.0-1</version>"
1414 " </xmlfile>"
1415 "</compatibility-matrix>";
1416 CompatibilityMatrix matrix;
1417 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1418 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 1}),
1419 "/system/etc/media_profile_V2_1.dtd");
1420}
1421
1422TEST_F(LibVintfTest, MatrixXmlFilePathDevice) {
1423 std::string matrixXml =
1424 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1425 " <xmlfile format=\"xsd\" optional=\"true\">"
1426 " <name>media_profile</name>"
1427 " <version>2.0-1</version>"
1428 " </xmlfile>"
1429 "</compatibility-matrix>";
1430 CompatibilityMatrix matrix;
1431 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1432 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}),
1433 "/vendor/etc/media_profile_V2_1.xsd");
1434}
1435
1436TEST_F(LibVintfTest, MatrixXmlFilePathOverride) {
1437 std::string matrixXml =
1438 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1439 " <xmlfile format=\"xsd\" optional=\"true\">"
1440 " <name>media_profile</name>"
1441 " <version>2.0-1</version>"
1442 " <path>/system/etc/foo.xsd</path>"
1443 " </xmlfile>"
1444 "</compatibility-matrix>";
1445 CompatibilityMatrix matrix;
1446 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1447 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "/system/etc/foo.xsd");
1448}
1449
1450TEST_F(LibVintfTest, MatrixXmlFilePathMissing) {
1451 std::string matrixXml =
1452 "<compatibility-matrix version=\"1.0\" type=\"framework\">"
1453 " <xmlfile format=\"dtd\" optional=\"true\">"
1454 " <name>media_profile</name>"
1455 " <version>2.1</version>"
1456 " </xmlfile>"
1457 "</compatibility-matrix>";
1458 CompatibilityMatrix matrix;
1459 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1460 EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "");
1461}
1462
Yifan Hong02e94002017-07-10 15:41:56 -07001463std::pair<KernelConfigParser, status_t> processData(const std::string& data, bool processComments,
1464 bool relaxedFormat = false) {
1465 KernelConfigParser parser(processComments, relaxedFormat);
Yifan Hongd8cee082017-07-05 16:06:09 -07001466 const char* p = data.c_str();
1467 size_t n = 0;
1468 size_t chunkSize;
Yifan Hong6209d172017-07-07 16:18:19 -07001469 status_t status = OK;
Yifan Hongd8cee082017-07-05 16:06:09 -07001470 for (; n < data.size(); p += chunkSize, n += chunkSize) {
1471 chunkSize = std::min<size_t>(5, data.size() - n);
Yifan Hong6209d172017-07-07 16:18:19 -07001472 if ((status = parser.process(p, chunkSize)) != OK) {
1473 break;
1474 }
Yifan Hongd8cee082017-07-05 16:06:09 -07001475 }
Yifan Hong6209d172017-07-07 16:18:19 -07001476 return {std::move(parser), status};
Yifan Hongd8cee082017-07-05 16:06:09 -07001477}
1478
1479TEST_F(LibVintfTest, KernelConfigParser) {
1480 // usage in /proc/config.gz
1481 const std::string data =
1482 "# CONFIG_NOT_SET is not set\n"
1483 "CONFIG_ONE=1\n"
1484 "CONFIG_Y=y\n"
1485 "CONFIG_STR=\"string\"\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001486 auto pair = processData(data, false /* processComments */);
1487 ASSERT_EQ(OK, pair.second) << pair.first.error();
1488 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001489
1490 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1491 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1492 EXPECT_EQ(configs.find("CONFIG_STR")->second, "\"string\"");
1493 EXPECT_EQ(configs.find("CONFIG_NOT_SET"), configs.end());
1494}
1495
1496TEST_F(LibVintfTest, KernelConfigParser2) {
1497 // usage in android-base.cfg
1498 const std::string data =
1499 "# CONFIG_NOT_SET is not set\n"
1500 "CONFIG_ONE=1\n"
1501 "CONFIG_Y=y\n"
1502 "CONFIG_STR=string\n"
1503 "# ignore_thiscomment\n"
1504 "# CONFIG_NOT_SET2 is not set\n";
Yifan Hong6209d172017-07-07 16:18:19 -07001505 auto pair = processData(data, true /* processComments */);
1506 ASSERT_EQ(OK, pair.second) << pair.first.error();
1507 const auto& configs = pair.first.configs();
Yifan Hongd8cee082017-07-05 16:06:09 -07001508
1509 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1510 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1511 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1512 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1513 EXPECT_EQ(configs.find("CONFIG_NOT_SET2")->second, "n");
1514}
1515
Yifan Hongc1889722017-07-07 16:19:52 -07001516TEST_F(LibVintfTest, KernelConfigParserSpace) {
1517 // usage in android-base.cfg
1518 const std::string data =
1519 " # CONFIG_NOT_SET is not set \n"
1520 " CONFIG_ONE=1 # 'tis a one!\n"
1521 " CONFIG_TWO=2 #'tis a two! \n"
1522 " CONFIG_THREE=3#'tis a three! \n"
1523 " CONFIG_233=233#'tis a three! \n"
1524 "#yey! random comments\n"
1525 "CONFIG_Y=y \n"
1526 " CONFIG_YES=y#YES! \n"
1527 "CONFIG_STR=string\n"
1528 "CONFIG_HELLO=hello world! #still works\n"
1529 "CONFIG_WORLD=hello world! \n"
1530 "CONFIG_GOOD = good morning! #comments here\n"
1531 " CONFIG_MORNING = good morning! \n";
Yifan Hong02e94002017-07-10 15:41:56 -07001532 auto pair = processData(data, true /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07001533 ASSERT_EQ(OK, pair.second) << pair.first.error();
1534 const auto& configs = pair.first.configs();
1535
1536 EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1537 EXPECT_EQ(configs.find("CONFIG_TWO")->second, "2");
1538 EXPECT_EQ(configs.find("CONFIG_THREE")->second, "3");
1539 EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
1540 EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
1541 EXPECT_EQ(configs.find("CONFIG_HELLO")->second, "hello world!")
1542 << "Value should be \"hello world!\" without trailing spaces";
1543 EXPECT_EQ(configs.find("CONFIG_WORLD")->second, "hello world!")
1544 << "Value should be \"hello world!\" without trailing spaces";
1545 EXPECT_EQ(configs.find("CONFIG_GOOD")->second, "good morning!")
1546 << "Value should be \"good morning!\" without leading or trailing spaces";
1547 EXPECT_EQ(configs.find("CONFIG_MORNING")->second, "good morning!")
1548 << "Value should be \"good morning!\" without leading or trailing spaces";
1549 EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
1550}
1551
Yifan Hongd9e46432017-08-15 17:14:52 -07001552TEST_F(LibVintfTest, NetutilsWrapperMatrix) {
1553 std::string matrixXml;
1554 CompatibilityMatrix matrix;
1555
1556 matrixXml =
1557 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1558 " <hal format=\"native\" optional=\"false\">"
1559 " <name>netutils-wrapper</name>"
1560 " <version>1.0</version>"
1561 " </hal>"
1562 "</compatibility-matrix>";
1563 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
1564 << gCompatibilityMatrixConverter.lastError();
1565
1566// only host libvintf hardcodes netutils-wrapper version requirements
Yifan Hong6bce1a62018-01-31 13:30:04 -08001567#ifndef LIBVINTF_TARGET
Yifan Hongd9e46432017-08-15 17:14:52 -07001568
1569 matrixXml =
1570 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1571 " <hal format=\"native\" optional=\"false\">"
1572 " <name>netutils-wrapper</name>"
1573 " <version>1.0-1</version>"
1574 " </hal>"
1575 "</compatibility-matrix>";
1576 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1577 EXPECT_CONTAINS(
1578 gCompatibilityMatrixConverter.lastError(),
1579 "netutils-wrapper HAL must specify exactly one version x.0, but a range is provided. "
1580 "Perhaps you mean '1.0'?");
1581
1582 matrixXml =
1583 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1584 " <hal format=\"native\" optional=\"false\">"
1585 " <name>netutils-wrapper</name>"
1586 " <version>1.1</version>"
1587 " </hal>"
1588 "</compatibility-matrix>";
1589 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1590 EXPECT_CONTAINS(
1591 gCompatibilityMatrixConverter.lastError(),
1592 "netutils-wrapper HAL must specify exactly one version x.0, but minor version is not 0. "
1593 "Perhaps you mean '1.0'?");
1594
1595 matrixXml =
1596 "<compatibility-matrix version=\"1.0\" type=\"device\">"
1597 " <hal format=\"native\" optional=\"false\">"
1598 " <name>netutils-wrapper</name>"
1599 " <version>1.0</version>"
1600 " <version>2.0</version>"
1601 " </hal>"
1602 "</compatibility-matrix>";
1603 EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
1604 EXPECT_CONTAINS(
1605 gCompatibilityMatrixConverter.lastError(),
1606 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1607 "is specified.");
1608
Yifan Hong6bce1a62018-01-31 13:30:04 -08001609#endif // LIBVINTF_TARGET
Yifan Hongd9e46432017-08-15 17:14:52 -07001610}
1611
1612TEST_F(LibVintfTest, NetutilsWrapperManifest) {
1613 std::string manifestXml;
1614 HalManifest manifest;
1615
1616 manifestXml =
1617 "<manifest version=\"1.0\" type=\"framework\">"
1618 " <hal format=\"native\">"
1619 " <name>netutils-wrapper</name>"
1620 " <version>1.0</version>"
1621 " <version>2.0</version>"
1622 " </hal>"
1623 "</manifest>";
1624 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml)) << gHalManifestConverter.lastError();
1625
1626// only host libvintf hardcodes netutils-wrapper version requirements
Yifan Hong6bce1a62018-01-31 13:30:04 -08001627#ifndef LIBVINTF_TARGET
Yifan Hongd9e46432017-08-15 17:14:52 -07001628
1629 manifestXml =
1630 "<manifest version=\"1.0\" type=\"framework\">"
1631 " <hal format=\"native\">"
1632 " <name>netutils-wrapper</name>"
1633 " <version>1.1</version>"
1634 " </hal>"
1635 "</manifest>";
1636 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1637 EXPECT_CONTAINS(
1638 gCompatibilityMatrixConverter.lastError(),
1639 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1640 "is specified.");
1641
1642 manifestXml =
1643 "<manifest version=\"1.0\" type=\"framework\">"
1644 " <hal format=\"native\">"
1645 " <name>netutils-wrapper</name>"
1646 " <version>1.0</version>"
1647 " <version>2.1</version>"
1648 " </hal>"
1649 "</manifest>";
1650 EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
1651 EXPECT_CONTAINS(
1652 gCompatibilityMatrixConverter.lastError(),
1653 "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
1654 "is specified.");
1655
Yifan Hong6bce1a62018-01-31 13:30:04 -08001656#endif // LIBVINTF_TARGET
Yifan Hongd9e46432017-08-15 17:14:52 -07001657}
1658
Yifan Hong5f996502017-08-23 14:46:44 -07001659TEST_F(LibVintfTest, KernelConfigConditionTest) {
1660 std::string 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_ARM</key>\n"
1667 " <value type=\"tristate\">y</value>\n"
1668 " </config>\n"
1669 " </conditions>\n"
1670 " <config>\n"
1671 " <key>CONFIG_FOO</key>\n"
1672 " <value type=\"tristate\">y</value>\n"
1673 " </config>\n"
1674 " </kernel>\n"
1675 " <sepolicy>\n"
1676 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1677 " <sepolicy-version>25.0</sepolicy-version>\n"
1678 " </sepolicy>\n"
1679 " <avb>\n"
1680 " <vbmeta-version>2.1</vbmeta-version>\n"
1681 " </avb>\n"
1682 "</compatibility-matrix>\n";
1683
1684 CompatibilityMatrix cm;
1685 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1686 << gCompatibilityMatrixConverter.lastError();
1687 const auto& kernels = getKernels(cm);
1688 ASSERT_GE(kernels.size(), 2u);
1689 ASSERT_TRUE(kernels[0].conditions().empty());
1690 const auto& kernel = kernels[1];
1691 const auto& cond = kernel.conditions();
1692 ASSERT_FALSE(cond.empty());
1693 EXPECT_EQ("CONFIG_ARM", cond.begin()->first);
1694 EXPECT_EQ(KernelConfigTypedValue(Tristate::YES), cond.begin()->second);
1695 EXPECT_FALSE(kernel.configs().empty());
1696
1697 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
1698}
1699
1700TEST_F(LibVintfTest, KernelConfigConditionEmptyTest) {
1701 std::string xml =
1702 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1703 " <kernel version=\"4.4.0\"/>\n"
1704 " <kernel version=\"3.18.22\">\n"
1705 " <conditions>\n"
1706 " <config>\n"
1707 " <key>CONFIG_ARM</key>\n"
1708 " <value type=\"tristate\">y</value>\n"
1709 " </config>\n"
1710 " </conditions>\n"
1711 " </kernel>\n"
1712 "</compatibility-matrix>\n";
1713
1714 CompatibilityMatrix cm;
1715 EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml))
1716 << "Should not accept first kernel version with non-empty conditions";
1717 EXPECT_EQ(
1718 "First <kernel> for version 3.18 must have empty <conditions> "
1719 "for backwards compatibility.",
1720 gCompatibilityMatrixConverter.lastError());
1721}
1722
1723TEST_F(LibVintfTest, KernelConfigConditionMatch) {
1724 RuntimeInfo runtime = testRuntimeInfo();
1725 std::string error;
1726 std::string xml;
1727 CompatibilityMatrix cm;
1728
1729 xml =
1730 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1731 " <kernel version=\"3.18.22\"/>\n"
1732 " <kernel version=\"3.18.22\">\n"
1733 " <conditions>\n"
1734 " <config>\n"
1735 " <key>CONFIG_64BIT</key>\n"
1736 " <value type=\"tristate\">y</value>\n"
1737 " </config>\n"
1738 " </conditions>\n"
1739 " <config>\n"
1740 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1741 " <value type=\"int\">24</value>\n"
1742 " </config>\n"
1743 " </kernel>\n"
1744 " <sepolicy>\n"
1745 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1746 " </sepolicy>\n"
1747 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1748 "</compatibility-matrix>\n";
1749
1750 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1751 << gCompatibilityMatrixConverter.lastError();
1752 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1753
1754 xml =
1755 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1756 " <kernel version=\"3.18.22\"/>\n"
1757 " <kernel version=\"3.18.22\">\n"
1758 " <conditions>\n"
1759 " <config>\n"
1760 " <key>CONFIG_64BIT</key>\n"
1761 " <value type=\"tristate\">y</value>\n"
1762 " </config>\n"
1763 " </conditions>\n"
1764 " <config>\n"
1765 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1766 " <value type=\"int\">26</value>\n"
1767 " </config>\n"
1768 " </kernel>\n"
1769 " <sepolicy>\n"
1770 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1771 " </sepolicy>\n"
1772 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1773 "</compatibility-matrix>\n";
1774
1775 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1776 << gCompatibilityMatrixConverter.lastError();
1777 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1778 << "conditions met, so CONFIG_ARCH_MMAP_RND_BITS should not match";
1779
1780 xml =
1781 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1782 " <kernel version=\"3.18.22\"/>\n"
1783 " <kernel version=\"3.18.22\">\n"
1784 " <conditions>\n"
1785 " <config>\n"
1786 " <key>CONFIG_64BIT</key>\n"
1787 " <value type=\"tristate\">n</value>\n"
1788 " </config>\n"
1789 " </conditions>\n"
1790 " <config>\n"
1791 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1792 " <value type=\"int\">26</value>\n"
1793 " </config>\n"
1794 " </kernel>\n"
1795 " <sepolicy>\n"
1796 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1797 " </sepolicy>\n"
1798 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1799 "</compatibility-matrix>\n";
1800
1801 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1802 << gCompatibilityMatrixConverter.lastError();
1803 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1804 xml =
1805 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1806 " <kernel version=\"3.18.22\"/>\n"
1807 " <kernel version=\"3.18.22\">\n"
1808 " <conditions>\n"
1809 " <config>\n"
1810 " <key>CONFIG_64BIT</key>\n"
1811 " <value type=\"tristate\">y</value>\n"
1812 " </config>\n"
1813 " <config>\n"
1814 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1815 " <value type=\"int\">24</value>\n"
1816 " </config>\n"
1817 " </conditions>\n"
1818 " <config>\n"
1819 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1820 " <value type=\"int\">0xdead000000000000</value>\n"
1821 " </config>\n"
1822 " </kernel>\n"
1823 " <sepolicy>\n"
1824 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1825 " </sepolicy>\n"
1826 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1827 "</compatibility-matrix>\n";
1828
1829 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1830 << gCompatibilityMatrixConverter.lastError();
1831 EXPECT_TRUE(runtime.checkCompatibility(cm, &error));
1832
1833 xml =
1834 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1835 " <kernel version=\"3.18.22\"/>\n"
1836 " <kernel version=\"3.18.22\">\n"
1837 " <conditions>\n"
1838 " <config>\n"
1839 " <key>CONFIG_64BIT</key>\n"
1840 " <value type=\"tristate\">y</value>\n"
1841 " </config>\n"
1842 " <config>\n"
1843 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1844 " <value type=\"int\">24</value>\n"
1845 " </config>\n"
1846 " </conditions>\n"
1847 " <config>\n"
1848 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1849 " <value type=\"int\">0xbeaf000000000000</value>\n"
1850 " </config>\n"
1851 " </kernel>\n"
1852 " <sepolicy>\n"
1853 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1854 " </sepolicy>\n"
1855 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1856 "</compatibility-matrix>\n";
1857
1858 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1859 << gCompatibilityMatrixConverter.lastError();
1860 EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
1861 << "conditions have 'and' relationship, so CONFIG_ILLEGAL_POINTER_VALUE should not match";
1862
1863 xml =
1864 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1865 " <kernel version=\"3.18.22\"/>\n"
1866 " <kernel version=\"3.18.22\">\n"
1867 " <conditions>\n"
1868 " <config>\n"
1869 " <key>CONFIG_64BIT</key>\n"
1870 " <value type=\"tristate\">y</value>\n"
1871 " </config>\n"
1872 " <config>\n"
1873 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1874 " <value type=\"int\">26</value>\n"
1875 " </config>\n"
1876 " </conditions>\n"
1877 " <config>\n"
1878 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1879 " <value type=\"int\">0xbeaf000000000000</value>\n"
1880 " </config>\n"
1881 " </kernel>\n"
1882 " <sepolicy>\n"
1883 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1884 " </sepolicy>\n"
1885 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1886 "</compatibility-matrix>\n";
1887
1888 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1889 << gCompatibilityMatrixConverter.lastError();
1890 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1891
1892 xml =
1893 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1894 " <kernel version=\"3.18.22\">\n"
1895 " <config>\n"
1896 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1897 " <value type=\"string\"/>\n"
1898 " </config>\n"
1899 " </kernel>\n"
1900 " <kernel version=\"3.18.22\">\n"
1901 " <conditions>\n"
1902 " <config>\n"
1903 " <key>CONFIG_64BIT</key>\n"
1904 " <value type=\"tristate\">y</value>\n"
1905 " </config>\n"
1906 " </conditions>\n"
1907 " <config>\n"
1908 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1909 " <value type=\"int\">0xdead000000000000</value>\n"
1910 " </config>\n"
1911 " </kernel>\n"
1912 " <kernel version=\"3.18.22\">\n"
1913 " <conditions>\n"
1914 " <config>\n"
1915 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1916 " <value type=\"int\">24</value>\n"
1917 " </config>\n"
1918 " </conditions>\n"
1919 " <config>\n"
1920 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1921 " <value type=\"string\">binder,hwbinder</value>\n"
1922 " </config>\n"
1923 " </kernel>\n"
1924 " <sepolicy>\n"
1925 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1926 " </sepolicy>\n"
1927 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1928 "</compatibility-matrix>\n";
1929
1930 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1931 << gCompatibilityMatrixConverter.lastError();
1932 EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
1933
1934 xml =
1935 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1936 " <kernel version=\"3.18.22\">\n"
1937 " <config>\n"
1938 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1939 " <value type=\"string\"/>\n"
1940 " </config>\n"
1941 " </kernel>\n"
1942 " <kernel version=\"3.18.22\">\n"
1943 " <conditions>\n"
1944 " <config>\n"
1945 " <key>CONFIG_64BIT</key>\n"
1946 " <value type=\"tristate\">y</value>\n"
1947 " </config>\n"
1948 " </conditions>\n"
1949 " <config>\n"
1950 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1951 " <value type=\"int\">0xbeaf000000000000</value>\n"
1952 " </config>\n"
1953 " </kernel>\n"
1954 " <kernel version=\"3.18.22\">\n"
1955 " <conditions>\n"
1956 " <config>\n"
1957 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
1958 " <value type=\"int\">24</value>\n"
1959 " </config>\n"
1960 " </conditions>\n"
1961 " <config>\n"
1962 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
1963 " <value type=\"string\">binder,hwbinder</value>\n"
1964 " </config>\n"
1965 " </kernel>\n"
1966 " <sepolicy>\n"
1967 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1968 " </sepolicy>\n"
1969 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1970 "</compatibility-matrix>\n";
1971
1972 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
1973 << gCompatibilityMatrixConverter.lastError();
1974 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used.";
1975
1976 xml =
1977 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
1978 " <kernel version=\"3.18.22\">\n"
1979 " <config>\n"
1980 " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
1981 " <value type=\"string\"/>\n"
1982 " </config>\n"
1983 " </kernel>\n"
1984 " <kernel version=\"3.18.22\">\n"
1985 " <conditions>\n"
1986 " <config>\n"
1987 " <key>CONFIG_64BIT</key>\n"
1988 " <value type=\"tristate\">y</value>\n"
1989 " </config>\n"
1990 " </conditions>\n"
1991 " <config>\n"
1992 " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
1993 " <value type=\"int\">0xdead000000000000</value>\n"
1994 " </config>\n"
1995 " </kernel>\n"
1996 " <kernel version=\"3.18.22\">\n"
1997 " <conditions>\n"
1998 " <config>\n"
1999 " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
2000 " <value type=\"int\">24</value>\n"
2001 " </config>\n"
2002 " </conditions>\n"
2003 " <config>\n"
2004 " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
2005 " <value type=\"string\">binder</value>\n"
2006 " </config>\n"
2007 " </kernel>\n"
2008 " <sepolicy>\n"
2009 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2010 " </sepolicy>\n"
2011 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2012 "</compatibility-matrix>\n";
2013
2014 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2015 << gCompatibilityMatrixConverter.lastError();
2016 EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used";
2017}
2018
Yifan Hongc1889722017-07-07 16:19:52 -07002019// Run KernelConfigParserInvalidTest on processComments = {true, false}
2020class KernelConfigParserInvalidTest : public ::testing::TestWithParam<bool> {};
2021
2022TEST_P(KernelConfigParserInvalidTest, NonSet1) {
2023 const std::string data = "# CONFIG_NOT_EXIST is not sat\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002024 auto pair = processData(data, GetParam() /* processComments */, true /* relaxedFormat */);
Yifan Hongc1889722017-07-07 16:19:52 -07002025 ASSERT_EQ(OK, pair.second) << pair.first.error();
2026 const auto& configs = pair.first.configs();
2027 EXPECT_EQ(configs.find("CONFIG_NOT_EXIST"), configs.end())
2028 << "CONFIG_NOT_EXIST should not exist because of typo";
2029}
2030
2031TEST_P(KernelConfigParserInvalidTest, InvalidLine1) {
2032 const std::string data = "FOO_CONFIG=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002033 ASSERT_NE(OK,
2034 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07002035}
2036
2037TEST_P(KernelConfigParserInvalidTest, InvalidLine2) {
2038 const std::string data = "CONFIG_BAR-BAZ=foo\n";
Yifan Hong02e94002017-07-10 15:41:56 -07002039 ASSERT_NE(OK,
2040 processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
Yifan Hongc1889722017-07-07 16:19:52 -07002041}
2042
2043INSTANTIATE_TEST_CASE_P(KernelConfigParser, KernelConfigParserInvalidTest, ::testing::Bool());
2044
Yifan Hong2027a492017-12-11 15:21:19 -08002045TEST_F(LibVintfTest, MatrixLevel) {
2046 CompatibilityMatrix cm;
2047 std::string xml;
2048
2049 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\"/>";
2050 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2051 << gCompatibilityMatrixConverter.lastError();
2052 EXPECT_EQ(Level::UNSPECIFIED, cm.level());
2053
2054 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"legacy\"/>";
2055 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2056 << gCompatibilityMatrixConverter.lastError();
2057 EXPECT_EQ(Level::LEGACY, cm.level());
2058
2059 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
2060 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2061 << gCompatibilityMatrixConverter.lastError();
2062 EXPECT_EQ(1u, cm.level());
2063}
2064
2065TEST_F(LibVintfTest, ManifestLevel) {
2066 HalManifest manifest;
2067 std::string xml;
2068
2069 xml = "<manifest version=\"1.0\" type=\"device\"/>";
2070 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2071 EXPECT_EQ(Level::UNSPECIFIED, manifest.level());
2072
2073 xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"legacy\"/>";
2074 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2075 EXPECT_EQ(Level::LEGACY, manifest.level());
2076
2077 xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"1\"/>";
2078 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2079 EXPECT_EQ(1u, manifest.level());
2080}
2081
Yifan Hongdbe9db32017-12-11 19:06:11 -08002082TEST_F(LibVintfTest, AddOptionalHal) {
2083 CompatibilityMatrix cm1;
2084 CompatibilityMatrix cm2;
2085 std::string error;
2086 std::string xml;
2087
2088 xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
2089 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2090 << gCompatibilityMatrixConverter.lastError();
2091
2092 xml =
2093 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2094 " <hal format=\"hidl\" optional=\"false\">\n"
2095 " <name>android.hardware.foo</name>\n"
2096 " <version>1.0-1</version>\n"
2097 " <interface>\n"
2098 " <name>IFoo</name>\n"
2099 " <instance>default</instance>\n"
2100 " </interface>\n"
2101 " </hal>\n"
2102 "</compatibility-matrix>\n";
2103 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2104 << gCompatibilityMatrixConverter.lastError();
2105
2106 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2107 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2108 EXPECT_EQ(xml,
2109 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2110 " <hal format=\"hidl\" optional=\"true\">\n"
2111 " <name>android.hardware.foo</name>\n"
2112 " <version>1.0-1</version>\n"
2113 " <interface>\n"
2114 " <name>IFoo</name>\n"
2115 " <instance>default</instance>\n"
2116 " </interface>\n"
2117 " </hal>\n"
2118 "</compatibility-matrix>\n");
2119}
2120
2121TEST_F(LibVintfTest, AddOptionalHalMinorVersion) {
2122 CompatibilityMatrix cm1;
2123 CompatibilityMatrix cm2;
2124 std::string error;
2125 std::string xml;
2126
2127 xml =
2128 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2129 " <hal format=\"hidl\" optional=\"false\">\n"
2130 " <name>android.hardware.foo</name>\n"
2131 " <version>1.2-3</version>\n"
2132 " <interface>\n"
2133 " <name>IFoo</name>\n"
2134 " <instance>default</instance>\n"
2135 " </interface>\n"
2136 " </hal>\n"
2137 "</compatibility-matrix>\n";
2138 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2139 << gCompatibilityMatrixConverter.lastError();
2140
2141 xml =
2142 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2143 " <hal format=\"hidl\" optional=\"false\">\n"
2144 " <name>android.hardware.foo</name>\n"
2145 " <version>1.0-4</version>\n"
2146 " <interface>\n"
2147 " <name>IFoo</name>\n"
2148 " <instance>default</instance>\n"
2149 " </interface>\n"
2150 " </hal>\n"
2151 "</compatibility-matrix>\n";
2152 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2153 << gCompatibilityMatrixConverter.lastError();
2154
2155 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2156 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2157 EXPECT_EQ(xml,
2158 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2159 " <hal format=\"hidl\" optional=\"false\">\n"
2160 " <name>android.hardware.foo</name>\n"
2161 " <version>1.2-4</version>\n"
2162 " <interface>\n"
2163 " <name>IFoo</name>\n"
2164 " <instance>default</instance>\n"
2165 " </interface>\n"
2166 " </hal>\n"
2167 "</compatibility-matrix>\n");
2168}
2169
2170TEST_F(LibVintfTest, AddOptionalHalMajorVersion) {
2171 CompatibilityMatrix cm1;
2172 CompatibilityMatrix cm2;
2173 std::string error;
2174 std::string xml;
2175
2176 xml =
2177 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2178 " <hal format=\"hidl\" optional=\"false\">\n"
2179 " <name>android.hardware.foo</name>\n"
2180 " <version>1.2-3</version>\n"
2181 " <interface>\n"
2182 " <name>IFoo</name>\n"
2183 " <instance>default</instance>\n"
2184 " </interface>\n"
2185 " </hal>\n"
2186 "</compatibility-matrix>\n";
2187 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2188 << gCompatibilityMatrixConverter.lastError();
2189
2190 xml =
2191 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2192 " <hal format=\"hidl\" optional=\"false\">\n"
2193 " <name>android.hardware.foo</name>\n"
Yifan Hongd8eea9e2017-12-22 15:13:42 -08002194 " <version>1.2-3</version>\n"
Yifan Hongdbe9db32017-12-11 19:06:11 -08002195 " <version>2.0-4</version>\n"
2196 " <interface>\n"
2197 " <name>IFoo</name>\n"
2198 " <instance>default</instance>\n"
2199 " </interface>\n"
2200 " </hal>\n"
2201 "</compatibility-matrix>\n";
2202 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2203 << gCompatibilityMatrixConverter.lastError();
2204
2205 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2206 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2207 EXPECT_EQ(xml,
2208 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2209 " <hal format=\"hidl\" optional=\"false\">\n"
2210 " <name>android.hardware.foo</name>\n"
2211 " <version>1.2-3</version>\n"
Yifan Hong734cc8c2018-03-15 17:08:58 -07002212 " <version>2.0-4</version>\n"
2213 " <interface>\n"
2214 " <name>IFoo</name>\n"
2215 " <instance>default</instance>\n"
2216 " </interface>\n"
2217 " </hal>\n"
2218 "</compatibility-matrix>\n");
2219}
2220
2221TEST_F(LibVintfTest, AddOptionalHalMinorVersionDiffInstance) {
2222 CompatibilityMatrix cm1;
2223 CompatibilityMatrix cm2;
2224 std::string error;
2225 std::string xml;
2226
2227 xml =
2228 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2229 " <hal format=\"hidl\" optional=\"false\">\n"
2230 " <name>android.hardware.foo</name>\n"
2231 " <version>1.0-1</version>\n"
2232 " <interface>\n"
2233 " <name>IFoo</name>\n"
2234 " <instance>default</instance>\n"
2235 " </interface>\n"
2236 " </hal>\n"
2237 "</compatibility-matrix>\n";
2238 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2239 << gCompatibilityMatrixConverter.lastError();
2240
2241 xml =
2242 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2243 " <hal format=\"hidl\" optional=\"false\">\n"
2244 " <name>android.hardware.foo</name>\n"
2245 " <version>1.1-2</version>\n"
2246 " <interface>\n"
2247 " <name>IFoo</name>\n"
2248 " <instance>custom</instance>\n"
2249 " </interface>\n"
2250 " </hal>\n"
2251 "</compatibility-matrix>\n";
2252 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2253 << gCompatibilityMatrixConverter.lastError();
2254
2255 EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2256 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
2257 EXPECT_EQ(xml,
2258 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2259 " <hal format=\"hidl\" optional=\"false\">\n"
2260 " <name>android.hardware.foo</name>\n"
2261 " <version>1.0-1</version>\n"
Yifan Hongdbe9db32017-12-11 19:06:11 -08002262 " <interface>\n"
2263 " <name>IFoo</name>\n"
2264 " <instance>default</instance>\n"
2265 " </interface>\n"
2266 " </hal>\n"
2267 " <hal format=\"hidl\" optional=\"true\">\n"
2268 " <name>android.hardware.foo</name>\n"
Yifan Hong734cc8c2018-03-15 17:08:58 -07002269 " <version>1.1-2</version>\n"
Yifan Hongdbe9db32017-12-11 19:06:11 -08002270 " <interface>\n"
2271 " <name>IFoo</name>\n"
Yifan Hong734cc8c2018-03-15 17:08:58 -07002272 " <instance>custom</instance>\n"
Yifan Hongdbe9db32017-12-11 19:06:11 -08002273 " </interface>\n"
2274 " </hal>\n"
2275 "</compatibility-matrix>\n");
2276}
2277
Yifan Hongd4b92fe2017-12-20 15:29:03 -08002278TEST_F(LibVintfTest, AddOptionalXmlFile) {
2279 CompatibilityMatrix cm1;
2280 CompatibilityMatrix cm2;
2281 std::string error;
2282 std::string xml;
2283
2284 xml =
2285 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2286 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2287 " <name>foo</name>\n"
2288 " <version>1.0-2</version>\n"
2289 " <path>/foo/bar/baz.xsd</path>\n"
2290 " </xmlfile>\n"
2291 "</compatibility-matrix>\n";
2292 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
2293 << gCompatibilityMatrixConverter.lastError();
2294
2295 xml =
2296 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
2297 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2298 " <name>foo</name>\n"
2299 " <version>1.1-3</version>\n"
2300 " <path>/foo/bar/quux.xsd</path>\n"
2301 " </xmlfile>\n"
2302 "</compatibility-matrix>\n";
2303 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
2304 << gCompatibilityMatrixConverter.lastError();
2305
2306 EXPECT_TRUE(addAllXmlFilesAsOptional(&cm1, &cm2, &error)) << error;
2307 xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::XMLFILES_ONLY);
2308 EXPECT_EQ(xml,
2309 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
2310 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2311 " <name>foo</name>\n"
2312 " <version>1.0-2</version>\n"
2313 " <path>/foo/bar/baz.xsd</path>\n"
2314 " </xmlfile>\n"
2315 " <xmlfile format=\"xsd\" optional=\"true\">\n"
2316 " <name>foo</name>\n"
2317 " <version>1.1-3</version>\n"
2318 " <path>/foo/bar/quux.xsd</path>\n"
2319 " </xmlfile>\n"
2320 "</compatibility-matrix>\n");
2321}
2322
Yifan Hongfeb454e2018-01-09 16:16:40 -08002323TEST_F(LibVintfTest, VendorNdk) {
2324 CompatibilityMatrix cm;
2325 std::string error;
2326 std::string xml;
2327
2328 xml =
2329 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
2330 " <vendor-ndk>\n"
2331 " <version>P</version>\n"
2332 " <library>libbase.so</library>\n"
2333 " <library>libjpeg.so</library>\n"
2334 " </vendor-ndk>\n"
2335 "</compatibility-matrix>\n";
2336 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2337 << gCompatibilityMatrixConverter.lastError();
2338 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
2339
2340 {
2341 HalManifest manifest;
2342 xml =
2343 "<manifest version=\"1.0\" type=\"framework\">\n"
2344 " <vendor-ndk>\n"
2345 " <version>27</version>\n"
2346 " <library>libbase.so</library>\n"
2347 " <library>libjpeg.so</library>\n"
2348 " </vendor-ndk>\n"
2349 " <vendor-ndk>\n"
2350 " <version>P</version>\n"
2351 " <library>libbase.so</library>\n"
2352 " <library>libjpeg.so</library>\n"
2353 " <library>libtinyxml2.so</library>\n"
2354 " </vendor-ndk>\n"
2355 "</manifest>\n";
2356
2357 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2358 EXPECT_EQ(xml, gHalManifestConverter(manifest));
2359 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2360 }
2361
2362 {
2363 HalManifest manifest;
2364 xml =
2365 "<manifest version=\"1.0\" type=\"framework\">\n"
2366 " <vendor-ndk>\n"
2367 " <version>27</version>\n"
2368 " <library>libbase.so</library>\n"
2369 " <library>libjpeg.so</library>\n"
2370 " </vendor-ndk>\n"
2371 "</manifest>\n";
2372
2373 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2374 EXPECT_EQ(xml, gHalManifestConverter(manifest));
2375 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2376 EXPECT_IN("Vndk version P is not supported.", error);
2377 }
2378
2379 {
2380 HalManifest manifest;
2381 xml =
2382 "<manifest version=\"1.0\" type=\"framework\">\n"
2383 " <vendor-ndk>\n"
2384 " <version>P</version>\n"
2385 " <library>libbase.so</library>\n"
2386 " </vendor-ndk>\n"
2387 "</manifest>\n";
2388
2389 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2390 EXPECT_EQ(xml, gHalManifestConverter(manifest));
2391 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2392 EXPECT_IN("Vndk libs incompatible for version P.", error);
2393 EXPECT_IN("libjpeg.so", error);
2394 }
2395}
2396
2397TEST_F(LibVintfTest, MissingVendorNdkInMatrix) {
2398 CompatibilityMatrix cm;
2399 std::string xml;
2400 std::string error;
2401
2402 xml = "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n";
2403 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2404 << gCompatibilityMatrixConverter.lastError();
2405
2406 {
2407 HalManifest manifest;
2408 xml = "<manifest version=\"1.0\" type=\"framework\"/>\n";
2409 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2410
2411 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2412 }
2413
2414 {
2415 HalManifest manifest;
2416 xml =
2417 "<manifest version=\"1.0\" type=\"framework\">\n"
2418 " <vendor-ndk>\n"
2419 " <version>P</version>\n"
2420 " <library>libbase.so</library>\n"
2421 " </vendor-ndk>\n"
2422 "</manifest>\n";
2423 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2424
2425 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2426 }
2427}
2428
Yifan Hong0bfbc122018-02-02 13:27:29 -08002429TEST_F(LibVintfTest, DuplicatedVendorNdkVersion) {
2430 std::string error;
2431 HalManifest manifest;
2432 std::string xml =
2433 "<manifest version=\"1.0\" type=\"framework\">\n"
2434 " <vendor-ndk>\n"
2435 " <version>27</version>\n"
2436 " </vendor-ndk>\n"
2437 " <vendor-ndk>\n"
2438 " <version>27</version>\n"
2439 " </vendor-ndk>\n"
2440 "</manifest>\n";
2441
2442 EXPECT_FALSE(gHalManifestConverter(&manifest, xml));
2443 EXPECT_EQ("Duplicated manifest.vendor-ndk.version 27", gHalManifestConverter.lastError());
2444}
2445
Yifan Hong68d23062018-01-17 16:09:46 -08002446TEST_F(LibVintfTest, ManifestHalOverride) {
2447 HalManifest manifest;
2448 std::string xml =
2449 "<manifest version=\"1.0\" type=\"device\">\n"
2450 " <hal format=\"hidl\" override=\"true\">\n"
2451 " <name>android.hardware.foo</name>\n"
2452 " <transport>hwbinder</transport>\n"
2453 " <version>1.0</version>\n"
2454 " </hal>\n"
2455 " <hal format=\"hidl\">\n"
2456 " <name>android.hardware.bar</name>\n"
2457 " <transport>hwbinder</transport>\n"
2458 " <version>1.0</version>\n"
2459 " </hal>\n"
2460 "</manifest>\n";
2461 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
Yifan Hongad40a8e2018-03-05 17:45:34 -08002462 const auto& foo = manifest.getHals("android.hardware.foo");
2463 ASSERT_FALSE(foo.empty());
Yifan Hong038f07c2018-03-13 12:01:24 -07002464 EXPECT_TRUE(foo.front()->isOverride());
Yifan Hongad40a8e2018-03-05 17:45:34 -08002465 const auto& bar = manifest.getHals("android.hardware.bar");
2466 ASSERT_FALSE(bar.empty());
Yifan Hong038f07c2018-03-13 12:01:24 -07002467 EXPECT_FALSE(bar.front()->isOverride());
Yifan Hong68d23062018-01-17 16:09:46 -08002468}
2469
Yifan Hong84f67e92018-01-17 16:57:19 -08002470// Test functionality of override="true" tag
2471TEST_F(LibVintfTest, ManifestAddOverrideHalSimple) {
2472 HalManifest manifest;
2473 std::string xml = "<manifest version=\"1.0\" type=\"device\"/>\n";
2474 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2475
2476 HalManifest newManifest;
2477 xml =
2478 "<manifest version=\"1.0\" type=\"device\">\n"
2479 " <hal format=\"hidl\" override=\"true\">\n"
2480 " <name>android.hardware.foo</name>\n"
2481 " <transport>hwbinder</transport>\n"
2482 " <version>1.1</version>\n"
2483 " <interface>\n"
2484 " <name>IFoo</name>\n"
2485 " <instance>default</instance>\n"
2486 " </interface>\n"
2487 " </hal>\n"
2488 "</manifest>\n";
2489 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2490
2491 manifest.addAllHals(&newManifest);
Yifan Honga1fae892018-03-13 12:36:38 -07002492 EXPECT_EQ(xml, gHalManifestConverter(manifest, SerializeFlag::HALS_NO_FQNAME));
Yifan Hong84f67e92018-01-17 16:57:19 -08002493}
2494
2495TEST_F(LibVintfTest, ManifestAddOverrideHalSimpleOverride) {
2496 HalManifest manifest;
2497 std::string xml =
2498 "<manifest version=\"1.0\" type=\"device\">\n"
2499 " <hal format=\"hidl\">\n"
2500 " <name>android.hardware.foo</name>\n"
2501 " <transport>hwbinder</transport>\n"
2502 " <version>1.0</version>\n"
2503 " </hal>\n"
2504 "</manifest>\n";
2505 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2506
2507 HalManifest newManifest;
2508 xml =
2509 "<manifest version=\"1.0\" type=\"device\">\n"
2510 " <hal format=\"hidl\" override=\"true\">\n"
2511 " <name>android.hardware.foo</name>\n"
2512 " <transport>hwbinder</transport>\n"
2513 " <version>1.1</version>\n"
2514 " <interface>\n"
2515 " <name>IFoo</name>\n"
2516 " <instance>default</instance>\n"
2517 " </interface>\n"
2518 " </hal>\n"
2519 "</manifest>\n";
2520 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2521
2522 manifest.addAllHals(&newManifest);
Yifan Honga1fae892018-03-13 12:36:38 -07002523 EXPECT_EQ(xml, gHalManifestConverter(manifest, SerializeFlag::HALS_NO_FQNAME));
Yifan Hong84f67e92018-01-17 16:57:19 -08002524}
2525
2526// Existing major versions should be removed.
2527TEST_F(LibVintfTest, ManifestAddOverrideHalMultiVersion) {
2528 HalManifest manifest;
2529 std::string xml =
2530 "<manifest version=\"1.0\" type=\"device\">\n"
2531 " <hal format=\"hidl\">\n"
2532 " <name>android.hardware.foo</name>\n"
2533 " <transport>hwbinder</transport>\n"
2534 " <version>1.3</version>\n"
2535 " <version>2.4</version>\n"
2536 " <interface>\n"
2537 " <name>IFoo</name>\n"
2538 " <instance>slot1</instance>\n"
2539 " </interface>\n"
2540 " </hal>\n"
2541 " <hal format=\"hidl\">\n"
2542 " <name>android.hardware.bar</name>\n"
2543 " <transport>hwbinder</transport>\n"
2544 " <version>1.3</version>\n"
2545 " </hal>\n"
2546 "</manifest>\n";
2547 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2548
2549 HalManifest newManifest;
2550 xml =
2551 "<manifest version=\"1.0\" type=\"device\">\n"
2552 " <hal format=\"hidl\" override=\"true\">\n"
2553 " <name>android.hardware.foo</name>\n"
2554 " <transport>hwbinder</transport>\n"
2555 " <version>1.1</version>\n"
2556 " <version>3.1</version>\n"
2557 " <interface>\n"
2558 " <name>IFoo</name>\n"
2559 " <instance>slot2</instance>\n"
2560 " </interface>\n"
2561 " </hal>\n"
2562 "</manifest>\n";
2563 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2564
2565 manifest.addAllHals(&newManifest);
2566 EXPECT_EQ(
2567 "<manifest version=\"1.0\" type=\"device\">\n"
2568 " <hal format=\"hidl\">\n"
2569 " <name>android.hardware.bar</name>\n"
2570 " <transport>hwbinder</transport>\n"
2571 " <version>1.3</version>\n"
2572 " </hal>\n"
2573 " <hal format=\"hidl\">\n"
2574 " <name>android.hardware.foo</name>\n"
2575 " <transport>hwbinder</transport>\n"
2576 " <version>2.4</version>\n"
2577 " <interface>\n"
2578 " <name>IFoo</name>\n"
2579 " <instance>slot1</instance>\n"
2580 " </interface>\n"
2581 " </hal>\n"
2582 " <hal format=\"hidl\" override=\"true\">\n"
2583 " <name>android.hardware.foo</name>\n"
2584 " <transport>hwbinder</transport>\n"
2585 " <version>1.1</version>\n"
2586 " <version>3.1</version>\n"
2587 " <interface>\n"
2588 " <name>IFoo</name>\n"
2589 " <instance>slot2</instance>\n"
2590 " </interface>\n"
2591 " </hal>\n"
2592 "</manifest>\n",
Yifan Honga1fae892018-03-13 12:36:38 -07002593 gHalManifestConverter(manifest, SerializeFlag::HALS_NO_FQNAME));
Yifan Hong84f67e92018-01-17 16:57:19 -08002594}
2595
2596TEST_F(LibVintfTest, ManifestAddOverrideHalMultiVersion2) {
2597 HalManifest manifest;
2598 std::string xml =
2599 "<manifest version=\"1.0\" type=\"device\">\n"
2600 " <hal format=\"hidl\">\n"
2601 " <name>android.hardware.foo</name>\n"
2602 " <transport>hwbinder</transport>\n"
2603 " <version>1.3</version>\n"
2604 " <version>2.4</version>\n"
2605 " <interface>\n"
2606 " <name>IFoo</name>\n"
2607 " <instance>slot1</instance>\n"
2608 " </interface>\n"
2609 " </hal>\n"
2610 "</manifest>\n";
2611 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2612
2613 HalManifest newManifest;
2614 xml =
2615 "<manifest version=\"1.0\" type=\"device\">\n"
2616 " <hal format=\"hidl\" override=\"true\">\n"
2617 " <name>android.hardware.foo</name>\n"
2618 " <transport>hwbinder</transport>\n"
2619 " <version>1.1</version>\n"
2620 " <version>2.1</version>\n"
2621 " <interface>\n"
2622 " <name>IFoo</name>\n"
2623 " <instance>slot2</instance>\n"
2624 " </interface>\n"
2625 " </hal>\n"
2626 "</manifest>\n";
2627 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2628
2629 manifest.addAllHals(&newManifest);
Yifan Honga1fae892018-03-13 12:36:38 -07002630 EXPECT_EQ(xml, gHalManifestConverter(manifest, SerializeFlag::HALS_NO_FQNAME));
Yifan Hong84f67e92018-01-17 16:57:19 -08002631}
2632
2633// if no <versions>, remove all existing <hal> with given <name>.
2634TEST_F(LibVintfTest, ManifestAddOverrideHalRemoveAll) {
2635 HalManifest manifest;
2636 std::string xml =
2637 "<manifest version=\"1.0\" type=\"device\">\n"
2638 " <hal format=\"hidl\">\n"
2639 " <name>android.hardware.foo</name>\n"
2640 " <transport>hwbinder</transport>\n"
2641 " <version>1.3</version>\n"
2642 " <version>2.4</version>\n"
2643 " <interface>\n"
2644 " <name>IFoo</name>\n"
2645 " <instance>slot1</instance>\n"
2646 " </interface>\n"
2647 " </hal>\n"
2648 " <hal format=\"hidl\">\n"
2649 " <name>android.hardware.foo</name>\n"
2650 " <transport>hwbinder</transport>\n"
2651 " <version>3.1</version>\n"
2652 " <version>4.3</version>\n"
2653 " <interface>\n"
2654 " <name>IBar</name>\n"
2655 " <instance>slot2</instance>\n"
2656 " </interface>\n"
2657 " </hal>\n"
2658 " <hal format=\"hidl\">\n"
2659 " <name>android.hardware.bar</name>\n"
2660 " <transport>hwbinder</transport>\n"
2661 " <version>1.3</version>\n"
2662 " </hal>\n"
2663 "</manifest>\n";
2664 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2665
2666 HalManifest newManifest;
2667 xml =
2668 "<manifest version=\"1.0\" type=\"device\">\n"
2669 " <hal format=\"hidl\" override=\"true\">\n"
2670 " <name>android.hardware.foo</name>\n"
2671 " <transport>hwbinder</transport>\n"
2672 " </hal>\n"
2673 "</manifest>\n";
2674 EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
2675
2676 manifest.addAllHals(&newManifest);
2677 EXPECT_EQ(
2678 "<manifest version=\"1.0\" type=\"device\">\n"
2679 " <hal format=\"hidl\">\n"
2680 " <name>android.hardware.bar</name>\n"
2681 " <transport>hwbinder</transport>\n"
2682 " <version>1.3</version>\n"
2683 " </hal>\n"
2684 " <hal format=\"hidl\" override=\"true\">\n"
2685 " <name>android.hardware.foo</name>\n"
2686 " <transport>hwbinder</transport>\n"
2687 " </hal>\n"
2688 "</manifest>\n",
2689 gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
2690}
2691
Yifan Honga28729e2018-01-17 13:40:35 -08002692// Make sure missing tags in old VINTF files does not cause incompatibilities.
2693TEST_F(LibVintfTest, Empty) {
2694 CompatibilityMatrix cm;
2695 HalManifest manifest;
2696 std::string xml;
2697 std::string error;
2698
2699 xml = "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n";
2700 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2701 << gCompatibilityMatrixConverter.lastError();
2702
2703 xml = "<manifest version=\"1.0\" type=\"framework\"/>\n";
2704 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2705
2706 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2707}
2708
2709TEST_F(LibVintfTest, SystemSdk) {
2710 CompatibilityMatrix cm;
2711 std::string xml;
2712 std::string error;
2713
2714 xml =
2715 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
2716 " <system-sdk>\n"
2717 " <version>1</version>\n"
2718 " <version>P</version>\n"
2719 " </system-sdk>\n"
2720 "</compatibility-matrix>\n";
2721 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
2722 << gCompatibilityMatrixConverter.lastError();
2723 EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm, ~SerializeFlag::NO_SSDK));
2724
2725 {
2726 HalManifest manifest;
2727 xml =
2728 "<manifest version=\"1.0\" type=\"framework\">\n"
2729 " <system-sdk>\n"
2730 " <version>1</version>\n"
2731 " <version>P</version>\n"
2732 " </system-sdk>\n"
2733 "</manifest>\n";
2734 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2735 EXPECT_EQ(xml, gHalManifestConverter(manifest, ~SerializeFlag::NO_SSDK));
2736
2737 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2738 }
2739
2740 {
2741 HalManifest manifest;
2742 xml =
2743 "<manifest version=\"1.0\" type=\"framework\">\n"
2744 " <system-sdk>\n"
2745 " <version>1</version>\n"
2746 " <version>3</version>\n"
2747 " <version>P</version>\n"
2748 " </system-sdk>\n"
2749 "</manifest>\n";
2750 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2751 EXPECT_TRUE(manifest.checkCompatibility(cm, &error));
2752 }
2753
2754 {
2755 HalManifest manifest;
2756 xml =
2757 "<manifest version=\"1.0\" type=\"framework\">\n"
2758 " <system-sdk>\n"
2759 " <version>1</version>\n"
2760 " </system-sdk>\n"
2761 "</manifest>\n";
2762 EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
2763 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2764 EXPECT_TRUE(error.find("System SDK") != std::string::npos) << error;
2765 }
2766}
2767
Yifan Hong94757062018-02-09 16:36:31 -08002768TEST_F(LibVintfTest, ManifestLastError) {
2769 HalManifest e;
2770 // Set mLastError to something else before testing.
2771 EXPECT_FALSE(gHalManifestConverter(&e, "<manifest/>"));
2772 EXPECT_NE("Not a valid XML", gHalManifestConverter.lastError());
2773
2774 std::string error;
2775 std::string prevError = gHalManifestConverter.lastError();
2776 EXPECT_FALSE(gHalManifestConverter(&e, "", &error));
2777 EXPECT_EQ("Not a valid XML", error);
2778 EXPECT_EQ(prevError, gHalManifestConverter.lastError()) << "lastError() should not be modified";
2779}
2780
2781TEST_F(LibVintfTest, MatrixLastError) {
2782 CompatibilityMatrix e;
2783 // Set mLastError to something else before testing.
2784 EXPECT_FALSE(gCompatibilityMatrixConverter(&e, "<compatibility-matrix/>"));
2785 EXPECT_NE("Not a valid XML", gCompatibilityMatrixConverter.lastError());
2786
2787 std::string error;
2788 std::string prevError = gCompatibilityMatrixConverter.lastError();
2789 EXPECT_FALSE(gCompatibilityMatrixConverter(&e, "", &error));
2790 EXPECT_EQ("Not a valid XML", error);
2791 EXPECT_EQ(prevError, gCompatibilityMatrixConverter.lastError())
2792 << "lastError() should not be modified";
2793}
2794
Yifan Hongde3aec22018-02-12 15:39:47 -08002795TEST_F(LibVintfTest, MatrixDetailErrorMsg) {
2796 std::string error;
2797 std::string xml;
2798
2799 HalManifest manifest;
2800 xml =
Yifan Hong970bf042018-03-07 13:58:43 -08002801 "<manifest version=\"1.0\" type=\"device\" target-level=\"103\">\n"
Yifan Hongde3aec22018-02-12 15:39:47 -08002802 " <hal format=\"hidl\">\n"
2803 " <name>android.hardware.foo</name>\n"
2804 " <transport>hwbinder</transport>\n"
2805 " <version>1.0</version>\n"
2806 " <interface>\n"
2807 " <name>IFoo</name>\n"
2808 " <instance>default</instance>\n"
2809 " </interface>\n"
2810 " </hal>\n"
2811 "</manifest>\n";
2812 ASSERT_TRUE(gHalManifestConverter(&manifest, xml, &error)) << error;
2813
2814 {
2815 CompatibilityMatrix cm;
2816 xml =
Yifan Hong970bf042018-03-07 13:58:43 -08002817 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"100\">\n"
Yifan Hongde3aec22018-02-12 15:39:47 -08002818 " <hal format=\"hidl\" optional=\"false\">\n"
2819 " <name>android.hardware.foo</name>\n"
2820 " <version>1.2-3</version>\n"
2821 " <version>4.5</version>\n"
2822 " <interface>\n"
2823 " <name>IFoo</name>\n"
2824 " <instance>default</instance>\n"
2825 " <instance>slot1</instance>\n"
2826 " </interface>\n"
2827 " <interface>\n"
2828 " <name>IBar</name>\n"
2829 " <instance>default</instance>\n"
2830 " </interface>\n"
2831 " </hal>\n"
2832 "</compatibility-matrix>\n";
2833 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml, &error)) << error;
2834 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
Yifan Hong970bf042018-03-07 13:58:43 -08002835 EXPECT_IN("Manifest level = 103", error)
2836 EXPECT_IN("Matrix level = 100", error)
Yifan Hongde3aec22018-02-12 15:39:47 -08002837 EXPECT_IN(
2838 "android.hardware.foo:\n"
2839 " required: \n"
2840 " (@1.2-3::IBar/default AND @1.2-3::IFoo/default AND @1.2-3::IFoo/slot1) OR\n"
2841 " (@4.5::IBar/default AND @4.5::IFoo/default AND @4.5::IFoo/slot1)\n"
2842 " provided: @1.0::IFoo/default",
2843 error);
2844 }
2845
2846 {
2847 CompatibilityMatrix cm;
2848 xml =
2849 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
2850 " <hal format=\"hidl\" optional=\"false\">\n"
2851 " <name>android.hardware.foo</name>\n"
2852 " <version>1.2-3</version>\n"
2853 " <interface>\n"
2854 " <name>IFoo</name>\n"
2855 " <instance>default</instance>\n"
2856 " <instance>slot1</instance>\n"
2857 " </interface>\n"
2858 " </hal>\n"
2859 "</compatibility-matrix>\n";
2860 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml, &error)) << error;
2861 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2862 EXPECT_IN(
2863 "android.hardware.foo:\n"
2864 " required: (@1.2-3::IFoo/default AND @1.2-3::IFoo/slot1)\n"
2865 " provided: @1.0::IFoo/default",
2866 error);
2867 }
2868
2869 // the most frequent use case.
2870 {
2871 CompatibilityMatrix cm;
2872 xml =
2873 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
2874 " <hal format=\"hidl\" optional=\"false\">\n"
2875 " <name>android.hardware.foo</name>\n"
2876 " <version>1.2-3</version>\n"
2877 " <interface>\n"
2878 " <name>IFoo</name>\n"
2879 " <instance>default</instance>\n"
2880 " </interface>\n"
2881 " </hal>\n"
2882 "</compatibility-matrix>\n";
2883 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml, &error)) << error;
2884 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
2885 EXPECT_IN(
2886 "android.hardware.foo:\n"
2887 " required: @1.2-3::IFoo/default\n"
2888 " provided: @1.0::IFoo/default",
2889 error);
2890 }
2891}
2892
Yifan Hongff6a7672018-03-14 12:34:48 -07002893TEST_F(LibVintfTest, DisabledHal) {
2894 std::string error;
2895 std::string xml;
2896 HalManifest manifest;
2897 xml =
2898 "<manifest version=\"1.0\" type=\"framework\">\n"
2899 " <hal format=\"hidl\" override=\"true\">\n"
Yifan Honga1fae892018-03-13 12:36:38 -07002900 " <transport>hwbinder</transport>\n"
Yifan Hongff6a7672018-03-14 12:34:48 -07002901 " <name>android.hardware.foo</name>\n"
2902 " <transport>hwbinder</transport>\n"
2903 " </hal>\n"
2904 " <hal format=\"hidl\" override=\"true\">\n"
2905 " <name>android.hardware.bar</name>\n"
2906 " <transport>hwbinder</transport>\n"
2907 " <fqname>@1.1::IFoo/custom</fqname>\n"
2908 " </hal>\n"
2909 " <hal format=\"hidl\">\n"
2910 " <name>android.hardware.baz</name>\n"
2911 " <transport>hwbinder</transport>\n"
2912 " </hal>\n"
2913 "</manifest>\n";
2914 ASSERT_TRUE(gHalManifestConverter(&manifest, xml, &error)) << error;
2915
2916 auto foo = manifest.getHals("android.hardware.foo");
2917 ASSERT_EQ(1u, foo.size());
2918 EXPECT_TRUE(foo.front()->isDisabledHal());
2919 auto bar = manifest.getHals("android.hardware.bar");
2920 ASSERT_EQ(1u, bar.size());
2921 EXPECT_FALSE(bar.front()->isDisabledHal());
2922 auto baz = manifest.getHals("android.hardware.baz");
2923 ASSERT_EQ(1u, baz.size());
2924 EXPECT_FALSE(baz.front()->isDisabledHal());
2925}
2926
Yifan Honga1fae892018-03-13 12:36:38 -07002927TEST_F(LibVintfTest, FqNameValid) {
2928 std::string error;
2929 std::string xml;
2930
2931 CompatibilityMatrix cm;
2932 xml =
2933 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
2934 " <hal format=\"hidl\" optional=\"false\">\n"
2935 " <name>android.hardware.foo</name>\n"
2936 " <version>1.0</version>\n"
2937 " <interface>\n"
2938 " <name>IFoo</name>\n"
2939 " <instance>default</instance>\n"
2940 " </interface>\n"
2941 " </hal>\n"
2942 " <hal format=\"hidl\" optional=\"false\">\n"
2943 " <name>android.hardware.foo</name>\n"
2944 " <version>1.1</version>\n"
2945 " <interface>\n"
2946 " <name>IFoo</name>\n"
2947 " <instance>custom</instance>\n"
2948 " </interface>\n"
2949 " </hal>\n"
2950 "</compatibility-matrix>\n";
2951 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml, &error)) << error;
2952
2953 {
2954 HalManifest manifest;
2955 xml =
2956 "<manifest version=\"1.0\" type=\"framework\">\n"
2957 " <hal format=\"hidl\">\n"
2958 " <name>android.hardware.foo</name>\n"
2959 " <transport>hwbinder</transport>\n"
2960 " <version>1.0</version>\n"
2961 " <interface>\n"
2962 " <name>IFoo</name>\n"
2963 " <instance>default</instance>\n"
2964 " <instance>custom</instance>\n"
2965 " </interface>\n"
2966 " <fqname>@1.1::IFoo/custom</fqname>\n"
2967 " </hal>\n"
2968 "</manifest>\n";
2969 ASSERT_TRUE(gHalManifestConverter(&manifest, xml, &error)) << error;
2970 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2971 }
2972
2973 {
2974 HalManifest manifest;
2975 xml =
2976 "<manifest version=\"1.0\" type=\"framework\">\n"
2977 " <hal format=\"hidl\">\n"
2978 " <name>android.hardware.foo</name>\n"
2979 " <transport>hwbinder</transport>\n"
2980 " <fqname>@1.0::IFoo/default</fqname>\n"
2981 " <fqname>@1.1::IFoo/custom</fqname>\n"
2982 " </hal>\n"
2983 "</manifest>\n";
2984 ASSERT_TRUE(gHalManifestConverter(&manifest, xml, &error)) << error;
2985 EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
2986 }
2987
2988 {
2989 HalManifest manifest;
2990 xml =
2991 "<manifest version=\"1.0\" type=\"framework\">\n"
2992 " <hal format=\"hidl\">\n"
2993 " <name>android.hardware.foo</name>\n"
2994 " <transport>hwbinder</transport>\n"
2995 " <version>1.0</version>\n"
2996 " <interface>\n"
2997 " <name>IFoo</name>\n"
2998 " <instance>default</instance>\n"
2999 " <instance>custom</instance>\n"
3000 " </interface>\n"
3001 " </hal>\n"
3002 "</manifest>\n";
3003 ASSERT_TRUE(gHalManifestConverter(&manifest, xml, &error)) << error;
3004 EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
3005 EXPECT_IN(
3006 "android.hardware.foo:\n"
3007 " required: @1.1::IFoo/custom\n"
3008 " provided: \n"
3009 " @1.0::IFoo/custom\n"
3010 " @1.0::IFoo/default",
3011 error);
3012 }
3013
3014 {
3015 HalManifest manifest;
3016 xml =
3017 "<manifest version=\"1.0\" type=\"framework\">\n"
3018 " <hal format=\"hidl\">\n"
3019 " <name>android.hardware.foo</name>\n"
3020 " <transport>hwbinder</transport>\n"
3021 " <fqname>@1.0::IFoo/default</fqname>\n"
3022 " <fqname>@1.0::IFoo/custom</fqname>\n"
3023 " </hal>\n"
3024 "</manifest>\n";
3025 ASSERT_TRUE(gHalManifestConverter(&manifest, xml, &error)) << error;
3026 EXPECT_IN(
3027 "android.hardware.foo:\n"
3028 " required: @1.1::IFoo/custom\n"
3029 " provided: \n"
3030 " @1.0::IFoo/custom\n"
3031 " @1.0::IFoo/default",
3032 error);
3033 }
3034}
3035
3036TEST_F(LibVintfTest, FqNameInvalid) {
3037 std::string error;
3038 std::string xml;
3039 ManifestHal hal;
3040 xml =
3041 "<hal format=\"hidl\">\n"
3042 " <name>android.hardware.foo</name>\n"
3043 " <transport>hwbinder</transport>\n"
3044 " <fqname>@1.1::IFoo/custom</fqname>\n"
3045 "</hal>\n";
3046 EXPECT_TRUE(gManifestHalConverter(&hal, xml, &error)) << error;
3047 xml =
3048 "<hal format=\"hidl\">\n"
3049 " <name>android.hardware.foo</name>\n"
3050 " <transport>hwbinder</transport>\n"
3051 " <fqname>1.1::IFoo/custom</fqname>\n"
3052 "</hal>\n";
3053 ASSERT_FALSE(gManifestHalConverter(&hal, xml, &error));
3054 EXPECT_IN("Could not parse text \"1.1::IFoo/custom\" in element <fqname>", error);
3055 xml =
3056 "<hal format=\"hidl\">\n"
3057 " <name>android.hardware.foo</name>\n"
3058 " <transport>hwbinder</transport>\n"
3059 " <fqname>android.hardware.foo@1.1::IFoo/custom</fqname>\n"
3060 "</hal>\n";
3061 ASSERT_FALSE(gManifestHalConverter(&hal, xml, &error));
3062 EXPECT_IN("Should not specify package", error);
3063 xml =
3064 "<hal format=\"hidl\">\n"
3065 " <name>android.hardware.foo</name>\n"
3066 " <transport>hwbinder</transport>\n"
3067 " <fqname>IFoo/custom</fqname>\n"
3068 "</hal>\n";
3069 ASSERT_FALSE(gManifestHalConverter(&hal, xml, &error));
3070 EXPECT_IN("Should specify version", error);
3071 xml =
3072 "<hal format=\"hidl\">\n"
3073 " <name>android.hardware.foo</name>\n"
3074 " <transport>hwbinder</transport>\n"
3075 " <fqname>@1.0::IFoo</fqname>\n"
3076 "</hal>\n";
3077 ASSERT_FALSE(gManifestHalConverter(&hal, xml, &error));
3078 EXPECT_IN("Should specify instance", error);
3079 xml =
3080 "<hal format=\"hidl\">\n"
3081 " <name>n07 4 v4l1d 1n73rf4c3</name>\n"
3082 " <transport>hwbinder</transport>\n"
3083 " <fqname>@1.0::IFoo/custom</fqname>\n"
3084 "</hal>\n";
3085 ASSERT_FALSE(gManifestHalConverter(&hal, xml, &error));
3086 EXPECT_IN("Cannot create FqInstance", error);
3087 EXPECT_IN("n07 4 v4l1d 1n73rf4c3", error);
3088}
3089
Yifan Honga9993572017-01-24 19:33:15 -08003090} // namespace vintf
3091} // namespace android
3092
Yifan Hong676447a2016-11-15 12:57:23 -08003093int main(int argc, char **argv) {
3094 ::testing::InitGoogleTest(&argc, argv);
3095 return RUN_ALL_TESTS();
3096}