blob: 850d716cea1061d02d4e04c57f4c36d9852693ad [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 Morelandfafbbd72016-12-01 05:56:21 +0000115 bool answer = cb->heyItsYouIsntIt(cb);
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700116 c[1] = systemTime() - c[1];
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700117
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800118 LOG(INFO) << "SERVER(Foo) callMe "
119 << cb.get()
120 << " calling IFooCallback::heyItsYouIsntIt, responded with "
121 << answer
122 << " after "
123 << c[1]
124 << "ns";
125
126 LOG(INFO) << "SERVER(Foo) callMe "
127 << cb.get()
128 << " calling IFooCallback::heyItsTheMeaningOfLife,"
129 << " should return immediately";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700130 c[2] = systemTime();
131 cb->heyItsTheMeaningOfLife(42);
132 c[2] = systemTime() - c[2];
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700133
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800134 LOG(INFO) << "SERVER(Foo) callMe "
135 << cb.get()
136 << " cAfter call to IFooCallback::heyItsTheMeaningOfLife responded after "
137 << c[2]
138 << "ns";
139 LOG(INFO) << "SERVER(Foo) callMe "
140 << cb.get()
141 << " calling IFooCallback::youBlockedMeFor to report times";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700142 cb->youBlockedMeFor(c);
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800143 LOG(INFO) << "SERVER(Foo) callMe "
144 << cb.get()
145 << " After call to IFooCallback::youBlockedMeFor";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700146 }
147
148 return Void();
149}
150
151Return<Foo::SomeEnum> Foo::useAnEnum(SomeEnum param) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800152 LOG(INFO) << "SERVER(Foo) useAnEnum " << (int)param;
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700153
154 return SomeEnum::goober;
155}
156
157Return<void> Foo::haveAGooberVec(const hidl_vec<Goober>& param) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800158 LOG(INFO) << "SERVER(Foo) haveAGooberVec &param = " << &param;
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700159
160 return Void();
161}
162
163Return<void> Foo::haveAGoober(const Goober &g) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800164 LOG(INFO) << "SERVER(Foo) haveaGoober g=" << &g;
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700165
166 return Void();
167}
168
169Return<void> Foo::haveAGooberArray(const hidl_array<Goober, 20> & /* lots */) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800170 LOG(INFO) << "SERVER(Foo) haveAGooberArray";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700171
172 return Void();
173}
174
175Return<void> Foo::haveATypeFromAnotherFile(const Abc &def) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800176 LOG(INFO) << "SERVER(Foo) haveATypeFromAnotherFile def=" << &def;
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700177
178 return Void();
179}
180
181Return<void> Foo::haveSomeStrings(
182 const hidl_array<hidl_string, 3> &array,
183 haveSomeStrings_cb _cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800184
185 LOG(INFO) << "SERVER(Foo) haveSomeStrings([\""
186 << array[0].c_str()
187 << "\", \""
188 << array[1].c_str()
189 << "\", \""
190 << array[2].c_str()
191 << "\"])";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700192
193 hidl_array<hidl_string, 2> result;
194 result[0] = "Hello";
195 result[1] = "World";
196
197 _cb(result);
198
199 return Void();
200}
201
202Return<void> Foo::haveAStringVec(
203 const hidl_vec<hidl_string> &vector,
204 haveAStringVec_cb _cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800205 LOG(INFO) << "SERVER(Foo) haveAStringVec([\""
206 << vector[0].c_str()
207 << "\", \""
208 << vector[1].c_str()
209 << "\", \""
210 << vector[2].c_str()
211 << "\"])";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700212
213 hidl_vec<hidl_string> result;
214 result.resize(2);
215
216 result[0] = "Hello";
217 result[1] = "World";
218
219 _cb(result);
220
221 return Void();
222}
223
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700224Return<void> Foo::transposeMe(
225 const hidl_array<float, 3, 5> &in, transposeMe_cb _cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800226 LOG(INFO) << "SERVER(Foo) transposeMe(" << to_string(in).c_str() << ")";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700227
228 hidl_array<float, 5, 3> out;
229 for (size_t i = 0; i < 5; ++i) {
230 for (size_t j = 0; j < 3; ++j) {
231 out[i][j] = in[j][i];
232 }
233 }
234
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800235 LOG(INFO) << "SERVER(Foo) transposeMe returning " << to_string(out).c_str();
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700236
237 _cb(out);
238
239 return Void();
240}
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700241
242Return<void> Foo::callingDrWho(
243 const MultiDimensional &in, callingDrWho_cb _hidl_cb) {
Yifan Hong0c4c7a32016-11-28 15:59:24 -0800244 LOG(INFO) << "SERVER(Foo) callingDrWho(" << MultiDimensionalToString(in).c_str() << ")";
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700245
246 MultiDimensional out;
247 for (size_t i = 0; i < 5; ++i) {
248 for (size_t j = 0; j < 3; ++j) {
249 out.quuxMatrix[i][j].first = in.quuxMatrix[4 - i][2 - j].last;
250 out.quuxMatrix[i][j].last = in.quuxMatrix[4 - i][2 - j].first;
251 }
252 }
253
254 _hidl_cb(out);
255
256 return Void();
257}
258
259Return<void> Foo::transpose(const StringMatrix5x3 &in, transpose_cb _hidl_cb) {
260 LOG(INFO) << "SERVER(Foo) transpose " << to_string(in);
261
262 StringMatrix3x5 out;
263 for (size_t i = 0; i < 3; ++i) {
264 for (size_t j = 0; j < 5; ++j) {
265 out.s[i][j] = in.s[j][i];
266 }
267 }
268
269 _hidl_cb(out);
270
271 return Void();
272}
273
274Return<void> Foo::transpose2(
275 const hidl_array<hidl_string, 5, 3> &in, transpose2_cb _hidl_cb) {
276 LOG(INFO) << "SERVER(Foo) transpose2 " << to_string(in);
277
278 hidl_array<hidl_string, 3, 5> out;
279 for (size_t i = 0; i < 3; ++i) {
280 for (size_t j = 0; j < 5; ++j) {
281 out[i][j] = in[j][i];
282 }
283 }
284
285 _hidl_cb(out);
286
287 return Void();
288}
289
290Return<void> Foo::sendVec(
291 const hidl_vec<uint8_t> &data, sendVec_cb _hidl_cb) {
292 _hidl_cb(data);
293
294 return Void();
295}
296
297Return<void> Foo::sendVecVec(sendVecVec_cb _hidl_cb) {
298 hidl_vec<hidl_vec<uint8_t>> data;
299 _hidl_cb(data);
300
301 return Void();
302}
303
Andreas Huber847b1452016-10-19 14:10:55 -0700304Return<void> Foo::haveAVectorOfInterfaces(
305 const hidl_vec<sp<ISimple> > &in,
306 haveAVectorOfInterfaces_cb _hidl_cb) {
307 _hidl_cb(in);
308
309 return Void();
310}
311
312Return<void> Foo::haveAVectorOfGenericInterfaces(
313 const hidl_vec<sp<android::hardware::IBinder> > &in,
314 haveAVectorOfGenericInterfaces_cb _hidl_cb) {
315 _hidl_cb(in);
Yifan Hongebfa6332016-10-14 10:41:41 -0700316 return Void();
317}
Andreas Huber847b1452016-10-19 14:10:55 -0700318
Yifan Hongebfa6332016-10-14 10:41:41 -0700319Return<void> Foo::createMyHandle(createMyHandle_cb _hidl_cb) {
320 native_handle_t* nh = native_handle_create(0, 10);
321 int data[] = {2,3,5,7,11,13,17,19,21,23};
322 CHECK(sizeof(data) == 10 * sizeof(int));
323 memcpy(nh->data, data, sizeof(data));
324 mHandles.push_back(nh);
325
326 MyHandle h;
327 h.guard = 666;
328 h.h = nh;
329 _hidl_cb(h);
330 return Void();
331}
332
333Return<void> Foo::createHandles(uint32_t size, createHandles_cb _hidl_cb) {
Martijn Coenen403161a2016-11-18 15:29:32 +0100334 hidl_vec<hidl_handle> handles;
Yifan Hongebfa6332016-10-14 10:41:41 -0700335 handles.resize(size);
336 for(uint32_t i = 0; i < size; ++i) {
337 createMyHandle([&](const MyHandle& h) {
338 handles[i] = h.h;
339 });
340 }
341 _hidl_cb(handles);
342 return Void();
343}
344
345Return<void> Foo::closeHandles() {
346 for(native_handle_t* h : mHandles) {
347 native_handle_delete(h);
348 }
349 mHandles.clear();
Andreas Huber847b1452016-10-19 14:10:55 -0700350 return Void();
351}
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700352
Martijn Coenenb7307d52016-10-27 11:51:46 +0200353Return<void> Foo::echoNullInterface(const sp<IFooCallback> &cb, echoNullInterface_cb _hidl_cb) {
354 _hidl_cb(cb == nullptr, cb);
355
356 return Void();
357}
358
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700359IFoo* HIDL_FETCH_IFoo(const char* /* name */) {
360 return new Foo();
361}
362
363} // namespace implementation
364} // namespace V1_0
365} // namespace foo
366} // namespace tests
367} // namespace hardware
368} // namespace android