blob: b5b6b18a7b3b3d3d994100ec65e0378def52b158 [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 Hong19e0a2a2017-04-14 17:30:53 -070072 Version getAvb(CompatibilityMatrix &cm) {
73 return cm.framework.mAvbMetaVersion;
74 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070075 const ManifestHal *getAnyHal(HalManifest &vm, const std::string &name) {
76 return vm.getAnyHal(name);
Yifan Honga9993572017-01-24 19:33:15 -080077 }
Yifan Hongd0cbf1f2017-04-12 19:47:06 -070078 MatrixHal *getAnyHal(CompatibilityMatrix &cm, const std::string &name) {
79 return cm.getAnyHal(name);
80 }
Yifan Hong9bbdb282017-04-12 21:53:59 -070081 ConstMultiMapValueIterable<std::string, ManifestHal> getHals(HalManifest &vm) {
Yifan Honga9993572017-01-24 19:33:15 -080082 return vm.getHals();
83 }
Yifan Hong5a06ef72017-01-24 19:54:24 -080084 bool isValid(const ManifestHal &mh) {
85 return mh.isValid();
86 }
Yifan Honga04e1472017-04-05 13:15:34 -070087 HalManifest testDeviceManifest() {
Yifan Hongd2b7e642017-02-17 10:15:32 -080088 HalManifest vm;
Yifan Hong7c7d7062017-04-04 16:26:51 -070089 vm.mType = SchemaType::DEVICE;
Yifan Hong2a3dd082017-04-04 17:15:35 -070090 vm.device.mSepolicyVersion = {25, 0};
Yifan Hong2059ffc2017-02-24 11:32:02 -080091 vm.add(ManifestHal{
92 .format = HalFormat::HIDL,
93 .name = "android.hardware.camera",
94 .versions = {Version(2, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -080095 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
Yifan Hongec3b9b72017-02-23 13:24:42 -080096 .interfaces = {
97 {"ICamera", {"ICamera", {"legacy/0", "default"}}},
98 {"IBetterCamera", {"IBetterCamera", {"camera"}}}
99 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800100 });
101 vm.add(ManifestHal{
102 .format = HalFormat::HIDL,
103 .name = "android.hardware.nfc",
104 .versions = {Version(1, 0)},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800105 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64},
Yifan Hongec3b9b72017-02-23 13:24:42 -0800106 .interfaces = {
107 {"INfc", {"INfc", {"default"}}}
108 }
Yifan Hong2059ffc2017-02-24 11:32:02 -0800109 });
Yifan Honga9993572017-01-24 19:33:15 -0800110
111 return vm;
112 }
Yifan Honga04e1472017-04-05 13:15:34 -0700113 HalManifest testFrameworkManfiest() {
114 HalManifest vm;
115 vm.mType = SchemaType::FRAMEWORK;
116 vm.add(ManifestHal{
117 .format = HalFormat::HIDL,
118 .name = "android.hidl.manager",
119 .versions = {Version(1, 0)},
120 .transportArch = {Transport::HWBINDER, Arch::ARCH_EMPTY},
121 .interfaces = {
122 {"IServiceManager", {"IServiceManager", {"default"}}},
123 }
124 });
125 Vndk vndk2505;
126 vndk2505.mVersionRange = {25, 0, 5};
127 vndk2505.mLibraries = { "libjpeg.so", "libbase.so" };
128 Vndk vndk2513;
129 vndk2513.mVersionRange = {25, 1, 3};
130 vndk2513.mLibraries = { "libjpeg.so", "libbase.so", "libtinyxml2.so" };
131 vm.framework.mVndks = { std::move(vndk2505), std::move(vndk2513) };
132
133 return vm;
134 }
Yifan Honga7201e72017-02-17 10:09:59 -0800135 RuntimeInfo testRuntimeInfo() {
136 RuntimeInfo info;
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800137 info.mOsName = "Linux";
138 info.mNodeName = "localhost";
139 info.mOsRelease = "3.18.31-g936f9a479d0f";
140 info.mKernelVersion = {3, 18, 31};
141 info.mOsVersion = "#4 SMP PREEMPT Wed Feb 1 18:10:52 PST 2017";
142 info.mHardwareId = "aarch64";
143 info.mKernelSepolicyVersion = 30;
Yifan Hongf1af7522017-02-16 18:00:55 -0800144 info.mKernelConfigs = {
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800145 {"CONFIG_64BIT", "y"},
146 {"CONFIG_ANDROID_BINDER_DEVICES", "\"binder,hwbinder\""},
147 {"CONFIG_ARCH_MMAP_RND_BITS", "24"},
148 {"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", "\"\""},
149 {"CONFIG_ILLEGAL_POINTER_VALUE", "0xdead000000000000"}
150 };
Yifan Hongf3029302017-04-12 17:23:49 -0700151 info.mAvbBootVersion = info.mAvbInitVersion = {2, 1};
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800152 return info;
153 }
Yifan Hong676447a2016-11-15 12:57:23 -0800154};
155
Yifan Hongef6d4d32017-01-23 14:12:28 -0800156
157TEST_F(LibVintfTest, Stringify) {
Yifan Honga04e1472017-04-05 13:15:34 -0700158 HalManifest vm = testDeviceManifest();
Yifan Hong974ad9c2017-04-04 15:37:39 -0700159 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/2.0:"
160 "hidl/android.hardware.nfc/passthrough32+64/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -0800161
162 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
163 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
164
165 VersionRange v(1, 2, 3);
166 EXPECT_EQ(to_string(v), "1.2-3");
167 VersionRange v2;
168 EXPECT_TRUE(parse("1.2-3", &v2));
169 EXPECT_EQ(v, v2);
170}
171
Yifan Hong9bbdb282017-04-12 21:53:59 -0700172TEST_F(LibVintfTest, GetTransport) {
173 HalManifest vm = testDeviceManifest();
174 EXPECT_EQ(Transport::HWBINDER, vm.getTransport("android.hardware.camera",
175 {2, 0}, "ICamera", "default"));
176}
177
Yifan Hongd2b7e642017-02-17 10:15:32 -0800178TEST_F(LibVintfTest, HalManifestConverter) {
Yifan Honga04e1472017-04-05 13:15:34 -0700179 HalManifest vm = testDeviceManifest();
Yifan Hongd2b7e642017-02-17 10:15:32 -0800180 std::string xml = gHalManifestConverter(vm);
Yifan Hong676447a2016-11-15 12:57:23 -0800181 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700182 "<manifest version=\"1.0\" type=\"device\">\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800183 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800184 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800185 " <transport>hwbinder</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800186 " <version>2.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800187 " <interface>\n"
188 " <name>IBetterCamera</name>\n"
189 " <instance>camera</instance>\n"
190 " </interface>\n"
191 " <interface>\n"
192 " <name>ICamera</name>\n"
193 " <instance>default</instance>\n"
194 " <instance>legacy/0</instance>\n"
195 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800196 " </hal>\n"
197 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800198 " <name>android.hardware.nfc</name>\n"
Yifan Hongc54d32c2017-03-07 19:12:26 -0800199 " <transport arch=\"32+64\">passthrough</transport>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800200 " <version>1.0</version>\n"
Yifan Hongec3b9b72017-02-23 13:24:42 -0800201 " <interface>\n"
202 " <name>INfc</name>\n"
203 " <instance>default</instance>\n"
204 " </interface>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800205 " </hal>\n"
Yifan Hong2a3dd082017-04-04 17:15:35 -0700206 " <sepolicy>\n"
207 " <version>25.0</version>\n"
208 " </sepolicy>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800209 "</manifest>\n");
Yifan Hongfb7469c2017-04-05 19:15:21 -0700210 HalManifest vm2;
211 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
212 EXPECT_EQ(vm, vm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800213}
214
Yifan Honga04e1472017-04-05 13:15:34 -0700215TEST_F(LibVintfTest, HalManifestConverterFramework) {
216 HalManifest vm = testFrameworkManfiest();
217 std::string xml = gHalManifestConverter(vm);
218 EXPECT_EQ(xml,
219 "<manifest version=\"1.0\" type=\"framework\">\n"
220 " <hal format=\"hidl\">\n"
221 " <name>android.hidl.manager</name>\n"
222 " <transport>hwbinder</transport>\n"
223 " <version>1.0</version>\n"
224 " <interface>\n"
225 " <name>IServiceManager</name>\n"
226 " <instance>default</instance>\n"
227 " </interface>\n"
228 " </hal>\n"
229 " <vndk>\n"
230 " <version>25.0.5</version>\n"
231 " <library>libbase.so</library>\n"
232 " <library>libjpeg.so</library>\n"
233 " </vndk>\n"
234 " <vndk>\n"
235 " <version>25.1.3</version>\n"
236 " <library>libbase.so</library>\n"
237 " <library>libjpeg.so</library>\n"
238 " <library>libtinyxml2.so</library>\n"
239 " </vndk>\n"
240 "</manifest>\n");
241 HalManifest vm2;
242 EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700243 EXPECT_EQ(vm, vm2);
Yifan Honga04e1472017-04-05 13:15:34 -0700244}
245
Yifan Hong8e9c6692017-02-28 14:07:42 -0800246TEST_F(LibVintfTest, HalManifestOptional) {
247 HalManifest vm;
248 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700249 "<manifest version=\"1.0\" type=\"device\"></manifest>"));
Yifan Hong8e9c6692017-02-28 14:07:42 -0800250 EXPECT_TRUE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700251 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800252 " <hal>"
253 " <name>android.hidl.manager</name>"
254 " <transport>hwbinder</transport>"
255 " <version>1.0</version>"
256 " </hal>"
257 "</manifest>"));
258 EXPECT_FALSE(gHalManifestConverter(&vm,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700259 "<manifest version=\"1.0\" type=\"device\">"
Yifan Hong8e9c6692017-02-28 14:07:42 -0800260 " <hal>"
261 " <name>android.hidl.manager</name>"
262 " <version>1.0</version>"
263 " </hal>"
264 "</manifest>"));
265}
266
Yifan Hongec3b9b72017-02-23 13:24:42 -0800267TEST_F(LibVintfTest, HalManifestInstances) {
Yifan Honga04e1472017-04-05 13:15:34 -0700268 HalManifest vm = testDeviceManifest();
Yifan Hongec3b9b72017-02-23 13:24:42 -0800269 EXPECT_EQ(vm.getInstances("android.hardware.camera", "ICamera"),
270 std::set<std::string>({"default", "legacy/0"}));
271 EXPECT_EQ(vm.getInstances("android.hardware.camera", "IBetterCamera"),
272 std::set<std::string>({"camera"}));
273 EXPECT_EQ(vm.getInstances("android.hardware.camera", "INotExist"),
Yifan Hong9bbdb282017-04-12 21:53:59 -0700274 std::set<std::string>({}));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800275 EXPECT_EQ(vm.getInstances("android.hardware.nfc", "INfc"),
276 std::set<std::string>({"default"}));
277
278 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "default"));
279 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "legacy/0"));
280 EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "camera"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800281 EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", "INfc", "default"));
282
Yifan Hong9bbdb282017-04-12 21:53:59 -0700283 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "default"));
Yifan Hongec3b9b72017-02-23 13:24:42 -0800284 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "ICamera", "notexist"));
285 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "default"));
286 EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "notexist"));
287 EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", "INfc", "notexist"));
288}
289
Yifan Hong676447a2016-11-15 12:57:23 -0800290TEST_F(LibVintfTest, VersionConverter) {
291 Version v(3, 6);
292 std::string xml = gVersionConverter(v);
293 EXPECT_EQ(xml, "<version>3.6</version>\n");
294 Version v2;
295 EXPECT_TRUE(gVersionConverter(&v2, xml));
296 EXPECT_EQ(v, v2);
297}
298
Yifan Hong676447a2016-11-15 12:57:23 -0800299TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800300 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800301 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
302 false /* optional */};
303 std::string xml = gMatrixHalConverter(mh);
304 EXPECT_EQ(xml,
305 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800306 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800307 " <version>1.2-3</version>\n"
308 " <version>4.5-6</version>\n"
309 "</hal>\n");
310 MatrixHal mh2;
311 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
312 EXPECT_EQ(mh, mh2);
313}
314
Yifan Hong3f5489a2017-02-08 11:14:21 -0800315TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
316
317 KernelConfigTypedValue converted;
318
319 auto testOne = [] (const KernelConfigTypedValue &original,
320 const std::string &expectXml) {
321 std::string xml;
322 KernelConfigTypedValue converted;
323 xml = gKernelConfigTypedValueConverter(original);
324 EXPECT_EQ(xml, expectXml);
325 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
326 EXPECT_EQ(original, converted);
327 };
328
329 auto testParse = [] (const KernelConfigTypedValue &original,
330 const std::string &xml) {
331 KernelConfigTypedValue converted;
332 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
333 EXPECT_EQ(original, converted);
334 };
335
336 testOne(KernelConfigTypedValue("stringvalue"),
337 "<value type=\"string\">stringvalue</value>\n");
338 testOne(KernelConfigTypedValue(""),
339 "<value type=\"string\"></value>\n");
340
341 testOne(KernelConfigTypedValue(Tristate::YES),
342 "<value type=\"tristate\">y</value>\n");
343 testOne(KernelConfigTypedValue(Tristate::NO),
344 "<value type=\"tristate\">n</value>\n");
345 testOne(KernelConfigTypedValue(Tristate::MODULE),
346 "<value type=\"tristate\">m</value>\n");
347 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
348 "<value type=\"tristate\">q</value>\n"));
349
350 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
351 "<value type=\"range\">4-20</value>\n");
352 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
353 "<value type=\"range\">0-18446744073709551615</value>\n");
354 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
355 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
356
357 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
358 "<value type=\"int\">-18446744073709551616</value>\n"));
359
360 testOne(KernelConfigTypedValue(INT64_MIN),
361 "<value type=\"int\">-9223372036854775808</value>\n");
362 testParse(KernelConfigTypedValue(INT64_MIN),
363 "<value type=\"int\">0x8000000000000000</value>\n");
364 testParse(KernelConfigTypedValue(INT64_MIN),
365 "<value type=\"int\">-0X8000000000000000</value>\n");
366
367 testParse(KernelConfigTypedValue(INT64_MIN + 1),
368 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
369
370 testParse(KernelConfigTypedValue(-0x50),
371 "<value type=\"int\">-0x50</value>\n");
372
373 testOne(KernelConfigTypedValue(0),
374 "<value type=\"int\">0</value>\n");
375
376 // Truncation for underflow.
377 testParse(KernelConfigTypedValue(1),
378 "<value type=\"int\">-0xffffffffffffffff</value>\n");
379 testParse(KernelConfigTypedValue(1),
380 "<value type=\"int\">-18446744073709551615</value>\n");
381
382 testOne(KernelConfigTypedValue(INT64_MAX),
383 "<value type=\"int\">9223372036854775807</value>\n");
384 testParse(KernelConfigTypedValue(INT64_MAX),
385 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
386 // Truncation for underflow.
387 testParse(KernelConfigTypedValue(INT64_MAX),
388 "<value type=\"int\">-9223372036854775809</value>\n");
389
390 testParse(KernelConfigTypedValue(-1),
391 "<value type=\"int\">18446744073709551615</value>\n");
392 testParse(KernelConfigTypedValue(-1),
393 "<value type=\"int\">0xffffffffffffffff</value>\n");
394
395 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
396 "<value type=\"int\">18446744073709551616</value>\n"));
397}
398
Yifan Hong676447a2016-11-15 12:57:23 -0800399TEST_F(LibVintfTest, CompatibilityMatrixCoverter) {
400 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800401 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800402 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Honga9993572017-01-24 19:33:15 -0800403 false /* optional */}));
404 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800405 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Honga9993572017-01-24 19:33:15 -0800406 true /* optional */}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800407 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
408 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
409 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
410 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong9a361582017-04-12 18:56:37 -0700411 set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
Yifan Hongf3029302017-04-12 17:23:49 -0700412 setAvb(cm, Version{2, 1});
Yifan Hong676447a2016-11-15 12:57:23 -0800413 std::string xml = gCompatibilityMatrixConverter(cm);
414 EXPECT_EQ(xml,
Yifan Hong7c7d7062017-04-04 16:26:51 -0700415 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800416 " <hal format=\"native\" optional=\"false\">\n"
417 " <name>android.hardware.camera</name>\n"
418 " <version>1.2-3</version>\n"
419 " <version>4.5-6</version>\n"
420 " </hal>\n"
421 " <hal format=\"native\" optional=\"true\">\n"
422 " <name>android.hardware.nfc</name>\n"
423 " <version>4.5-6</version>\n"
424 " <version>10.11-12</version>\n"
425 " </hal>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800426 " <kernel version=\"3.18.22\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800427 " <config>\n"
428 " <key>CONFIG_FOO</key>\n"
429 " <value type=\"tristate\">y</value>\n"
430 " </config>\n"
431 " <config>\n"
432 " <key>CONFIG_BAR</key>\n"
433 " <value type=\"string\">stringvalue</value>\n"
434 " </config>\n"
435 " </kernel>\n"
Yifan Hongc3066892017-02-24 10:42:02 -0800436 " <kernel version=\"4.4.1\">\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800437 " <config>\n"
438 " <key>CONFIG_BAZ</key>\n"
439 " <value type=\"int\">20</value>\n"
440 " </config>\n"
441 " <config>\n"
442 " <key>CONFIG_BAR</key>\n"
443 " <value type=\"range\">3-5</value>\n"
444 " </config>\n"
445 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800446 " <sepolicy>\n"
447 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
Yifan Hong9a361582017-04-12 18:56:37 -0700448 " <sepolicy-version>25.0</sepolicy-version>\n"
449 " <sepolicy-version>26.0-3</sepolicy-version>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800450 " </sepolicy>\n"
Yifan Hongf3029302017-04-12 17:23:49 -0700451 " <avb>\n"
452 " <vbmeta-version>2.1</vbmeta-version>\n"
453 " </avb>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800454 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800455 CompatibilityMatrix cm2;
456 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Hongfb7469c2017-04-05 19:15:21 -0700457 EXPECT_EQ(cm, cm2);
Yifan Hong676447a2016-11-15 12:57:23 -0800458}
459
Yifan Hong03d2d4a2017-04-12 17:34:14 -0700460TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
461 CompatibilityMatrix cm;
462 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
463 {{VersionRange(1,0)}},
464 false /* optional */}));
465 set(cm, SchemaType::DEVICE);
466 set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
467 std::string xml = gCompatibilityMatrixConverter(cm);
468 EXPECT_EQ(xml,
469 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
470 " <hal format=\"native\" optional=\"false\">\n"
471 " <name>android.hidl.manager</name>\n"
472 " <version>1.0</version>\n"
473 " </hal>\n"
474 " <vndk>\n"
475 " <version>25.0.1-5</version>\n"
476 " <library>libbase.so</library>\n"
477 " <library>libjpeg.so</library>\n"
478 " </vndk>\n"
479 "</compatibility-matrix>\n");
480 CompatibilityMatrix cm2;
481 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
482 EXPECT_EQ(cm, cm2);
483}
484
Yifan Hong676447a2016-11-15 12:57:23 -0800485TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800486 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800487
Yifan Hong2059ffc2017-02-24 11:32:02 -0800488 ManifestHal invalidHal{
489 .format = HalFormat::HIDL,
490 .name = "android.hardware.camera",
491 .versions = {{Version(2, 0), Version(2, 1)}},
Yifan Hongc54d32c2017-03-07 19:12:26 -0800492 .transportArch = {Transport::PASSTHROUGH, Arch::ARCH_32_64}
Yifan Hong2059ffc2017-02-24 11:32:02 -0800493 };
494
Yifan Hong5a06ef72017-01-24 19:54:24 -0800495 EXPECT_FALSE(isValid(invalidHal));
Yifan Hongd2b7e642017-02-17 10:15:32 -0800496 HalManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800497 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800498}
499
Tri Vod0143942017-03-24 17:51:23 -0700500TEST_F(LibVintfTest, HalManifestGetHalNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700501 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700502 EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
503 {"android.hardware.camera", "android.hardware.nfc"}));
504}
505
506TEST_F(LibVintfTest, HalManifestGetInterfaceNames) {
Yifan Honga04e1472017-04-05 13:15:34 -0700507 HalManifest vm = testDeviceManifest();
Tri Vod0143942017-03-24 17:51:23 -0700508 EXPECT_EQ(vm.getInterfaceNames("android.hardware.camera"),
509 std::set<std::string>({"ICamera", "IBetterCamera"}));
510 EXPECT_EQ(vm.getInterfaceNames("android.hardware.nfc"),
511 std::set<std::string>({"INfc"}));
512}
513
Yifan Hongd2b7e642017-02-17 10:15:32 -0800514TEST_F(LibVintfTest, HalManifestGetHal) {
Yifan Honga04e1472017-04-05 13:15:34 -0700515 HalManifest vm = testDeviceManifest();
Yifan Hong9bbdb282017-04-12 21:53:59 -0700516 EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
517 EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800518
519 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
520 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800521 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800522 EXPECT_EQ(hal.name, arr[i++]);
523 }
524}
525
Yifan Honga7201e72017-02-17 10:09:59 -0800526TEST_F(LibVintfTest, RuntimeInfo) {
527 RuntimeInfo ki = testRuntimeInfo();
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800528 using KernelConfigs = std::vector<KernelConfig>;
529 const KernelConfigs configs {
530 KernelConfig{"CONFIG_64BIT", Tristate::YES},
531 KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
532 KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
533 KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
534 KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
535 KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
536 };
537
538 auto testMatrix = [&] (MatrixKernel &&kernel) {
539 CompatibilityMatrix cm;
540 add(cm, std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700541 set(cm, {30, {{25, 0}}});
Yifan Hongf3029302017-04-12 17:23:49 -0700542 setAvb(cm, {2, 1});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800543 return cm;
544 };
545
546 std::string error;
547
548 {
549 MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
550 CompatibilityMatrix cm = testMatrix(std::move(kernel));
551 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
552 }
553
554 {
555 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
556 CompatibilityMatrix cm = testMatrix(std::move(kernel));
557 EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
558 }
559
560 {
561 MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
562 CompatibilityMatrix cm = testMatrix(std::move(kernel));
Yifan Hong9a361582017-04-12 18:56:37 -0700563 set(cm, Sepolicy{22, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800564 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
565 << "kernel-sepolicy-version shouldn't match";
Yifan Hong9a361582017-04-12 18:56:37 -0700566 set(cm, Sepolicy{40, {{25, 0}}});
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800567 EXPECT_FALSE(ki.checkCompatibility(cm, &error))
568 << "kernel-sepolicy-version shouldn't match";
569 }
570
571 {
572 KernelConfigs newConfigs(configs);
573 newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
574 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
575 CompatibilityMatrix cm = testMatrix(std::move(kernel));
576 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
577 }
578
579 {
580 KernelConfigs newConfigs(configs);
581 newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
582 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
583 CompatibilityMatrix cm = testMatrix(std::move(kernel));
584 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
585 }
586
587 {
588 KernelConfigs newConfigs(configs);
589 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
590 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
591 CompatibilityMatrix cm = testMatrix(std::move(kernel));
592 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
593 }
594
595 {
596 KernelConfigs newConfigs(configs);
597 newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
598 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
599 CompatibilityMatrix cm = testMatrix(std::move(kernel));
600 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
601 }
602
603 {
604 KernelConfigs newConfigs(configs);
605 newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
606 MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
607 CompatibilityMatrix cm = testMatrix(std::move(kernel));
608 EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
609 }
Yifan Hongf3029302017-04-12 17:23:49 -0700610
611 RuntimeInfo badAvb = testRuntimeInfo();
612 CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
613 {
614 setAvb(badAvb, {1, 0}, {2, 1});
615 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
616 }
617 {
618 setAvb(badAvb, {2, 1}, {3, 0});
619 EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
620 }
621 {
622 setAvb(badAvb, {2, 1}, {2, 3});
623 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
624 }
625 {
626 setAvb(badAvb, {2, 3}, {2, 1});
627 EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
628 }
Yifan Hongc66ad1e2017-02-08 20:19:45 -0800629}
630
Yifan Hong19e0a2a2017-04-14 17:30:53 -0700631TEST_F(LibVintfTest, MissingAvb) {
632 std::string xml =
633 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
634 " <kernel version=\"3.18.31\"></kernel>"
635 " <sepolicy>\n"
636 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
637 " <sepolicy-version>25.5</sepolicy-version>\n"
638 " </sepolicy>\n"
639 "</compatibility-matrix>\n";
640 CompatibilityMatrix cm;
641 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
642 EXPECT_EQ(getAvb(cm), Version(0, 0));
643}
644
Yifan Hongd0cbf1f2017-04-12 19:47:06 -0700645TEST_F(LibVintfTest, Compat) {
646 std::string manifestXml =
647 "<manifest version=\"1.0\" type=\"device\">\n"
648 " <hal format=\"hidl\">\n"
649 " <name>android.hardware.camera</name>\n"
650 " <transport>hwbinder</transport>\n"
651 " <version>3.5</version>\n"
652 " <interface>\n"
653 " <name>IBetterCamera</name>\n"
654 " <instance>camera</instance>\n"
655 " </interface>\n"
656 " <interface>\n"
657 " <name>ICamera</name>\n"
658 " <instance>default</instance>\n"
659 " <instance>legacy/0</instance>\n"
660 " </interface>\n"
661 " </hal>\n"
662 " <hal format=\"hidl\">\n"
663 " <name>android.hardware.nfc</name>\n"
664 " <transport>hwbinder</transport>\n"
665 " <version>1.0</version>\n"
666 " <version>2.0</version>\n"
667 " <interface>\n"
668 " <name>INfc</name>\n"
669 " <instance>nfc_nci</instance>\n"
670 " </interface>\n"
671 " </hal>\n"
672 " <hal format=\"hidl\">\n"
673 " <name>android.hardware.nfc</name>\n"
674 " <transport>hwbinder</transport>\n"
675 " <version>2.0</version>\n"
676 " <interface>\n"
677 " <name>INfc</name>\n"
678 " <instance>default</instance>\n"
679 " </interface>\n"
680 " </hal>\n"
681 " <sepolicy>\n"
682 " <version>25.5</version>\n"
683 " </sepolicy>\n"
684 "</manifest>\n";
685
686 std::string matrixXml =
687 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
688 " <hal format=\"hidl\" optional=\"false\">\n"
689 " <name>android.hardware.camera</name>\n"
690 " <version>2.0-5</version>\n"
691 " <version>3.4-16</version>\n"
692 " </hal>\n"
693 " <hal format=\"hidl\" optional=\"false\">\n"
694 " <name>android.hardware.nfc</name>\n"
695 " <version>1.0</version>\n"
696 " <version>2.0</version>\n"
697 " </hal>\n"
698 " <hal format=\"hidl\" optional=\"true\">\n"
699 " <name>android.hardware.foo</name>\n"
700 " <version>1.0</version>\n"
701 " </hal>\n"
702 " <sepolicy>\n"
703 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
704 " <sepolicy-version>25.5</sepolicy-version>\n"
705 " <sepolicy-version>26.0-3</sepolicy-version>\n"
706 " </sepolicy>\n"
707 " <avb>\n"
708 " <vbmeta-version>2.1</vbmeta-version>\n"
709 " </avb>\n"
710 "</compatibility-matrix>\n";
711
712 HalManifest manifest;
713 CompatibilityMatrix matrix;
714 std::string error;
715 EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
716 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
717 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
718
719 // some smaller test cases
720 matrixXml =
721 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
722 " <hal format=\"hidl\" optional=\"false\">\n"
723 " <name>android.hardware.camera</name>\n"
724 " <version>3.4</version>\n"
725 " </hal>\n"
726 " <sepolicy>\n"
727 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
728 " <sepolicy-version>25.5</sepolicy-version>\n"
729 " </sepolicy>\n"
730 " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
731 "</compatibility-matrix>\n";
732 matrix = {};
733 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
734 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
735 MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
736 EXPECT_NE(camera, nullptr);
737 camera->versionRanges[0] = {3, 5};
738 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
739 camera->versionRanges[0] = {3, 6};
740 EXPECT_FALSE(manifest.checkCompatibility(matrix));
741
742 // reset it
743 matrix = {};
744 EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
745 set(matrix, Sepolicy{30, {{26, 0}}});
746 EXPECT_FALSE(manifest.checkCompatibility(matrix));
747 set(matrix, Sepolicy{30, {{25, 6}}});
748 EXPECT_FALSE(manifest.checkCompatibility(matrix));
749 set(matrix, Sepolicy{30, {{25, 4}}});
750 EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
751}
752
Yifan Hong398f4c72017-04-13 20:18:01 -0700753TEST_F(LibVintfTest, Compat2) {
754 std::string deviceManifestXml =
755 "<manifest version=\"1.0\" type=\"device\">\n"
756 " <sepolicy>\n"
757 " <version>25.5</version>\n"
758 " </sepolicy>\n"
759 "</manifest>\n";
760 std::string frameworkManifestXml =
761 "<manifest version=\"1.0\" type=\"framework\">\n"
762 " <vndk>\n"
763 " <version>25.0.5</version>\n"
764 " </vndk>\n"
765 "</manifest>\n";
766 std::string deviceMatrixXml =
767 "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
768 " <vndk>\n"
769 " <version>25.0.5</version>\n"
770 " </vndk>\n"
771 "</compatibility-matrix>\n";
772 std::string frameworkMatrixXml =
773 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
774 " <kernel version=\"3.18.31\"></kernel>"
775 " <sepolicy>\n"
776 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
777 " <sepolicy-version>25.5</sepolicy-version>\n"
778 " </sepolicy>\n"
779 " <avb>\n"
780 " <vbmeta-version>2.1</vbmeta-version>\n"
781 " </avb>\n"
782 "</compatibility-matrix>\n";
783 RuntimeInfo runtimeInfo = testRuntimeInfo();
784 HalManifest devManifest;
785 HalManifest fwkManifest;
786 CompatibilityMatrix devMatrix;
787 CompatibilityMatrix fwkMatrix;
788 EXPECT_TRUE(gHalManifestConverter(&devManifest, deviceManifestXml));
789 EXPECT_TRUE(gHalManifestConverter(&fwkManifest, frameworkManifestXml));
790 EXPECT_TRUE(gCompatibilityMatrixConverter(&devMatrix, deviceMatrixXml));
791 EXPECT_TRUE(gCompatibilityMatrixConverter(&fwkMatrix, frameworkMatrixXml));
792 std::string error;
793 EXPECT_TRUE(devManifest.checkCompatibility(fwkMatrix, &error)) << error;
794 EXPECT_TRUE(fwkManifest.checkCompatibility(devMatrix, &error)) << error;
795 EXPECT_TRUE(runtimeInfo.checkCompatibility(fwkMatrix, &error)) << error;
796
797 bool systemMounted = false;
798 bool vendorMounted = false;
Yifan Hong65cc7222017-04-14 15:30:52 -0700799 bool systemUmounted = false;
800 bool vendorUmounted = false;
801 auto mountSystem = [&systemMounted] () { systemMounted = true; return OK; };
802 auto mountVendor = [&vendorMounted] () { vendorMounted = true; return OK; };
803 auto umountSystem = [&systemUmounted] () { systemUmounted = true; return OK; };
804 auto umountVendor = [&vendorUmounted] () { vendorUmounted = true; return OK; };
Yifan Hong398f4c72017-04-13 20:18:01 -0700805 auto nullManifestFunc = [](bool) -> const HalManifest * { return nullptr; };
806 auto runtimeInfoFunc = [&](bool) { return &runtimeInfo; };
807 // full OTA
808 EXPECT_EQ(COMPATIBLE, details::checkCompatibility(
809 {deviceManifestXml, deviceMatrixXml, frameworkManifestXml, frameworkMatrixXml},
Yifan Hong65cc7222017-04-14 15:30:52 -0700810 false /* mount */, mountSystem, umountSystem, mountVendor, umountVendor,
Yifan Hong398f4c72017-04-13 20:18:01 -0700811 nullManifestFunc,
812 nullManifestFunc,
813 runtimeInfoFunc,
814 &error)) << error;
815 EXPECT_FALSE(systemMounted);
816 EXPECT_FALSE(vendorMounted);
Yifan Hong65cc7222017-04-14 15:30:52 -0700817 EXPECT_FALSE(systemUmounted);
818 EXPECT_FALSE(vendorUmounted);
Yifan Hong398f4c72017-04-13 20:18:01 -0700819 EXPECT_EQ(COMPATIBLE, details::checkCompatibility(
820 {deviceManifestXml, deviceMatrixXml, frameworkManifestXml, frameworkMatrixXml},
Yifan Hong65cc7222017-04-14 15:30:52 -0700821 true /* mount */, mountSystem, umountSystem, mountVendor, umountVendor,
Yifan Hong398f4c72017-04-13 20:18:01 -0700822 nullManifestFunc,
823 nullManifestFunc,
824 runtimeInfoFunc,
825 &error)) << error;
826 EXPECT_FALSE(systemMounted);
827 EXPECT_FALSE(vendorMounted);
Yifan Hong65cc7222017-04-14 15:30:52 -0700828 EXPECT_FALSE(systemUmounted);
829 EXPECT_FALSE(vendorUmounted);
Yifan Hong398f4c72017-04-13 20:18:01 -0700830
831 // framework only OTA
832 EXPECT_GT(0, details::checkCompatibility(
833 {frameworkManifestXml, frameworkMatrixXml},
Yifan Hong65cc7222017-04-14 15:30:52 -0700834 false /* mount */, mountSystem, umountSystem, mountVendor, umountVendor,
Yifan Hong398f4c72017-04-13 20:18:01 -0700835 nullManifestFunc,
836 nullManifestFunc,
837 runtimeInfoFunc,
838 &error)) << "should not mount, thus info should be missing";
839 EXPECT_FALSE(systemMounted);
840 EXPECT_FALSE(vendorMounted);
Yifan Hong65cc7222017-04-14 15:30:52 -0700841 EXPECT_FALSE(systemUmounted);
842 EXPECT_FALSE(vendorUmounted);
Yifan Hong398f4c72017-04-13 20:18:01 -0700843 EXPECT_EQ(COMPATIBLE, details::checkCompatibility(
844 {frameworkManifestXml, frameworkMatrixXml},
Yifan Hong65cc7222017-04-14 15:30:52 -0700845 true /* mount */, mountSystem, umountSystem, mountVendor, umountVendor,
Yifan Hong398f4c72017-04-13 20:18:01 -0700846 nullManifestFunc,
847 [&](auto) { return &devManifest; },
848 runtimeInfoFunc,
849 &error)) << error;
850 EXPECT_FALSE(systemMounted);
851 EXPECT_TRUE(vendorMounted);
Yifan Hong65cc7222017-04-14 15:30:52 -0700852 EXPECT_FALSE(systemUmounted);
853 EXPECT_TRUE(vendorUmounted);
Yifan Hong398f4c72017-04-13 20:18:01 -0700854
855 CompatibilityMatrix failedFwkMatrix;
856 std::string failedFrameworkMatrixXml;
857
858 // Failed framework only OTA example 1: runtime info doesn't work (avb version)
859 failedFwkMatrix = {};
860 systemMounted = false;
861 vendorMounted = false;
862 failedFrameworkMatrixXml =
863 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
864 " <kernel version=\"3.18.31\"></kernel>"
865 " <sepolicy>\n"
866 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
867 " <sepolicy-version>25.5</sepolicy-version>\n"
868 " </sepolicy>\n"
869 " <avb>\n"
870 " <vbmeta-version>2.2</vbmeta-version>\n"
871 " </avb>\n"
872 "</compatibility-matrix>\n";
873 EXPECT_TRUE(gCompatibilityMatrixConverter(&failedFwkMatrix, failedFrameworkMatrixXml));
874 EXPECT_TRUE(devManifest.checkCompatibility(failedFwkMatrix, &error)) << error;
875 EXPECT_FALSE(runtimeInfo.checkCompatibility(failedFwkMatrix, &error)) << error;
876 EXPECT_EQ(INCOMPATIBLE, details::checkCompatibility(
877 {frameworkManifestXml, failedFrameworkMatrixXml},
Yifan Hong65cc7222017-04-14 15:30:52 -0700878 true /* mount */, mountSystem, umountSystem, mountVendor, umountVendor,
Yifan Hong398f4c72017-04-13 20:18:01 -0700879 nullManifestFunc,
880 [&](auto) { return &devManifest; },
881 runtimeInfoFunc,
882 &error)) << error;
883 EXPECT_FALSE(systemMounted);
884 EXPECT_TRUE(vendorMounted);
Yifan Hong65cc7222017-04-14 15:30:52 -0700885 EXPECT_FALSE(systemUmounted);
886 EXPECT_TRUE(vendorUmounted);
Yifan Hong398f4c72017-04-13 20:18:01 -0700887
888 // Failed framework only OTA example 2: unsupported HAL
889 failedFwkMatrix = {};
890 systemMounted = false;
891 vendorMounted = false;
892 failedFrameworkMatrixXml =
893 "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
894 " <hal format=\"hidl\" optional=\"false\">\n"
895 " <name>android.hardware.camera</name>\n"
896 " <version>2.0-5</version>\n"
897 " </hal>\n"
898 " <kernel version=\"3.18.31\"></kernel>"
899 " <sepolicy>\n"
900 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
901 " <sepolicy-version>25.5</sepolicy-version>\n"
902 " </sepolicy>\n"
903 " <avb>\n"
904 " <vbmeta-version>2.1</vbmeta-version>\n"
905 " </avb>\n"
906 "</compatibility-matrix>\n";
907 EXPECT_TRUE(gCompatibilityMatrixConverter(&failedFwkMatrix, failedFrameworkMatrixXml));
908 EXPECT_FALSE(devManifest.checkCompatibility(failedFwkMatrix, &error)) << error;
909 EXPECT_TRUE(runtimeInfo.checkCompatibility(failedFwkMatrix, &error)) << error;
910 EXPECT_EQ(INCOMPATIBLE, details::checkCompatibility(
911 {frameworkManifestXml, failedFrameworkMatrixXml},
Yifan Hong65cc7222017-04-14 15:30:52 -0700912 true /* mount */, mountSystem, umountSystem, mountVendor, umountVendor,
Yifan Hong398f4c72017-04-13 20:18:01 -0700913 nullManifestFunc,
914 [&](auto) { return &devManifest; },
915 runtimeInfoFunc,
916 &error)) << error;
917 EXPECT_FALSE(systemMounted);
918 EXPECT_TRUE(vendorMounted);
Yifan Hong65cc7222017-04-14 15:30:52 -0700919 EXPECT_FALSE(systemUmounted);
920 EXPECT_TRUE(vendorUmounted);
Yifan Hong398f4c72017-04-13 20:18:01 -0700921}
922
Yifan Honga9993572017-01-24 19:33:15 -0800923} // namespace vintf
924} // namespace android
925
Yifan Hong676447a2016-11-15 12:57:23 -0800926int main(int argc, char **argv) {
927 ::testing::InitGoogleTest(&argc, argv);
928 return RUN_ALL_TESTS();
929}