blob: 81aa78b3b077bc7ef85248de90e9a0c595c9c1f8 [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>
7#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) {
19 ALOGI("SERVER(Foo) doThis(%.2f)", param);
20
21 return Void();
22}
23
24Return<void> Foo::doThis(uint32_t param) {
25 ALOGI("SERVER(Foo) doThis (int) (%d)", param);
26 return Void();
27}
28
29Return<int32_t> Foo::doThatAndReturnSomething(
30 int64_t param) {
31 LOG(INFO) << "SERVER(Foo) doThatAndReturnSomething(" << param << ")";
32
33 return 666;
34}
35
36Return<double> Foo::doQuiteABit(
37 int32_t a,
38 int64_t b,
39 float c,
40 double d) {
41 LOG(INFO) << "SERVER(Foo) doQuiteABit("
42 << a
43 << ", "
44 << b
45 << ", "
46 << c
47 << ", "
48 << d
49 << ")";
50
51 return 666.5;
52}
53
54Return<void> Foo::doSomethingElse(
55 const hidl_array<int32_t, 15> &param, doSomethingElse_cb _cb) {
56 ALOGI("SERVER(Foo) doSomethingElse(...)");
57
58 hidl_array<int32_t, 32> result;
59 for (size_t i = 0; i < 15; ++i) {
60 result[i] = 2 * param[i];
61 result[15 + i] = param[i];
62 }
63 result[30] = 1;
64 result[31] = 2;
65
66 _cb(result);
67
68 return Void();
69}
70
71Return<void> Foo::doStuffAndReturnAString(
72 doStuffAndReturnAString_cb _cb) {
73 ALOGI("SERVER(Foo) doStuffAndReturnAString");
74
75 hidl_string s;
76 s = "Hello, world";
77
78 _cb(s);
79
80 return Void();
81}
82
83Return<void> Foo::mapThisVector(
84 const hidl_vec<int32_t> &param, mapThisVector_cb _cb) {
85 ALOGI("SERVER(Foo) mapThisVector");
86
87 hidl_vec<int32_t> out;
88 out.resize(param.size());
89
90 for (size_t i = 0; i < out.size(); ++i) {
91 out[i] = param[i] * 2;
92 }
93
94 _cb(out);
95
96 return Void();
97}
98
99Return<void> Foo::callMe(
100 const sp<IFooCallback> &cb) {
101 ALOGI("SERVER(Foo) callMe %p", cb.get());
102
103 if (cb != NULL) {
104
105 hidl_array<nsecs_t, 3> c;
106 ALOGI("SERVER(Foo) callMe %p calling IFooCallback::heyItsYou, " \
107 "should return immediately", cb.get());
108 c[0] = systemTime();
109 cb->heyItsYou(cb);
110 c[0] = systemTime() - c[0];
111 ALOGI("SERVER(Foo) callMe %p calling IFooCallback::heyItsYou " \
112 "returned after %" PRId64 "ns", cb.get(), c[0]);
113
114 ALOGI("SERVER(Foo) callMe %p calling IFooCallback::heyItsYouIsntIt, " \
115 "should block for %" PRId64 " seconds", cb.get(),
116 FooCallback::DELAY_S);
117 c[1] = systemTime();
118 bool answer = cb->heyItsYouIsntIt(cb);
119 c[1] = systemTime() - c[1];
120 ALOGI("SERVER(Foo) callMe %p IFooCallback::heyItsYouIsntIt " \
121 "responded with %d after %" PRId64 "ns", cb.get(), answer, c[1]);
122
123 ALOGI("SERVER(Foo) callMe %p calling " \
124 "IFooCallback::heyItsTheMeaningOfLife, " \
125 "should return immediately ", cb.get());
126 c[2] = systemTime();
127 cb->heyItsTheMeaningOfLife(42);
128 c[2] = systemTime() - c[2];
129 ALOGI("SERVER(Foo) callMe %p After call to " \
130 "IFooCallback::heyItsTheMeaningOfLife " \
131 "responded after %" PRId64 "ns", cb.get(), c[2]);
132
133 ALOGI("SERVER(Foo) callMe %p calling IFooCallback::youBlockedMeFor " \
134 "to report times", cb.get());
135 cb->youBlockedMeFor(c);
136 ALOGI("SERVER(Foo) callMe %p After call to " \
137 "IFooCallback::heyYouBlockedMeFor", cb.get());
138 }
139
140 return Void();
141}
142
143Return<Foo::SomeEnum> Foo::useAnEnum(SomeEnum param) {
144 ALOGI("SERVER(Foo) useAnEnum %d", (int)param);
145
146 return SomeEnum::goober;
147}
148
149Return<void> Foo::haveAGooberVec(const hidl_vec<Goober>& param) {
150 ALOGI("SERVER(Foo) haveAGooberVec &param = %p", &param);
151
152 return Void();
153}
154
155Return<void> Foo::haveAGoober(const Goober &g) {
156 ALOGI("SERVER(Foo) haveaGoober g=%p", &g);
157
158 return Void();
159}
160
161Return<void> Foo::haveAGooberArray(const hidl_array<Goober, 20> & /* lots */) {
162 ALOGI("SERVER(Foo) haveAGooberArray");
163
164 return Void();
165}
166
167Return<void> Foo::haveATypeFromAnotherFile(const Abc &def) {
168 ALOGI("SERVER(Foo) haveATypeFromAnotherFile def=%p", &def);
169
170 return Void();
171}
172
173Return<void> Foo::haveSomeStrings(
174 const hidl_array<hidl_string, 3> &array,
175 haveSomeStrings_cb _cb) {
176 ALOGI("SERVER(Foo) haveSomeStrings([\"%s\", \"%s\", \"%s\"])",
177 array[0].c_str(),
178 array[1].c_str(),
179 array[2].c_str());
180
181 hidl_array<hidl_string, 2> result;
182 result[0] = "Hello";
183 result[1] = "World";
184
185 _cb(result);
186
187 return Void();
188}
189
190Return<void> Foo::haveAStringVec(
191 const hidl_vec<hidl_string> &vector,
192 haveAStringVec_cb _cb) {
193 ALOGI("SERVER(Foo) haveAStringVec([\"%s\", \"%s\", \"%s\"])",
194 vector[0].c_str(),
195 vector[1].c_str(),
196 vector[2].c_str());
197
198 hidl_vec<hidl_string> result;
199 result.resize(2);
200
201 result[0] = "Hello";
202 result[1] = "World";
203
204 _cb(result);
205
206 return Void();
207}
208
209// NOTE: duplicated code in hidl_test
210using std::to_string;
211
212static std::string to_string(const IFoo::StringMatrix5x3 &M);
213static std::string to_string(const IFoo::StringMatrix3x5 &M);
214static std::string to_string(const hidl_string &s);
215
216template<typename T>
217static std::string to_string(const T *elems, size_t n) {
218 std::string out;
219 out = "[";
220 for (size_t i = 0; i < n; ++i) {
221 if (i > 0) {
222 out += ", ";
223 }
224 out += to_string(elems[i]);
225 }
226 out += "]";
227
228 return out;
229}
230
231template<typename T, size_t SIZE>
232static std::string to_string(const hidl_array<T, SIZE> &array) {
233 return to_string(&array[0], SIZE);
234}
235
236template<typename T, size_t SIZE1, size_t SIZE2>
237static std::string to_string(const hidl_array<T, SIZE1, SIZE2> &array) {
238 std::string out;
239 out = "[";
240 for (size_t i = 0; i < SIZE1; ++i) {
241 if (i > 0) {
242 out += ", ";
243 }
244
245 out += "[";
246 for (size_t j = 0; j < SIZE2; ++j) {
247 if (j > 0) {
248 out += ", ";
249 }
250
251 out += to_string(array[i][j]);
252 }
253 out += "]";
254 }
255 out += "]";
256
257 return out;
258}
259
260template<typename T>
261static std::string to_string(const hidl_vec<T> &vec) {
262 return to_string(&vec[0], vec.size());
263}
264
265static std::string to_string(const IFoo::StringMatrix5x3 &M) {
266 return to_string(M.s);
267}
268
269static std::string to_string(const IFoo::StringMatrix3x5 &M) {
270 return to_string(M.s);
271}
272
273static std::string to_string(const hidl_string &s) {
274 return std::string("'") + s.c_str() + "'";
275}
276
277Return<void> Foo::transposeMe(
278 const hidl_array<float, 3, 5> &in, transposeMe_cb _cb) {
279 ALOGI("SERVER(Foo) transposeMe(%s)", to_string(in).c_str());
280
281 hidl_array<float, 5, 3> out;
282 for (size_t i = 0; i < 5; ++i) {
283 for (size_t j = 0; j < 3; ++j) {
284 out[i][j] = in[j][i];
285 }
286 }
287
288 ALOGI("SERVER(Foo) transposeMe returning %s", to_string(out).c_str());
289
290 _cb(out);
291
292 return Void();
293}
294// end duplicated code
295
296static std::string QuuxToString(const IFoo::Quux &val) {
297 std::string s;
298
299 s = "Quux(first='";
300 s += val.first.c_str();
301 s += "', last='";
302 s += val.last.c_str();
303 s += "')";
304
305 return s;
306}
307
308static std::string MultiDimensionalToString(const IFoo::MultiDimensional &val) {
309 std::string s;
310
311 s += "MultiDimensional(";
312
313 s += "quuxMatrix=[";
314
315 size_t k = 0;
316 for (size_t i = 0; i < 5; ++i) {
317 if (i > 0) {
318 s += ", ";
319 }
320
321 s += "[";
322 for (size_t j = 0; j < 3; ++j, ++k) {
323 if (j > 0) {
324 s += ", ";
325 }
326
327 s += QuuxToString(val.quuxMatrix[i][j]);
328 }
329 }
330 s += "]";
331
332 s += ")";
333
334 return s;
335}
336
337Return<void> Foo::callingDrWho(
338 const MultiDimensional &in, callingDrWho_cb _hidl_cb) {
339 ALOGI("SERVER(Foo) callingDrWho(%s)", MultiDimensionalToString(in).c_str());
340
341 MultiDimensional out;
342 for (size_t i = 0; i < 5; ++i) {
343 for (size_t j = 0; j < 3; ++j) {
344 out.quuxMatrix[i][j].first = in.quuxMatrix[4 - i][2 - j].last;
345 out.quuxMatrix[i][j].last = in.quuxMatrix[4 - i][2 - j].first;
346 }
347 }
348
349 _hidl_cb(out);
350
351 return Void();
352}
353
354Return<void> Foo::transpose(const StringMatrix5x3 &in, transpose_cb _hidl_cb) {
355 LOG(INFO) << "SERVER(Foo) transpose " << to_string(in);
356
357 StringMatrix3x5 out;
358 for (size_t i = 0; i < 3; ++i) {
359 for (size_t j = 0; j < 5; ++j) {
360 out.s[i][j] = in.s[j][i];
361 }
362 }
363
364 _hidl_cb(out);
365
366 return Void();
367}
368
369Return<void> Foo::transpose2(
370 const hidl_array<hidl_string, 5, 3> &in, transpose2_cb _hidl_cb) {
371 LOG(INFO) << "SERVER(Foo) transpose2 " << to_string(in);
372
373 hidl_array<hidl_string, 3, 5> out;
374 for (size_t i = 0; i < 3; ++i) {
375 for (size_t j = 0; j < 5; ++j) {
376 out[i][j] = in[j][i];
377 }
378 }
379
380 _hidl_cb(out);
381
382 return Void();
383}
384
385Return<void> Foo::sendVec(
386 const hidl_vec<uint8_t> &data, sendVec_cb _hidl_cb) {
387 _hidl_cb(data);
388
389 return Void();
390}
391
392Return<void> Foo::sendVecVec(sendVecVec_cb _hidl_cb) {
393 hidl_vec<hidl_vec<uint8_t>> data;
394 _hidl_cb(data);
395
396 return Void();
397}
398
399
400IFoo* HIDL_FETCH_IFoo(const char* /* name */) {
401 return new Foo();
402}
403
404} // namespace implementation
405} // namespace V1_0
406} // namespace foo
407} // namespace tests
408} // namespace hardware
409} // namespace android