blob: a860ce77f26fdb4df0f1a46231c10885ddf4bae2 [file] [log] [blame]
Yifan Hongd5b5b2e2016-10-06 13:50:49 -07001
2#define LOG_TAG "hidl_test"
3
4#include "Foo.h"
Yifan Hongd5b5b2e2016-10-06 13:50:49 -07005#include <android-base/logging.h>
Yifan Hong30dc3de2016-10-17 11:38:15 -07006#include <hidl-test/FooHelper.h>
Yifan Hongd5b5b2e2016-10-06 13:50:49 -07007#include <inttypes.h>
8#include <utils/Timers.h>
9
10namespace android {
11namespace hardware {
12namespace tests {
13namespace foo {
14namespace V1_0 {
15namespace implementation {
16
17// Methods from ::android::hardware::tests::foo::V1_0::IFoo follow.
18Return<void> Foo::doThis(float param) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -080019 LOG(INFO) << "SERVER(Foo) doThis(" << param << ")";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070020
21 return Void();
22}
23
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070024Return<int32_t> Foo::doThatAndReturnSomething(
25 int64_t param) {
26 LOG(INFO) << "SERVER(Foo) doThatAndReturnSomething(" << param << ")";
27
28 return 666;
29}
30
31Return<double> Foo::doQuiteABit(
32 int32_t a,
33 int64_t b,
34 float c,
35 double d) {
36 LOG(INFO) << "SERVER(Foo) doQuiteABit("
37 << a
38 << ", "
39 << b
40 << ", "
41 << c
42 << ", "
43 << d
44 << ")";
45
46 return 666.5;
47}
48
49Return<void> Foo::doSomethingElse(
50 const hidl_array<int32_t, 15> &param, doSomethingElse_cb _cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -080051 LOG(INFO) << "SERVER(Foo) doSomethingElse(...)";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070052
53 hidl_array<int32_t, 32> result;
54 for (size_t i = 0; i < 15; ++i) {
55 result[i] = 2 * param[i];
56 result[15 + i] = param[i];
57 }
58 result[30] = 1;
59 result[31] = 2;
60
61 _cb(result);
62
63 return Void();
64}
65
66Return<void> Foo::doStuffAndReturnAString(
67 doStuffAndReturnAString_cb _cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -080068 LOG(INFO) << "SERVER(Foo) doStuffAndReturnAString";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070069
Steven Moreland54813ed2016-10-24 10:46:43 -070070 _cb("Hello, world");
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070071
72 return Void();
73}
74
75Return<void> Foo::mapThisVector(
76 const hidl_vec<int32_t> &param, mapThisVector_cb _cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -080077 LOG(INFO) << "SERVER(Foo) mapThisVector";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070078
79 hidl_vec<int32_t> out;
80 out.resize(param.size());
81
82 for (size_t i = 0; i < out.size(); ++i) {
83 out[i] = param[i] * 2;
84 }
85
86 _cb(out);
87
88 return Void();
89}
90
91Return<void> Foo::callMe(
92 const sp<IFooCallback> &cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -080093 LOG(INFO) << "SERVER(Foo) callMe " << cb.get();
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070094
95 if (cb != NULL) {
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070096 hidl_array<nsecs_t, 3> c;
Yifan Hong0c4c7a32016-11-28 15:59:24 -080097 LOG(INFO) << "SERVER(Foo) callMe "
98 << cb.get()
99 << " calling IFooCallback::heyItsYou, should return immediately";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700100 c[0] = systemTime();
101 cb->heyItsYou(cb);
102 c[0] = systemTime() - c[0];
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800103 LOG(INFO) << "SERVER(Foo) callMe "
104 << cb.get()
105 << " calling IFooCallback::heyItsYou, returned after"
106 << c[0]
107 << "ns";
108 LOG(INFO) << "SERVER(Foo) callMe "
109 << cb.get()
110 << " calling IFooCallback::heyItsYouIsntIt, should block for"
111 << DELAY_S
112 << " seconds";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700113 c[1] = systemTime();
Steven Morelandfafbbd72016-12-01 05:56:21 +0000114 bool answer = cb->heyItsYouIsntIt(cb);
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700115 c[1] = systemTime() - c[1];
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700116
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800117 LOG(INFO) << "SERVER(Foo) callMe "
118 << cb.get()
119 << " calling IFooCallback::heyItsYouIsntIt, responded with "
120 << answer
121 << " after "
122 << c[1]
123 << "ns";
124
125 LOG(INFO) << "SERVER(Foo) callMe "
126 << cb.get()
127 << " calling IFooCallback::heyItsTheMeaningOfLife,"
128 << " should return immediately";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700129 c[2] = systemTime();
130 cb->heyItsTheMeaningOfLife(42);
131 c[2] = systemTime() - c[2];
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700132
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800133 LOG(INFO) << "SERVER(Foo) callMe "
134 << cb.get()
135 << " cAfter call to IFooCallback::heyItsTheMeaningOfLife responded after "
136 << c[2]
137 << "ns";
138 LOG(INFO) << "SERVER(Foo) callMe "
139 << cb.get()
140 << " calling IFooCallback::youBlockedMeFor to report times";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700141 cb->youBlockedMeFor(c);
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800142 LOG(INFO) << "SERVER(Foo) callMe "
143 << cb.get()
144 << " After call to IFooCallback::youBlockedMeFor";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700145 }
146
147 return Void();
148}
149
150Return<Foo::SomeEnum> Foo::useAnEnum(SomeEnum param) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800151 LOG(INFO) << "SERVER(Foo) useAnEnum " << (int)param;
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700152
153 return SomeEnum::goober;
154}
155
156Return<void> Foo::haveAGooberVec(const hidl_vec<Goober>& param) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800157 LOG(INFO) << "SERVER(Foo) haveAGooberVec &param = " << &param;
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700158
159 return Void();
160}
161
162Return<void> Foo::haveAGoober(const Goober &g) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800163 LOG(INFO) << "SERVER(Foo) haveaGoober g=" << &g;
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700164
165 return Void();
166}
167
168Return<void> Foo::haveAGooberArray(const hidl_array<Goober, 20> & /* lots */) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800169 LOG(INFO) << "SERVER(Foo) haveAGooberArray";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700170
171 return Void();
172}
173
174Return<void> Foo::haveATypeFromAnotherFile(const Abc &def) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800175 LOG(INFO) << "SERVER(Foo) haveATypeFromAnotherFile def=" << &def;
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700176
177 return Void();
178}
179
180Return<void> Foo::haveSomeStrings(
181 const hidl_array<hidl_string, 3> &array,
182 haveSomeStrings_cb _cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800183
184 LOG(INFO) << "SERVER(Foo) haveSomeStrings([\""
185 << array[0].c_str()
186 << "\", \""
187 << array[1].c_str()
188 << "\", \""
189 << array[2].c_str()
190 << "\"])";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700191
192 hidl_array<hidl_string, 2> result;
193 result[0] = "Hello";
194 result[1] = "World";
195
196 _cb(result);
197
198 return Void();
199}
200
201Return<void> Foo::haveAStringVec(
202 const hidl_vec<hidl_string> &vector,
203 haveAStringVec_cb _cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800204 LOG(INFO) << "SERVER(Foo) haveAStringVec([\""
205 << vector[0].c_str()
206 << "\", \""
207 << vector[1].c_str()
208 << "\", \""
209 << vector[2].c_str()
210 << "\"])";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700211
212 hidl_vec<hidl_string> result;
213 result.resize(2);
214
215 result[0] = "Hello";
216 result[1] = "World";
217
218 _cb(result);
219
220 return Void();
221}
222
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700223Return<void> Foo::transposeMe(
224 const hidl_array<float, 3, 5> &in, transposeMe_cb _cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800225 LOG(INFO) << "SERVER(Foo) transposeMe(" << to_string(in).c_str() << ")";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700226
227 hidl_array<float, 5, 3> out;
228 for (size_t i = 0; i < 5; ++i) {
229 for (size_t j = 0; j < 3; ++j) {
230 out[i][j] = in[j][i];
231 }
232 }
233
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800234 LOG(INFO) << "SERVER(Foo) transposeMe returning " << to_string(out).c_str();
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700235
236 _cb(out);
237
238 return Void();
239}
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700240
241Return<void> Foo::callingDrWho(
242 const MultiDimensional &in, callingDrWho_cb _hidl_cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800243 LOG(INFO) << "SERVER(Foo) callingDrWho(" << MultiDimensionalToString(in).c_str() << ")";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700244
245 MultiDimensional out;
246 for (size_t i = 0; i < 5; ++i) {
247 for (size_t j = 0; j < 3; ++j) {
248 out.quuxMatrix[i][j].first = in.quuxMatrix[4 - i][2 - j].last;
249 out.quuxMatrix[i][j].last = in.quuxMatrix[4 - i][2 - j].first;
250 }
251 }
252
253 _hidl_cb(out);
254
255 return Void();
256}
257
258Return<void> Foo::transpose(const StringMatrix5x3 &in, transpose_cb _hidl_cb) {
259 LOG(INFO) << "SERVER(Foo) transpose " << to_string(in);
260
261 StringMatrix3x5 out;
262 for (size_t i = 0; i < 3; ++i) {
263 for (size_t j = 0; j < 5; ++j) {
264 out.s[i][j] = in.s[j][i];
265 }
266 }
267
268 _hidl_cb(out);
269
270 return Void();
271}
272
273Return<void> Foo::transpose2(
274 const hidl_array<hidl_string, 5, 3> &in, transpose2_cb _hidl_cb) {
275 LOG(INFO) << "SERVER(Foo) transpose2 " << to_string(in);
276
277 hidl_array<hidl_string, 3, 5> out;
278 for (size_t i = 0; i < 3; ++i) {
279 for (size_t j = 0; j < 5; ++j) {
280 out[i][j] = in[j][i];
281 }
282 }
283
284 _hidl_cb(out);
285
286 return Void();
287}
288
289Return<void> Foo::sendVec(
290 const hidl_vec<uint8_t> &data, sendVec_cb _hidl_cb) {
291 _hidl_cb(data);
292
293 return Void();
294}
295
296Return<void> Foo::sendVecVec(sendVecVec_cb _hidl_cb) {
297 hidl_vec<hidl_vec<uint8_t>> data;
298 _hidl_cb(data);
299
300 return Void();
301}
302
Andreas Huber847b1452016-10-19 14:10:55 -0700303Return<void> Foo::haveAVectorOfInterfaces(
304 const hidl_vec<sp<ISimple> > &in,
305 haveAVectorOfInterfaces_cb _hidl_cb) {
306 _hidl_cb(in);
307
308 return Void();
309}
310
311Return<void> Foo::haveAVectorOfGenericInterfaces(
Yifan Hongebcc3322016-11-28 16:09:46 -0800312 const hidl_vec<sp<android::hidl::base::V1_0::IBase> > &in,
Andreas Huber847b1452016-10-19 14:10:55 -0700313 haveAVectorOfGenericInterfaces_cb _hidl_cb) {
314 _hidl_cb(in);
Yifan Hongebfa6332016-10-14 10:41:41 -0700315 return Void();
316}
Andreas Huber847b1452016-10-19 14:10:55 -0700317
Yifan Hongebfa6332016-10-14 10:41:41 -0700318Return<void> Foo::createMyHandle(createMyHandle_cb _hidl_cb) {
319 native_handle_t* nh = native_handle_create(0, 10);
320 int data[] = {2,3,5,7,11,13,17,19,21,23};
321 CHECK(sizeof(data) == 10 * sizeof(int));
322 memcpy(nh->data, data, sizeof(data));
323 mHandles.push_back(nh);
324
325 MyHandle h;
326 h.guard = 666;
327 h.h = nh;
328 _hidl_cb(h);
329 return Void();
330}
331
332Return<void> Foo::createHandles(uint32_t size, createHandles_cb _hidl_cb) {
Martijn Coenen403161a2016-11-18 15:29:32 +0100333 hidl_vec<hidl_handle> handles;
Yifan Hongebfa6332016-10-14 10:41:41 -0700334 handles.resize(size);
335 for(uint32_t i = 0; i < size; ++i) {
336 createMyHandle([&](const MyHandle& h) {
337 handles[i] = h.h;
338 });
339 }
340 _hidl_cb(handles);
341 return Void();
342}
343
344Return<void> Foo::closeHandles() {
345 for(native_handle_t* h : mHandles) {
346 native_handle_delete(h);
347 }
348 mHandles.clear();
Andreas Huber847b1452016-10-19 14:10:55 -0700349 return Void();
350}
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700351
Martijn Coenenb7307d52016-10-27 11:51:46 +0200352Return<void> Foo::echoNullInterface(const sp<IFooCallback> &cb, echoNullInterface_cb _hidl_cb) {
353 _hidl_cb(cb == nullptr, cb);
354
355 return Void();
356}
357
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700358IFoo* HIDL_FETCH_IFoo(const char* /* name */) {
359 return new Foo();
360}
361
362} // namespace implementation
363} // namespace V1_0
364} // namespace foo
365} // namespace tests
366} // namespace hardware
367} // namespace android