blob: def1ac85b2720da53b4dd16ca1e30458acc471f5 [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 }
Yifan Hong558380a2017-02-09 15:37:32 -080046 void set(CompatibilityMatrix &cm, Sepolicy &&sepolicy) {
47 cm.sepolicy = sepolicy;
48 }
Yifan Honga9993572017-01-24 19:33:15 -080049 const ManifestHal *getHal(VendorManifest &vm, const std::string &name) {
50 return vm.getHal(name);
51 }
52 ConstMapValueIterable<std::string, ManifestHal> getHals(VendorManifest &vm) {
53 return vm.getHals();
54 }
55 bool isEqual(const CompatibilityMatrix &cm1, const CompatibilityMatrix &cm2) {
56 return cm1.hals == cm2.hals && cm1.kernels == cm2.kernels;
57 }
Yifan Hong5a06ef72017-01-24 19:54:24 -080058 bool isValid(const ManifestHal &mh) {
59 return mh.isValid();
60 }
Yifan Honga9993572017-01-24 19:33:15 -080061 VendorManifest testVendorManifest() {
62 VendorManifest vm;
63 vm.add(ManifestHal::hal("android.hardware.camera", ImplLevel::SOC, "msm8892",
64 Version(2,0), Transport::HWBINDER));
65 vm.add(ManifestHal::hal("android.hardware.nfc", ImplLevel::GENERIC, "generic",
66 Version(1,0), Transport::PASSTHROUGH));
67
68 return vm;
69 }
Yifan Hong676447a2016-11-15 12:57:23 -080070};
71
Yifan Hongef6d4d32017-01-23 14:12:28 -080072
73TEST_F(LibVintfTest, Stringify) {
74 VendorManifest vm = testVendorManifest();
75 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/soc/msm8892/2.0:"
76 "hidl/android.hardware.nfc/passthrough/generic/generic/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -080077
78 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
79 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
80
81 VersionRange v(1, 2, 3);
82 EXPECT_EQ(to_string(v), "1.2-3");
83 VersionRange v2;
84 EXPECT_TRUE(parse("1.2-3", &v2));
85 EXPECT_EQ(v, v2);
86}
87
88TEST_F(LibVintfTest, VendorManifestConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -080089 VendorManifest vm = testVendorManifest();
Yifan Hong676447a2016-11-15 12:57:23 -080090 std::string xml = gVendorManifestConverter(vm);
91 EXPECT_EQ(xml,
92 "<manifest version=\"1.0\">\n"
93 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -080094 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -080095 " <transport>hwbinder</transport>\n"
96 " <impl level=\"soc\">msm8892</impl>\n"
97 " <version>2.0</version>\n"
98 " </hal>\n"
99 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800100 " <name>android.hardware.nfc</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800101 " <transport>passthrough</transport>\n"
102 " <impl level=\"generic\">generic</impl>\n"
103 " <version>1.0</version>\n"
104 " </hal>\n"
105 "</manifest>\n");
106}
107
108TEST_F(LibVintfTest, VersionConverter) {
109 Version v(3, 6);
110 std::string xml = gVersionConverter(v);
111 EXPECT_EQ(xml, "<version>3.6</version>\n");
112 Version v2;
113 EXPECT_TRUE(gVersionConverter(&v2, xml));
114 EXPECT_EQ(v, v2);
115}
116
117TEST_F(LibVintfTest, HalImplementationConverter) {
118 HalImplementation hl{ImplLevel::SOC, "msm8992"};
119 std::string xml = gHalImplementationConverter(hl);
120 EXPECT_EQ(xml, "<impl level=\"soc\">msm8992</impl>\n");
121 HalImplementation hl2;
122 EXPECT_TRUE(gHalImplementationConverter(&hl2, xml));
123 EXPECT_EQ(hl.impl, hl2.impl);
124 EXPECT_EQ(hl.implLevel, hl2.implLevel);
125}
126
127TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800128 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800129 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
130 false /* optional */};
131 std::string xml = gMatrixHalConverter(mh);
132 EXPECT_EQ(xml,
133 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800134 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800135 " <version>1.2-3</version>\n"
136 " <version>4.5-6</version>\n"
137 "</hal>\n");
138 MatrixHal mh2;
139 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
140 EXPECT_EQ(mh, mh2);
141}
142
Yifan Hong3f5489a2017-02-08 11:14:21 -0800143TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
144
145 KernelConfigTypedValue converted;
146
147 auto testOne = [] (const KernelConfigTypedValue &original,
148 const std::string &expectXml) {
149 std::string xml;
150 KernelConfigTypedValue converted;
151 xml = gKernelConfigTypedValueConverter(original);
152 EXPECT_EQ(xml, expectXml);
153 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
154 EXPECT_EQ(original, converted);
155 };
156
157 auto testParse = [] (const KernelConfigTypedValue &original,
158 const std::string &xml) {
159 KernelConfigTypedValue converted;
160 EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
161 EXPECT_EQ(original, converted);
162 };
163
164 testOne(KernelConfigTypedValue("stringvalue"),
165 "<value type=\"string\">stringvalue</value>\n");
166 testOne(KernelConfigTypedValue(""),
167 "<value type=\"string\"></value>\n");
168
169 testOne(KernelConfigTypedValue(Tristate::YES),
170 "<value type=\"tristate\">y</value>\n");
171 testOne(KernelConfigTypedValue(Tristate::NO),
172 "<value type=\"tristate\">n</value>\n");
173 testOne(KernelConfigTypedValue(Tristate::MODULE),
174 "<value type=\"tristate\">m</value>\n");
175 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
176 "<value type=\"tristate\">q</value>\n"));
177
178 testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
179 "<value type=\"range\">4-20</value>\n");
180 testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
181 "<value type=\"range\">0-18446744073709551615</value>\n");
182 testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
183 "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
184
185 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
186 "<value type=\"int\">-18446744073709551616</value>\n"));
187
188 testOne(KernelConfigTypedValue(INT64_MIN),
189 "<value type=\"int\">-9223372036854775808</value>\n");
190 testParse(KernelConfigTypedValue(INT64_MIN),
191 "<value type=\"int\">0x8000000000000000</value>\n");
192 testParse(KernelConfigTypedValue(INT64_MIN),
193 "<value type=\"int\">-0X8000000000000000</value>\n");
194
195 testParse(KernelConfigTypedValue(INT64_MIN + 1),
196 "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
197
198 testParse(KernelConfigTypedValue(-0x50),
199 "<value type=\"int\">-0x50</value>\n");
200
201 testOne(KernelConfigTypedValue(0),
202 "<value type=\"int\">0</value>\n");
203
204 // Truncation for underflow.
205 testParse(KernelConfigTypedValue(1),
206 "<value type=\"int\">-0xffffffffffffffff</value>\n");
207 testParse(KernelConfigTypedValue(1),
208 "<value type=\"int\">-18446744073709551615</value>\n");
209
210 testOne(KernelConfigTypedValue(INT64_MAX),
211 "<value type=\"int\">9223372036854775807</value>\n");
212 testParse(KernelConfigTypedValue(INT64_MAX),
213 "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
214 // Truncation for underflow.
215 testParse(KernelConfigTypedValue(INT64_MAX),
216 "<value type=\"int\">-9223372036854775809</value>\n");
217
218 testParse(KernelConfigTypedValue(-1),
219 "<value type=\"int\">18446744073709551615</value>\n");
220 testParse(KernelConfigTypedValue(-1),
221 "<value type=\"int\">0xffffffffffffffff</value>\n");
222
223 EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
224 "<value type=\"int\">18446744073709551616</value>\n"));
225}
226
Yifan Hong676447a2016-11-15 12:57:23 -0800227TEST_F(LibVintfTest, CompatibilityMatrixCoverter) {
228 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800229 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800230 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Honga9993572017-01-24 19:33:15 -0800231 false /* optional */}));
232 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800233 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Honga9993572017-01-24 19:33:15 -0800234 true /* optional */}));
Yifan Hong3f5489a2017-02-08 11:14:21 -0800235 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
236 {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
237 EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
238 {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
Yifan Hong558380a2017-02-09 15:37:32 -0800239 set(cm, Sepolicy(30, {1, 3}));
Yifan Hong676447a2016-11-15 12:57:23 -0800240 std::string xml = gCompatibilityMatrixConverter(cm);
241 EXPECT_EQ(xml,
Yifan Hong3f5489a2017-02-08 11:14:21 -0800242 "<compatibility-matrix version=\"1.0\">\n"
243 " <hal format=\"native\" optional=\"false\">\n"
244 " <name>android.hardware.camera</name>\n"
245 " <version>1.2-3</version>\n"
246 " <version>4.5-6</version>\n"
247 " </hal>\n"
248 " <hal format=\"native\" optional=\"true\">\n"
249 " <name>android.hardware.nfc</name>\n"
250 " <version>4.5-6</version>\n"
251 " <version>10.11-12</version>\n"
252 " </hal>\n"
253 " <kernel version=\"3.18\" minlts=\"3.18.22\">\n"
254 " <config>\n"
255 " <key>CONFIG_FOO</key>\n"
256 " <value type=\"tristate\">y</value>\n"
257 " </config>\n"
258 " <config>\n"
259 " <key>CONFIG_BAR</key>\n"
260 " <value type=\"string\">stringvalue</value>\n"
261 " </config>\n"
262 " </kernel>\n"
263 " <kernel version=\"4.4\" minlts=\"4.4.1\">\n"
264 " <config>\n"
265 " <key>CONFIG_BAZ</key>\n"
266 " <value type=\"int\">20</value>\n"
267 " </config>\n"
268 " <config>\n"
269 " <key>CONFIG_BAR</key>\n"
270 " <value type=\"range\">3-5</value>\n"
271 " </config>\n"
272 " </kernel>\n"
Yifan Hong558380a2017-02-09 15:37:32 -0800273 " <sepolicy>\n"
274 " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
275 " <sepolicy-version>1-3</sepolicy-version>\n"
276 " </sepolicy>\n"
Yifan Hong3f5489a2017-02-08 11:14:21 -0800277 "</compatibility-matrix>\n");
Yifan Hong676447a2016-11-15 12:57:23 -0800278 CompatibilityMatrix cm2;
279 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Honga9993572017-01-24 19:33:15 -0800280 EXPECT_TRUE(isEqual(cm, cm2));
Yifan Hong676447a2016-11-15 12:57:23 -0800281}
282
283TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800284 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800285
Yifan Hongef6d4d32017-01-23 14:12:28 -0800286 ManifestHal invalidHal = ManifestHal::hal("android.hardware.camera", ImplLevel::SOC, "msm8892",
Yifan Hong676447a2016-11-15 12:57:23 -0800287 {{Version(2,0), Version(2,1)}}, Transport::PASSTHROUGH);
Yifan Hong5a06ef72017-01-24 19:54:24 -0800288 EXPECT_FALSE(isValid(invalidHal));
Yifan Hong676447a2016-11-15 12:57:23 -0800289 VendorManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800290 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800291}
292
Yifan Hongef6d4d32017-01-23 14:12:28 -0800293TEST_F(LibVintfTest, VendorManifestGetHal) {
294 VendorManifest vm = testVendorManifest();
Yifan Honga9993572017-01-24 19:33:15 -0800295 EXPECT_NE(getHal(vm, "android.hardware.camera"), nullptr);
296 EXPECT_EQ(getHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800297
298 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
299 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800300 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800301 EXPECT_EQ(hal.name, arr[i++]);
302 }
303}
304
Yifan Honga9993572017-01-24 19:33:15 -0800305} // namespace vintf
306} // namespace android
307
Yifan Hong676447a2016-11-15 12:57:23 -0800308int main(int argc, char **argv) {
309 ::testing::InitGoogleTest(&argc, argv);
310 return RUN_ALL_TESTS();
311}