blob: da93b94b18636112b093f7761ced4f17a6c162d6 [file] [log] [blame]
Yifan Hong676447a2016-11-15 12:57:23 -08001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "LibHidlTest"
18
Yifan Hong398f4c72017-04-13 20:18:01 -070019#include <functional>
20
Yifan Hong676447a2016-11-15 12:57:23 -080021#include <vintf/parse_string.h>
22#include <vintf/parse_xml.h>
23#include <vintf/CompatibilityMatrix.h>
Yifan Hong398f4c72017-04-13 20:18:01 -070024#include <vintf/VintfObject.h>
Yifan Hong676447a2016-11-15 12:57:23 -080025
26#include <android-base/logging.h>
Yifan Hong3f5489a2017-02-08 11:14:21 -080027#include <android-base/parseint.h>
Yifan Hong676447a2016-11-15 12:57:23 -080028#include <gtest/gtest.h>
29
Yifan Honga9993572017-01-24 19:33:15 -080030namespace android {
31namespace vintf {
Yifan Hong676447a2016-11-15 12:57:23 -080032
Yifan Hong4a5eb7b2017-02-16 18:19:26 -080033extern const XmlConverter<Version> &gVersionConverter;
Yifan Hong037f12a2017-03-06 19:11:48 -080034extern const XmlConverter<ManifestHal> &gManifestHalConverter;
Yifan Hong4a5eb7b2017-02-16 18:19:26 -080035extern const XmlConverter<MatrixHal> &gMatrixHalConverter;
36extern const XmlConverter<KernelConfigTypedValue> &gKernelConfigTypedValueConverter;
Yifan Hongd2b7e642017-02-17 10:15:32 -080037extern const XmlConverter<HalManifest> &gHalManifestConverter;
Yifan Hong4a5eb7b2017-02-16 18:19:26 -080038extern const XmlConverter<CompatibilityMatrix> &gCompatibilityMatrixConverter;
39
Yifan Honga9993572017-01-24 19:33:15 -080040struct LibVintfTest : public ::testing::Test {
Yifan Hong676447a2016-11-15 12:57:23 -080041public:
42 virtual void SetUp() override {
43 }
44 virtual void TearDown() override {
45 }
Yifan Honga9993572017-01-24 19:33:15 -080046 bool add(CompatibilityMatrix &cm, MatrixHal &&hal) {
47 return cm.add(std::move(hal));
48 }
49 bool add(CompatibilityMatrix &cm, MatrixKernel &&kernel) {
50 return cm.add(std::move(kernel));
51 }
Yifan Hongd2b7e642017-02-17 10:15:32 -080052 bool add(HalManifest &vm, ManifestHal &&hal) {
Yifan Honga9993572017-01-24 19:33:15 -080053 return vm.add(std::move(hal));
54 }
Yifan Hong558380a2017-02-09 15:37:32 -080055 void set(CompatibilityMatrix &cm, Sepolicy &&sepolicy) {
Yifan Hong7c7d7062017-04-04 16:26:51 -070056 cm.framework.mSepolicy = sepolicy;
Yifan Hong558380a2017-02-09 15:37:32 -080057 }
Yifan Hong03d2d4a2017-04-12 17:34:14 -070058 void set(CompatibilityMatrix &cm, SchemaType type) {
59 cm.mType = type;
60 }
61 void set(CompatibilityMatrix &cm, VndkVersionRange &&range, std::set<std::string> &&libs) {
62 cm.device.mVndk.mVersionRange = range;
63 cm.device.mVndk.mLibraries = libs;
64 }
Yifan Hongf3029302017-04-12 17:23:49 -070065 void setAvb(RuntimeInfo &ki, Version initVersion, Version bootVersion) {
66 ki.mAvbInitVersion = initVersion;
67 ki.mAvbBootVersion = bootVersion;
68 }
69 void setAvb(CompatibilityMatrix &cm, Version &&avbVersion) {
70 cm.framework.mAvbMetaVersion = avbVersion;
71 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070072 const ManifestHal *getAnyHal(HalManifest &vm, const std::string &name) {
73 return vm.getAnyHal(name);
Yifan Honga9993572017-01-24 19:33:15 -080074 }
Yifan Hongd0cbf1f2017-04-12 19:47:06 -070075 MatrixHal *getAnyHal(CompatibilityMatrix &cm, const std::string &name) {
76 return cm.getAnyHal(name);
77 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070078 ConstMultiMapValueIterable<std::string, ManifestHal> getHals(HalManifest &vm) {
Yifan Honga9993572017-01-24 19:33:15 -080079 return vm.getHals();
80 }
Yifan Hong5a06ef72017-01-24 19:54:24 -080081 bool isValid(const ManifestHal &mh) {
82 return mh.isValid();
83 }
Yifan Honga04e1472017-04-05 13:15:34 -070084 HalManifest testDeviceManifest() {
Yifan Hongd2b7e642017-02-17 10:15:32 -080085 HalManifest vm;
Yifan Hong7c7d7062017-04-04 16:26:51 -070086 vm.mType = SchemaType::DEVICE;
Yifan Hong2a3dd082017-04-04 17:15:35 -070087 vm.device.mSepolicyVersion = {25, 0};
Yifan Hong2059ffc2017-02-24 11:32:02 -080088 vm.add(ManifestHal{
89 .format = HalFormat::HIDL,
90 .name = "android.hardware.camera",
91 .versions = {Version(2, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -080092 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
Yifan Hongec3b9b72017-02-23 13:24:42 -080093 .interfaces = {
94 {"ICamera", {"ICamera", {"legacy/0", "default"}}},
95 {"IBetterCamera", {"IBetterCamera", {"camera"}}}
96 }
Yifan Hong2059ffc2017-02-24 11:32:02 -080097 });
98 vm.add(ManifestHal{
99 .format = HalFormat::HIDL,
100 .name = "android.hardware.nfc",
101 .versions = {Version(1, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800102 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800103 .interfaces = {
104 {"INfc", {"INfc", {"default"}}}
105 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800106 });
Yifan Honga9993572017-01-24 19:33:15 -0800107
108 return vm;
109 }
Yifan Honga04e1472017-04-05 13:15:34 -0700110 HalManifest testFrameworkManfiest() {
111 HalManifest vm;
112 vm.mType = SchemaType::FRAMEWORK;
113 vm.add(ManifestHal{
114 .format = HalFormat::HIDL,
115 .name = "android.hidl.manager",
116 .versions = {Version(1, 0)},
117 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
118 .interfaces = {
119 {"IServiceManager", {"IServiceManager", {"default"}}},
120 }
121 });
122 Vndk vndk2505;
123 vndk2505.mVersionRange = {25, 0, 5};
124 vndk2505.mLibraries = { "libjpeg.so", "libbase.so" };
125 Vndk vndk2513;
126 vndk2513.mVersionRange = {25, 1, 3};
127 vndk2513.mLibraries = { "libjpeg.so", "libbase.so", "libtinyxml2.so" };
128 vm.framework.mVndks = { std::move(vndk2505), std::move(vndk2513) };
129
130 return vm;
131 }
Yifan Honga7201e72017-02-17 10:09:59 -0800132 RuntimeInfo testRuntimeInfo() {
133 RuntimeInfo info;
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800134 info.mOsName = "Linux";
135 info.mNodeName = "localhost";
136 info.mOsRelease = "3.18.31-g936f9a479d0f";
137 info.mKernelVersion = {3, 18, 31};
138 info.mOsVersion = "#4 SMP PREEMPT Wed Feb 1 18:10:52 PST 2017";
139 info.mHardwareId = "aarch64";
140 info.mKernelSepolicyVersion = 30;
Yifan Hongf1af7522017-02-16 18:00:55 -0800141 info.mKernelConfigs = {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800142 {"CONFIG_64BIT", "y"},
143 {"CONFIG_ANDROID_BINDER_DEVICES", "\"binder,hwbinder\""},
144 {"CONFIG_ARCH_MMAP_RND_BITS", "24"},
145 {"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", "\"\""},
146 {"CONFIG_ILLEGAL_POINTER_VALUE", "0xdead000000000000"}
147 };
Yifan Hongf3029302017-04-12 17:23:49 -0700148 info.mAvbBootVersion = info.mAvbInitVersion = {2, 1};
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800149 return info;
150 }
Yifan Hong676447a2016-11-15 12:57:23 -0800151};
152
Yifan Hongef6d4d32017-01-23 14:12:28 -0800153
154TEST_F(LibVintfTest, Stringify) {
Yifan Honga04e1472017-04-05 13:15:34 -0700155 HalManifest vm = testDeviceManifest();
Yifan Hong974ad9c2017-04-04 15:37:39 -0700156 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/2.0:"
157 "hidl/android.hardware.nfc/passthrough32+64/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -0800158
159 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
160 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
161
162 VersionRange v(1, 2, 3);
163 EXPECT_EQ(to_string(v), "1.2-3");
164 VersionRange v2;
165 EXPECT_TRUE(parse("1.2-3", &v2));
166 EXPECT_EQ(v, v2);
167}
168
Yifan Hong9bbdb282017-04-12 21:53:59 -0700169TEST_F(LibVintfTest, GetTransport) {
170 HalManifest vm = testDeviceManifest();
171 EXPECT_EQ(Transport::HWBINDER, vm.getTransport("android.hardware.camera",
172 {2, 0}, "ICamera", "default"));
173}
174
Yifan Hongd2b7e642017-02-17 10:15:32 -0800175TEST_F(LibVintfTest, HalManifestConverter) {
Yifan Honga04e1472017-04-05 13:15:34 -0700176 HalManifest vm = testDeviceManifest();
Yifan Hongd2b7e642017-02-17 10:15:32 -0800177 std::string xml = gHalManifestConverter(vm);
Yifan Hong676447a2016-11-15 12:57:23 -0800178 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700179 "<manifest version=\"1.0\" type=\"device\">\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800180 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800181 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800182 " <transport>hwbinder</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800183 " <version>2.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800184 " <interface>\n"
185 " <name>IBetterCamera</name>\n"
186 " <instance>camera</instance>\n"
187 " </interface>\n"
188 " <interface>\n"
189 " <name>ICamera</name>\n"
190 " <instance>default</instance>\n"
191 " <instance>legacy/0</instance>\n"
192 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800193 " </hal>\n"
194 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800195 " <name>android.hardware.nfc</name>\n"
Yifan Hongc54d32c2017-03-07 19:12:26 -0800196 " <transport arch=\"32+64\">passthrough</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800197 " <version>1.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800198 " <interface>\n"
199 " <name>INfc</name>\n"
200 " <instance>default</instance>\n"
201 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800202 " </hal>\n"
Yifan Hong2a3dd082017-04-04 17:15:35 -0700203 " <sepolicy>\n"
204 " <version>25.0</version>\n"
205 " </sepolicy>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800206 "</manifest>\n");
Yifan Hongfb7469c2017-04-05 19:15:21 -0700207 HalManifest vm2;
208 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
209 EXPECT_EQ(vm, vm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800210}
211
Yifan Honga04e1472017-04-05 13:15:34 -0700212TEST_F(LibVintfTest, HalManifestConverterFramework) {
213 HalManifest vm = testFrameworkManfiest();
214 std::string xml = gHalManifestConverter(vm);
215 EXPECT_EQ(xml,
216 "<manifest version=\"1.0\" type=\"framework\">\n"
217 " <hal format=\"hidl\">\n"
218 " <name>android.hidl.manager</name>\n"
219 " <transport>hwbinder</transport>\n"
220 " <version>1.0</version>\n"
221 " <interface>\n"
222 " <name>IServiceManager</name>\n"
223 " <instance>default</instance>\n"
224 " </interface>\n"
225 " </hal>\n"
226 " <vndk>\n"
227 " <version>25.0.5</version>\n"
228 " <library>libbase.so</library>\n"
229 " <library>libjpeg.so</library>\n"
230 " </vndk>\n"
231 " <vndk>\n"
232 " <version>25.1.3</version>\n"
233 " <library>libbase.so</library>\n"
234 " <library>libjpeg.so</library>\n"
235 " <library>libtinyxml2.so</library>\n"
236 " </vndk>\n"
237 "</manifest>\n");
238 HalManifest vm2;
239 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700240 EXPECT_EQ(vm, vm2);
Yifan Honga04e1472017-04-05 13:15:34 -0700241}
242
Yifan Hong8e9c6692017-02-28 14:07:42 -0800243TEST_F(LibVintfTest, HalManifestOptional) {
244 HalManifest vm;
245 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700246 "<manifest version=\"1.0\" type=\"device\"></manifest>"));
Yifan Hong8e9c6692017-02-28 14:07:42 -0800247 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700248 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800249 " <hal>"
250 " <name>android.hidl.manager</name>"
251 " <transport>hwbinder</transport>"
252 " <version>1.0</version>"
253 " </hal>"
254 "</manifest>"));
255 EXPECT_FALSE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700256 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800257 " <hal>"
258 " <name>android.hidl.manager</name>"
259 " <version>1.0</version>"
260 " </hal>"
261 "</manifest>"));
262}
263
Yifan Hongec3b9b72017-02-23 13:24:42 -0800264TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700265 HalManifest vm = testDeviceManifest();
Yifan Hongec3b9b72017-02-23 13:24:42 -0800266 EXPECT_EQ(vm.getInstances("android.hardware.camera", "ICamera"),
267 std::set<std::string>({"default", "legacy/0"}));
268 EXPECT_EQ(vm.getInstances("android.hardware.camera", "IBetterCamera"),
269 std::set<std::string>({"camera"}));
270 EXPECT_EQ(vm.getInstances("android.hardware.camera", "INotExist"),
Yifan Hong9bbdb282017-04-12 21:53:59 -0700271 std::set<std::string>({}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800272 EXPECT_EQ(vm.getInstances("android.hardware.nfc", "INfc"),
273 std::set<std::string>({"default"}));
274
275 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "default"));
276 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "legacy/0"));
277 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "camera"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800278 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", "INfc", "default"));
279
Yifan Hong9bbdb282017-04-12 21:53:59 -0700280 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800281 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "ICamera", "notexist"));
282 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "default"));
283 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "notexist"));
284 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", "INfc", "notexist"));
285}
286
Yifan Hong676447a2016-11-15 12:57:23 -0800287TEST_F(LibVintfTest, VersionConverter) {
288 Version v(3, 6);
289 std::string xml = gVersionConverter(v);
290 EXPECT_EQ(xml, "<version>3.6</version>\n");
291 Version v2;
292 EXPECT_TRUE(gVersionConverter(&v2, xml));
293 EXPECT_EQ(v, v2);
294}
295
Yifan Hong676447a2016-11-15 12:57:23 -0800296TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800297 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800298 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
299 false /* optional */};
300 std::string xml = gMatrixHalConverter(mh);
301 EXPECT_EQ(xml,
302 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800303 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800304 " <version>1.2-3</version>\n"
305 " <version>4.5-6</version>\n"
306 "</hal>\n");
307 MatrixHal mh2;
308 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
309 EXPECT_EQ(mh, mh2);
310}
311
Yifan Hong3f5489a2017-02-08 11:14:21 -0800312TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
313
314 KernelConfigTypedValue converted;
315
316 auto testOne = [] (const KernelConfigTypedValue &original,
317 const std::string &expectXml) {
318 std::string xml;
319 KernelConfigTypedValue converted;
320 xml = gKernelConfigTypedValueConverter(original);
321 EXPECT_EQ(xml, expectXml);
322 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
323 EXPECT_EQ(original, converted);
324 };
325
326 auto testParse = [] (const KernelConfigTypedValue &original,
327 const std::string &xml) {
328 KernelConfigTypedValue converted;
329 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
330 EXPECT_EQ(original, converted);
331 };
332
333 testOne(KernelConfigTypedValue("stringvalue"),
334 "<value type=\"string\">stringvalue</value>\n");
335 testOne(KernelConfigTypedValue(""),
336 "<value type=\"string\"></value>\n");
337
338 testOne(KernelConfigTypedValue(Tristate::YES),
339 "<value type=\"tristate\">y</value>\n");
340 testOne(KernelConfigTypedValue(Tristate::NO),
341 "<value type=\"tristate\">n</value>\n");
342 testOne(KernelConfigTypedValue(Tristate::MODULE),
343 "<value type=\"tristate\">m</value>\n");
344 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
345 "<value type=\"tristate\">q</value>\n"));
346
347 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
348 "<value type=\"range\">4-20</value>\n");
349 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
350 "<value type=\"range\">0-18446744073709551615</value>\n");
351 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
352 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
353
354 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
355 "<value type=\"int\">-18446744073709551616</value>\n"));
356
357 testOne(KernelConfigTypedValue(INT64_MIN),
358 "<value type=\"int\">-9223372036854775808</value>\n");
359 testParse(KernelConfigTypedValue(INT64_MIN),
360 "<value type=\"int\">0x8000000000000000</value>\n");
361 testParse(KernelConfigTypedValue(INT64_MIN),
362 "<value type=\"int\">-0X8000000000000000</value>\n");
363
364 testParse(KernelConfigTypedValue(INT64_MIN + 1),
365 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
366
367 testParse(KernelConfigTypedValue(-0x50),
368 "<value type=\"int\">-0x50</value>\n");
369
370 testOne(KernelConfigTypedValue(0),
371 "<value type=\"int\">0</value>\n");
372
373 // Truncation for underflow.
374 testParse(KernelConfigTypedValue(1),
375 "<value type=\"int\">-0xffffffffffffffff</value>\n");
376 testParse(KernelConfigTypedValue(1),
377 "<value type=\"int\">-18446744073709551615</value>\n");
378
379 testOne(KernelConfigTypedValue(INT64_MAX),
380 "<value type=\"int\">9223372036854775807</value>\n");
381 testParse(KernelConfigTypedValue(INT64_MAX),
382 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
383 // Truncation for underflow.
384 testParse(KernelConfigTypedValue(INT64_MAX),
385 "<value type=\"int\">-9223372036854775809</value>\n");
386
387 testParse(KernelConfigTypedValue(-1),
388 "<value type=\"int\">18446744073709551615</value>\n");
389 testParse(KernelConfigTypedValue(-1),
390 "<value type=\"int\">0xffffffffffffffff</value>\n");
391
392 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
393 "<value type=\"int\">18446744073709551616</value>\n"));
394}
395
Yifan Hong676447a2016-11-15 12:57:23 -0800396TEST_F(LibVintfTest, CompatibilityMatrixCoverter) {
397 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800398 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800399 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Honga9993572017-01-24 19:33:15 -0800400 false /* optional */}));
401 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800402 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Honga9993572017-01-24 19:33:15 -0800403 true /* optional */}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800404 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
405 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
406 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
407 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700408 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700409 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800410 std::string xml = gCompatibilityMatrixConverter(cm);
411 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700412 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800413 " <hal format=\"native\" optional=\"false\">\n"
414 " <name>android.hardware.camera</name>\n"
415 " <version>1.2-3</version>\n"
416 " <version>4.5-6</version>\n"
417 " </hal>\n"
418 " <hal format=\"native\" optional=\"true\">\n"
419 " <name>android.hardware.nfc</name>\n"
420 " <version>4.5-6</version>\n"
421 " <version>10.11-12</version>\n"
422 " </hal>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800423 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800424 " <config>\n"
425 " <key>CONFIG_FOO</key>\n"
426 " <value type=\"tristate\">y</value>\n"
427 " </config>\n"
428 " <config>\n"
429 " <key>CONFIG_BAR</key>\n"
430 " <value type=\"string\">stringvalue</value>\n"
431 " </config>\n"
432 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800433 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800434 " <config>\n"
435 " <key>CONFIG_BAZ</key>\n"
436 " <value type=\"int\">20</value>\n"
437 " </config>\n"
438 " <config>\n"
439 " <key>CONFIG_BAR</key>\n"
440 " <value type=\"range\">3-5</value>\n"
441 " </config>\n"
442 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800443 " <sepolicy>\n"
444 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700445 " <sepolicy-version>25.0</sepolicy-version>\n"
446 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800447 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700448 " <avb>\n"
449 " <vbmeta-version>2.1</vbmeta-version>\n"
450 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800451 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800452 CompatibilityMatrix cm2;
453 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700454 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800455}
456
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700457TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
458 CompatibilityMatrix cm;
459 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
460 {{VersionRange(1,0)}},
461 false /* optional */}));
462 set(cm, SchemaType::DEVICE);
463 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
464 std::string xml = gCompatibilityMatrixConverter(cm);
465 EXPECT_EQ(xml,
466 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
467 " <hal format=\"native\" optional=\"false\">\n"
468 " <name>android.hidl.manager</name>\n"
469 " <version>1.0</version>\n"
470 " </hal>\n"
471 " <vndk>\n"
472 " <version>25.0.1-5</version>\n"
473 " <library>libbase.so</library>\n"
474 " <library>libjpeg.so</library>\n"
475 " </vndk>\n"
476 "</compatibility-matrix>\n");
477 CompatibilityMatrix cm2;
478 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
479 EXPECT_EQ(cm, cm2);
480}
481
Yifan Hong676447a2016-11-15 12:57:23 -0800482TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800483 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800484
Yifan Hong2059ffc2017-02-24 11:32:02 -0800485 ManifestHal invalidHal{
486 .format = HalFormat::HIDL,
487 .name = "android.hardware.camera",
488 .versions = {{Version(2, 0), Version(2, 1)}},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800489 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64}
Yifan Hong2059ffc2017-02-24 11:32:02 -0800490 };
491
Yifan Hong5a06ef72017-01-24 19:54:24 -0800492 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800493 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800494 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800495}
496
Tri Vod0143942017-03-24 17:51:23 -0700497TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700498 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700499 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
500 {"android.hardware.camera", "android.hardware.nfc"}));
501}
502
503TEST_F(LibVintfTest, HalManifestGetInterfaceNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700504 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700505 EXPECT_EQ(vm.getInterfaceNames("android.hardware.camera"),
506 std::set<std::string>({"ICamera", "IBetterCamera"}));
507 EXPECT_EQ(vm.getInterfaceNames("android.hardware.nfc"),
508 std::set<std::string>({"INfc"}));
509}
510
Yifan Hongd2b7e642017-02-17 10:15:32 -0800511TEST_F(LibVintfTest, HalManifestGetHal) {
Yifan Honga04e1472017-04-05 13:15:34 -0700512 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700513 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
514 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800515
516 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
517 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800518 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800519 EXPECT_EQ(hal.name, arr[i++]);
520 }
521}
522
Yifan Honga7201e72017-02-17 10:09:59 -0800523TEST_F(LibVintfTest, RuntimeInfo) {
524 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800525 using KernelConfigs = std::vector<KernelConfig>;
526 const KernelConfigs configs {
527 KernelConfig{"CONFIG_64BIT", Tristate::YES},
528 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
529 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
530 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
531 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
532 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
533 };
534
535 auto testMatrix = [&] (MatrixKernel &&kernel) {
536 CompatibilityMatrix cm;
537 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700538 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700539 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800540 return cm;
541 };
542
543 std::string error;
544
545 {
546 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
547 CompatibilityMatrix cm = testMatrix(std::move(kernel));
548 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
549 }
550
551 {
552 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
553 CompatibilityMatrix cm = testMatrix(std::move(kernel));
554 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
555 }
556
557 {
558 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
559 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700560 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800561 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
562 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700563 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800564 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
565 << "kernel-sepolicy-version shouldn't match";
566 }
567
568 {
569 KernelConfigs newConfigs(configs);
570 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
571 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
572 CompatibilityMatrix cm = testMatrix(std::move(kernel));
573 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
574 }
575
576 {
577 KernelConfigs newConfigs(configs);
578 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
579 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
580 CompatibilityMatrix cm = testMatrix(std::move(kernel));
581 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
582 }
583
584 {
585 KernelConfigs newConfigs(configs);
586 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
587 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
588 CompatibilityMatrix cm = testMatrix(std::move(kernel));
589 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
590 }
591
592 {
593 KernelConfigs newConfigs(configs);
594 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
595 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
596 CompatibilityMatrix cm = testMatrix(std::move(kernel));
597 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
598 }
599
600 {
601 KernelConfigs newConfigs(configs);
602 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
603 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
604 CompatibilityMatrix cm = testMatrix(std::move(kernel));
605 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
606 }
Yifan Hongf3029302017-04-12 17:23:49 -0700607
608 RuntimeInfo badAvb = testRuntimeInfo();
609 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
610 {
611 setAvb(badAvb, {1, 0}, {2, 1});
612 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
613 }
614 {
615 setAvb(badAvb, {2, 1}, {3, 0});
616 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
617 }
618 {
619 setAvb(badAvb, {2, 1}, {2, 3});
620 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
621 }
622 {
623 setAvb(badAvb, {2, 3}, {2, 1});
624 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
625 }
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800626}
627
Yifan Hongd0cbf1f2017-04-12 19:47:06 -0700628TEST_F(LibVintfTest, Compat) {
629 std::string manifestXml =
630 "<manifest version=\"1.0\" type=\"device\">\n"
631 " <hal format=\"hidl\">\n"
632 " <name>android.hardware.camera</name>\n"
633 " <transport>hwbinder</transport>\n"
634 " <version>3.5</version>\n"
635 " <interface>\n"
636 " <name>IBetterCamera</name>\n"
637 " <instance>camera</instance>\n"
638 " </interface>\n"
639 " <interface>\n"
640 " <name>ICamera</name>\n"
641 " <instance>default</instance>\n"
642 " <instance>legacy/0</instance>\n"
643 " </interface>\n"
644 " </hal>\n"
645 " <hal format=\"hidl\">\n"
646 " <name>android.hardware.nfc</name>\n"
647 " <transport>hwbinder</transport>\n"
648 " <version>1.0</version>\n"
649 " <version>2.0</version>\n"
650 " <interface>\n"
651 " <name>INfc</name>\n"
652 " <instance>nfc_nci</instance>\n"
653 " </interface>\n"
654 " </hal>\n"
655 " <hal format=\"hidl\">\n"
656 " <name>android.hardware.nfc</name>\n"
657 " <transport>hwbinder</transport>\n"
658 " <version>2.0</version>\n"
659 " <interface>\n"
660 " <name>INfc</name>\n"
661 " <instance>default</instance>\n"
662 " </interface>\n"
663 " </hal>\n"
664 " <sepolicy>\n"
665 " <version>25.5</version>\n"
666 " </sepolicy>\n"
667 "</manifest>\n";
668
669 std::string matrixXml =
670 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
671 " <hal format=\"hidl\" optional=\"false\">\n"
672 " <name>android.hardware.camera</name>\n"
673 " <version>2.0-5</version>\n"
674 " <version>3.4-16</version>\n"
675 " </hal>\n"
676 " <hal format=\"hidl\" optional=\"false\">\n"
677 " <name>android.hardware.nfc</name>\n"
678 " <version>1.0</version>\n"
679 " <version>2.0</version>\n"
680 " </hal>\n"
681 " <hal format=\"hidl\" optional=\"true\">\n"
682 " <name>android.hardware.foo</name>\n"
683 " <version>1.0</version>\n"
684 " </hal>\n"
685 " <sepolicy>\n"
686 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
687 " <sepolicy-version>25.5</sepolicy-version>\n"
688 " <sepolicy-version>26.0-3</sepolicy-version>\n"
689 " </sepolicy>\n"
690 " <avb>\n"
691 " <vbmeta-version>2.1</vbmeta-version>\n"
692 " </avb>\n"
693 "</compatibility-matrix>\n";
694
695 HalManifest manifest;
696 CompatibilityMatrix matrix;
697 std::string error;
698 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
699 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
700 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
701
702 // some smaller test cases
703 matrixXml =
704 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
705 " <hal format=\"hidl\" optional=\"false\">\n"
706 " <name>android.hardware.camera</name>\n"
707 " <version>3.4</version>\n"
708 " </hal>\n"
709 " <sepolicy>\n"
710 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
711 " <sepolicy-version>25.5</sepolicy-version>\n"
712 " </sepolicy>\n"
713 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
714 "</compatibility-matrix>\n";
715 matrix = {};
716 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
717 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
718 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
719 EXPECT_NE(camera, nullptr);
720 camera->versionRanges[0] = {3, 5};
721 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
722 camera->versionRanges[0] = {3, 6};
723 EXPECT_FALSE(manifest.checkCompatibility(matrix));
724
725 // reset it
726 matrix = {};
727 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
728 set(matrix, Sepolicy{30, {{26, 0}}});
729 EXPECT_FALSE(manifest.checkCompatibility(matrix));
730 set(matrix, Sepolicy{30, {{25, 6}}});
731 EXPECT_FALSE(manifest.checkCompatibility(matrix));
732 set(matrix, Sepolicy{30, {{25, 4}}});
733 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
734}
735
Yifan Hong398f4c72017-04-13 20:18:01 -0700736namespace details {
737int32_t checkCompatibility(const std::vector<std::string> &xmls, bool mount,
738 std::function<status_t(void)> mountSystem,
739 std::function<status_t(void)> mountVendor,
740 std::function<const HalManifest *(bool)> GetFrameworkHalManifest,
741 std::function<const HalManifest *(bool)> GetDeviceHalManifest,
742 std::function<const RuntimeInfo *(bool)> GetRuntimeInfo,
743 std::string *error);
744} // namespace details
745
746TEST_F(LibVintfTest, Compat2) {
747 std::string deviceManifestXml =
748 "<manifest version=\"1.0\" type=\"device\">\n"
749 " <sepolicy>\n"
750 " <version>25.5</version>\n"
751 " </sepolicy>\n"
752 "</manifest>\n";
753 std::string frameworkManifestXml =
754 "<manifest version=\"1.0\" type=\"framework\">\n"
755 " <vndk>\n"
756 " <version>25.0.5</version>\n"
757 " </vndk>\n"
758 "</manifest>\n";
759 std::string deviceMatrixXml =
760 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
761 " <vndk>\n"
762 " <version>25.0.5</version>\n"
763 " </vndk>\n"
764 "</compatibility-matrix>\n";
765 std::string frameworkMatrixXml =
766 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
767 " <kernel version=\"3.18.31\"></kernel>"
768 " <sepolicy>\n"
769 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
770 " <sepolicy-version>25.5</sepolicy-version>\n"
771 " </sepolicy>\n"
772 " <avb>\n"
773 " <vbmeta-version>2.1</vbmeta-version>\n"
774 " </avb>\n"
775 "</compatibility-matrix>\n";
776 RuntimeInfo runtimeInfo = testRuntimeInfo();
777 HalManifest devManifest;
778 HalManifest fwkManifest;
779 CompatibilityMatrix devMatrix;
780 CompatibilityMatrix fwkMatrix;
781 EXPECT_TRUE(gHalManifestConverter(&devManifest, deviceManifestXml));
782 EXPECT_TRUE(gHalManifestConverter(&fwkManifest, frameworkManifestXml));
783 EXPECT_TRUE(gCompatibilityMatrixConverter(&devMatrix, deviceMatrixXml));
784 EXPECT_TRUE(gCompatibilityMatrixConverter(&fwkMatrix, frameworkMatrixXml));
785 std::string error;
786 EXPECT_TRUE(devManifest.checkCompatibility(fwkMatrix, &error)) << error;
787 EXPECT_TRUE(fwkManifest.checkCompatibility(devMatrix, &error)) << error;
788 EXPECT_TRUE(runtimeInfo.checkCompatibility(fwkMatrix, &error)) << error;
789
790 bool systemMounted = false;
791 bool vendorMounted = false;
792 auto mountSystem = [&systemMounted] () { systemMounted = true; return OK; };
793 auto mountVendor = [&vendorMounted] () { vendorMounted = true; return OK; };
794 auto nullManifestFunc = [](bool) -> const HalManifest * { return nullptr; };
795 auto runtimeInfoFunc = [&](bool) { return &runtimeInfo; };
796 // full OTA
797 EXPECT_EQ(COMPATIBLE, details::checkCompatibility(
798 {deviceManifestXml, deviceMatrixXml, frameworkManifestXml, frameworkMatrixXml},
799 false /* mount */, mountSystem, mountVendor,
800 nullManifestFunc,
801 nullManifestFunc,
802 runtimeInfoFunc,
803 &error)) << error;
804 EXPECT_FALSE(systemMounted);
805 EXPECT_FALSE(vendorMounted);
806 EXPECT_EQ(COMPATIBLE, details::checkCompatibility(
807 {deviceManifestXml, deviceMatrixXml, frameworkManifestXml, frameworkMatrixXml},
808 true /* mount */, mountSystem, mountVendor,
809 nullManifestFunc,
810 nullManifestFunc,
811 runtimeInfoFunc,
812 &error)) << error;
813 EXPECT_FALSE(systemMounted);
814 EXPECT_FALSE(vendorMounted);
815
816 // framework only OTA
817 EXPECT_GT(0, details::checkCompatibility(
818 {frameworkManifestXml, frameworkMatrixXml},
819 false /* mount */, mountSystem, mountVendor,
820 nullManifestFunc,
821 nullManifestFunc,
822 runtimeInfoFunc,
823 &error)) << "should not mount, thus info should be missing";
824 EXPECT_FALSE(systemMounted);
825 EXPECT_FALSE(vendorMounted);
826 EXPECT_EQ(COMPATIBLE, details::checkCompatibility(
827 {frameworkManifestXml, frameworkMatrixXml},
828 true /* mount */, mountSystem, mountVendor,
829 nullManifestFunc,
830 [&](auto) { return &devManifest; },
831 runtimeInfoFunc,
832 &error)) << error;
833 EXPECT_FALSE(systemMounted);
834 EXPECT_TRUE(vendorMounted);
835
836 CompatibilityMatrix failedFwkMatrix;
837 std::string failedFrameworkMatrixXml;
838
839 // Failed framework only OTA example 1: runtime info doesn't work (avb version)
840 failedFwkMatrix = {};
841 systemMounted = false;
842 vendorMounted = false;
843 failedFrameworkMatrixXml =
844 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
845 " <kernel version=\"3.18.31\"></kernel>"
846 " <sepolicy>\n"
847 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
848 " <sepolicy-version>25.5</sepolicy-version>\n"
849 " </sepolicy>\n"
850 " <avb>\n"
851 " <vbmeta-version>2.2</vbmeta-version>\n"
852 " </avb>\n"
853 "</compatibility-matrix>\n";
854 EXPECT_TRUE(gCompatibilityMatrixConverter(&failedFwkMatrix, failedFrameworkMatrixXml));
855 EXPECT_TRUE(devManifest.checkCompatibility(failedFwkMatrix, &error)) << error;
856 EXPECT_FALSE(runtimeInfo.checkCompatibility(failedFwkMatrix, &error)) << error;
857 EXPECT_EQ(INCOMPATIBLE, details::checkCompatibility(
858 {frameworkManifestXml, failedFrameworkMatrixXml},
859 true /* mount */, mountSystem, mountVendor,
860 nullManifestFunc,
861 [&](auto) { return &devManifest; },
862 runtimeInfoFunc,
863 &error)) << error;
864 EXPECT_FALSE(systemMounted);
865 EXPECT_TRUE(vendorMounted);
866
867 // Failed framework only OTA example 2: unsupported HAL
868 failedFwkMatrix = {};
869 systemMounted = false;
870 vendorMounted = false;
871 failedFrameworkMatrixXml =
872 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
873 " <hal format=\"hidl\" optional=\"false\">\n"
874 " <name>android.hardware.camera</name>\n"
875 " <version>2.0-5</version>\n"
876 " </hal>\n"
877 " <kernel version=\"3.18.31\"></kernel>"
878 " <sepolicy>\n"
879 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
880 " <sepolicy-version>25.5</sepolicy-version>\n"
881 " </sepolicy>\n"
882 " <avb>\n"
883 " <vbmeta-version>2.1</vbmeta-version>\n"
884 " </avb>\n"
885 "</compatibility-matrix>\n";
886 EXPECT_TRUE(gCompatibilityMatrixConverter(&failedFwkMatrix, failedFrameworkMatrixXml));
887 EXPECT_FALSE(devManifest.checkCompatibility(failedFwkMatrix, &error)) << error;
888 EXPECT_TRUE(runtimeInfo.checkCompatibility(failedFwkMatrix, &error)) << error;
889 EXPECT_EQ(INCOMPATIBLE, details::checkCompatibility(
890 {frameworkManifestXml, failedFrameworkMatrixXml},
891 true /* mount */, mountSystem, mountVendor,
892 nullManifestFunc,
893 [&](auto) { return &devManifest; },
894 runtimeInfoFunc,
895 &error)) << error;
896 EXPECT_FALSE(systemMounted);
897 EXPECT_TRUE(vendorMounted);
898}
899
Yifan Honga9993572017-01-24 19:33:15 -0800900} // namespace vintf
901} // namespace android
902
Yifan Hong676447a2016-11-15 12:57:23 -0800903int main(int argc, char **argv) {
904 ::testing::InitGoogleTest(&argc, argv);
905 return RUN_ALL_TESTS();
906}