blob: 76f8acb12e9355e6294158f8bbc0655585b7f2cf [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 }
Yifan Hong5a06ef72017-01-24 19:54:24 -080054 bool isValid(const ManifestHal &mh) {
55 return mh.isValid();
56 }
Yifan Honga9993572017-01-24 19:33:15 -080057 VendorManifest testVendorManifest() {
58 VendorManifest vm;
59 vm.add(ManifestHal::hal("android.hardware.camera", ImplLevel::SOC, "msm8892",
60 Version(2,0), Transport::HWBINDER));
61 vm.add(ManifestHal::hal("android.hardware.nfc", ImplLevel::GENERIC, "generic",
62 Version(1,0), Transport::PASSTHROUGH));
63
64 return vm;
65 }
Yifan Hong676447a2016-11-15 12:57:23 -080066};
67
Yifan Hongef6d4d32017-01-23 14:12:28 -080068
69TEST_F(LibVintfTest, Stringify) {
70 VendorManifest vm = testVendorManifest();
71 EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/soc/msm8892/2.0:"
72 "hidl/android.hardware.nfc/passthrough/generic/generic/1.0");
Yifan Hong676447a2016-11-15 12:57:23 -080073
74 EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
75 EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
76
77 VersionRange v(1, 2, 3);
78 EXPECT_EQ(to_string(v), "1.2-3");
79 VersionRange v2;
80 EXPECT_TRUE(parse("1.2-3", &v2));
81 EXPECT_EQ(v, v2);
82}
83
84TEST_F(LibVintfTest, VendorManifestConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -080085 VendorManifest vm = testVendorManifest();
Yifan Hong676447a2016-11-15 12:57:23 -080086 std::string xml = gVendorManifestConverter(vm);
87 EXPECT_EQ(xml,
88 "<manifest version=\"1.0\">\n"
89 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -080090 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -080091 " <transport>hwbinder</transport>\n"
92 " <impl level=\"soc\">msm8892</impl>\n"
93 " <version>2.0</version>\n"
94 " </hal>\n"
95 " <hal format=\"hidl\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -080096 " <name>android.hardware.nfc</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -080097 " <transport>passthrough</transport>\n"
98 " <impl level=\"generic\">generic</impl>\n"
99 " <version>1.0</version>\n"
100 " </hal>\n"
101 "</manifest>\n");
102}
103
104TEST_F(LibVintfTest, VersionConverter) {
105 Version v(3, 6);
106 std::string xml = gVersionConverter(v);
107 EXPECT_EQ(xml, "<version>3.6</version>\n");
108 Version v2;
109 EXPECT_TRUE(gVersionConverter(&v2, xml));
110 EXPECT_EQ(v, v2);
111}
112
113TEST_F(LibVintfTest, HalImplementationConverter) {
114 HalImplementation hl{ImplLevel::SOC, "msm8992"};
115 std::string xml = gHalImplementationConverter(hl);
116 EXPECT_EQ(xml, "<impl level=\"soc\">msm8992</impl>\n");
117 HalImplementation hl2;
118 EXPECT_TRUE(gHalImplementationConverter(&hl2, xml));
119 EXPECT_EQ(hl.impl, hl2.impl);
120 EXPECT_EQ(hl.implLevel, hl2.implLevel);
121}
122
123TEST_F(LibVintfTest, MatrixHalConverter) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800124 MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800125 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
126 false /* optional */};
127 std::string xml = gMatrixHalConverter(mh);
128 EXPECT_EQ(xml,
129 "<hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800130 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800131 " <version>1.2-3</version>\n"
132 " <version>4.5-6</version>\n"
133 "</hal>\n");
134 MatrixHal mh2;
135 EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
136 EXPECT_EQ(mh, mh2);
137}
138
139TEST_F(LibVintfTest, CompatibilityMatrixCoverter) {
140 CompatibilityMatrix cm;
Yifan Honga9993572017-01-24 19:33:15 -0800141 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
Yifan Hong676447a2016-11-15 12:57:23 -0800142 {{VersionRange(1,2,3), VersionRange(4,5,6)}},
Yifan Honga9993572017-01-24 19:33:15 -0800143 false /* optional */}));
144 EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
Yifan Hong676447a2016-11-15 12:57:23 -0800145 {{VersionRange(4,5,6), VersionRange(10,11,12)}},
Yifan Honga9993572017-01-24 19:33:15 -0800146 true /* optional */}));
147 EXPECT_TRUE(add(cm, MatrixKernel{Version(3, 18),
148 {{{"CONFIG_FOO"}, {"CONFIG_BAR"}}}}));
149 EXPECT_TRUE(add(cm, MatrixKernel{Version(4, 4),
150 {{{"CONFIG_BAZ"}, {"CONFIG_BAR"}}}}));
Yifan Hong676447a2016-11-15 12:57:23 -0800151 std::string xml = gCompatibilityMatrixConverter(cm);
152 EXPECT_EQ(xml,
153 "<compatibility-matrix version=\"1.0\">\n"
154 " <hal format=\"native\" optional=\"false\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800155 " <name>android.hardware.camera</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800156 " <version>1.2-3</version>\n"
157 " <version>4.5-6</version>\n"
158 " </hal>\n"
159 " <hal format=\"native\" optional=\"true\">\n"
Yifan Hongef6d4d32017-01-23 14:12:28 -0800160 " <name>android.hardware.nfc</name>\n"
Yifan Hong676447a2016-11-15 12:57:23 -0800161 " <version>4.5-6</version>\n"
162 " <version>10.11-12</version>\n"
163 " </hal>\n"
164 " <kernel version=\"3.18\">\n"
165 " <config>CONFIG_FOO</config>\n"
166 " <config>CONFIG_BAR</config>\n"
167 " </kernel>\n"
168 " <kernel version=\"4.4\">\n"
169 " <config>CONFIG_BAZ</config>\n"
170 " <config>CONFIG_BAR</config>\n"
171 " </kernel>\n"
172 " <sepolicy/>\n"
173 "</compatibility-matrix>\n");
174 CompatibilityMatrix cm2;
175 EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
Yifan Honga9993572017-01-24 19:33:15 -0800176 EXPECT_TRUE(isEqual(cm, cm2));
Yifan Hong676447a2016-11-15 12:57:23 -0800177}
178
179TEST_F(LibVintfTest, IsValid) {
Yifan Hong5a06ef72017-01-24 19:54:24 -0800180 EXPECT_TRUE(isValid(ManifestHal()));
Yifan Hong676447a2016-11-15 12:57:23 -0800181
Yifan Hongef6d4d32017-01-23 14:12:28 -0800182 ManifestHal invalidHal = ManifestHal::hal("android.hardware.camera", ImplLevel::SOC, "msm8892",
Yifan Hong676447a2016-11-15 12:57:23 -0800183 {{Version(2,0), Version(2,1)}}, Transport::PASSTHROUGH);
Yifan Hong5a06ef72017-01-24 19:54:24 -0800184 EXPECT_FALSE(isValid(invalidHal));
Yifan Hong676447a2016-11-15 12:57:23 -0800185 VendorManifest vm2;
Yifan Hong5a06ef72017-01-24 19:54:24 -0800186 EXPECT_FALSE(add(vm2, std::move(invalidHal)));
Yifan Hong676447a2016-11-15 12:57:23 -0800187}
188
Yifan Hongef6d4d32017-01-23 14:12:28 -0800189TEST_F(LibVintfTest, VendorManifestGetHal) {
190 VendorManifest vm = testVendorManifest();
Yifan Honga9993572017-01-24 19:33:15 -0800191 EXPECT_NE(getHal(vm, "android.hardware.camera"), nullptr);
192 EXPECT_EQ(getHal(vm, "non-existent"), nullptr);
Yifan Hongef6d4d32017-01-23 14:12:28 -0800193
194 std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
195 size_t i = 0;
Yifan Honga9993572017-01-24 19:33:15 -0800196 for (const auto &hal : getHals(vm)) {
Yifan Hongef6d4d32017-01-23 14:12:28 -0800197 EXPECT_EQ(hal.name, arr[i++]);
198 }
199}
200
Yifan Honga9993572017-01-24 19:33:15 -0800201} // namespace vintf
202} // namespace android
203
Yifan Hong676447a2016-11-15 12:57:23 -0800204int main(int argc, char **argv) {
205 ::testing::InitGoogleTest(&argc, argv);
206 return RUN_ALL_TESTS();
207}