1d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
2d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong#define LOG_TAG "hidl_test"
3d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
4d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong#include "Foo.h"
5d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong#include <android-base/logging.h>
630dc3dee3c248b95e4fea676021c980f69bed4caYifan Hong#include <hidl-test/FooHelper.h>
7d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong#include <inttypes.h>
8d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong#include <utils/Timers.h>
9d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
10d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hongnamespace android {
11d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hongnamespace hardware {
12d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hongnamespace tests {
13d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hongnamespace foo {
14d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hongnamespace V1_0 {
15d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hongnamespace implementation {
16d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
17d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong// Methods from ::android::hardware::tests::foo::V1_0::IFoo follow.
183bcfa475e29a169e888215d9b52cda50fa645ca5Steven MorelandReturn<void> Foo::convertToBoolIfSmall(Discriminator d, const hidl_vec<Union>& u,
193bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland                                       convertToBoolIfSmall_cb _hidl_cb) {
203bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland    hidl_vec<ContainsUnion> res(u.size());
213bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland    for (size_t i = 0; i < u.size(); i++) {
223bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland        ContainsUnion& outValue = res[i];
233bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland
243bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland        if (d == Discriminator::BOOL) {
253bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland            outValue.discriminator = Discriminator::BOOL;
263bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland            outValue.value.boolValue = u[i].boolValue;
273bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland        } else {
283bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland            uint64_t value = u[i].intValue;
293bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland            if (value == 0 || value == 1) {
303bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland                outValue.discriminator = Discriminator::BOOL;
313bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland                outValue.value.boolValue = static_cast<bool>(value);
323bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland            } else {
333bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland                outValue.discriminator = Discriminator::INT;
343bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland                outValue.value.intValue = value;
353bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland            }
363bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland        }
373bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland    }
383bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland    _hidl_cb(res);
393bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland    return Void();
403bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland}
413bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland
42d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::doThis(float param) {
430c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong    LOG(INFO) << "SERVER(Foo) doThis(" << param << ")";
44d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
45d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
46d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
47d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
48d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<int32_t> Foo::doThatAndReturnSomething(
49d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        int64_t param) {
50d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    LOG(INFO) << "SERVER(Foo) doThatAndReturnSomething(" << param << ")";
51d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
52d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return 666;
53d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
54d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
55d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<double> Foo::doQuiteABit(
56d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        int32_t a,
57d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        int64_t b,
58d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        float c,
59d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        double d) {
60d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    LOG(INFO) << "SERVER(Foo) doQuiteABit("
61d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong              << a
62d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong              << ", "
63d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong              << b
64d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong              << ", "
65d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong              << c
66d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong              << ", "
67d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong              << d
68d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong              << ")";
69d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
70d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return 666.5;
71d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
72d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
73d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::doSomethingElse(
74d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        const hidl_array<int32_t, 15> &param, doSomethingElse_cb _cb) {
750c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong    LOG(INFO) << "SERVER(Foo) doSomethingElse(...)";
76d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
77d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    hidl_array<int32_t, 32> result;
78d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    for (size_t i = 0; i < 15; ++i) {
79d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        result[i] = 2 * param[i];
80d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        result[15 + i] = param[i];
81d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    }
82d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    result[30] = 1;
83d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    result[31] = 2;
84d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
85d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    _cb(result);
86d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
87d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
88d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
89d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
90d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::doStuffAndReturnAString(
91d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        doStuffAndReturnAString_cb _cb) {
920c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong    LOG(INFO) << "SERVER(Foo) doStuffAndReturnAString";
93d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
9454813ed7c631ee5bfa499e87da65cacbf10efc9bSteven Moreland    _cb("Hello, world");
95d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
96d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
97d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
98d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
99d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::mapThisVector(
100d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        const hidl_vec<int32_t> &param, mapThisVector_cb _cb) {
1010c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong    LOG(INFO) << "SERVER(Foo) mapThisVector";
102d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
103d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    hidl_vec<int32_t> out;
104d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    out.resize(param.size());
105d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
106d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    for (size_t i = 0; i < out.size(); ++i) {
107d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        out[i] = param[i] * 2;
108d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    }
109d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
110d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    _cb(out);
111d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
112d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
113d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
114d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
115d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::callMe(
116d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        const sp<IFooCallback> &cb) {
1170c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong    LOG(INFO) << "SERVER(Foo) callMe " << cb.get();
118d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
119d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    if (cb != NULL) {
120d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        hidl_array<nsecs_t, 3> c;
1210c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong        LOG(INFO) << "SERVER(Foo) callMe "
1220c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << cb.get()
1230c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << " calling IFooCallback::heyItsYou, should return immediately";
124d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        c[0] = systemTime();
125d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        cb->heyItsYou(cb);
126d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        c[0] = systemTime() - c[0];
1270c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong        LOG(INFO) << "SERVER(Foo) callMe "
1280c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << cb.get()
1290c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << " calling IFooCallback::heyItsYou, returned after"
1300c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << c[0]
1310c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << "ns";
1320c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong        LOG(INFO) << "SERVER(Foo) callMe "
1330c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << cb.get()
1340c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << " calling IFooCallback::heyItsYouIsntIt, should block for"
1350c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << DELAY_S
1360c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << " seconds";
137d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        c[1] = systemTime();
138fafbbd7026dc48054f3c68b0484b3ffa972d7ab6Steven Moreland        bool answer = cb->heyItsYouIsntIt(cb);
139d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        c[1] = systemTime() - c[1];
140d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
1410c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong        LOG(INFO) << "SERVER(Foo) callMe "
1420c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << cb.get()
1430c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << " calling IFooCallback::heyItsYouIsntIt, responded with "
1440c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << answer
1450c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << " after "
1460c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << c[1]
1470c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << "ns";
1480c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong
1490c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong        LOG(INFO) << "SERVER(Foo) callMe "
1500c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << cb.get()
1510c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << " calling IFooCallback::heyItsTheMeaningOfLife,"
1520c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << " should return immediately";
153d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        c[2] = systemTime();
154d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        cb->heyItsTheMeaningOfLife(42);
155d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        c[2] = systemTime() - c[2];
156d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
1570c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong        LOG(INFO) << "SERVER(Foo) callMe "
1580c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << cb.get()
1590c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << " cAfter call to IFooCallback::heyItsTheMeaningOfLife responded after "
1600c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << c[2]
1610c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << "ns";
1620c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong        LOG(INFO) << "SERVER(Foo) callMe "
1630c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << cb.get()
1640c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << " calling IFooCallback::youBlockedMeFor to report times";
165d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        cb->youBlockedMeFor(c);
1660c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong        LOG(INFO) << "SERVER(Foo) callMe "
1670c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << cb.get()
1680c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong                  << " After call to IFooCallback::youBlockedMeFor";
169d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    }
170d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
171d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
172d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
173d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
174d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<Foo::SomeEnum> Foo::useAnEnum(SomeEnum param) {
1750c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong    LOG(INFO) << "SERVER(Foo) useAnEnum " << (int)param;
176d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
177d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return SomeEnum::goober;
178d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
179d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
180d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::haveAGooberVec(const hidl_vec<Goober>& param) {
1810c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong    LOG(INFO) << "SERVER(Foo) haveAGooberVec &param = " << &param;
182d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
183d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
184d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
185d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
186d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::haveAGoober(const Goober &g) {
1870c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong    LOG(INFO) << "SERVER(Foo) haveaGoober g=" << &g;
188d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
189d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
190d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
191d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
192d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::haveAGooberArray(const hidl_array<Goober, 20> & /* lots */) {
1930c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong    LOG(INFO) << "SERVER(Foo) haveAGooberArray";
194d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
195d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
196d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
197d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
198d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::haveATypeFromAnotherFile(const Abc &def) {
1990c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong    LOG(INFO) << "SERVER(Foo) haveATypeFromAnotherFile def=" << &def;
200d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
201d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
202d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
203d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
204d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::haveSomeStrings(
205d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        const hidl_array<hidl_string, 3> &array,
206d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        haveSomeStrings_cb _cb) {
2070c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong
2080c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong    LOG(INFO) << "SERVER(Foo) haveSomeStrings([\""
2090c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong              << array[0].c_str()
2100c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong              << "\", \""
2110c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong              << array[1].c_str()
2120c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong              << "\", \""
2130c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong              << array[2].c_str()
2140c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong              << "\"])";
215d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
216d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    hidl_array<hidl_string, 2> result;
217d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    result[0] = "Hello";
218d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    result[1] = "World";
219d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
220d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    _cb(result);
221d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
222d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
223d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
224d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
225d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::haveAStringVec(
226d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        const hidl_vec<hidl_string> &vector,
227d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        haveAStringVec_cb _cb) {
2280c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong    LOG(INFO) << "SERVER(Foo) haveAStringVec([\""
2290c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong              << vector[0].c_str()
2300c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong              << "\", \""
2310c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong              << vector[1].c_str()
2320c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong              << "\", \""
2330c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong              << vector[2].c_str()
2340c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong              << "\"])";
235d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
236d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    hidl_vec<hidl_string> result;
237d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    result.resize(2);
238d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
239d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    result[0] = "Hello";
240d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    result[1] = "World";
241d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
242d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    _cb(result);
243d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
244d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
245d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
246d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
247d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::transposeMe(
248d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        const hidl_array<float, 3, 5> &in, transposeMe_cb _cb) {
2490c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong    LOG(INFO) << "SERVER(Foo) transposeMe(" << to_string(in).c_str() << ")";
250d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
251d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    hidl_array<float, 5, 3> out;
252d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    for (size_t i = 0; i < 5; ++i) {
253d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        for (size_t j = 0; j < 3; ++j) {
254d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong            out[i][j] = in[j][i];
255d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        }
256d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    }
257d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
2580c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong    LOG(INFO) << "SERVER(Foo) transposeMe returning " << to_string(out).c_str();
259d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
260d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    _cb(out);
261d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
262d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
263d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
264d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
265d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::callingDrWho(
266d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        const MultiDimensional &in, callingDrWho_cb _hidl_cb) {
2670c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong    LOG(INFO) << "SERVER(Foo) callingDrWho(" << MultiDimensionalToString(in).c_str() << ")";
268d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
269d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    MultiDimensional out;
270d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    for (size_t i = 0; i < 5; ++i) {
271d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        for (size_t j = 0; j < 3; ++j) {
272d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong            out.quuxMatrix[i][j].first = in.quuxMatrix[4 - i][2 - j].last;
273d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong            out.quuxMatrix[i][j].last = in.quuxMatrix[4 - i][2 - j].first;
274d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        }
275d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    }
276d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
277d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    _hidl_cb(out);
278d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
279d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
280d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
281d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
282d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::transpose(const StringMatrix5x3 &in, transpose_cb _hidl_cb) {
283d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    LOG(INFO) << "SERVER(Foo) transpose " << to_string(in);
284d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
285d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    StringMatrix3x5 out;
286d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    for (size_t i = 0; i < 3; ++i) {
287d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        for (size_t j = 0; j < 5; ++j) {
288d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong            out.s[i][j] = in.s[j][i];
289d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        }
290d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    }
291d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
292d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    _hidl_cb(out);
293d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
294d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
295d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
296d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
297d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::transpose2(
298d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        const hidl_array<hidl_string, 5, 3> &in, transpose2_cb _hidl_cb) {
299d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    LOG(INFO) << "SERVER(Foo) transpose2 " << to_string(in);
300d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
301d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    hidl_array<hidl_string, 3, 5> out;
302d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    for (size_t i = 0; i < 3; ++i) {
303d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        for (size_t j = 0; j < 5; ++j) {
304d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong            out[i][j] = in[j][i];
305d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        }
306d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    }
307d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
308d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    _hidl_cb(out);
309d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
310d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
311d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
312d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
313d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::sendVec(
314d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong        const hidl_vec<uint8_t> &data, sendVec_cb _hidl_cb) {
315d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    _hidl_cb(data);
316d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
317d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
318d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
319d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
320d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::sendVecVec(sendVecVec_cb _hidl_cb) {
321d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    hidl_vec<hidl_vec<uint8_t>> data;
322d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    _hidl_cb(data);
323d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
324d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return Void();
325d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
326d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
327847b14511a973be167af465491226a86492a10c6Andreas HuberReturn<void> Foo::haveAVectorOfInterfaces(
328847b14511a973be167af465491226a86492a10c6Andreas Huber        const hidl_vec<sp<ISimple> > &in,
329847b14511a973be167af465491226a86492a10c6Andreas Huber        haveAVectorOfInterfaces_cb _hidl_cb) {
330847b14511a973be167af465491226a86492a10c6Andreas Huber    _hidl_cb(in);
331847b14511a973be167af465491226a86492a10c6Andreas Huber
332847b14511a973be167af465491226a86492a10c6Andreas Huber    return Void();
333847b14511a973be167af465491226a86492a10c6Andreas Huber}
334847b14511a973be167af465491226a86492a10c6Andreas Huber
335847b14511a973be167af465491226a86492a10c6Andreas HuberReturn<void> Foo::haveAVectorOfGenericInterfaces(
336ebcc3328e8bd0415514751853a5de8010cc8c6baYifan Hong        const hidl_vec<sp<android::hidl::base::V1_0::IBase> > &in,
337847b14511a973be167af465491226a86492a10c6Andreas Huber        haveAVectorOfGenericInterfaces_cb _hidl_cb) {
338847b14511a973be167af465491226a86492a10c6Andreas Huber    _hidl_cb(in);
339ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    return Void();
340ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong}
341ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong
342ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan HongReturn<void> Foo::createMyHandle(createMyHandle_cb _hidl_cb) {
343ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    native_handle_t* nh = native_handle_create(0, 10);
344ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    int data[] = {2,3,5,7,11,13,17,19,21,23};
345ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    CHECK(sizeof(data) == 10 * sizeof(int));
346ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    memcpy(nh->data, data, sizeof(data));
347ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    mHandles.push_back(nh);
348ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong
349ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    MyHandle h;
350ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    h.guard = 666;
351ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    h.h = nh;
352ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    _hidl_cb(h);
353ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    return Void();
354ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong}
355847b14511a973be167af465491226a86492a10c6Andreas Huber
356ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan HongReturn<void> Foo::createHandles(uint32_t size, createHandles_cb _hidl_cb) {
357403161ab73ad230ab27321a570b1c41d3b1af4a2Martijn Coenen    hidl_vec<hidl_handle> handles;
358ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    handles.resize(size);
359ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    for(uint32_t i = 0; i < size; ++i) {
360ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong        createMyHandle([&](const MyHandle& h) {
361ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong            handles[i] = h.h;
362ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong        });
363ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    }
364ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    _hidl_cb(handles);
365ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    return Void();
366ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong}
367ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong
368ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan HongReturn<void> Foo::closeHandles() {
369ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    for(native_handle_t* h : mHandles) {
370ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong        native_handle_delete(h);
371ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    }
372ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong    mHandles.clear();
373847b14511a973be167af465491226a86492a10c6Andreas Huber    return Void();
374847b14511a973be167af465491226a86492a10c6Andreas Huber}
375d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
376b7307d5c8acedec902c2a39de62065b2dbb9ae1aMartijn CoenenReturn<void> Foo::echoNullInterface(const sp<IFooCallback> &cb, echoNullInterface_cb _hidl_cb) {
377b7307d5c8acedec902c2a39de62065b2dbb9ae1aMartijn Coenen    _hidl_cb(cb == nullptr, cb);
378b7307d5c8acedec902c2a39de62065b2dbb9ae1aMartijn Coenen
379b7307d5c8acedec902c2a39de62065b2dbb9ae1aMartijn Coenen    return Void();
380b7307d5c8acedec902c2a39de62065b2dbb9ae1aMartijn Coenen}
381b7307d5c8acedec902c2a39de62065b2dbb9ae1aMartijn Coenen
382d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongIFoo* HIDL_FETCH_IFoo(const char* /* name */) {
383d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong    return new Foo();
384d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}
385d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong
386d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} // namespace implementation
387d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}  // namespace V1_0
388d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}  // namespace foo
389d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}  // namespace tests
390d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}  // namespace hardware
391d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong}  // namespace android
392