blob: 97815761a11385a91e4cacd98d669376caea9fde [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>
25#include <gtest/gtest.h>
26
Yifan Honga9993572017-01-24 19:33:15 -080027namespace android {
28namespace vintf {
Yifan Hong676447a2016-11-15 12:57:23 -080029
Yifan Honga9993572017-01-24 19:33:15 -080030struct LibVintfTest : public ::testing::Test {
Yifan Hong676447a2016-11-15 12:57:23 -080031public:
32 virtual void SetUp() override {
33 }
34 virtual void TearDown() override {
35 }
Yifan Honga9993572017-01-24 19:33:15 -080036 bool add(CompatibilityMatrix &cm, MatrixHal &&hal) {
37 return cm.add(std::move(hal));
38 }
39 bool add(CompatibilityMatrix &cm, MatrixKernel &&kernel) {
40 return cm.add(std::move(kernel));
41 }
42 bool add(VendorManifest &vm, ManifestHal &&hal) {
43 return vm.add(std::move(hal));
44 }
45 const ManifestHal *getHal(VendorManifest &vm, const std::string &name) {
46 return vm.getHal(name);
47 }
48 ConstMapValueIterable<std::string, ManifestHal> getHals(VendorManifest &vm) {
49 return vm.getHals();
50 }
51 bool isEqual(const CompatibilityMatrix &cm1, const CompatibilityMatrix &cm2) {
52 return cm1.hals == cm2.hals && cm1.kernels == cm2.kernels;
53 }
54 VendorManifest testVendorManifest() {
55 VendorManifest vm;
56 vm.add(ManifestHal::hal("android.hardware.camera", ImplLevel::SOC, "msm8892",
57 Version(2,0), Transport::HWBINDER));
58 vm.add(ManifestHal::hal("android.hardware.nfc", ImplLevel::GENERIC, "generic",
59 Version(1,0), Transport::PASSTHROUGH));
60
61 return vm;
62 }
Yifan Hong676447a2016-11-15 12:57:23 -080063};
64
Yifan Hongef6d4d32017-01-23 14:12:28 -080065
66TEST_F(LibVintfTest, Stringify) {
67 VendorManifest vm = testVendorManifest();
68 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/soc/msm8892/2.0:"
69 "hidl/android.hardware.nfc/passthrough/generic/generic/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -080070
71 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
72 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
73
74 VersionRange v(1, 2, 3);
75 EXPECT_EQ(to_string(v), "1.2-3");
76 VersionRange v2;
77 EXPECT_TRUE(parse("1.2-3", &v2));
78 EXPECT_EQ(v, v2);
79}
80
81TEST_F(LibVintfTest, VendorManifestConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -080082 VendorManifest vm = testVendorManifest();
Yifan Hong676447a2016-11-15 12:57:23 -080083 std::string xml = gVendorManifestConverter(vm);
84 EXPECT_EQ(xml,
85 "<manifest version=\"1.0\">\n"
86 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -080087 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -080088 " <transport>hwbinder</transport>\n"
89 " <impl level=\"soc\">msm8892</impl>\n"
90 " <version>2.0</version>\n"
91 " </hal>\n"
92 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -080093 " <name>android.hardware.nfc</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -080094 " <transport>passthrough</transport>\n"
95 " <impl level=\"generic\">generic</impl>\n"
96 " <version>1.0</version>\n"
97 " </hal>\n"
98 "</manifest>\n");
99}
100
101TEST_F(LibVintfTest, VersionConverter) {
102 Version v(3, 6);
103 std::string xml = gVersionConverter(v);
104 EXPECT_EQ(xml, "<version>3.6</version>\n");
105 Version v2;
106 EXPECT_TRUE(gVersionConverter(&v2, xml));
107 EXPECT_EQ(v, v2);
108}
109
110TEST_F(LibVintfTest, HalImplementationConverter) {
111 HalImplementation hl{ImplLevel::SOC, "msm8992"};
112 std::string xml = gHalImplementationConverter(hl);
113 EXPECT_EQ(xml, "<impl level=\"soc\">msm8992</impl>\n");
114 HalImplementation hl2;
115 EXPECT_TRUE(gHalImplementationConverter(&hl2, xml));
116 EXPECT_EQ(hl.impl, hl2.impl);
117 EXPECT_EQ(hl.implLevel, hl2.implLevel);
118}
119
120TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800121 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800122 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
123 false /* optional */};
124 std::string xml = gMatrixHalConverter(mh);
125 EXPECT_EQ(xml,
126 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800127 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800128 " <version>1.2-3</version>\n"
129 " <version>4.5-6</version>\n"
130 "</hal>\n");
131 MatrixHal mh2;
132 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
133 EXPECT_EQ(mh, mh2);
134}
135
136TEST_F(LibVintfTest, CompatibilityMatrixCoverter) {
137 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800138 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800139 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Honga9993572017-01-24 19:33:15 -0800140 false /* optional */}));
141 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800142 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Honga9993572017-01-24 19:33:15 -0800143 true /* optional */}));
144 EXPECT_TRUE(add(cm, MatrixKernel{Version(3, 18),
145 {{{"CONFIG_FOO"}, {"CONFIG_BAR"}}}}));
146 EXPECT_TRUE(add(cm, MatrixKernel{Version(4, 4),
147 {{{"CONFIG_BAZ"}, {"CONFIG_BAR"}}}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800148 std::string xml = gCompatibilityMatrixConverter(cm);
149 EXPECT_EQ(xml,
150 "<compatibility-matrix version=\"1.0\">\n"
151 " <hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800152 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800153 " <version>1.2-3</version>\n"
154 " <version>4.5-6</version>\n"
155 " </hal>\n"
156 " <hal format=\"native\" optional=\"true\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800157 " <name>android.hardware.nfc</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800158 " <version>4.5-6</version>\n"
159 " <version>10.11-12</version>\n"
160 " </hal>\n"
161 " <kernel version=\"3.18\">\n"
162 " <config>CONFIG_FOO</config>\n"
163 " <config>CONFIG_BAR</config>\n"
164 " </kernel>\n"
165 " <kernel version=\"4.4\">\n"
166 " <config>CONFIG_BAZ</config>\n"
167 " <config>CONFIG_BAR</config>\n"
168 " </kernel>\n"
169 " <sepolicy/>\n"
170 "</compatibility-matrix>\n");
171 CompatibilityMatrix cm2;
172 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Honga9993572017-01-24 19:33:15 -0800173 EXPECT_TRUE(isEqual(cm, cm2));
Yifan Hong676447a2016-11-15 12:57:23 -0800174}
175
176TEST_F(LibVintfTest, IsValid) {
177 EXPECT_TRUE(ManifestHal().isValid());
178 EXPECT_TRUE(VendorManifest().isValid());
179
Yifan Hongef6d4d32017-01-23 14:12:28 -0800180 VendorManifest vm = testVendorManifest();
Yifan Hong676447a2016-11-15 12:57:23 -0800181 EXPECT_TRUE(vm.isValid());
182
Yifan Hongef6d4d32017-01-23 14:12:28 -0800183 ManifestHal invalidHal = ManifestHal::hal("android.hardware.camera", ImplLevel::SOC, "msm8892",
Yifan Hong676447a2016-11-15 12:57:23 -0800184 {{Version(2,0), Version(2,1)}}, Transport::PASSTHROUGH);
185 EXPECT_FALSE(invalidHal.isValid());
186 VendorManifest vm2;
Yifan Honga9993572017-01-24 19:33:15 -0800187 add(vm2, std::move(invalidHal));
Yifan Hong676447a2016-11-15 12:57:23 -0800188 EXPECT_FALSE(vm2.isValid());
189}
190
Yifan Hongef6d4d32017-01-23 14:12:28 -0800191TEST_F(LibVintfTest, VendorManifestGetHal) {
192 VendorManifest vm = testVendorManifest();
Yifan Honga9993572017-01-24 19:33:15 -0800193 EXPECT_NE(getHal(vm, "android.hardware.camera"), nullptr);
194 EXPECT_EQ(getHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800195
196 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
197 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800198 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800199 EXPECT_EQ(hal.name, arr[i++]);
200 }
201}
202
Yifan Honga9993572017-01-24 19:33:15 -0800203} // namespace vintf
204} // namespace android
205
Yifan Hong676447a2016-11-15 12:57:23 -0800206int main(int argc, char **argv) {
207 ::testing::InitGoogleTest(&argc, argv);
208 return RUN_ALL_TESTS();
209}