blob: 5a51532e19e9d34f5a881d03f7480500e4b95c22 [file] [log] [blame]
Yifan Hongd5b5b2e2016-10-06 13:50:49 -07001
2#define LOG_TAG "hidl_test"
3
4#include "Foo.h"
5#include "FooCallback.h"
6#include <android-base/logging.h>
Yifan Hong30dc3de2016-10-17 11:38:15 -07007#include <hidl-test/FooHelper.h>
Yifan Hongd5b5b2e2016-10-06 13:50:49 -07008#include <inttypes.h>
9#include <utils/Timers.h>
10
11namespace android {
12namespace hardware {
13namespace tests {
14namespace foo {
15namespace V1_0 {
16namespace implementation {
17
18// Methods from ::android::hardware::tests::foo::V1_0::IFoo follow.
19Return<void> Foo::doThis(float param) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -080020 LOG(INFO) << "SERVER(Foo) doThis(" << param << ")";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070021
22 return Void();
23}
24
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070025Return<int32_t> Foo::doThatAndReturnSomething(
26 int64_t param) {
27 LOG(INFO) << "SERVER(Foo) doThatAndReturnSomething(" << param << ")";
28
29 return 666;
30}
31
32Return<double> Foo::doQuiteABit(
33 int32_t a,
34 int64_t b,
35 float c,
36 double d) {
37 LOG(INFO) << "SERVER(Foo) doQuiteABit("
38 << a
39 << ", "
40 << b
41 << ", "
42 << c
43 << ", "
44 << d
45 << ")";
46
47 return 666.5;
48}
49
50Return<void> Foo::doSomethingElse(
51 const hidl_array<int32_t, 15> &param, doSomethingElse_cb _cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -080052 LOG(INFO) << "SERVER(Foo) doSomethingElse(...)";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070053
54 hidl_array<int32_t, 32> result;
55 for (size_t i = 0; i < 15; ++i) {
56 result[i] = 2 * param[i];
57 result[15 + i] = param[i];
58 }
59 result[30] = 1;
60 result[31] = 2;
61
62 _cb(result);
63
64 return Void();
65}
66
67Return<void> Foo::doStuffAndReturnAString(
68 doStuffAndReturnAString_cb _cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -080069 LOG(INFO) << "SERVER(Foo) doStuffAndReturnAString";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070070
Steven Moreland54813ed2016-10-24 10:46:43 -070071 _cb("Hello, world");
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070072
73 return Void();
74}
75
76Return<void> Foo::mapThisVector(
77 const hidl_vec<int32_t> &param, mapThisVector_cb _cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -080078 LOG(INFO) << "SERVER(Foo) mapThisVector";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070079
80 hidl_vec<int32_t> out;
81 out.resize(param.size());
82
83 for (size_t i = 0; i < out.size(); ++i) {
84 out[i] = param[i] * 2;
85 }
86
87 _cb(out);
88
89 return Void();
90}
91
92Return<void> Foo::callMe(
93 const sp<IFooCallback> &cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -080094 LOG(INFO) << "SERVER(Foo) callMe " << cb.get();
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070095
96 if (cb != NULL) {
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070097 hidl_array<nsecs_t, 3> c;
Yifan Hong0c4c7a32016-11-28 15:59:24 -080098 LOG(INFO) << "SERVER(Foo) callMe "
99 << cb.get()
100 << " calling IFooCallback::heyItsYou, should return immediately";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700101 c[0] = systemTime();
102 cb->heyItsYou(cb);
103 c[0] = systemTime() - c[0];
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800104 LOG(INFO) << "SERVER(Foo) callMe "
105 << cb.get()
106 << " calling IFooCallback::heyItsYou, returned after"
107 << c[0]
108 << "ns";
109 LOG(INFO) << "SERVER(Foo) callMe "
110 << cb.get()
111 << " calling IFooCallback::heyItsYouIsntIt, should block for"
112 << DELAY_S
113 << " seconds";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700114 c[1] = systemTime();
Steven Morelanddc5f84f2016-11-22 14:16:37 -0800115 Return<bool> ret = cb->heyItsYouIsntIt(cb);
116 if (!ret.isOk()) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800117 LOG(ERROR) << "SERVER(Foo) callMe "
118 << cb.get()
119 << " encountered transport error ("
120 << ret.getStatus().exceptionCode()
121 << ").";
Steven Morelanddc5f84f2016-11-22 14:16:37 -0800122 return Void();
123 }
124 bool answer = ret.get();
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700125 c[1] = systemTime() - c[1];
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700126
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800127 LOG(INFO) << "SERVER(Foo) callMe "
128 << cb.get()
129 << " calling IFooCallback::heyItsYouIsntIt, responded with "
130 << answer
131 << " after "
132 << c[1]
133 << "ns";
134
135 LOG(INFO) << "SERVER(Foo) callMe "
136 << cb.get()
137 << " calling IFooCallback::heyItsTheMeaningOfLife,"
138 << " should return immediately";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700139 c[2] = systemTime();
140 cb->heyItsTheMeaningOfLife(42);
141 c[2] = systemTime() - c[2];
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700142
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800143 LOG(INFO) << "SERVER(Foo) callMe "
144 << cb.get()
145 << " cAfter call to IFooCallback::heyItsTheMeaningOfLife responded after "
146 << c[2]
147 << "ns";
148 LOG(INFO) << "SERVER(Foo) callMe "
149 << cb.get()
150 << " calling IFooCallback::youBlockedMeFor to report times";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700151 cb->youBlockedMeFor(c);
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800152 LOG(INFO) << "SERVER(Foo) callMe "
153 << cb.get()
154 << " After call to IFooCallback::youBlockedMeFor";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700155 }
156
157 return Void();
158}
159
160Return<Foo::SomeEnum> Foo::useAnEnum(SomeEnum param) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800161 LOG(INFO) << "SERVER(Foo) useAnEnum " << (int)param;
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700162
163 return SomeEnum::goober;
164}
165
166Return<void> Foo::haveAGooberVec(const hidl_vec<Goober>& param) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800167 LOG(INFO) << "SERVER(Foo) haveAGooberVec &param = " << &param;
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700168
169 return Void();
170}
171
172Return<void> Foo::haveAGoober(const Goober &g) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800173 LOG(INFO) << "SERVER(Foo) haveaGoober g=" << &g;
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700174
175 return Void();
176}
177
178Return<void> Foo::haveAGooberArray(const hidl_array<Goober, 20> & /* lots */) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800179 LOG(INFO) << "SERVER(Foo) haveAGooberArray";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700180
181 return Void();
182}
183
184Return<void> Foo::haveATypeFromAnotherFile(const Abc &def) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800185 LOG(INFO) << "SERVER(Foo) haveATypeFromAnotherFile def=" << &def;
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700186
187 return Void();
188}
189
190Return<void> Foo::haveSomeStrings(
191 const hidl_array<hidl_string, 3> &array,
192 haveSomeStrings_cb _cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800193
194 LOG(INFO) << "SERVER(Foo) haveSomeStrings([\""
195 << array[0].c_str()
196 << "\", \""
197 << array[1].c_str()
198 << "\", \""
199 << array[2].c_str()
200 << "\"])";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700201
202 hidl_array<hidl_string, 2> result;
203 result[0] = "Hello";
204 result[1] = "World";
205
206 _cb(result);
207
208 return Void();
209}
210
211Return<void> Foo::haveAStringVec(
212 const hidl_vec<hidl_string> &vector,
213 haveAStringVec_cb _cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800214 LOG(INFO) << "SERVER(Foo) haveAStringVec([\""
215 << vector[0].c_str()
216 << "\", \""
217 << vector[1].c_str()
218 << "\", \""
219 << vector[2].c_str()
220 << "\"])";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700221
222 hidl_vec<hidl_string> result;
223 result.resize(2);
224
225 result[0] = "Hello";
226 result[1] = "World";
227
228 _cb(result);
229
230 return Void();
231}
232
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700233Return<void> Foo::transposeMe(
234 const hidl_array<float, 3, 5> &in, transposeMe_cb _cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800235 LOG(INFO) << "SERVER(Foo) transposeMe(" << to_string(in).c_str() << ")";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700236
237 hidl_array<float, 5, 3> out;
238 for (size_t i = 0; i < 5; ++i) {
239 for (size_t j = 0; j < 3; ++j) {
240 out[i][j] = in[j][i];
241 }
242 }
243
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800244 LOG(INFO) << "SERVER(Foo) transposeMe returning " << to_string(out).c_str();
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700245
246 _cb(out);
247
248 return Void();
249}
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700250
251Return<void> Foo::callingDrWho(
252 const MultiDimensional &in, callingDrWho_cb _hidl_cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800253 LOG(INFO) << "SERVER(Foo) callingDrWho(" << MultiDimensionalToString(in).c_str() << ")";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700254
255 MultiDimensional out;
256 for (size_t i = 0; i < 5; ++i) {
257 for (size_t j = 0; j < 3; ++j) {
258 out.quuxMatrix[i][j].first = in.quuxMatrix[4 - i][2 - j].last;
259 out.quuxMatrix[i][j].last = in.quuxMatrix[4 - i][2 - j].first;
260 }
261 }
262
263 _hidl_cb(out);
264
265 return Void();
266}
267
268Return<void> Foo::transpose(const StringMatrix5x3 &in, transpose_cb _hidl_cb) {
269 LOG(INFO) << "SERVER(Foo) transpose " << to_string(in);
270
271 StringMatrix3x5 out;
272 for (size_t i = 0; i < 3; ++i) {
273 for (size_t j = 0; j < 5; ++j) {
274 out.s[i][j] = in.s[j][i];
275 }
276 }
277
278 _hidl_cb(out);
279
280 return Void();
281}
282
283Return<void> Foo::transpose2(
284 const hidl_array<hidl_string, 5, 3> &in, transpose2_cb _hidl_cb) {
285 LOG(INFO) << "SERVER(Foo) transpose2 " << to_string(in);
286
287 hidl_array<hidl_string, 3, 5> out;
288 for (size_t i = 0; i < 3; ++i) {
289 for (size_t j = 0; j < 5; ++j) {
290 out[i][j] = in[j][i];
291 }
292 }
293
294 _hidl_cb(out);
295
296 return Void();
297}
298
299Return<void> Foo::sendVec(
300 const hidl_vec<uint8_t> &data, sendVec_cb _hidl_cb) {
301 _hidl_cb(data);
302
303 return Void();
304}
305
306Return<void> Foo::sendVecVec(sendVecVec_cb _hidl_cb) {
307 hidl_vec<hidl_vec<uint8_t>> data;
308 _hidl_cb(data);
309
310 return Void();
311}
312
Andreas Huber847b1452016-10-19 14:10:55 -0700313Return<void> Foo::haveAVectorOfInterfaces(
314 const hidl_vec<sp<ISimple> > &in,
315 haveAVectorOfInterfaces_cb _hidl_cb) {
316 _hidl_cb(in);
317
318 return Void();
319}
320
321Return<void> Foo::haveAVectorOfGenericInterfaces(
322 const hidl_vec<sp<android::hardware::IBinder> > &in,
323 haveAVectorOfGenericInterfaces_cb _hidl_cb) {
324 _hidl_cb(in);
Yifan Hongebfa6332016-10-14 10:41:41 -0700325 return Void();
326}
Andreas Huber847b1452016-10-19 14:10:55 -0700327
Yifan Hongebfa6332016-10-14 10:41:41 -0700328Return<void> Foo::createMyHandle(createMyHandle_cb _hidl_cb) {
329 native_handle_t* nh = native_handle_create(0, 10);
330 int data[] = {2,3,5,7,11,13,17,19,21,23};
331 CHECK(sizeof(data) == 10 * sizeof(int));
332 memcpy(nh->data, data, sizeof(data));
333 mHandles.push_back(nh);
334
335 MyHandle h;
336 h.guard = 666;
337 h.h = nh;
338 _hidl_cb(h);
339 return Void();
340}
341
342Return<void> Foo::createHandles(uint32_t size, createHandles_cb _hidl_cb) {
Martijn Coenen403161a2016-11-18 15:29:32 +0100343 hidl_vec<hidl_handle> handles;
Yifan Hongebfa6332016-10-14 10:41:41 -0700344 handles.resize(size);
345 for(uint32_t i = 0; i < size; ++i) {
346 createMyHandle([&](const MyHandle& h) {
347 handles[i] = h.h;
348 });
349 }
350 _hidl_cb(handles);
351 return Void();
352}
353
354Return<void> Foo::closeHandles() {
355 for(native_handle_t* h : mHandles) {
356 native_handle_delete(h);
357 }
358 mHandles.clear();
Andreas Huber847b1452016-10-19 14:10:55 -0700359 return Void();
360}
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700361
Martijn Coenenb7307d52016-10-27 11:51:46 +0200362Return<void> Foo::echoNullInterface(const sp<IFooCallback> &cb, echoNullInterface_cb _hidl_cb) {
363 _hidl_cb(cb == nullptr, cb);
364
365 return Void();
366}
367
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700368IFoo* HIDL_FETCH_IFoo(const char* /* name */) {
369 return new Foo();
370}
371
372} // namespace implementation
373} // namespace V1_0
374} // namespace foo
375} // namespace tests
376} // namespace hardware
377} // namespace android