blob: 7b7182c5d4c5fe30cb64a7d6b2eccb02b26a34c9 [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
19#include <vintf/parse_string.h>
20#include <vintf/parse_xml.h>
21#include <vintf/CompatibilityMatrix.h>
22#include <vintf/VendorManifest.h>
23
24#include <android-base/logging.h>
Yifan Hong3f5489a2017-02-08 11:14:21 -080025#include <android-base/parseint.h>
Yifan Hong676447a2016-11-15 12:57:23 -080026#include <gtest/gtest.h>
27
Yifan Honga9993572017-01-24 19:33:15 -080028namespace android {
29namespace vintf {
Yifan Hong676447a2016-11-15 12:57:23 -080030
Yifan Honga9993572017-01-24 19:33:15 -080031struct LibVintfTest : public ::testing::Test {
Yifan Hong676447a2016-11-15 12:57:23 -080032public:
33 virtual void SetUp() override {
34 }
35 virtual void TearDown() override {
36 }
Yifan Honga9993572017-01-24 19:33:15 -080037 bool add(CompatibilityMatrix &cm, MatrixHal &&hal) {
38 return cm.add(std::move(hal));
39 }
40 bool add(CompatibilityMatrix &cm, MatrixKernel &&kernel) {
41 return cm.add(std::move(kernel));
42 }
43 bool add(VendorManifest &vm, ManifestHal &&hal) {
44 return vm.add(std::move(hal));
45 }
46 const ManifestHal *getHal(VendorManifest &vm, const std::string &name) {
47 return vm.getHal(name);
48 }
49 ConstMapValueIterable<std::string, ManifestHal> getHals(VendorManifest &vm) {
50 return vm.getHals();
51 }
52 bool isEqual(const CompatibilityMatrix &cm1, const CompatibilityMatrix &cm2) {
53 return cm1.hals == cm2.hals && cm1.kernels == cm2.kernels;
54 }
Yifan Hong5a06ef72017-01-24 19:54:24 -080055 bool isValid(const ManifestHal &mh) {
56 return mh.isValid();
57 }
Yifan Honga9993572017-01-24 19:33:15 -080058 VendorManifest testVendorManifest() {
59 VendorManifest vm;
60 vm.add(ManifestHal::hal("android.hardware.camera", ImplLevel::SOC, "msm8892",
61 Version(2,0), Transport::HWBINDER));
62 vm.add(ManifestHal::hal("android.hardware.nfc", ImplLevel::GENERIC, "generic",
63 Version(1,0), Transport::PASSTHROUGH));
64
65 return vm;
66 }
Yifan Hong676447a2016-11-15 12:57:23 -080067};
68
Yifan Hongef6d4d32017-01-23 14:12:28 -080069
70TEST_F(LibVintfTest, Stringify) {
71 VendorManifest vm = testVendorManifest();
72 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/soc/msm8892/2.0:"
73 "hidl/android.hardware.nfc/passthrough/generic/generic/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -080074
75 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
76 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
77
78 VersionRange v(1, 2, 3);
79 EXPECT_EQ(to_string(v), "1.2-3");
80 VersionRange v2;
81 EXPECT_TRUE(parse("1.2-3", &v2));
82 EXPECT_EQ(v, v2);
83}
84
85TEST_F(LibVintfTest, VendorManifestConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -080086 VendorManifest vm = testVendorManifest();
Yifan Hong676447a2016-11-15 12:57:23 -080087 std::string xml = gVendorManifestConverter(vm);
88 EXPECT_EQ(xml,
89 "<manifest version=\"1.0\">\n"
90 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -080091 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -080092 " <transport>hwbinder</transport>\n"
93 " <impl level=\"soc\">msm8892</impl>\n"
94 " <version>2.0</version>\n"
95 " </hal>\n"
96 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -080097 " <name>android.hardware.nfc</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -080098 " <transport>passthrough</transport>\n"
99 " <impl level=\"generic\">generic</impl>\n"
100 " <version>1.0</version>\n"
101 " </hal>\n"
102 "</manifest>\n");
103}
104
105TEST_F(LibVintfTest, VersionConverter) {
106 Version v(3, 6);
107 std::string xml = gVersionConverter(v);
108 EXPECT_EQ(xml, "<version>3.6</version>\n");
109 Version v2;
110 EXPECT_TRUE(gVersionConverter(&v2, xml));
111 EXPECT_EQ(v, v2);
112}
113
114TEST_F(LibVintfTest, HalImplementationConverter) {
115 HalImplementation hl{ImplLevel::SOC, "msm8992"};
116 std::string xml = gHalImplementationConverter(hl);
117 EXPECT_EQ(xml, "<impl level=\"soc\">msm8992</impl>\n");
118 HalImplementation hl2;
119 EXPECT_TRUE(gHalImplementationConverter(&hl2, xml));
120 EXPECT_EQ(hl.impl, hl2.impl);
121 EXPECT_EQ(hl.implLevel, hl2.implLevel);
122}
123
124TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800125 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800126 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
127 false /* optional */};
128 std::string xml = gMatrixHalConverter(mh);
129 EXPECT_EQ(xml,
130 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800131 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800132 " <version>1.2-3</version>\n"
133 " <version>4.5-6</version>\n"
134 "</hal>\n");
135 MatrixHal mh2;
136 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
137 EXPECT_EQ(mh, mh2);
138}
139
Yifan Hong3f5489a2017-02-08 11:14:21 -0800140TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
141
142 KernelConfigTypedValue converted;
143
144 auto testOne = [] (const KernelConfigTypedValue &original,
145 const std::string &expectXml) {
146 std::string xml;
147 KernelConfigTypedValue converted;
148 xml = gKernelConfigTypedValueConverter(original);
149 EXPECT_EQ(xml, expectXml);
150 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
151 EXPECT_EQ(original, converted);
152 };
153
154 auto testParse = [] (const KernelConfigTypedValue &original,
155 const std::string &xml) {
156 KernelConfigTypedValue converted;
157 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
158 EXPECT_EQ(original, converted);
159 };
160
161 testOne(KernelConfigTypedValue("stringvalue"),
162 "<value type=\"string\">stringvalue</value>\n");
163 testOne(KernelConfigTypedValue(""),
164 "<value type=\"string\"></value>\n");
165
166 testOne(KernelConfigTypedValue(Tristate::YES),
167 "<value type=\"tristate\">y</value>\n");
168 testOne(KernelConfigTypedValue(Tristate::NO),
169 "<value type=\"tristate\">n</value>\n");
170 testOne(KernelConfigTypedValue(Tristate::MODULE),
171 "<value type=\"tristate\">m</value>\n");
172 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
173 "<value type=\"tristate\">q</value>\n"));
174
175 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
176 "<value type=\"range\">4-20</value>\n");
177 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
178 "<value type=\"range\">0-18446744073709551615</value>\n");
179 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
180 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
181
182 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
183 "<value type=\"int\">-18446744073709551616</value>\n"));
184
185 testOne(KernelConfigTypedValue(INT64_MIN),
186 "<value type=\"int\">-9223372036854775808</value>\n");
187 testParse(KernelConfigTypedValue(INT64_MIN),
188 "<value type=\"int\">0x8000000000000000</value>\n");
189 testParse(KernelConfigTypedValue(INT64_MIN),
190 "<value type=\"int\">-0X8000000000000000</value>\n");
191
192 testParse(KernelConfigTypedValue(INT64_MIN + 1),
193 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
194
195 testParse(KernelConfigTypedValue(-0x50),
196 "<value type=\"int\">-0x50</value>\n");
197
198 testOne(KernelConfigTypedValue(0),
199 "<value type=\"int\">0</value>\n");
200
201 // Truncation for underflow.
202 testParse(KernelConfigTypedValue(1),
203 "<value type=\"int\">-0xffffffffffffffff</value>\n");
204 testParse(KernelConfigTypedValue(1),
205 "<value type=\"int\">-18446744073709551615</value>\n");
206
207 testOne(KernelConfigTypedValue(INT64_MAX),
208 "<value type=\"int\">9223372036854775807</value>\n");
209 testParse(KernelConfigTypedValue(INT64_MAX),
210 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
211 // Truncation for underflow.
212 testParse(KernelConfigTypedValue(INT64_MAX),
213 "<value type=\"int\">-9223372036854775809</value>\n");
214
215 testParse(KernelConfigTypedValue(-1),
216 "<value type=\"int\">18446744073709551615</value>\n");
217 testParse(KernelConfigTypedValue(-1),
218 "<value type=\"int\">0xffffffffffffffff</value>\n");
219
220 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
221 "<value type=\"int\">18446744073709551616</value>\n"));
222}
223
Yifan Hong676447a2016-11-15 12:57:23 -0800224TEST_F(LibVintfTest, CompatibilityMatrixCoverter) {
225 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800226 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800227 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Honga9993572017-01-24 19:33:15 -0800228 false /* optional */}));
229 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800230 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Honga9993572017-01-24 19:33:15 -0800231 true /* optional */}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800232 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
233 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
234 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
235 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800236 std::string xml = gCompatibilityMatrixConverter(cm);
237 EXPECT_EQ(xml,
Yifan Hong3f5489a2017-02-08 11:14:21 -0800238 "<compatibility-matrix version=\"1.0\">\n"
239 " <hal format=\"native\" optional=\"false\">\n"
240 " <name>android.hardware.camera</name>\n"
241 " <version>1.2-3</version>\n"
242 " <version>4.5-6</version>\n"
243 " </hal>\n"
244 " <hal format=\"native\" optional=\"true\">\n"
245 " <name>android.hardware.nfc</name>\n"
246 " <version>4.5-6</version>\n"
247 " <version>10.11-12</version>\n"
248 " </hal>\n"
249 " <kernel version=\"3.18\" minlts=\"3.18.22\">\n"
250 " <config>\n"
251 " <key>CONFIG_FOO</key>\n"
252 " <value type=\"tristate\">y</value>\n"
253 " </config>\n"
254 " <config>\n"
255 " <key>CONFIG_BAR</key>\n"
256 " <value type=\"string\">stringvalue</value>\n"
257 " </config>\n"
258 " </kernel>\n"
259 " <kernel version=\"4.4\" minlts=\"4.4.1\">\n"
260 " <config>\n"
261 " <key>CONFIG_BAZ</key>\n"
262 " <value type=\"int\">20</value>\n"
263 " </config>\n"
264 " <config>\n"
265 " <key>CONFIG_BAR</key>\n"
266 " <value type=\"range\">3-5</value>\n"
267 " </config>\n"
268 " </kernel>\n"
269 " <sepolicy/>\n"
270 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800271 CompatibilityMatrix cm2;
272 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Honga9993572017-01-24 19:33:15 -0800273 EXPECT_TRUE(isEqual(cm, cm2));
Yifan Hong676447a2016-11-15 12:57:23 -0800274}
275
276TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800277 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800278
Yifan Hongef6d4d32017-01-23 14:12:28 -0800279 ManifestHal invalidHal = ManifestHal::hal("android.hardware.camera", ImplLevel::SOC, "msm8892",
Yifan Hong676447a2016-11-15 12:57:23 -0800280 {{Version(2,0), Version(2,1)}}, Transport::PASSTHROUGH);
Yifan Hong5a06ef72017-01-24 19:54:24 -0800281 EXPECT_FALSE(isValid(invalidHal));
Yifan Hong676447a2016-11-15 12:57:23 -0800282 VendorManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800283 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800284}
285
Yifan Hongef6d4d32017-01-23 14:12:28 -0800286TEST_F(LibVintfTest, VendorManifestGetHal) {
287 VendorManifest vm = testVendorManifest();
Yifan Honga9993572017-01-24 19:33:15 -0800288 EXPECT_NE(getHal(vm, "android.hardware.camera"), nullptr);
289 EXPECT_EQ(getHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800290
291 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
292 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800293 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800294 EXPECT_EQ(hal.name, arr[i++]);
295 }
296}
297
Yifan Honga9993572017-01-24 19:33:15 -0800298} // namespace vintf
299} // namespace android
300
Yifan Hong676447a2016-11-15 12:57:23 -0800301int main(int argc, char **argv) {
302 ::testing::InitGoogleTest(&argc, argv);
303 return RUN_ALL_TESTS();
304}