1 /*
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_NDEBUG 0
18 #define LOG_TAG "hidl_test_java_native"
19
20 #include <android-base/logging.h>
21
22 #include <android/hardware/tests/baz/1.0/IBaz.h>
23
24 #include <hidl/LegacySupport.h>
25
26 #include <gtest/gtest.h>
27
28 #include <hidl/HidlTransportSupport.h>
29 #include <hidl/Status.h>
30 using ::android::sp;
31 using ::android::hardware::tests::baz::V1_0::IBase;
32 using ::android::hardware::tests::baz::V1_0::IBaz;
33 using ::android::hardware::tests::baz::V1_0::IBazCallback;
34
35 using ::android::hardware::hidl_array;
36 using ::android::hardware::hidl_vec;
37 using ::android::hardware::hidl_string;
38 using ::android::hardware::configureRpcThreadpool;
39 using ::android::hardware::defaultPassthroughServiceImplementation;
40 using ::android::hardware::joinRpcThreadpool;
41 using ::android::hardware::Return;
42 using ::android::hardware::Void;
43
44 struct BazCallback : public IBazCallback {
45 Return<void> heyItsMe(const sp<IBazCallback> &cb) override;
46 Return<void> hey() override;
47 };
48
heyItsMe(const sp<IBazCallback> & cb)49 Return<void> BazCallback::heyItsMe(
50 const sp<IBazCallback> &cb) {
51 LOG(INFO) << "SERVER: heyItsMe cb = " << cb.get();
52
53 return Void();
54 }
55
hey()56 Return<void> BazCallback::hey() {
57 LOG(INFO) << "SERVER: hey";
58
59 return Void();
60 }
61
62 using std::to_string;
63
usage(const char * me)64 static void usage(const char *me) {
65 fprintf(stderr, "%s [-c]lient | [-s]erver\n", me);
66 }
67
68 struct HidlEnvironment : public ::testing::Environment {
SetUpHidlEnvironment69 void SetUp() override {
70 }
71
TearDownHidlEnvironment72 void TearDown() override {
73 }
74 };
75
76 struct HidlTest : public ::testing::Test {
77 sp<IBaz> baz;
78
SetUpHidlTest79 void SetUp() override {
80 using namespace ::android::hardware;
81
82 baz = IBaz::getService("baz");
83
84 CHECK(baz != NULL);
85 }
86
TearDownHidlTest87 void TearDown() override {
88 }
89 };
90
91 template <typename T>
EXPECT_OK(const::android::hardware::Return<T> & ret)92 static void EXPECT_OK(const ::android::hardware::Return<T> &ret) {
93 EXPECT_TRUE(ret.isOk());
94 }
95
TEST_F(HidlTest,GetDescriptorTest)96 TEST_F(HidlTest, GetDescriptorTest) {
97 EXPECT_OK(baz->interfaceDescriptor([&] (const auto &desc) {
98 EXPECT_EQ(desc, IBaz::descriptor);
99 }));
100 }
101
TEST_F(HidlTest,BazSomeBaseMethodTest)102 TEST_F(HidlTest, BazSomeBaseMethodTest) {
103 EXPECT_OK(baz->someBaseMethod());
104 }
105
TEST_F(HidlTest,BazSomeOtherBaseMethodTest)106 TEST_F(HidlTest, BazSomeOtherBaseMethodTest) {
107 IBase::Foo foo;
108 foo.x = 1;
109 foo.y.z = 2.5;
110 // A valid UTF-8 string
111 foo.y.s = "Hello, world, \x46\x6F\x6F\x20\xC2\xA9\x20\x62\x61\x72\x20\xF0\x9D\x8C\x86\x20\x54\x72\x65\x62\x6C\x65\x20\xE2\x98\x83\x20\x72\x6F\x63\x6B\x73";
112
113 foo.aaa.resize(5);
114 for (size_t i = 0; i < foo.aaa.size(); ++i) {
115 foo.aaa[i].z = 1.0f + (float)i * 0.01f;
116 foo.aaa[i].s = ("Hello, world " + std::to_string(i)).c_str();
117 }
118
119 EXPECT_OK(
120 baz->someOtherBaseMethod(
121 foo,
122 [&](const auto &result) {
123 // Strings should have the same size as they did before
124 // marshaling. b/35038064
125 EXPECT_EQ(result.y.s.size(), foo.y.s.size());
126 EXPECT_EQ(foo, result);
127 }));
128 }
129
TEST_F(HidlTest,BazSomeMethodWithFooArraysTest)130 TEST_F(HidlTest, BazSomeMethodWithFooArraysTest) {
131 hidl_array<IBase::Foo, 2> foo;
132
133 foo[0].x = 1;
134 foo[0].y.z = 2.5;
135 foo[0].y.s = "Hello, world";
136
137 foo[0].aaa.resize(5);
138 for (size_t i = 0; i < foo[0].aaa.size(); ++i) {
139 foo[0].aaa[i].z = 1.0f + (float)i * 0.01f;
140 foo[0].aaa[i].s = ("Hello, world " + std::to_string(i)).c_str();
141 }
142
143 foo[1].x = 2;
144 foo[1].y.z = -2.5;
145 foo[1].y.s = "Morituri te salutant";
146
147 foo[1].aaa.resize(3);
148 for (size_t i = 0; i < foo[1].aaa.size(); ++i) {
149 foo[1].aaa[i].z = 2.0f - (float)i * 0.01f;
150 foo[1].aaa[i].s = ("Alea iacta est: " + std::to_string(i)).c_str();
151 }
152
153 hidl_array<IBaz::Foo, 2> fooExpectedOutput;
154 fooExpectedOutput[0] = foo[1];
155 fooExpectedOutput[1] = foo[0];
156
157 EXPECT_OK(
158 baz->someMethodWithFooArrays(
159 foo,
160 [&](const auto &result) {
161 EXPECT_EQ(result, fooExpectedOutput);
162 }));
163 }
164
TEST_F(HidlTest,BazSomeMethodWithFooVectorsTest)165 TEST_F(HidlTest, BazSomeMethodWithFooVectorsTest) {
166 hidl_vec<IBase::Foo> foo;
167 foo.resize(2);
168
169 foo[0].x = 1;
170 foo[0].y.z = 2.5;
171 foo[0].y.s = "Hello, world";
172
173 foo[0].aaa.resize(5);
174 for (size_t i = 0; i < foo[0].aaa.size(); ++i) {
175 foo[0].aaa[i].z = 1.0f + (float)i * 0.01f;
176 foo[0].aaa[i].s = ("Hello, world " + std::to_string(i)).c_str();
177 }
178
179 foo[1].x = 2;
180 foo[1].y.z = -2.5;
181 foo[1].y.s = "Morituri te salutant";
182
183 foo[1].aaa.resize(3);
184 for (size_t i = 0; i < foo[1].aaa.size(); ++i) {
185 foo[1].aaa[i].z = 2.0f - (float)i * 0.01f;
186 foo[1].aaa[i].s = ("Alea iacta est: " + std::to_string(i)).c_str();
187 }
188
189 hidl_vec<IBaz::Foo> fooExpectedOutput;
190 fooExpectedOutput.resize(2);
191 fooExpectedOutput[0] = foo[1];
192 fooExpectedOutput[1] = foo[0];
193
194 EXPECT_OK(
195 baz->someMethodWithFooVectors(
196 foo,
197 [&](const auto &result) {
198 EXPECT_EQ(result, fooExpectedOutput);
199 }));
200 }
201
TEST_F(HidlTest,BazSomeMethodWithVectorOfArray)202 TEST_F(HidlTest, BazSomeMethodWithVectorOfArray) {
203 IBase::VectorOfArray in, expectedOut;
204 in.addresses.resize(3);
205 expectedOut.addresses.resize(3);
206
207 size_t k = 0;
208 const size_t n = in.addresses.size();
209
210 for (size_t i = 0; i < n; ++i) {
211 for (size_t j = 0; j < 6; ++j, ++k) {
212 in.addresses[i][j] = k;
213 expectedOut.addresses[n - 1 - i][j] = k;
214 }
215 }
216
217 EXPECT_OK(
218 baz->someMethodWithVectorOfArray(
219 in,
220 [&](const auto &out) {
221 EXPECT_EQ(expectedOut, out);
222 }));
223 }
224
TEST_F(HidlTest,BazSomeMethodTakingAVectorOfArray)225 TEST_F(HidlTest, BazSomeMethodTakingAVectorOfArray) {
226 hidl_vec<hidl_array<uint8_t, 6> > in, expectedOut;
227 in.resize(3);
228 expectedOut.resize(3);
229
230 size_t k = 0;
231 const size_t n = in.size();
232 for (size_t i = 0; i < n; ++i) {
233 for (size_t j = 0; j < 6; ++j, ++k) {
234 in[i][j] = k;
235 expectedOut[n - 1 - i][j] = k;
236 }
237 }
238
239 EXPECT_OK(
240 baz->someMethodTakingAVectorOfArray(
241 in,
242 [&](const auto &out) {
243 EXPECT_EQ(expectedOut, out);
244 }));
245 }
246
numberToEnglish(int x)247 static std::string numberToEnglish(int x) {
248 static const char *const kDigits[] = {
249 "zero",
250 "one",
251 "two",
252 "three",
253 "four",
254 "five",
255 "six",
256 "seven",
257 "eight",
258 "nine",
259 };
260
261 if (x < 0) {
262 return "negative " + numberToEnglish(-x);
263 }
264
265 if (x < 10) {
266 return kDigits[x];
267 }
268
269 if (x <= 15) {
270 static const char *const kSpecialTens[] = {
271 "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
272 };
273
274 return kSpecialTens[x - 10];
275 }
276
277 if (x < 20) {
278 return std::string(kDigits[x % 10]) + "teen";
279 }
280
281 if (x < 100) {
282 static const char *const kDecades[] = {
283 "twenty", "thirty", "forty", "fifty", "sixty", "seventy",
284 "eighty", "ninety",
285 };
286
287 return std::string(kDecades[x / 10 - 2]) + kDigits[x % 10];
288 }
289
290 return "positively huge!";
291 }
292
TEST_F(HidlTest,BazTransposeTest)293 TEST_F(HidlTest, BazTransposeTest) {
294 IBase::StringMatrix5x3 in;
295 IBase::StringMatrix3x5 expectedOut;
296
297 for (int i = 0; i < 5; ++i) {
298 for (int j = 0; j < 3; ++j) {
299 in.s[i][j] = expectedOut.s[j][i] = numberToEnglish(3 * i + j + 1).c_str();
300 }
301 }
302
303 EXPECT_OK(baz->transpose(
304 in,
305 [&](const auto &out) {
306 EXPECT_EQ(expectedOut, out);
307 }));
308 }
309
TEST_F(HidlTest,BazTranspose2Test)310 TEST_F(HidlTest, BazTranspose2Test) {
311 hidl_array<hidl_string, 5, 3> in;
312 hidl_array<hidl_string, 3, 5> expectedOut;
313
314 for (int i = 0; i < 5; ++i) {
315 for (int j = 0; j < 3; ++j) {
316 in[i][j] = expectedOut[j][i] = numberToEnglish(3 * i + j + 1).c_str();
317 }
318 }
319
320 EXPECT_OK(baz->transpose2(
321 in,
322 [&](const auto &out) {
323 EXPECT_EQ(expectedOut, out);
324 }));
325 }
326
TEST_F(HidlTest,BazSomeBoolMethodTest)327 TEST_F(HidlTest, BazSomeBoolMethodTest) {
328 auto result = baz->someBoolMethod(true);
329 EXPECT_OK(result);
330 EXPECT_EQ(result, false);
331 }
332
TEST_F(HidlTest,BazSomeBoolArrayMethodTest)333 TEST_F(HidlTest, BazSomeBoolArrayMethodTest) {
334 hidl_array<bool, 3> someBoolArray;
335 someBoolArray[0] = true;
336 someBoolArray[1] = false;
337 someBoolArray[2] = true;
338
339 hidl_array<bool, 4> expectedOut;
340 expectedOut[0] = false;
341 expectedOut[1] = true;
342 expectedOut[2] = false;
343 expectedOut[3] = true;
344
345 EXPECT_OK(
346 baz->someBoolArrayMethod(
347 someBoolArray,
348 [&](const auto &result) {
349 EXPECT_EQ(expectedOut, result);
350 }));
351 }
352
TEST_F(HidlTest,BazSomeBoolVectorMethodTest)353 TEST_F(HidlTest, BazSomeBoolVectorMethodTest) {
354 hidl_vec<bool> someBoolVector, expected;
355 someBoolVector.resize(4);
356 expected.resize(4);
357
358 for (size_t i = 0; i < someBoolVector.size(); ++i) {
359 someBoolVector[i] = ((i & 1) == 0);
360 expected[i] = !someBoolVector[i];
361 }
362
363 EXPECT_OK(
364 baz->someBoolVectorMethod(
365 someBoolVector,
366 [&](const auto &result) {
367 EXPECT_EQ(expected, result);
368 }));
369 }
370
TEST_F(HidlTest,BazDoThisMethodTest)371 TEST_F(HidlTest, BazDoThisMethodTest) {
372 EXPECT_OK(baz->doThis(1.0f));
373 }
374
TEST_F(HidlTest,BazDoThatAndReturnSomethingMethodTest)375 TEST_F(HidlTest, BazDoThatAndReturnSomethingMethodTest) {
376 auto result = baz->doThatAndReturnSomething(1);
377 EXPECT_OK(result);
378 EXPECT_EQ(result, 666);
379 }
380
TEST_F(HidlTest,BazDoQuiteABitMethodTest)381 TEST_F(HidlTest, BazDoQuiteABitMethodTest) {
382 auto result = baz->doQuiteABit(1, 2ll, 3.0f, 4.0);
383
384 EXPECT_OK(result);
385 EXPECT_EQ(result, 666.5);
386 }
387
TEST_F(HidlTest,BazDoSomethingElseMethodTest)388 TEST_F(HidlTest, BazDoSomethingElseMethodTest) {
389 hidl_array<int32_t, 15> param;
390 hidl_array<int32_t, 32> expected;
391
392 for (size_t i = 0; i < 15; ++i) {
393 param[i] = expected[15 + i] = i;
394 expected[i] = 2 * i;
395 }
396
397 expected[30] = 1;
398 expected[31] = 2;
399
400 EXPECT_OK(
401 baz->doSomethingElse(
402 param,
403 [&](const auto &result) {
404 EXPECT_EQ(expected, result);
405 }));
406 }
407
TEST_F(HidlTest,BazDoStuffAndReturnAStringMethodTest)408 TEST_F(HidlTest, BazDoStuffAndReturnAStringMethodTest) {
409 std::string expected = "Hello, world!";
410 EXPECT_OK(
411 baz->doStuffAndReturnAString(
412 [&](const auto &result) {
413 EXPECT_EQ(expected, result);
414 }));
415 }
416
TEST_F(HidlTest,BazMapThisVectorMethodTest)417 TEST_F(HidlTest, BazMapThisVectorMethodTest) {
418 hidl_vec<int32_t> vec_param, expected;
419 vec_param.resize(15);
420 expected.resize(15);
421
422 for (size_t i = 0; i < 15; ++i) {
423 vec_param[i] = i;
424 expected[i] = 2 * i;
425 }
426
427 EXPECT_OK(
428 baz->mapThisVector(
429 vec_param,
430 [&](const auto &result) {
431 EXPECT_EQ(expected, result);
432 }));
433 }
434
TEST_F(HidlTest,BazCallMeMethodTest)435 TEST_F(HidlTest, BazCallMeMethodTest) {
436 EXPECT_OK(baz->callMe(new BazCallback()));
437 }
438
TEST_F(HidlTest,BazCallMeLaterMethodTest)439 TEST_F(HidlTest, BazCallMeLaterMethodTest) {
440 EXPECT_OK(baz->callMeLater(new BazCallback()));
441 EXPECT_OK(baz->iAmFreeNow());
442 }
443
TEST_F(HidlTest,BazUseAnEnumMethodTest)444 TEST_F(HidlTest, BazUseAnEnumMethodTest) {
445 auto result = baz->useAnEnum(IBaz::SomeEnum::bar);
446
447 EXPECT_OK(result);
448 EXPECT_TRUE(result == IBaz::SomeEnum::quux);
449 }
450
TEST_F(HidlTest,BazHaveSomeStringsMethodTest)451 TEST_F(HidlTest, BazHaveSomeStringsMethodTest) {
452 hidl_array<hidl_string, 3> string_params;
453 string_params[0] = "one";
454 string_params[1] = "two";
455 string_params[2] = "three";
456
457 hidl_array<hidl_string, 2> expected;
458 expected[0] = "Hello";
459 expected[1] = "World";
460
461 EXPECT_OK(
462 baz->haveSomeStrings(
463 string_params,
464 [&](const auto &result) {
465 EXPECT_EQ(expected, result);
466 }));
467 }
468
TEST_F(HidlTest,BazHaveAStringVecMethodTest)469 TEST_F(HidlTest, BazHaveAStringVecMethodTest) {
470 hidl_vec<hidl_string> string_vec{ "Uno", "Dos", "Tres", "Cuatro" };
471 hidl_vec<hidl_string> expected{"Hello", "World"};
472
473 EXPECT_OK(
474 baz->haveAStringVec(
475 string_vec,
476 [&](const auto &result) {
477 EXPECT_EQ(expected, result);
478 }));
479 }
480
TEST_F(HidlTest,BazReturnABunchOfStringsMethodTest)481 TEST_F(HidlTest, BazReturnABunchOfStringsMethodTest) {
482 std::string expectedA = "Eins";
483 std::string expectedB = "Zwei";
484 std::string expectedC = "Drei";
485 EXPECT_OK(
486 baz->returnABunchOfStrings(
487 [&](const auto &a, const auto &b, const auto &c) {
488 EXPECT_EQ(a, expectedA);
489 EXPECT_EQ(b, expectedB);
490 EXPECT_EQ(c, expectedC);
491 }));
492 }
493
main(int argc,char ** argv)494 int main(int argc, char **argv) {
495 setenv("TREBLE_TESTING_OVERRIDE", "true", true);
496
497 using namespace android::hardware;
498
499 const char *me = argv[0];
500
501 bool wantClient = false;
502 bool wantServer = false;
503
504 int res;
505 while ((res = getopt(argc, argv, "chs")) >= 0) {
506 switch (res) {
507 case 'c':
508 {
509 wantClient = true;
510 break;
511 }
512
513 case 's':
514 {
515 wantServer = true;
516 break;
517 }
518
519 case '?':
520 case 'h':
521 default:
522 {
523 usage(me);
524 exit(1);
525 break;
526 }
527 }
528 }
529
530 if ((!wantClient && !wantServer) || (wantClient && wantServer)) {
531 usage(me);
532 exit(1);
533 }
534
535 if (wantClient) {
536 ::testing::AddGlobalTestEnvironment(new HidlEnvironment);
537 ::testing::InitGoogleTest(&argc, argv);
538 int status = RUN_ALL_TESTS();
539 return status;
540 }
541
542 return defaultPassthroughServiceImplementation<IBaz>("baz");
543
544 }
545