1179379a911b386023250998f6d257482febb2d86Hridya Valsaraju#define LOG_TAG "hidl_test_client"
211992a60ff12aa66d13da9731f9578e1165422a0Yifan Hong
311992a60ff12aa66d13da9731f9578e1165422a0Yifan Hong#include "FooCallback.h"
411992a60ff12aa66d13da9731f9578e1165422a0Yifan Hong
59cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber#include <android-base/logging.h>
69cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
701bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland#include <android/hidl/manager/1.0/IServiceManager.h>
80693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland#include <android/hidl/manager/1.0/IServiceNotification.h>
901bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
10ffc4e519aa059811a1e5839c0883a876d3d05aaaSteven Moreland#include <android/hidl/allocator/1.0/IAllocator.h>
1199e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen#include <android/hidl/memory/1.0/IMemory.h>
1299e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen
13aa2b83adce439a67ef150e1677a39e5e4154ca34Steven Moreland#include <android/hidl/token/1.0/ITokenManager.h>
14aa2b83adce439a67ef150e1677a39e5e4154ca34Steven Moreland
15b48a7da5a689a246439dfebf54fdd91ec6949d00Steven Moreland#include <android/hardware/tests/foo/1.0/IFoo.h>
1601e7cdef5d4198104a4e772cb742fb88777dccebYifan Hong#include <android/hardware/tests/foo/1.0/BnHwSimple.h>
17def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong#include <android/hardware/tests/foo/1.0/BsSimple.h>
1801e7cdef5d4198104a4e772cb742fb88777dccebYifan Hong#include <android/hardware/tests/foo/1.0/BpHwSimple.h>
19b48a7da5a689a246439dfebf54fdd91ec6949d00Steven Moreland#include <android/hardware/tests/bar/1.0/IBar.h>
20328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen#include <android/hardware/tests/bar/1.0/BpHwBar.h>
21328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen#include <android/hardware/tests/bar/1.0/BnHwBar.h>
225749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong#include <android/hardware/tests/bar/1.0/IComplicated.h>
2387ff823efa7bda4304391987235cc48e6b351b58Yifan Hong#include <android/hardware/tests/bar/1.0/IImportRules.h>
24179379a911b386023250998f6d257482febb2d86Hridya Valsaraju#include <android/hardware/tests/baz/1.0/IBaz.h>
25f509cb0e7680dcf4c8db02020765584c89b85573Yifan Hong#include <android/hardware/tests/hash/1.0/IHash.h>
26b48a7da5a689a246439dfebf54fdd91ec6949d00Steven Moreland#include <android/hardware/tests/inheritance/1.0/IFetcher.h>
27b48a7da5a689a246439dfebf54fdd91ec6949d00Steven Moreland#include <android/hardware/tests/inheritance/1.0/IGrandparent.h>
28b48a7da5a689a246439dfebf54fdd91ec6949d00Steven Moreland#include <android/hardware/tests/inheritance/1.0/IParent.h>
29b48a7da5a689a246439dfebf54fdd91ec6949d00Steven Moreland#include <android/hardware/tests/inheritance/1.0/IChild.h>
3099e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen#include <android/hardware/tests/memory/1.0/IMemoryTest.h>
31b48a7da5a689a246439dfebf54fdd91ec6949d00Steven Moreland#include <android/hardware/tests/pointer/1.0/IGraph.h>
32b48a7da5a689a246439dfebf54fdd91ec6949d00Steven Moreland#include <android/hardware/tests/pointer/1.0/IPointer.h>
339cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
341dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong#include <gtest/gtest.h>
351dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong#if GTEST_IS_THREADSAFE
361dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong#include <sys/types.h>
37c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong#include <sys/wait.h>
381dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong#include <signal.h>
391dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong#include <errno.h>
401dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong#include <pthread.h>
411dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong#else
421dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong#error "GTest did not detect pthread library."
431dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong#endif
441dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong
4501bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland#include <algorithm>
460693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland#include <condition_variable>
47d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong#include <getopt.h>
48d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong#include <inttypes.h>
490693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland#include <mutex>
5001bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland#include <set>
51bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong#include <sstream>
52ccd782b771e283825ad178f1ab33b8c105e6d55dYifan Hong#include <utility>
53d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong#include <vector>
54bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
55398e6fb53f387f7d3adfb1083d8381b8e813c9daYifan Hong#include <hidl-test/FooHelper.h>
56398e6fb53f387f7d3adfb1083d8381b8e813c9daYifan Hong#include <hidl-test/PointerHelper.h>
57398e6fb53f387f7d3adfb1083d8381b8e813c9daYifan Hong
589391510f0d5ec6340aef2325ce0b92c84c1f56f9Martijn Coenen#include <hidl/Status.h>
5999e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen#include <hidlmemory/mapping.h>
60fa55d6ec8496deb5e40865f13f8bf6a971ca622dMartijn Coenen
610acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev#include <utils/Condition.h>
620acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev#include <utils/Timers.h>
630acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev
64bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong#define EXPECT_OK(__ret__) EXPECT_TRUE(isOk(__ret__))
6584465909d270461251ca0c195640911b4eb6a7faYifan Hong#define EXPECT_FAIL(__ret__) EXPECT_FALSE(isOk(__ret__))
668c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong#define EXPECT_ARRAYEQ(__a1__, __a2__, __size__) EXPECT_TRUE(isArrayEqual(__a1__, __a2__, __size__))
67bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
68bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong// TODO uncomment this when kernel is patched with pointer changes.
69bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong//#define HIDL_RUN_POINTER_TESTS 1
70bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
71ca89052152606fff3bf634777654584aa4b07efaYifan Hong// forward declarations.
72179379a911b386023250998f6d257482febb2d86Hridya Valsarajuclass HidlEnvironment;
73ca89052152606fff3bf634777654584aa4b07efaYifan Hong
74c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong// static storage
75179379a911b386023250998f6d257482febb2d86Hridya Valsarajuenum TestMode {
76c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    BINDERIZED,
77c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    PASSTHROUGH
78179379a911b386023250998f6d257482febb2d86Hridya Valsaraju};
79179379a911b386023250998f6d257482febb2d86Hridya Valsaraju
80179379a911b386023250998f6d257482febb2d86Hridya Valsarajustatic HidlEnvironment *gHidlEnvironment = nullptr;
81c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong
8286a112bdfae618d6538307839a6c39555bceb79dAndreas Huberusing ::android::hardware::tests::foo::V1_0::Abc;
8388ca4511354b4bdaed1846486a1b285576788e4bSteven Morelandusing ::android::hardware::tests::foo::V1_0::IFoo;
8488ca4511354b4bdaed1846486a1b285576788e4bSteven Morelandusing ::android::hardware::tests::foo::V1_0::IFooCallback;
8586a112bdfae618d6538307839a6c39555bceb79dAndreas Huberusing ::android::hardware::tests::foo::V1_0::ISimple;
8611992a60ff12aa66d13da9731f9578e1165422a0Yifan Hongusing ::android::hardware::tests::foo::V1_0::implementation::FooCallback;
8788ca4511354b4bdaed1846486a1b285576788e4bSteven Morelandusing ::android::hardware::tests::bar::V1_0::IBar;
885749b2c5842f7ca031349eba3841a243e07d54ebYifan Hongusing ::android::hardware::tests::bar::V1_0::IComplicated;
89179379a911b386023250998f6d257482febb2d86Hridya Valsarajuusing ::android::hardware::tests::baz::V1_0::IBaz;
90f509cb0e7680dcf4c8db02020765584c89b85573Yifan Hongusing ::android::hardware::tests::hash::V1_0::IHash;
911e81c530eec864805c4f13250538e50a067eafc4Yifan Hongusing ::android::hardware::tests::inheritance::V1_0::IFetcher;
921e81c530eec864805c4f13250538e50a067eafc4Yifan Hongusing ::android::hardware::tests::inheritance::V1_0::IGrandparent;
931e81c530eec864805c4f13250538e50a067eafc4Yifan Hongusing ::android::hardware::tests::inheritance::V1_0::IParent;
941e81c530eec864805c4f13250538e50a067eafc4Yifan Hongusing ::android::hardware::tests::inheritance::V1_0::IChild;
95bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongusing ::android::hardware::tests::pointer::V1_0::IGraph;
96bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongusing ::android::hardware::tests::pointer::V1_0::IPointer;
9799e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenenusing ::android::hardware::tests::memory::V1_0::IMemoryTest;
982b6591b6fc64b21b58f230d7c91cb1367f0bb564Iliyan Malchevusing ::android::hardware::Return;
99d57066f167eab04f32c8ef7e644e2a036256209bIliyan Malchevusing ::android::hardware::Void;
100f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huberusing ::android::hardware::hidl_array;
101115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenenusing ::android::hardware::hidl_death_recipient;
10299e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenenusing ::android::hardware::hidl_memory;
1038a82ff7ce6b5c0288b5239e25e1cbd1f5d8e3d27Andreas Huberusing ::android::hardware::hidl_string;
10499e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenenusing ::android::hardware::hidl_vec;
105ffc4e519aa059811a1e5839c0883a876d3d05aaaSteven Morelandusing ::android::hidl::allocator::V1_0::IAllocator;
106115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenenusing ::android::hidl::base::V1_0::IBase;
10701bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Morelandusing ::android::hidl::manager::V1_0::IServiceManager;
1080693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Morelandusing ::android::hidl::manager::V1_0::IServiceNotification;
10999e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenenusing ::android::hidl::memory::V1_0::IMemory;
110aa2b83adce439a67ef150e1677a39e5e4154ca34Steven Morelandusing ::android::hidl::token::V1_0::ITokenManager;
1119cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huberusing ::android::sp;
112115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenenusing ::android::wp;
113398e6fb53f387f7d3adfb1083d8381b8e813c9daYifan Hongusing ::android::to_string;
1140acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchevusing ::android::Mutex;
115398e6fb53f387f7d3adfb1083d8381b8e813c9daYifan Hongusing ::android::MultiDimensionalToString;
1160acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchevusing ::android::Condition;
117398e6fb53f387f7d3adfb1083d8381b8e813c9daYifan Hongusing ::android::DELAY_S;
118398e6fb53f387f7d3adfb1083d8381b8e813c9daYifan Hongusing ::android::DELAY_NS;
119398e6fb53f387f7d3adfb1083d8381b8e813c9daYifan Hongusing ::android::TOLERANCE_NS;
120398e6fb53f387f7d3adfb1083d8381b8e813c9daYifan Hongusing ::android::ONEWAY_TOLERANCE_NS;
121398e6fb53f387f7d3adfb1083d8381b8e813c9daYifan Hongusing std::to_string;
1229cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
123bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongtemplate <typename T>
124a3e8b239a43da534038ae4f4c350d3940713ee4cYifan Hongstatic inline ::testing::AssertionResult isOk(const ::android::hardware::Return<T> &ret) {
125cd00b9b86431d82ca9b9b60cb97d200af277f220Steven Moreland    return ret.isOk()
126cd00b9b86431d82ca9b9b60cb97d200af277f220Steven Moreland        ? (::testing::AssertionSuccess() << ret.description())
127cd00b9b86431d82ca9b9b60cb97d200af277f220Steven Moreland        : (::testing::AssertionFailure() << ret.description());
128bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
129bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
130bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongtemplate<typename T, typename S>
131bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongstatic inline bool isArrayEqual(const T arr1, const S arr2, size_t size) {
132bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    for(size_t i = 0; i < size; i++)
133bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        if(arr1[i] != arr2[i])
134bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong            return false;
135bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    return true;
136bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
137bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
13801bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Morelandtemplate<typename T>
13901bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Morelandstd::string to_string(std::set<T> set) {
14001bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    std::stringstream ss;
14101bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    ss << "{";
14201bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
14301bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    bool first = true;
14401bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    for (const T &item : set) {
14501bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        if (first) {
14601bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland            first = false;
14701bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        } else {
14801bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland            ss << ", ";
14901bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        }
15001bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
15101bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        ss << to_string(item);
15201bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    }
15301bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
15401bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    ss << "}";
15501bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
15601bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    return ss.str();
15701bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland}
15801bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
15986a112bdfae618d6538307839a6c39555bceb79dAndreas Huberstruct Simple : public ISimple {
16086a112bdfae618d6538307839a6c39555bceb79dAndreas Huber    Simple(int32_t cookie)
16186a112bdfae618d6538307839a6c39555bceb79dAndreas Huber        : mCookie(cookie) {
16286a112bdfae618d6538307839a6c39555bceb79dAndreas Huber    }
16386a112bdfae618d6538307839a6c39555bceb79dAndreas Huber
16486a112bdfae618d6538307839a6c39555bceb79dAndreas Huber    Return<int32_t> getCookie() override {
16586a112bdfae618d6538307839a6c39555bceb79dAndreas Huber        return mCookie;
16686a112bdfae618d6538307839a6c39555bceb79dAndreas Huber    }
16786a112bdfae618d6538307839a6c39555bceb79dAndreas Huber
1685749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    Return<void> customVecInt(customVecInt_cb _cb) override {
1695749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        _cb(hidl_vec<int32_t>());
1705749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        return Void();
1715749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    }
1725749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong
1735749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    Return<void> customVecStr(customVecStr_cb _cb) override {
1745749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        hidl_vec<hidl_string> vec;
1755749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        vec.resize(2);
1765749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        _cb(vec);
1775749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        return Void();
1785749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    }
1795749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong
1805749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    Return<void> mystr(mystr_cb _cb) override {
1815749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        _cb(hidl_string());
1825749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        return Void();
1835749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    }
1845749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong
1855749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    Return<void> myhandle(myhandle_cb _cb) override {
1865749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        auto h = native_handle_create(0, 1);
1875749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        _cb(h);
1885749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        native_handle_delete(h);
1895749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        return Void();
1905749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    }
1915749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong
1925749b2c5842f7ca031349eba3841a243e07d54ebYifan Hongprivate:
1935749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    int32_t mCookie;
1945749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong};
1955749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong
19621aa43c93083bab6f1ab5511418fc65bf49de068Steven Morelandstruct SimpleParent : public IParent {
19721aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland    Return<void> doGrandparent() override {
19821aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland        return Void();
19921aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland    }
20021aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland    Return<void> doParent() override {
20121aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland        return Void();
20221aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland    }
20321aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland};
20421aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland
20521aa43c93083bab6f1ab5511418fc65bf49de068Steven Morelandstruct SimpleChild : public IChild {
20621aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland    Return<void> doGrandparent() override {
20721aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland        return Void();
20821aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland    }
20921aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland    Return <void> doParent() override {
21021aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland        return Void();
21121aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland    }
21221aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland    Return <void> doChild() override {
21321aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland        return Void();
21421aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland    }
21521aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland};
21621aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland
2175749b2c5842f7ca031349eba3841a243e07d54ebYifan Hongstruct Complicated : public IComplicated {
2185749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    Complicated(int32_t cookie)
2195749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        : mCookie(cookie) {
2205749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    }
2215749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong
2225749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    Return<int32_t> getCookie() override {
2235749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        return mCookie;
2245749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    }
2255749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong
2265749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    Return<void> customVecInt(customVecInt_cb _cb) override {
2275749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        _cb(hidl_vec<int32_t>());
2285749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        return Void();
2295749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    }
2305749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    Return<void> customVecStr(customVecStr_cb _cb) override {
2315749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        hidl_vec<hidl_string> vec;
2325749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        vec.resize(2);
2335749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        _cb(vec);
2345749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        return Void();
2355749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    }
2365749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong
2375749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    Return<void> mystr(mystr_cb _cb) override {
2385749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        _cb(hidl_string());
2395749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        return Void();
2405749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    }
2415749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong
2425749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    Return<void> myhandle(myhandle_cb _cb) override {
2435749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        auto h = native_handle_create(0, 1);
2445749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        _cb(h);
2455749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        native_handle_delete(h);
2465749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong        return Void();
2475749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    }
2485749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong
24986a112bdfae618d6538307839a6c39555bceb79dAndreas Huberprivate:
25086a112bdfae618d6538307839a6c39555bceb79dAndreas Huber    int32_t mCookie;
25186a112bdfae618d6538307839a6c39555bceb79dAndreas Huber};
2520693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
25387ff823efa7bda4304391987235cc48e6b351b58Yifan Hong// Ensure (statically) that the types in IImportRules resolves to the correct types by
25487ff823efa7bda4304391987235cc48e6b351b58Yifan Hong// overriding the methods with fully namespaced types as arguments.
25587ff823efa7bda4304391987235cc48e6b351b58Yifan Hongstruct MyImportRules : public ::android::hardware::tests::bar::V1_0::IImportRules {
25687ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    Return<void> rule0a(
25787ff823efa7bda4304391987235cc48e6b351b58Yifan Hong            const ::android::hardware::tests::bar::V1_0::IImportRules::Outer&) override {
25887ff823efa7bda4304391987235cc48e6b351b58Yifan Hong        return Void();
25987ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    }
26087ff823efa7bda4304391987235cc48e6b351b58Yifan Hong
26187ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    Return<void> rule0a1(
26287ff823efa7bda4304391987235cc48e6b351b58Yifan Hong            const ::android::hardware::tests::bar::V1_0::IImportRules::Outer&) override {
26387ff823efa7bda4304391987235cc48e6b351b58Yifan Hong        return Void();
26487ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    }
26587ff823efa7bda4304391987235cc48e6b351b58Yifan Hong
26687ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    Return<void> rule0b(
26787ff823efa7bda4304391987235cc48e6b351b58Yifan Hong            const ::android::hardware::tests::bar::V1_0::IImportRules::Outer&) override {
26887ff823efa7bda4304391987235cc48e6b351b58Yifan Hong        return Void();
26987ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    }
27087ff823efa7bda4304391987235cc48e6b351b58Yifan Hong
27187ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    Return<void> rule0c(const ::android::hardware::tests::foo::V1_0::Outer&) override {
27287ff823efa7bda4304391987235cc48e6b351b58Yifan Hong        return Void();
27387ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    }
27487ff823efa7bda4304391987235cc48e6b351b58Yifan Hong
27587ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    Return<void> rule0d(const ::android::hardware::tests::foo::V1_0::Outer&) override {
27687ff823efa7bda4304391987235cc48e6b351b58Yifan Hong        return Void();
27787ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    }
27887ff823efa7bda4304391987235cc48e6b351b58Yifan Hong
27987ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    Return<void> rule0e(
28087ff823efa7bda4304391987235cc48e6b351b58Yifan Hong            const ::android::hardware::tests::bar::V1_0::IImportRules::Outer::Inner&) override {
28187ff823efa7bda4304391987235cc48e6b351b58Yifan Hong        return Void();
28287ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    }
28387ff823efa7bda4304391987235cc48e6b351b58Yifan Hong
28487ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    Return<void> rule0f(
28587ff823efa7bda4304391987235cc48e6b351b58Yifan Hong            const ::android::hardware::tests::bar::V1_0::IImportRules::Outer::Inner&) override {
28687ff823efa7bda4304391987235cc48e6b351b58Yifan Hong        return Void();
28787ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    }
28887ff823efa7bda4304391987235cc48e6b351b58Yifan Hong
28987ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    Return<void> rule0g(const ::android::hardware::tests::foo::V1_0::Outer::Inner&) override {
29087ff823efa7bda4304391987235cc48e6b351b58Yifan Hong        return Void();
29187ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    }
29287ff823efa7bda4304391987235cc48e6b351b58Yifan Hong
29387ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    Return<void> rule0h(const ::android::hardware::tests::foo::V1_0::Outer::Inner&) override {
29487ff823efa7bda4304391987235cc48e6b351b58Yifan Hong        return Void();
29587ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    }
29687ff823efa7bda4304391987235cc48e6b351b58Yifan Hong
29787ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    Return<void> rule1a(const ::android::hardware::tests::bar::V1_0::Def&) override {
29887ff823efa7bda4304391987235cc48e6b351b58Yifan Hong        return Void();
29987ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    }
30087ff823efa7bda4304391987235cc48e6b351b58Yifan Hong
30187ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    Return<void> rule1b(const ::android::hardware::tests::foo::V1_0::Def&) override {
30287ff823efa7bda4304391987235cc48e6b351b58Yifan Hong        return Void();
30387ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    }
30487ff823efa7bda4304391987235cc48e6b351b58Yifan Hong
30587ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    Return<void> rule2a(const ::android::hardware::tests::foo::V1_0::Unrelated&) override {
30687ff823efa7bda4304391987235cc48e6b351b58Yifan Hong        return Void();
30787ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    }
30887ff823efa7bda4304391987235cc48e6b351b58Yifan Hong
30987ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    Return<void> rule2b(const sp<::android::hardware::tests::foo::V1_0::IFooCallback>&) override {
31087ff823efa7bda4304391987235cc48e6b351b58Yifan Hong        return Void();
31187ff823efa7bda4304391987235cc48e6b351b58Yifan Hong    }
31287ff823efa7bda4304391987235cc48e6b351b58Yifan Hong};
31387ff823efa7bda4304391987235cc48e6b351b58Yifan Hong
3140693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Morelandstruct ServiceNotification : public IServiceNotification {
3150693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland    std::mutex mutex;
3160693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland    std::condition_variable condition;
3170693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
3180693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland    Return<void> onRegistration(const hidl_string &fqName,
3190693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland                                const hidl_string &name,
3200693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland                                bool preexisting) override {
3210693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        if (preexisting) {
3220693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland            // not interested in things registered from previous runs of hidl_test
3230693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland            return Void();
3240693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        }
3250693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
3260693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        std::unique_lock<std::mutex> lock(mutex);
3270693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
3280693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        mRegistered.push_back(std::string(fqName.c_str()) + "/" + name.c_str());
3290693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
3300693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        lock.unlock();
3310693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        condition.notify_one();
3320693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
3330693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        return Void();
3340693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland    }
3350693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
3360693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland    const std::vector<std::string> &getRegistrations() const {
3370693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        return mRegistered;
3380693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland    }
3390693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
3400693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Morelandprivate:
3410693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland    std::vector<std::string> mRegistered{};
3420693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland};
3430693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
344179379a911b386023250998f6d257482febb2d86Hridya Valsarajuclass HidlEnvironment : public ::testing::Environment {
3451dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hongpublic:
34601bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    sp<IServiceManager> manager;
347aa2b83adce439a67ef150e1677a39e5e4154ca34Steven Moreland    sp<ITokenManager> tokenManager;
34899e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    sp<IAllocator> ashmemAllocator;
34999e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    sp<IMemoryTest> memoryTest;
3501e81c530eec864805c4f13250538e50a067eafc4Yifan Hong    sp<IFetcher> fetcher;
3511dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong    sp<IFoo> foo;
352179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    sp<IBaz> dyingBaz;
3531dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong    sp<IBar> bar;
354bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    sp<IGraph> graphInterface;
355bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    sp<IPointer> pointerInterface;
3563cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    sp<IPointer> validationPointerInterface;
357179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    TestMode mode;
358f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju    bool enableDelayMeasurementTests;
359f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju    HidlEnvironment(TestMode mode, bool enableDelayMeasurementTests) :
360f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju        mode(mode), enableDelayMeasurementTests(enableDelayMeasurementTests) {};
361ccd782b771e283825ad178f1ab33b8c105e6d55dYifan Hong
362ca89052152606fff3bf634777654584aa4b07efaYifan Hong    void getServices() {
3638b98d8ddadec92c1465d60c25e003dd604517ea7Yifan Hong        manager = IServiceManager::getService();
36401bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
36501bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        // alternatively:
36601bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        // manager = defaultServiceManager()
36701bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
36801bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        ASSERT_NE(manager, nullptr);
36901bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        ASSERT_TRUE(manager->isRemote()); // manager is always remote
37001bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
3718b98d8ddadec92c1465d60c25e003dd604517ea7Yifan Hong        tokenManager = ITokenManager::getService();
372aa2b83adce439a67ef150e1677a39e5e4154ca34Steven Moreland        ASSERT_NE(tokenManager, nullptr);
373aa2b83adce439a67ef150e1677a39e5e4154ca34Steven Moreland        ASSERT_TRUE(tokenManager->isRemote()); // tokenManager is always remote
374aa2b83adce439a67ef150e1677a39e5e4154ca34Steven Moreland
3752a75353a696ebc6c4f934e066d32787b3c91c0ceSteven Moreland        ashmemAllocator = IAllocator::getService("ashmem");
3762a75353a696ebc6c4f934e066d32787b3c91c0ceSteven Moreland        ASSERT_NE(ashmemAllocator, nullptr);
3772a75353a696ebc6c4f934e066d32787b3c91c0ceSteven Moreland        ASSERT_TRUE(ashmemAllocator->isRemote()); // allocator is always remote
3782a75353a696ebc6c4f934e066d32787b3c91c0ceSteven Moreland
379c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong        // getStub is true if we are in passthrough mode to skip checking
380c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong        // binderized server, false for binderized mode.
3811e81c530eec864805c4f13250538e50a067eafc4Yifan Hong
382179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        memoryTest = IMemoryTest::getService("memory", mode == PASSTHROUGH /* getStub */);
38399e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen        ASSERT_NE(memoryTest, nullptr);
384179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        ASSERT_EQ(memoryTest->isRemote(), mode == BINDERIZED);
38599e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen
386179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        fetcher = IFetcher::getService("fetcher", mode == PASSTHROUGH /* getStub */);
3871e81c530eec864805c4f13250538e50a067eafc4Yifan Hong        ASSERT_NE(fetcher, nullptr);
388179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        ASSERT_EQ(fetcher->isRemote(), mode == BINDERIZED);
3891e81c530eec864805c4f13250538e50a067eafc4Yifan Hong
390179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        foo = IFoo::getService("foo", mode == PASSTHROUGH /* getStub */);
3917a827722c5b615585cfd1e664fe434cc47af9dbfYifan Hong        ASSERT_NE(foo, nullptr);
392179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        ASSERT_EQ(foo->isRemote(), mode == BINDERIZED);
3939cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
394179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        dyingBaz = IBaz::getService("dyingBaz", mode == PASSTHROUGH /* getStub */);
395115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen        ASSERT_NE(foo, nullptr);
396179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        ASSERT_EQ(foo->isRemote(), mode == BINDERIZED);
397115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen
398179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        bar = IBar::getService("foo", mode == PASSTHROUGH /* getStub */);
3997a827722c5b615585cfd1e664fe434cc47af9dbfYifan Hong        ASSERT_NE(bar, nullptr);
400179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        ASSERT_EQ(bar->isRemote(), mode == BINDERIZED);
4019cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
402179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        graphInterface = IGraph::getService("graph", mode == PASSTHROUGH /* getStub */);
4037a827722c5b615585cfd1e664fe434cc47af9dbfYifan Hong        ASSERT_NE(graphInterface, nullptr);
404179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        ASSERT_EQ(graphInterface->isRemote(), mode == BINDERIZED);
405bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
406179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        pointerInterface = IPointer::getService("pointer", mode == PASSTHROUGH /* getStub */);
4073eac8a3419ce36a4f84e4620474711c138753d3cYifan Hong        ASSERT_NE(pointerInterface, nullptr);
408179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        ASSERT_EQ(pointerInterface->isRemote(), mode == BINDERIZED);
4093cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong
4103cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        // use passthrough mode as the validation object.
4113cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        validationPointerInterface = IPointer::getService("pointer", true /* getStub */);
4123cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        ASSERT_NE(validationPointerInterface, nullptr);
4131dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong    }
4141e81c530eec864805c4f13250538e50a067eafc4Yifan Hong
415ca89052152606fff3bf634777654584aa4b07efaYifan Hong    virtual void SetUp() {
416ca89052152606fff3bf634777654584aa4b07efaYifan Hong        ALOGI("Environment setup beginning...");
417ca89052152606fff3bf634777654584aa4b07efaYifan Hong        getServices();
4181dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong        ALOGI("Environment setup complete.");
4191dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong    }
4201dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong};
4219cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
422ca89052152606fff3bf634777654584aa4b07efaYifan Hongclass HidlTest : public ::testing::Test {
423ca89052152606fff3bf634777654584aa4b07efaYifan Hongpublic:
42401bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    sp<IServiceManager> manager;
425aa2b83adce439a67ef150e1677a39e5e4154ca34Steven Moreland    sp<ITokenManager> tokenManager;
42699e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    sp<IAllocator> ashmemAllocator;
42799e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    sp<IMemoryTest> memoryTest;
4281e81c530eec864805c4f13250538e50a067eafc4Yifan Hong    sp<IFetcher> fetcher;
429ca89052152606fff3bf634777654584aa4b07efaYifan Hong    sp<IFoo> foo;
430179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    sp<IBaz> dyingBaz;
431ca89052152606fff3bf634777654584aa4b07efaYifan Hong    sp<IBar> bar;
432ca89052152606fff3bf634777654584aa4b07efaYifan Hong    sp<IGraph> graphInterface;
433ca89052152606fff3bf634777654584aa4b07efaYifan Hong    sp<IPointer> pointerInterface;
4343cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    sp<IPointer> validationPointerInterface;
435179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    TestMode mode = TestMode::PASSTHROUGH;
436115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen
437ca89052152606fff3bf634777654584aa4b07efaYifan Hong    virtual void SetUp() override {
438ca89052152606fff3bf634777654584aa4b07efaYifan Hong        ALOGI("Test setup beginning...");
439179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        manager = gHidlEnvironment->manager;
440179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        tokenManager = gHidlEnvironment->tokenManager;
441179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        ashmemAllocator = gHidlEnvironment->ashmemAllocator;
442179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        memoryTest = gHidlEnvironment->memoryTest;
443179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        fetcher = gHidlEnvironment->fetcher;
444179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        foo = gHidlEnvironment->foo;
445179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        dyingBaz = gHidlEnvironment->dyingBaz;
446179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        bar = gHidlEnvironment->bar;
447179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        graphInterface = gHidlEnvironment->graphInterface;
448179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        pointerInterface = gHidlEnvironment->pointerInterface;
449179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        validationPointerInterface = gHidlEnvironment->validationPointerInterface;
450179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        mode = gHidlEnvironment->mode;
451ca89052152606fff3bf634777654584aa4b07efaYifan Hong        ALOGI("Test setup complete");
452ca89052152606fff3bf634777654584aa4b07efaYifan Hong    }
453ca89052152606fff3bf634777654584aa4b07efaYifan Hong};
454ca89052152606fff3bf634777654584aa4b07efaYifan Hong
455f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan HongTEST_F(HidlTest, ToStringTest) {
456f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    using namespace android::hardware;
457f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong
458f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    LOG(INFO) << toString(IFoo::Everything{});
459f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong
460f7b596bc5f6ab432ed6b664d790b91a0b8bb917aMartijn Coenen    // Note that handles don't need to be deleted because MQDescriptor takes ownership
461f7b596bc5f6ab432ed6b664d790b91a0b8bb917aMartijn Coenen    // and deletes them when destructed.
462f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    auto handle = native_handle_create(0, 1);
463f7b596bc5f6ab432ed6b664d790b91a0b8bb917aMartijn Coenen    auto handle2 = native_handle_create(0, 1);
464f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    handle->data[0] = 5;
465f7b596bc5f6ab432ed6b664d790b91a0b8bb917aMartijn Coenen    handle2->data[0] = 6;
466f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    IFoo::Everything e {
467f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        .u = {.p = reinterpret_cast<void *>(0x5)},
468f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        .number = 10,
469f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        .h = handle,
470f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        .descSync = {std::vector<GrantorDescriptor>(), handle, 5},
471f7b596bc5f6ab432ed6b664d790b91a0b8bb917aMartijn Coenen        .descUnsync = {std::vector<GrantorDescriptor>(), handle2, 6},
472f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        .mem = hidl_memory("mymem", handle, 5),
473f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        .p = reinterpret_cast<void *>(0x6),
474f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        .vs = {"hello", "world"},
475f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        .multidimArray = hidl_vec<hidl_string>{"hello", "great", "awesome", "nice"}.data(),
476f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        .sArray = hidl_vec<hidl_string>{"awesome", "thanks", "you're welcome"}.data(),
477f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        .anotherStruct = {.first = "first", .last = "last"},
478f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        .bf = IFoo::BitField::V0 | IFoo::BitField::V2
479f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    };
480f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    LOG(INFO) << toString(e);
481f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    LOG(INFO) << toString(foo);
482f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    // toString is for debugging purposes only; no good EXPECT
483f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    // statement can be written here.
484f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong}
485f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong
486731163da922c499d48e867e94c888eddef1af6bfSteven MorelandTEST_F(HidlTest, PassthroughLookupTest) {
487731163da922c499d48e867e94c888eddef1af6bfSteven Moreland    // IFoo is special because it returns an interface no matter
488731163da922c499d48e867e94c888eddef1af6bfSteven Moreland    //   what instance name is requested. In general, this is BAD!
489731163da922c499d48e867e94c888eddef1af6bfSteven Moreland    EXPECT_NE(nullptr, IFoo::getService("", true /* getStub */).get());
490731163da922c499d48e867e94c888eddef1af6bfSteven Moreland    EXPECT_NE(nullptr, IFoo::getService("a", true /* getStub */).get());
491731163da922c499d48e867e94c888eddef1af6bfSteven Moreland    EXPECT_NE(nullptr, IFoo::getService("asdf", true /* getStub */).get());
492731163da922c499d48e867e94c888eddef1af6bfSteven Moreland    EXPECT_NE(nullptr, IFoo::getService("::::::::", true /* getStub */).get());
493731163da922c499d48e867e94c888eddef1af6bfSteven Moreland    EXPECT_NE(nullptr, IFoo::getService("/////", true /* getStub */).get());
494731163da922c499d48e867e94c888eddef1af6bfSteven Moreland    EXPECT_NE(nullptr, IFoo::getService("\n", true /* getStub */).get());
495731163da922c499d48e867e94c888eddef1af6bfSteven Moreland}
496731163da922c499d48e867e94c888eddef1af6bfSteven Moreland
497870d1a7ccd70bd710128993de401278614d1975eYifan HongTEST_F(HidlTest, EnumToStringTest) {
498870d1a7ccd70bd710128993de401278614d1975eYifan Hong    using namespace std::string_literals;
499870d1a7ccd70bd710128993de401278614d1975eYifan Hong    using ::android::hardware::tests::foo::V1_0::toString;
500870d1a7ccd70bd710128993de401278614d1975eYifan Hong    // toString for enum
501870d1a7ccd70bd710128993de401278614d1975eYifan Hong    EXPECT_EQ(toString(IFoo::BitField::V0), "V0"s);
502870d1a7ccd70bd710128993de401278614d1975eYifan Hong    EXPECT_EQ(toString(static_cast<IFoo::BitField>(0)), "0"s)
503870d1a7ccd70bd710128993de401278614d1975eYifan Hong            << "Invalid enum isn't stringified correctly.";
504870d1a7ccd70bd710128993de401278614d1975eYifan Hong    EXPECT_EQ(toString(static_cast<IFoo::BitField>(IFoo::BitField::V0 | IFoo::BitField::V2)), "0x5"s)
505870d1a7ccd70bd710128993de401278614d1975eYifan Hong            << "Invalid enum isn't stringified correctly.";
506870d1a7ccd70bd710128993de401278614d1975eYifan Hong    // dump bitfields
507870d1a7ccd70bd710128993de401278614d1975eYifan Hong    EXPECT_EQ(toString<IFoo::BitField>(0 | IFoo::BitField::V0), "V0 (0x1)"s);
508870d1a7ccd70bd710128993de401278614d1975eYifan Hong    EXPECT_EQ(toString<IFoo::BitField>(0 | IFoo::BitField::V0 | IFoo::BitField::V2), "V0 | V2 (0x5)"s);
509870d1a7ccd70bd710128993de401278614d1975eYifan Hong    EXPECT_EQ(toString<IFoo::BitField>(0xF), "V0 | V1 | V2 | V3 | VALL (0xf)"s);
510870d1a7ccd70bd710128993de401278614d1975eYifan Hong    EXPECT_EQ(toString<IFoo::BitField>(0xFF), "V0 | V1 | V2 | V3 | VALL | 0xf0 (0xff)"s);
511870d1a7ccd70bd710128993de401278614d1975eYifan Hong}
512870d1a7ccd70bd710128993de401278614d1975eYifan Hong
513424a948265821d514be42e9e2dd9a53cf515d0bbSteven MorelandTEST_F(HidlTest, PingTest) {
514424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland    EXPECT_OK(manager->ping());
515424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland}
516424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland
517eec5f7afb247cb3b520bbad2fa7658e011ec172eSteven MorelandTEST_F(HidlTest, TryGetServiceTest) {
518eec5f7afb247cb3b520bbad2fa7658e011ec172eSteven Moreland    sp<IServiceManager> dne = IServiceManager::tryGetService("boss");
519eec5f7afb247cb3b520bbad2fa7658e011ec172eSteven Moreland    ASSERT_EQ(dne, nullptr);
520eec5f7afb247cb3b520bbad2fa7658e011ec172eSteven Moreland
521eec5f7afb247cb3b520bbad2fa7658e011ec172eSteven Moreland    sp<IServiceManager> manager = IServiceManager::tryGetService();
522eec5f7afb247cb3b520bbad2fa7658e011ec172eSteven Moreland    ASSERT_NE(manager, nullptr);
523eec5f7afb247cb3b520bbad2fa7658e011ec172eSteven Moreland}
524eec5f7afb247cb3b520bbad2fa7658e011ec172eSteven Moreland
525f509cb0e7680dcf4c8db02020765584c89b85573Yifan HongTEST_F(HidlTest, HashTest) {
526f509cb0e7680dcf4c8db02020765584c89b85573Yifan Hong    uint8_t ihash[32] = {74,38,204,105,102,117,11,15,207,7,238,198,29,35,30,62,100,
527f509cb0e7680dcf4c8db02020765584c89b85573Yifan Hong            216,131,182,3,61,162,241,215,211,6,20,251,143,125,161};
528f509cb0e7680dcf4c8db02020765584c89b85573Yifan Hong    auto service = IHash::getService(mode == PASSTHROUGH /* getStub */);
529f509cb0e7680dcf4c8db02020765584c89b85573Yifan Hong    EXPECT_OK(service->getHashChain([&] (const auto &chain) {
530f509cb0e7680dcf4c8db02020765584c89b85573Yifan Hong        EXPECT_EQ(chain[0].size(), 32u);
531f509cb0e7680dcf4c8db02020765584c89b85573Yifan Hong        EXPECT_ARRAYEQ(ihash, chain[0], 32);
532f509cb0e7680dcf4c8db02020765584c89b85573Yifan Hong        EXPECT_OK(manager->getHashChain([&] (const auto &managerChain) {
533f509cb0e7680dcf4c8db02020765584c89b85573Yifan Hong            EXPECT_EQ(chain[chain.size() - 1].size(), managerChain[managerChain.size() - 1].size());
534f509cb0e7680dcf4c8db02020765584c89b85573Yifan Hong            EXPECT_ARRAYEQ(chain[chain.size() - 1], managerChain[managerChain.size() - 1],
535f509cb0e7680dcf4c8db02020765584c89b85573Yifan Hong                    chain[chain.size() - 1].size()) << "Hash for IBase doesn't match!";
536f509cb0e7680dcf4c8db02020765584c89b85573Yifan Hong        }));
537f509cb0e7680dcf4c8db02020765584c89b85573Yifan Hong    }));
538f509cb0e7680dcf4c8db02020765584c89b85573Yifan Hong}
539f509cb0e7680dcf4c8db02020765584c89b85573Yifan Hong
54001bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven MorelandTEST_F(HidlTest, ServiceListTest) {
54101bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    static const std::set<std::string> binderizedSet = {
54201bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        "android.hardware.tests.pointer@1.0::IPointer/pointer",
54301bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        "android.hardware.tests.bar@1.0::IBar/foo",
54401bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        "android.hardware.tests.inheritance@1.0::IFetcher/fetcher",
54501bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        "android.hardware.tests.inheritance@1.0::IParent/parent",
54601bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        "android.hardware.tests.inheritance@1.0::IParent/child",
54701bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        "android.hardware.tests.inheritance@1.0::IChild/child",
54801bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        "android.hardware.tests.pointer@1.0::IGraph/graph",
54901bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        "android.hardware.tests.inheritance@1.0::IGrandparent/child",
55001bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        "android.hardware.tests.foo@1.0::IFoo/foo",
551c20e35b887a49a98dfe7b9e52f7aa40002d1a1b5Martijn Coenen        "android.hidl.manager@1.0::IServiceManager/default",
55201bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    };
55301bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
55401bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    static const std::set<std::string> passthroughSet = {
555c20e35b887a49a98dfe7b9e52f7aa40002d1a1b5Martijn Coenen        "android.hidl.manager@1.0::IServiceManager/default"
55601bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    };
55701bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
55801bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    std::set<std::string> activeSet;
55901bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
560179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    switch(mode) {
56101bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        case BINDERIZED: {
56201bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland            activeSet = binderizedSet;
56301bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        } break;
56401bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
56501bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        case PASSTHROUGH: {
56601bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland            activeSet = passthroughSet;
56701bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        } break;
56801bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        default:
56901bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland            EXPECT_TRUE(false) << "unrecognized mode";
57001bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    }
57101bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
57201bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    EXPECT_OK(manager->list([&activeSet](const hidl_vec<hidl_string> &registered){
57301bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        std::set<std::string> registeredSet;
57401bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
57501bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        for (size_t i = 0; i < registered.size(); i++) {
57601bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland            registeredSet.insert(registered[i]);
57701bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        }
57801bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
57901bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        std::set<std::string> difference;
58001bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        std::set_difference(activeSet.begin(), activeSet.end(),
58101bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland                            registeredSet.begin(), registeredSet.end(),
58201bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland                            std::inserter(difference, difference.begin()));
58301bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
58401bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        EXPECT_EQ(difference.size(), 0u) << "service(s) not registered " << to_string(difference);
58501bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    }));
58601bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland}
58701bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
58872d948857e957bc7da6be58615beb3e128c7b209Steven Moreland// passthrough TODO(b/31959402)
58901bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven MorelandTEST_F(HidlTest, ServiceListByInterfaceTest) {
590179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    if (mode == BINDERIZED) {
591d39133bff0a3df357226f33b424cdf99299cc40aSteven Moreland        EXPECT_OK(manager->listByInterface(IParent::descriptor,
59201bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland            [](const hidl_vec<hidl_string> &registered) {
59301bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland                std::set<std::string> registeredSet;
59401bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
59501bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland                for (size_t i = 0; i < registered.size(); i++) {
59601bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland                    registeredSet.insert(registered[i]);
59701bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland                }
59801bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
59901bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland                std::set<std::string> activeSet = {
60001bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland                    "parent", "child"
60101bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland                };
60201bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland                std::set<std::string> difference;
60301bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland                std::set_difference(activeSet.begin(), activeSet.end(),
60401bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland                                    registeredSet.begin(), registeredSet.end(),
60501bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland                                    std::inserter(difference, difference.begin()));
60601bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
60701bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland                EXPECT_EQ(difference.size(), 0u) << "service(s) not registered " << to_string(difference);
60801bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland            }));
60901bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    }
61001bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland}
61101bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
61272d948857e957bc7da6be58615beb3e128c7b209Steven Moreland// passthrough TODO(b/31959402)
61301bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven MorelandTEST_F(HidlTest, ServiceParentTest) {
614179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    if (mode == BINDERIZED) {
61501bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        sp<IParent> parent = IParent::getService("child");
61601bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
61701bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland        EXPECT_NE(parent, nullptr);
61801bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland    }
61901bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland}
62001bcb774f3b0744774a8a28b5e093a7c1c8dd9ffSteven Moreland
62172d948857e957bc7da6be58615beb3e128c7b209Steven Moreland// passthrough TODO(b/31959402)
6220693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven MorelandTEST_F(HidlTest, ServiceNotificationTest) {
623179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    if (mode == BINDERIZED) {
6240693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        ServiceNotification *notification = new ServiceNotification();
6250693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
6260693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        std::string instanceName = "test-instance";
62721aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland        EXPECT_TRUE(IParent::registerForNotifications(instanceName, notification));
6280693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
62921aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland        EXPECT_EQ(::android::OK, (new SimpleChild())->registerAsService(instanceName));
63021aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland        EXPECT_EQ(::android::OK, (new SimpleParent())->registerAsService(instanceName));
6310693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
6320693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        std::unique_lock<std::mutex> lock(notification->mutex);
6330693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
6340693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        notification->condition.wait_for(
6350693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland                lock,
6360693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland                std::chrono::milliseconds(2),
6370693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland                [&notification]() {
63821aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland                   return notification->getRegistrations().size() >= 2;
6390693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland                });
6400693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
6410693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        std::vector<std::string> registrations = notification->getRegistrations();
6420693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
64321aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland        EXPECT_EQ(registrations.size(), 2u);
6440693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
6450693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        EXPECT_EQ(to_string(registrations.data(), registrations.size()),
64621aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland                  std::string("['") + IParent::descriptor + "/" + instanceName +
64721aa43c93083bab6f1ab5511418fc65bf49de068Steven Moreland                             "', '" + IParent::descriptor + "/" + instanceName + "']");
6480693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland    }
6490693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland}
6500693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
65172d948857e957bc7da6be58615beb3e128c7b209Steven Moreland// passthrough TODO(b/31959402)
6520693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven MorelandTEST_F(HidlTest, ServiceAllNotificationTest) {
653179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    if (mode == BINDERIZED) {
6540693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        ServiceNotification *notification = new ServiceNotification();
6550693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
6560693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        std::string instanceOne = "test-instance-one";
6570693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        std::string instanceTwo = "test-instance-two";
6580693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        EXPECT_TRUE(ISimple::registerForNotifications("", notification));
6590693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
6600693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        Simple* instanceA = new Simple(1);
661c7167ca32679a1127d9504be700dfd6dfbc41a3fSteven Moreland        EXPECT_EQ(::android::OK, instanceA->registerAsService(instanceOne));
6620693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        Simple* instanceB = new Simple(2);
663c7167ca32679a1127d9504be700dfd6dfbc41a3fSteven Moreland        EXPECT_EQ(::android::OK, instanceB->registerAsService(instanceTwo));
6640693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
6650693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        std::unique_lock<std::mutex> lock(notification->mutex);
6660693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
6670693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        notification->condition.wait_for(
6680693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland                lock,
6690693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland                std::chrono::milliseconds(2),
6700693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland                [&notification]() {
6710693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland                   return notification->getRegistrations().size() >= 2;
6720693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland                });
6730693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
6740693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        std::vector<std::string> registrations = notification->getRegistrations();
6750693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        std::sort(registrations.begin(), registrations.end());
6760693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
6770693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        EXPECT_EQ(registrations.size(), 2u);
6780693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
679d39133bff0a3df357226f33b424cdf99299cc40aSteven Moreland        std::string descriptor = ISimple::descriptor;
6800693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
6810693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland        EXPECT_EQ(to_string(registrations.data(), registrations.size()),
6820693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland                  "['" + descriptor + "/" + instanceOne + "', '"
6830693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland                       + descriptor + "/" + instanceTwo + "']");
6840693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland    }
6850693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland}
6860693f31ad6db66a0ed57e5c52bb61d77337cab3cSteven Moreland
687aa2b83adce439a67ef150e1677a39e5e4154ca34Steven MorelandTEST_F(HidlTest, TestToken) {
688cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland    Return<void> ret = tokenManager->createToken(manager, [&] (const hidl_vec<uint8_t> &token) {
689cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland        Return<sp<IBase>> retService = tokenManager->get(token);
690cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland        EXPECT_OK(retService);
691cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland        if (retService.isOk()) {
692cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland            sp<IBase> service = retService;
693cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland            EXPECT_NE(nullptr, service.get());
694cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland            sp<IServiceManager> retManager = IServiceManager::castFrom(service);
695cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland
696cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland            // TODO(b/33818800): should have only one Bp per process
697cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland            // EXPECT_EQ(manager, retManager);
698cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland
699cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland            EXPECT_NE(nullptr, retManager.get());
700cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland        }
701aa2b83adce439a67ef150e1677a39e5e4154ca34Steven Moreland
702cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland        Return<bool> unregisterRet = tokenManager->unregister(token);
703aa2b83adce439a67ef150e1677a39e5e4154ca34Steven Moreland
704cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland        EXPECT_OK(unregisterRet);
705cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland        if (unregisterRet.isOk()) {
706cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland            EXPECT_TRUE(unregisterRet);
707cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland        }
708cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland    });
709cf47e4d11ab8750c848a24f40963783552411ddfSteven Moreland    EXPECT_OK(ret);
710aa2b83adce439a67ef150e1677a39e5e4154ca34Steven Moreland}
711aa2b83adce439a67ef150e1677a39e5e4154ca34Steven Moreland
71299e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn CoenenTEST_F(HidlTest, TestSharedMemory) {
71399e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    const uint8_t kValue = 0xCA;
71499e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    hidl_memory mem_copy;
71599e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    EXPECT_OK(ashmemAllocator->allocate(1024, [&](bool success, const hidl_memory& mem) {
71699e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen        EXPECT_EQ(success, true);
71799e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen
71899e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen        sp<IMemory> memory = mapMemory(mem);
71999e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen
72099e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen        EXPECT_NE(memory, nullptr);
72199e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen
72299e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen        uint8_t* data = static_cast<uint8_t*>(static_cast<void*>(memory->getPointer()));
72399e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen        EXPECT_NE(data, nullptr);
72499e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen
72599e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen        EXPECT_EQ(memory->getSize(), mem.size());
72699e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen
72799e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen        memory->update();
72899e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen        memset(data, 0, memory->getSize());
72999e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen        memory->commit();
73099e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen
73199e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen        mem_copy = mem;
73299e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen        memoryTest->fillMemory(mem, kValue);
733fc0601696cc798c6528f74e11f1b2ea11102d0f3Steven Moreland
734fc0601696cc798c6528f74e11f1b2ea11102d0f3Steven Moreland        memory->read();
73599e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen        for (size_t i = 0; i < mem.size(); i++) {
73699e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen            EXPECT_EQ(kValue, data[i]);
73799e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen        }
738fc0601696cc798c6528f74e11f1b2ea11102d0f3Steven Moreland        memory->commit();
73999e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    }));
74099e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen
74199e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    // Test the memory persists after the call
74299e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    sp<IMemory> memory = mapMemory(mem_copy);
74399e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen
74499e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    EXPECT_NE(memory, nullptr);
74599e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen
74699e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    uint8_t* data = static_cast<uint8_t*>(static_cast<void*>(memory->getPointer()));
74799e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    EXPECT_NE(data, nullptr);
74899e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen
749fc0601696cc798c6528f74e11f1b2ea11102d0f3Steven Moreland    memory->read();
75099e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    for (size_t i = 0; i < mem_copy.size(); i++) {
75199e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen        EXPECT_EQ(kValue, data[i]);
75299e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    }
753fc0601696cc798c6528f74e11f1b2ea11102d0f3Steven Moreland    memory->commit();
7548951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju
7558951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju    hidl_memory mem_move(std::move(mem_copy));
7568951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju    ASSERT_EQ(nullptr, mem_copy.handle());
7578951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju    ASSERT_EQ(0UL, mem_copy.size());
7588951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju    ASSERT_EQ("", mem_copy.name());
7598951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju
7608951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju    memory.clear();
7618951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju    memory = mapMemory(mem_move);
7628951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju
7638951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju    EXPECT_NE(memory, nullptr);
7648951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju
7658951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju    data = static_cast<uint8_t*>(static_cast<void*>(memory->getPointer()));
7668951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju    EXPECT_NE(data, nullptr);
7678951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju
768fc0601696cc798c6528f74e11f1b2ea11102d0f3Steven Moreland    memory->read();
7698951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju    for (size_t i = 0; i < mem_move.size(); i++) {
7708951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju        EXPECT_EQ(kValue, data[i]);
7718951e55e7af8d9666bd55cff1c6a672b3a94b510Hridya Valsaraju    }
772fc0601696cc798c6528f74e11f1b2ea11102d0f3Steven Moreland    memory->commit();
77399e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen}
77499e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen
77560864a4374fe867fc3e7f309ca8e4e7c757d7583Steven MorelandTEST_F(HidlTest, BatchSharedMemory) {
77660864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland    const uint8_t kValue = 0xCA;
77760864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland    const uint64_t kBatchSize = 2;
77860864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland    hidl_vec<hidl_memory> batchCopy;
77960864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland
78060864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland    EXPECT_OK(ashmemAllocator->batchAllocate(1024, kBatchSize,
78160864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland        [&](bool success, const hidl_vec<hidl_memory>& batch) {
78260864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland            ASSERT_TRUE(success);
78360864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland            EXPECT_EQ(kBatchSize, batch.size());
78460864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland
78560864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland            for (uint64_t i = 0; i < batch.size(); i++) {
78660864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland                sp<IMemory> memory = mapMemory(batch[i]);
78760864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland
78860864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland                EXPECT_NE(nullptr, memory.get());
78960864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland
79060864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland                uint8_t* data = static_cast<uint8_t*>(static_cast<void*>(memory->getPointer()));
79160864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland                EXPECT_NE(nullptr, data);
79260864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland
79360864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland                EXPECT_EQ(memory->getSize(), batch[i].size());
79460864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland
79560864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland                memory->update();
79660864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland                memset(data, kValue, memory->getSize());
79760864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland                memory->commit();
79860864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland            }
79960864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland
80060864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland            batchCopy = batch;
80160864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland        }));
80260864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland
80360864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland    for (uint64_t i = 0; i < batchCopy.size(); i++) {
80460864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland        // Test the memory persists after the call
80560864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland        sp<IMemory> memory = mapMemory(batchCopy[i]);
80660864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland
80760864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland        EXPECT_NE(memory, nullptr);
80860864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland
80960864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland        uint8_t* data = static_cast<uint8_t*>(static_cast<void*>(memory->getPointer()));
81060864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland        EXPECT_NE(data, nullptr);
81160864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland
81260864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland        memory->read();
81360864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland        for (size_t i = 0; i < batchCopy[i].size(); i++) {
81460864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland            EXPECT_EQ(kValue, data[i]);
81560864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland        }
81660864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland        memory->commit();
81760864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland    }
81860864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland}
81960864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland
82060864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Morelandinline uint64_t operator""_GB(unsigned long long num) {
82160864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland    return num * 1024 * 1024 * 1024;
82260864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland}
82360864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland
82460864a4374fe867fc3e7f309ca8e4e7c757d7583Steven MorelandTEST_F(HidlTest, FailedBatchSharedMemory) {
82560864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland    EXPECT_OK(ashmemAllocator->batchAllocate(1024, UINT64_MAX, [&](bool success, const auto& v) {
82660864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland        EXPECT_FALSE(success);
82760864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland        EXPECT_EQ(0u, v.size());
82860864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland    }));
82960864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland    EXPECT_OK(ashmemAllocator->batchAllocate(1_GB, 1024, [&](bool success, const auto& v) {
83060864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland        EXPECT_FALSE(success);
83160864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland        EXPECT_EQ(0u, v.size());
83260864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland    }));
83360864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland}
83460864a4374fe867fc3e7f309ca8e4e7c757d7583Steven Moreland
835f31f165e060c91ac97a1ff139de8a72e824a3308Steven MorelandTEST_F(HidlTest, NullSharedMemory) {
836f31f165e060c91ac97a1ff139de8a72e824a3308Steven Moreland    hidl_memory memory{};
837f31f165e060c91ac97a1ff139de8a72e824a3308Steven Moreland
838f31f165e060c91ac97a1ff139de8a72e824a3308Steven Moreland    EXPECT_EQ(nullptr, memory.handle());
839f31f165e060c91ac97a1ff139de8a72e824a3308Steven Moreland
840f31f165e060c91ac97a1ff139de8a72e824a3308Steven Moreland    EXPECT_OK(memoryTest->haveSomeMemory(memory, [&](const hidl_memory &mem) {
841f31f165e060c91ac97a1ff139de8a72e824a3308Steven Moreland        EXPECT_EQ(nullptr, mem.handle());
842f31f165e060c91ac97a1ff139de8a72e824a3308Steven Moreland    }));
843f31f165e060c91ac97a1ff139de8a72e824a3308Steven Moreland}
844f31f165e060c91ac97a1ff139de8a72e824a3308Steven Moreland
845c75fd47b91f2edea70bb88f5508d9a161b916045Yifan HongTEST_F(HidlTest, FooGetDescriptorTest) {
846c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong    EXPECT_OK(foo->interfaceDescriptor([&] (const auto &desc) {
847179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        EXPECT_EQ(desc, mode == BINDERIZED
848c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong                ? IBar::descriptor // service is actually IBar in binderized mode
849c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong                : IFoo::descriptor); // dlopened, so service is IFoo
850c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong    }));
851c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong}
852c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong
8531dc8793c9aac86fe08dbe3150d96d88435a978dfYifan HongTEST_F(HidlTest, FooDoThisTest) {
854b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT call doThis.");
8551dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong    EXPECT_OK(foo->doThis(1.0f));
856b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT doThis returned.");
8571dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong}
8589cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
8591dc8793c9aac86fe08dbe3150d96d88435a978dfYifan HongTEST_F(HidlTest, FooDoThatAndReturnSomethingTest) {
860b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT call doThatAndReturnSomething.");
8612ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland    int32_t result = foo->doThatAndReturnSomething(2.0f);
8622ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland    ALOGI("CLIENT doThatAndReturnSomething returned %d.", result);
8632ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland    EXPECT_EQ(result, 666);
8641dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong}
8659cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
8661dc8793c9aac86fe08dbe3150d96d88435a978dfYifan HongTEST_F(HidlTest, FooDoQuiteABitTest) {
867b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT call doQuiteABit");
8682ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland    double something = foo->doQuiteABit(1, 2, 3.0f, 4.0);
8692ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland    ALOGI("CLIENT doQuiteABit returned %f.", something);
8702ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland    EXPECT_DOUBLE_EQ(something, 666.5);
8711dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong}
8721dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong
8731dc8793c9aac86fe08dbe3150d96d88435a978dfYifan HongTEST_F(HidlTest, FooDoSomethingElseTest) {
8749cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
875b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT call doSomethingElse");
876f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber    hidl_array<int32_t, 15> param;
8779cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    for (size_t i = 0; i < sizeof(param) / sizeof(param[0]); ++i) {
8789cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber        param[i] = i;
8799cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    }
8801dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong    EXPECT_OK(foo->doSomethingElse(param, [&](const auto &something) {
881b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev            ALOGI("CLIENT doSomethingElse returned %s.",
8825e44a291ff57cd25ce6447996b11104ac2938ee9Andreas Huber                  to_string(something).c_str());
8831dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong            int32_t expect[] = {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24,
8841dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong                26, 28, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 1, 2};
885e70455b6294fcb1ab98b8cd608000a3af61af2ccSteven Moreland            EXPECT_TRUE(isArrayEqual(something, expect, 32));
8861dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong        }));
8871dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong}
8889cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
8891dc8793c9aac86fe08dbe3150d96d88435a978dfYifan HongTEST_F(HidlTest, FooDoStuffAndReturnAStringTest) {
890b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT call doStuffAndReturnAString");
8911dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong    EXPECT_OK(foo->doStuffAndReturnAString([&](const auto &something) {
892b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev            ALOGI("CLIENT doStuffAndReturnAString returned '%s'.",
8939cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber                  something.c_str());
8941dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong            EXPECT_STREQ(something.c_str(), "Hello, world");
8956e3f9f47eaf9664c605f703e6f48df2648756332Steven Moreland            EXPECT_EQ(strlen("Hello, world"), something.size());
8961dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong        }));
8971dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong}
8989cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
8991dc8793c9aac86fe08dbe3150d96d88435a978dfYifan HongTEST_F(HidlTest, FooMapThisVectorTest) {
9009cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    hidl_vec<int32_t> vecParam;
9019cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    vecParam.resize(10);
9029cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    for (size_t i = 0; i < 10; ++i) {
9039cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber        vecParam[i] = i;
9049cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    }
9051dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong    EXPECT_OK(foo->mapThisVector(vecParam, [&](const auto &something) {
906b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev            ALOGI("CLIENT mapThisVector returned %s.",
9075e44a291ff57cd25ce6447996b11104ac2938ee9Andreas Huber                  to_string(something).c_str());
9081dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong            int32_t expect[] = {0, 2, 4, 6, 8, 10, 12, 14, 16, 18};
909e70455b6294fcb1ab98b8cd608000a3af61af2ccSteven Moreland            EXPECT_TRUE(isArrayEqual(something, expect, something.size()));
9101dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong        }));
9111dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong}
9129cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
913def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan HongTEST_F(HidlTest, WrapTest) {
914f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju    if (!gHidlEnvironment->enableDelayMeasurementTests) {
915f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju        return;
916f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju    }
917f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju
91801e7cdef5d4198104a4e772cb742fb88777dccebYifan Hong    using ::android::hardware::tests::foo::V1_0::BnHwSimple;
919def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    using ::android::hardware::tests::foo::V1_0::BsSimple;
92001e7cdef5d4198104a4e772cb742fb88777dccebYifan Hong    using ::android::hardware::tests::foo::V1_0::BpHwSimple;
9217d3ac806f3f8e9ac3fe5ecc3d17054e8b4e641dfZhuoyao Zhang    using ::android::hardware::details::HidlInstrumentor;
922def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    nsecs_t now;
923def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    int i = 0;
924def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong
925def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    now = systemTime();
92601e7cdef5d4198104a4e772cb742fb88777dccebYifan Hong    new BnHwSimple(new Simple(1));
92701e7cdef5d4198104a4e772cb742fb88777dccebYifan Hong    EXPECT_LT(systemTime() - now, 2000000) << "    for BnHwSimple(nonnull)";
928def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong
929def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    now = systemTime();
93001e7cdef5d4198104a4e772cb742fb88777dccebYifan Hong    new BnHwSimple(nullptr);
93101e7cdef5d4198104a4e772cb742fb88777dccebYifan Hong    EXPECT_LT(systemTime() - now, 2000000) << "    for BnHwSimple(null)";
932def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong
933def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    now = systemTime();
934def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    new BsSimple(new Simple(1));
935def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    EXPECT_LT(systemTime() - now, 2000000) << "    for BsSimple(nonnull)";
936def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong
937def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    now = systemTime();
938def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    new BsSimple(nullptr);
939def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    EXPECT_LT(systemTime() - now, 2000000) << "    for BsSimple(null)";
940def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong
941def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    now = systemTime();
94201e7cdef5d4198104a4e772cb742fb88777dccebYifan Hong    new BpHwSimple(nullptr);
94301e7cdef5d4198104a4e772cb742fb88777dccebYifan Hong    EXPECT_LT(systemTime() - now, 2000000) << "    for BpHwSimple(null)";
944def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong
945def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    now = systemTime();
9467d3ac806f3f8e9ac3fe5ecc3d17054e8b4e641dfZhuoyao Zhang    new ::android::hardware::details::HidlInstrumentor("", "");
947def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    EXPECT_LT(systemTime() - now, 2000000) << "    for HidlInstrumentor";
948def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong
949def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    now = systemTime();
950def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    i++;
951def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong    EXPECT_LT(systemTime() - now,    1000) << "    for nothing";
952def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong}
953def2cfbad63338aefdaa71dc7a9ae3a0f75c0dd9Yifan Hong
9541dc8793c9aac86fe08dbe3150d96d88435a978dfYifan HongTEST_F(HidlTest, FooCallMeTest) {
955f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju    if (!gHidlEnvironment->enableDelayMeasurementTests) {
956f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju        return;
957f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju    }
95811992a60ff12aa66d13da9731f9578e1165422a0Yifan Hong    sp<IFooCallback> fooCb = new FooCallback();
959b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT call callMe.");
9600acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    // callMe is oneway, should return instantly.
9610acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    nsecs_t now;
9620acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    now = systemTime();
9630acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    EXPECT_OK(foo->callMe(fooCb));
9643eac8a3419ce36a4f84e4620474711c138753d3cYifan Hong    EXPECT_LT(systemTime() - now, ONEWAY_TOLERANCE_NS);
965b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT callMe returned.");
9660acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev
9670acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    // Bar::callMe will invoke three methods on FooCallback; one will return
9680acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    // right away (even though it is a two-way method); the second one will
9693eac8a3419ce36a4f84e4620474711c138753d3cYifan Hong    // block Bar for DELAY_S seconds, and the third one will return
9700acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    // to Bar right away (is oneway) but will itself block for DELAY_S seconds.
9710acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    // We need a way to make sure that these three things have happened within
9720acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    // 2*DELAY_S seconds plus some small tolerance.
9730acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    //
9740acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    // Method FooCallback::reportResults() takes a timeout parameter.  It blocks for
9750acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    // that length of time, while waiting for the three methods above to
9760acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    // complete.  It returns the information of whether each method was invoked,
9770acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    // as well as how long the body of the method took to execute.  We verify
9780acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    // the information returned by reportResults() against the timeout we pass (which
9790acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    // is long enough for the method bodies to execute, plus tolerance), and
9800acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    // verify that eachof them executed, as expected, and took the length of
9810acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    // time to execute that we also expect.
9820acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev
983fcf94e48639538117e52f81ba7018c2af7b4cc81Yifan Hong    const nsecs_t waitNs =
984fcf94e48639538117e52f81ba7018c2af7b4cc81Yifan Hong        3 * DELAY_NS + TOLERANCE_NS;
9850acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    const nsecs_t reportResultsNs =
9863eac8a3419ce36a4f84e4620474711c138753d3cYifan Hong        2 * DELAY_NS + TOLERANCE_NS;
98703866f5efb7b0e20e8bb4fd416e577a6332f3306Andreas Huber
9880acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    ALOGI("CLIENT: Waiting for up to %" PRId64 " seconds.",
989fcf94e48639538117e52f81ba7018c2af7b4cc81Yifan Hong          nanoseconds_to_seconds(waitNs));
9900acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev
991fcf94e48639538117e52f81ba7018c2af7b4cc81Yifan Hong    fooCb->reportResults(waitNs,
9920acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev                [&](int64_t timeLeftNs,
993f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber                    const hidl_array<IFooCallback::InvokeInfo, 3> &invokeResults) {
9940acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev        ALOGI("CLIENT: FooCallback::reportResults() is returning data.");
9950acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev        ALOGI("CLIENT: Waited for %" PRId64 " milliseconds.",
996fcf94e48639538117e52f81ba7018c2af7b4cc81Yifan Hong              nanoseconds_to_milliseconds(waitNs - timeLeftNs));
997fcf94e48639538117e52f81ba7018c2af7b4cc81Yifan Hong
998fcf94e48639538117e52f81ba7018c2af7b4cc81Yifan Hong        EXPECT_LE(waitNs - timeLeftNs, reportResultsNs)
999fcf94e48639538117e52f81ba7018c2af7b4cc81Yifan Hong                << "waited for "
1000fcf94e48639538117e52f81ba7018c2af7b4cc81Yifan Hong                << (timeLeftNs >= 0 ? "" : "more than ")
1001fcf94e48639538117e52f81ba7018c2af7b4cc81Yifan Hong                << (timeLeftNs >= 0 ? (waitNs - timeLeftNs) : waitNs)
1002fcf94e48639538117e52f81ba7018c2af7b4cc81Yifan Hong                << "ns, expect to finish in "
1003fcf94e48639538117e52f81ba7018c2af7b4cc81Yifan Hong                << reportResultsNs << " ns";
10040acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev
10050acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev        // two-way method, was supposed to return right away
10060acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev        EXPECT_TRUE(invokeResults[0].invoked);
10073eac8a3419ce36a4f84e4620474711c138753d3cYifan Hong        EXPECT_LE(invokeResults[0].timeNs, invokeResults[0].callerBlockedNs);
10083eac8a3419ce36a4f84e4620474711c138753d3cYifan Hong        EXPECT_LE(invokeResults[0].callerBlockedNs, TOLERANCE_NS);
10090acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev        // two-way method, was supposed to block caller for DELAY_NS
10100acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev        EXPECT_TRUE(invokeResults[1].invoked);
10113eac8a3419ce36a4f84e4620474711c138753d3cYifan Hong        EXPECT_LE(invokeResults[1].timeNs, invokeResults[1].callerBlockedNs);
10123eac8a3419ce36a4f84e4620474711c138753d3cYifan Hong        EXPECT_LE(invokeResults[1].callerBlockedNs,
10133eac8a3419ce36a4f84e4620474711c138753d3cYifan Hong                    DELAY_NS + TOLERANCE_NS);
10140acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev        // one-way method, do not block caller, but body was supposed to block for DELAY_NS
10150acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev        EXPECT_TRUE(invokeResults[2].invoked);
10163eac8a3419ce36a4f84e4620474711c138753d3cYifan Hong        EXPECT_LE(invokeResults[2].callerBlockedNs, ONEWAY_TOLERANCE_NS);
10173eac8a3419ce36a4f84e4620474711c138753d3cYifan Hong        EXPECT_LE(invokeResults[2].timeNs, DELAY_NS + TOLERANCE_NS);
10180acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    });
10190acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev}
10200acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev
10212ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland
10222ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland
10231dc8793c9aac86fe08dbe3150d96d88435a978dfYifan HongTEST_F(HidlTest, FooUseAnEnumTest) {
10241dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong    ALOGI("CLIENT call useAnEnum.");
10252ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland    IFoo::SomeEnum sleepy = foo->useAnEnum(IFoo::SomeEnum::quux);
10262ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland    ALOGI("CLIENT useAnEnum returned %u", (unsigned)sleepy);
10272ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland    EXPECT_EQ(sleepy, IFoo::SomeEnum::goober);
10281dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong}
10299cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
10301dc8793c9aac86fe08dbe3150d96d88435a978dfYifan HongTEST_F(HidlTest, FooHaveAGooberTest) {
10319cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    hidl_vec<IFoo::Goober> gooberVecParam;
10329cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    gooberVecParam.resize(2);
10339cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    gooberVecParam[0].name = "Hello";
10349cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    gooberVecParam[1].name = "World";
10359cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
1036b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT call haveAGooberVec.");
10371dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong    EXPECT_OK(foo->haveAGooberVec(gooberVecParam));
1038b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT haveAGooberVec returned.");
10399cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
1040b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT call haveaGoober.");
10411dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong    EXPECT_OK(foo->haveAGoober(gooberVecParam[0]));
1042b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT haveaGoober returned.");
1043b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev
1044b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT call haveAGooberArray.");
1045f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber    hidl_array<IFoo::Goober, 20> gooberArrayParam;
10461dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong    EXPECT_OK(foo->haveAGooberArray(gooberArrayParam));
1047b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT haveAGooberArray returned.");
10481dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong}
104988ca4511354b4bdaed1846486a1b285576788e4bSteven Moreland
10501dc8793c9aac86fe08dbe3150d96d88435a978dfYifan HongTEST_F(HidlTest, FooHaveATypeFromAnotherFileTest) {
1051b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT call haveATypeFromAnotherFile.");
105288ca4511354b4bdaed1846486a1b285576788e4bSteven Moreland    Abc abcParam{};
105388ca4511354b4bdaed1846486a1b285576788e4bSteven Moreland    abcParam.x = "alphabet";
105488ca4511354b4bdaed1846486a1b285576788e4bSteven Moreland    abcParam.y = 3.14f;
1055a65bb2cd849eb17274c8477e4959e7bc08555fcbYifan Hong    native_handle_t *handle = native_handle_create(0, 0);
1056a65bb2cd849eb17274c8477e4959e7bc08555fcbYifan Hong    abcParam.z = handle;
10571dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong    EXPECT_OK(foo->haveATypeFromAnotherFile(abcParam));
1058b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT haveATypeFromAnotherFile returned.");
1059a65bb2cd849eb17274c8477e4959e7bc08555fcbYifan Hong    native_handle_delete(handle);
106088ca4511354b4bdaed1846486a1b285576788e4bSteven Moreland    abcParam.z = NULL;
10611dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong}
10629cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
10631dc8793c9aac86fe08dbe3150d96d88435a978dfYifan HongTEST_F(HidlTest, FooHaveSomeStringsTest) {
1064b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT call haveSomeStrings.");
1065f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber    hidl_array<hidl_string, 3> stringArrayParam;
10669cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    stringArrayParam[0] = "What";
10679cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    stringArrayParam[1] = "a";
10689cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    stringArrayParam[2] = "disaster";
106967f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland    EXPECT_OK(foo->haveSomeStrings(
107067f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland                stringArrayParam,
107167f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland                [&](const auto &out) {
107267f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland                    ALOGI("CLIENT haveSomeStrings returned %s.",
107367f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland                          to_string(out).c_str());
107467f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland
107567f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland                    EXPECT_EQ(to_string(out), "['Hello', 'World']");
107667f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland                }));
1077b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT haveSomeStrings returned.");
10781dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong}
10799cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
10801dc8793c9aac86fe08dbe3150d96d88435a978dfYifan HongTEST_F(HidlTest, FooHaveAStringVecTest) {
1081b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT call haveAStringVec.");
10829cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    hidl_vec<hidl_string> stringVecParam;
10839cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    stringVecParam.resize(3);
10849cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    stringVecParam[0] = "What";
10859cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    stringVecParam[1] = "a";
10869cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber    stringVecParam[2] = "disaster";
108767f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland    EXPECT_OK(foo->haveAStringVec(
108867f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland                stringVecParam,
108967f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland                [&](const auto &out) {
109067f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland                    ALOGI("CLIENT haveAStringVec returned %s.",
109167f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland                          to_string(out).c_str());
109267f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland
109367f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland                    EXPECT_EQ(to_string(out), "['Hello', 'World']");
109467f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland                }));
1095b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT haveAStringVec returned.");
10961dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong}
10976cb08cf9f021a01d9d2b1eaec6729aac6ae70708Andreas Huber
1098f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas HuberTEST_F(HidlTest, FooTransposeMeTest) {
1099f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber    hidl_array<float, 3, 5> in;
1100f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber    float k = 1.0f;
1101f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber    for (size_t i = 0; i < 3; ++i) {
1102f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber        for (size_t j = 0; j < 5; ++j, ++k) {
1103f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber            in[i][j] = k;
1104f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber        }
1105f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber    }
1106f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber
1107f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber    ALOGI("CLIENT call transposeMe(%s).", to_string(in).c_str());
1108f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber
1109f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber    EXPECT_OK(foo->transposeMe(
1110f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber                in,
1111f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                [&](const auto &out) {
1112f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                    ALOGI("CLIENT transposeMe returned %s.",
1113f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber                          to_string(out).c_str());
1114f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber
1115f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                    for (size_t i = 0; i < 3; ++i) {
1116f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                        for (size_t j = 0; j < 5; ++j) {
1117f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber                            EXPECT_EQ(out[j][i], in[i][j]);
1118f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                        }
1119f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                    }
1120f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                }));
1121f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber}
1122f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber
1123f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas HuberTEST_F(HidlTest, FooCallingDrWhoTest) {
1124f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber    IFoo::MultiDimensional in;
1125f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber
1126f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber    size_t k = 0;
1127f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber    for (size_t i = 0; i < 5; ++i) {
1128f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber        for (size_t j = 0; j < 3; ++j, ++k) {
1129f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber            in.quuxMatrix[i][j].first = ("First " + std::to_string(k)).c_str();
1130f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber            in.quuxMatrix[i][j].last = ("Last " + std::to_string(15-k)).c_str();
1131f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber        }
1132f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber    }
1133f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber
1134f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber    ALOGI("CLIENT call callingDrWho(%s).",
1135f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber          MultiDimensionalToString(in).c_str());
1136f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber
1137f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber    EXPECT_OK(foo->callingDrWho(
1138f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                in,
1139f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                [&](const auto &out) {
1140f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                    ALOGI("CLIENT callingDrWho returned %s.",
1141f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                          MultiDimensionalToString(out).c_str());
1142f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber
1143709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                    size_t k = 0;
1144f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                    for (size_t i = 0; i < 5; ++i) {
1145709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                        for (size_t j = 0; j < 3; ++j, ++k) {
1146f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                            EXPECT_STREQ(
1147f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber                                out.quuxMatrix[i][j].first.c_str(),
1148f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber                                in.quuxMatrix[4 - i][2 - j].last.c_str());
1149f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber
1150f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                            EXPECT_STREQ(
1151f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber                                out.quuxMatrix[i][j].last.c_str(),
1152f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber                                in.quuxMatrix[4 - i][2 - j].first.c_str());
1153f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                        }
1154f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                    }
1155f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber                }));
1156f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber}
1157f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber
1158709b62dbda6184770bb34470ff550e02c1643e67Andreas Huberstatic std::string numberToEnglish(int x) {
1159709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    static const char *const kDigits[] = {
1160709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        "zero",
1161709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        "one",
1162709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        "two",
1163709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        "three",
1164709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        "four",
1165709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        "five",
1166709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        "six",
1167709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        "seven",
1168709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        "eight",
1169709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        "nine",
1170709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    };
1171709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
1172709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    if (x < 0) {
1173709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        return "negative " + numberToEnglish(-x);
1174709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    }
1175709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
1176709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    if (x < 10) {
1177709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        return kDigits[x];
1178709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    }
1179709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
1180709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    if (x <= 15) {
1181709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        static const char *const kSpecialTens[] = {
1182709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber            "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
1183709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        };
1184709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
1185709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        return kSpecialTens[x - 10];
1186709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    }
1187709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
1188709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    if (x < 20) {
1189709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        return std::string(kDigits[x % 10]) + "teen";
1190709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    }
1191709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
1192709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    if (x < 100) {
1193709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        static const char *const kDecades[] = {
1194709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber            "twenty", "thirty", "forty", "fifty", "sixty", "seventy",
1195709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber            "eighty", "ninety",
1196709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        };
1197709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
1198709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        return std::string(kDecades[x / 10 - 2]) + kDigits[x % 10];
1199709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    }
1200709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
1201709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    return "positively huge!";
1202709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber}
1203709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
1204709b62dbda6184770bb34470ff550e02c1643e67Andreas HuberTEST_F(HidlTest, FooTransposeTest) {
1205709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    IFoo::StringMatrix5x3 in;
1206709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
1207709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    for (int i = 0; i < 5; ++i) {
1208f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber        for (int j = 0; j < 3; ++j) {
1209f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber            in.s[i][j] = numberToEnglish(3 * i + j + 1).c_str();
1210709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        }
1211709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    }
1212709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
1213709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    EXPECT_OK(foo->transpose(
1214709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                in,
1215709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                [&](const auto &out) {
1216709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                    EXPECT_EQ(
1217709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                        to_string(out),
1218709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                        "[['one', 'four', 'seven', 'ten', 'thirteen'], "
1219709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                         "['two', 'five', 'eight', 'eleven', 'fourteen'], "
1220709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                         "['three', 'six', 'nine', 'twelve', 'fifteen']]");
1221709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                }));
1222709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber}
1223709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
1224709b62dbda6184770bb34470ff550e02c1643e67Andreas HuberTEST_F(HidlTest, FooTranspose2Test) {
1225f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber    hidl_array<hidl_string, 5, 3> in;
1226709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
1227709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    for (int i = 0; i < 5; ++i) {
1228f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber        for (int j = 0; j < 3; ++j) {
1229f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber            in[i][j] = numberToEnglish(3 * i + j + 1).c_str();
1230709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        }
1231709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    }
1232709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
1233709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    EXPECT_OK(foo->transpose2(
1234709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                in,
1235709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                [&](const auto &out) {
1236709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                    EXPECT_EQ(
1237f03332ac955bc6cb22873e236868eacfc3bf78ccAndreas Huber                        to_string(out),
1238709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                        "[['one', 'four', 'seven', 'ten', 'thirteen'], "
1239709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                         "['two', 'five', 'eight', 'eleven', 'fourteen'], "
1240709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                         "['three', 'six', 'nine', 'twelve', 'fifteen']]");
1241709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber                }));
1242709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber}
1243709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
1244b725d679b19a1a5e74e30666450832469bc35cbdYifan HongTEST_F(HidlTest, FooNullNativeHandleTest) {
12459d97da2203a07661288709caaec2ed5caaaff0d6Martijn Coenen    Abc xyz;
12469d97da2203a07661288709caaec2ed5caaaff0d6Martijn Coenen    xyz.z = nullptr;
12479d97da2203a07661288709caaec2ed5caaaff0d6Martijn Coenen    EXPECT_OK(bar->expectNullHandle(nullptr, xyz, [](bool hIsNull, bool xyzHasNull) {
12489d97da2203a07661288709caaec2ed5caaaff0d6Martijn Coenen        EXPECT_TRUE(hIsNull);
12499d97da2203a07661288709caaec2ed5caaaff0d6Martijn Coenen        EXPECT_TRUE(xyzHasNull);
12509d97da2203a07661288709caaec2ed5caaaff0d6Martijn Coenen    }));
1251b725d679b19a1a5e74e30666450832469bc35cbdYifan Hong}
125267f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland
1253e163823c438558579dfc2018fe136a2808cf5d6cMartijn CoenenTEST_F(HidlTest, FooNullCallbackTest) {
1254e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen    EXPECT_OK(foo->echoNullInterface(nullptr,
1255e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen                [](const auto receivedNull, const auto &intf) {
1256e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen                   EXPECT_TRUE(receivedNull);
1257e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen                   EXPECT_EQ(intf, nullptr);
1258e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen                }));
1259e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen}
1260e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen
126167f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven MorelandTEST_F(HidlTest, FooNonNullCallbackTest) {
126267f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland    hidl_array<hidl_string, 5, 3> in;
126367f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland
126467f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland    EXPECT_FAIL(foo->transpose2(in, nullptr /* _hidl_cb */));
126567f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland}
126667f67b4e7a1f0d7d53703daa42d5cc07b375a577Steven Moreland
12675e44a291ff57cd25ce6447996b11104ac2938ee9Andreas HuberTEST_F(HidlTest, FooSendVecTest) {
12685e44a291ff57cd25ce6447996b11104ac2938ee9Andreas Huber    hidl_vec<uint8_t> in;
12695e44a291ff57cd25ce6447996b11104ac2938ee9Andreas Huber    in.resize(16);
12705e44a291ff57cd25ce6447996b11104ac2938ee9Andreas Huber    for (size_t i = 0; i < in.size(); ++i) {
12715e44a291ff57cd25ce6447996b11104ac2938ee9Andreas Huber        in[i] = i;
12725e44a291ff57cd25ce6447996b11104ac2938ee9Andreas Huber    }
12735e44a291ff57cd25ce6447996b11104ac2938ee9Andreas Huber
12745e44a291ff57cd25ce6447996b11104ac2938ee9Andreas Huber    EXPECT_OK(foo->sendVec(
12755e44a291ff57cd25ce6447996b11104ac2938ee9Andreas Huber                in,
12765e44a291ff57cd25ce6447996b11104ac2938ee9Andreas Huber                [&](const auto &out) {
12775e44a291ff57cd25ce6447996b11104ac2938ee9Andreas Huber                    EXPECT_EQ(to_string(in), to_string(out));
12785e44a291ff57cd25ce6447996b11104ac2938ee9Andreas Huber                }));
12795e44a291ff57cd25ce6447996b11104ac2938ee9Andreas Huber}
12805e44a291ff57cd25ce6447996b11104ac2938ee9Andreas Huber
1281afb30cb46a492318261ba49b8c9fc4af67dd5976Martijn CoenenTEST_F(HidlTest, FooSendEmptyVecTest) {
1282afb30cb46a492318261ba49b8c9fc4af67dd5976Martijn Coenen    hidl_vec<uint8_t> in;
1283afb30cb46a492318261ba49b8c9fc4af67dd5976Martijn Coenen    EXPECT_OK(foo->sendVec(
1284afb30cb46a492318261ba49b8c9fc4af67dd5976Martijn Coenen                in,
1285afb30cb46a492318261ba49b8c9fc4af67dd5976Martijn Coenen                [&](const auto &out) {
1286afb30cb46a492318261ba49b8c9fc4af67dd5976Martijn Coenen                    EXPECT_EQ(out.size(), 0u);
1287afb30cb46a492318261ba49b8c9fc4af67dd5976Martijn Coenen                    EXPECT_EQ(to_string(in), to_string(out));
1288afb30cb46a492318261ba49b8c9fc4af67dd5976Martijn Coenen                }));
1289afb30cb46a492318261ba49b8c9fc4af67dd5976Martijn Coenen}
1290afb30cb46a492318261ba49b8c9fc4af67dd5976Martijn Coenen
129186a112bdfae618d6538307839a6c39555bceb79dAndreas HuberTEST_F(HidlTest, FooHaveAVectorOfInterfacesTest) {
129286a112bdfae618d6538307839a6c39555bceb79dAndreas Huber    hidl_vec<sp<ISimple> > in;
129386a112bdfae618d6538307839a6c39555bceb79dAndreas Huber    in.resize(16);
129486a112bdfae618d6538307839a6c39555bceb79dAndreas Huber    for (size_t i = 0; i < in.size(); ++i) {
129586a112bdfae618d6538307839a6c39555bceb79dAndreas Huber        in[i] = new Simple(i);
129686a112bdfae618d6538307839a6c39555bceb79dAndreas Huber    }
129786a112bdfae618d6538307839a6c39555bceb79dAndreas Huber
129886a112bdfae618d6538307839a6c39555bceb79dAndreas Huber    EXPECT_OK(foo->haveAVectorOfInterfaces(
129986a112bdfae618d6538307839a6c39555bceb79dAndreas Huber                in,
130086a112bdfae618d6538307839a6c39555bceb79dAndreas Huber                [&](const auto &out) {
130186a112bdfae618d6538307839a6c39555bceb79dAndreas Huber                    EXPECT_EQ(in.size(), out.size());
130286a112bdfae618d6538307839a6c39555bceb79dAndreas Huber                    for (size_t i = 0; i < in.size(); ++i) {
13032ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland                        int32_t inCookie = in[i]->getCookie();
13042ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland                        int32_t outCookie = out[i]->getCookie();
13052ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland                        EXPECT_EQ(inCookie, outCookie);
130686a112bdfae618d6538307839a6c39555bceb79dAndreas Huber                    }
130786a112bdfae618d6538307839a6c39555bceb79dAndreas Huber                }));
130886a112bdfae618d6538307839a6c39555bceb79dAndreas Huber}
130986a112bdfae618d6538307839a6c39555bceb79dAndreas Huber
131086a112bdfae618d6538307839a6c39555bceb79dAndreas HuberTEST_F(HidlTest, FooHaveAVectorOfGenericInterfacesTest) {
131186a112bdfae618d6538307839a6c39555bceb79dAndreas Huber
1312c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong    hidl_vec<sp<::android::hidl::base::V1_0::IBase> > in;
131386a112bdfae618d6538307839a6c39555bceb79dAndreas Huber    in.resize(16);
131486a112bdfae618d6538307839a6c39555bceb79dAndreas Huber    for (size_t i = 0; i < in.size(); ++i) {
1315c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong        sp<ISimple> s = new Simple(i);
1316c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong        in[i] = s;
131786a112bdfae618d6538307839a6c39555bceb79dAndreas Huber    }
131886a112bdfae618d6538307839a6c39555bceb79dAndreas Huber
131986a112bdfae618d6538307839a6c39555bceb79dAndreas Huber    EXPECT_OK(foo->haveAVectorOfGenericInterfaces(
132086a112bdfae618d6538307839a6c39555bceb79dAndreas Huber                in,
132186a112bdfae618d6538307839a6c39555bceb79dAndreas Huber                [&](const auto &out) {
132286a112bdfae618d6538307839a6c39555bceb79dAndreas Huber                    EXPECT_EQ(in.size(), out.size());
1323c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong
1324fbcdc80e6451c24545cf0a5841d0c40cca58f42cYifan Hong                    EXPECT_OK(out[0]->interfaceDescriptor([](const auto &name) {
1325fbcdc80e6451c24545cf0a5841d0c40cca58f42cYifan Hong                        ASSERT_STREQ(name.c_str(), ISimple::descriptor);
1326c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong                    }));
132786a112bdfae618d6538307839a6c39555bceb79dAndreas Huber                    for (size_t i = 0; i < in.size(); ++i) {
1328c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong                        sp<ISimple> inSimple = ISimple::castFrom(in[i]);
1329c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong                        sp<ISimple> outSimple = ISimple::castFrom(out[i]);
1330c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong
1331c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong                        ASSERT_NE(inSimple.get(), nullptr);
1332c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong                        ASSERT_NE(outSimple.get(), nullptr);
13336ec2f0b6fd43eec8e064c392804d3d9aa87b6f2fMartijn Coenen                        EXPECT_EQ(in[i], inSimple.get()); // pointers must be equal!
13342ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland                        int32_t inCookie = inSimple->getCookie();
13352ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland                        int32_t outCookie = outSimple->getCookie();
13362ae5bcaaa598f2cc1208b4e85a283325b4bdc453Steven Moreland                        EXPECT_EQ(inCookie, outCookie);
133786a112bdfae618d6538307839a6c39555bceb79dAndreas Huber                    }
133886a112bdfae618d6538307839a6c39555bceb79dAndreas Huber                }));
133986a112bdfae618d6538307839a6c39555bceb79dAndreas Huber}
134086a112bdfae618d6538307839a6c39555bceb79dAndreas Huber
13418c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan HongTEST_F(HidlTest, FooStructEmbeddedHandleTest) {
13428c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong    EXPECT_OK(foo->createMyHandle([&](const auto &myHandle) {
13438c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong        EXPECT_EQ(myHandle.guard, 666);
13442f69a5b157e9c5c41847e55bf3e7dbb01b7de99dMartijn Coenen        const native_handle_t* handle = myHandle.h.getNativeHandle();
13452f69a5b157e9c5c41847e55bf3e7dbb01b7de99dMartijn Coenen        EXPECT_EQ(handle->numInts, 10);
13462f69a5b157e9c5c41847e55bf3e7dbb01b7de99dMartijn Coenen        EXPECT_EQ(handle->numFds, 0);
13478c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong        int data[] = {2,3,5,7,11,13,17,19,21,23};
13482f69a5b157e9c5c41847e55bf3e7dbb01b7de99dMartijn Coenen        EXPECT_ARRAYEQ(handle->data, data, 10);
13498c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong    }));
13508c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong
13518c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong    EXPECT_OK(foo->closeHandles());
13528c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong}
13538c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong
13548c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan HongTEST_F(HidlTest, FooHandleVecTest) {
13558c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong    EXPECT_OK(foo->createHandles(3, [&](const auto &handles) {
13568c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong        EXPECT_EQ(handles.size(), 3ull);
13578c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong        int data[] = {2,3,5,7,11,13,17,19,21,23};
13588c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong        for (size_t i = 0; i < 3; i++) {
13598c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong            const native_handle_t *h = handles[i];
13608c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong            EXPECT_EQ(h->numInts, 10) << " for element " << i;
13618c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong            EXPECT_EQ(h->numFds, 0) << " for element " << i;
13628c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong            EXPECT_ARRAYEQ(h->data, data, 10);
13638c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong        }
13648c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong    }));
13658c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong
13668c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong    EXPECT_OK(foo->closeHandles());
13678c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong}
13688c48ad75135ec0394a173b29c2068b3bf84a9dc3Yifan Hong
1369115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenenstruct HidlDeathRecipient : hidl_death_recipient {
1370115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    std::mutex mutex;
1371115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    std::condition_variable condition;
1372115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    wp<IBase> who;
1373115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    bool fired = false;
1374115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    uint64_t cookie = 0;
1375115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen
1376115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    virtual void serviceDied(uint64_t cookie, const wp<IBase>& who) {
1377115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen        std::unique_lock<std::mutex> lock(mutex);
1378115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen        fired = true;
1379115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen        this->cookie = cookie;
1380115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen        this->who = who;
1381115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen        condition.notify_one();
1382115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    };
1383115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen};
1384115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen
1385115d428f9c38c078d679a98942c47ce4a17bd599Martijn CoenenTEST_F(HidlTest, DeathRecipientTest) {
1386115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    sp<HidlDeathRecipient> recipient = new HidlDeathRecipient();
1387115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    sp<HidlDeathRecipient> recipient2 = new HidlDeathRecipient();
1388115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen
1389179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    EXPECT_TRUE(dyingBaz->linkToDeath(recipient, 0x1481));
1390179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    EXPECT_TRUE(dyingBaz->linkToDeath(recipient2, 0x2592));
1391179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    EXPECT_TRUE(dyingBaz->unlinkToDeath(recipient2));
1392115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen
1393179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    if (mode != BINDERIZED) {
1394115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen        // Passthrough doesn't fire, nor does it keep state of
1395115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen        // registered death recipients (so it won't fail unlinking
1396115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen        // the same recipient twice).
1397115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen        return;
1398115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    }
1399115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen
1400179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    EXPECT_FALSE(dyingBaz->unlinkToDeath(recipient2));
1401179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    auto ret = dyingBaz->dieNow();
1402179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    if (!ret.isOk()) {
1403179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        //do nothing, this is expected
1404179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    }
1405115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen
1406115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    std::unique_lock<std::mutex> lock(recipient->mutex);
1407115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    recipient->condition.wait_for(lock, std::chrono::milliseconds(1000), [&recipient]() {
1408115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen            return recipient->fired;
1409115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    });
1410115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    EXPECT_TRUE(recipient->fired);
1411115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    EXPECT_EQ(recipient->cookie, 0x1481u);
1412179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    EXPECT_EQ(recipient->who, dyingBaz);
1413115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    std::unique_lock<std::mutex> lock2(recipient2->mutex);
1414115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    recipient2->condition.wait_for(lock2, std::chrono::milliseconds(1000), [&recipient2]() {
1415115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen            return recipient2->fired;
1416115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    });
1417115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    EXPECT_FALSE(recipient2->fired);
1418115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen
1419115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    // Verify servicemanager dropped its reference too
1420179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    sp<IBaz> deadBaz = IBaz::getService("dyingBaz", false);
1421179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    if (deadBaz != nullptr) {
1422115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen        // Got a passthrough
1423179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        EXPECT_FALSE(deadBaz->isRemote());
1424115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    }
1425115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen}
1426115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen
14271dc8793c9aac86fe08dbe3150d96d88435a978dfYifan HongTEST_F(HidlTest, BarThisIsNewTest) {
14280acf4192dc13277bdd4ba8006d3602595ccfd546Iliyan Malchev    // Now the tricky part, get access to the derived interface.
1429b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT call thisIsNew.");
14301dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong    EXPECT_OK(bar->thisIsNew());
1431b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev    ALOGI("CLIENT thisIsNew returned.");
14329cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber}
14339cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
14341e81c530eec864805c4f13250538e50a067eafc4Yifan Hongstatic void expectGoodChild(const sp<IChild> &child) {
14351e81c530eec864805c4f13250538e50a067eafc4Yifan Hong    ASSERT_NE(child.get(), nullptr);
14361e81c530eec864805c4f13250538e50a067eafc4Yifan Hong    EXPECT_OK(child->doGrandparent());
14371e81c530eec864805c4f13250538e50a067eafc4Yifan Hong    EXPECT_OK(child->doParent());
14381e81c530eec864805c4f13250538e50a067eafc4Yifan Hong    EXPECT_OK(child->doChild());
14391e81c530eec864805c4f13250538e50a067eafc4Yifan Hong}
14401e81c530eec864805c4f13250538e50a067eafc4Yifan Hong
14411e81c530eec864805c4f13250538e50a067eafc4Yifan Hongstatic void expectGoodParent(const sp<IParent> &parent) {
14421e81c530eec864805c4f13250538e50a067eafc4Yifan Hong    ASSERT_NE(parent.get(), nullptr);
14431e81c530eec864805c4f13250538e50a067eafc4Yifan Hong    EXPECT_OK(parent->doGrandparent());
14441e81c530eec864805c4f13250538e50a067eafc4Yifan Hong    EXPECT_OK(parent->doParent());
14451e81c530eec864805c4f13250538e50a067eafc4Yifan Hong    sp<IChild> child = IChild::castFrom(parent);
14461e81c530eec864805c4f13250538e50a067eafc4Yifan Hong    expectGoodChild(child);
14471e81c530eec864805c4f13250538e50a067eafc4Yifan Hong}
14481e81c530eec864805c4f13250538e50a067eafc4Yifan Hong
14491e81c530eec864805c4f13250538e50a067eafc4Yifan Hongstatic void expectGoodGrandparent(const sp<IGrandparent> &grandparent) {
14501e81c530eec864805c4f13250538e50a067eafc4Yifan Hong    ASSERT_NE(grandparent.get(), nullptr);
14511e81c530eec864805c4f13250538e50a067eafc4Yifan Hong    EXPECT_OK(grandparent->doGrandparent());
14521e81c530eec864805c4f13250538e50a067eafc4Yifan Hong    sp<IParent> parent = IParent::castFrom(grandparent);
14531e81c530eec864805c4f13250538e50a067eafc4Yifan Hong    expectGoodParent(parent);
14541e81c530eec864805c4f13250538e50a067eafc4Yifan Hong}
14551e81c530eec864805c4f13250538e50a067eafc4Yifan Hong
14565749b2c5842f7ca031349eba3841a243e07d54ebYifan HongTEST_F(HidlTest, FooHaveAnInterfaceTest) {
14575749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong
14585749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong    sp<ISimple> in = new Complicated(42);
1459b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    Return<sp<ISimple>> ret = bar->haveAInterface(in);
1460b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    EXPECT_OK(ret);
1461b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    sp<ISimple> out = ret;
1462b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    ASSERT_NE(out.get(), nullptr);
1463b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    EXPECT_EQ(out->getCookie(), 42);
1464fbcdc80e6451c24545cf0a5841d0c40cca58f42cYifan Hong    EXPECT_OK(out->customVecInt([](const auto &) { }));
1465fbcdc80e6451c24545cf0a5841d0c40cca58f42cYifan Hong    EXPECT_OK(out->customVecStr([](const auto &) { }));
1466fbcdc80e6451c24545cf0a5841d0c40cca58f42cYifan Hong    EXPECT_OK(out->ping());
1467fbcdc80e6451c24545cf0a5841d0c40cca58f42cYifan Hong    EXPECT_OK(out->mystr([](const auto &) { }));
1468fbcdc80e6451c24545cf0a5841d0c40cca58f42cYifan Hong    EXPECT_OK(out->myhandle([](const auto &) { }));
14695749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong}
14705749b2c5842f7ca031349eba3841a243e07d54ebYifan Hong
14711e81c530eec864805c4f13250538e50a067eafc4Yifan HongTEST_F(HidlTest, InheritRemoteGrandparentTest) {
1472b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    Return<sp<IGrandparent>> ret = fetcher->getGrandparent(true);
1473b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    EXPECT_OK(ret);
1474b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    expectGoodGrandparent(ret);
14751e81c530eec864805c4f13250538e50a067eafc4Yifan Hong}
14761e81c530eec864805c4f13250538e50a067eafc4Yifan Hong
14771e81c530eec864805c4f13250538e50a067eafc4Yifan HongTEST_F(HidlTest, InheritLocalGrandparentTest) {
1478b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    Return<sp<IGrandparent>> ret = fetcher->getGrandparent(false);
1479b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    EXPECT_OK(ret);
1480b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    expectGoodGrandparent(ret);
14811e81c530eec864805c4f13250538e50a067eafc4Yifan Hong}
14821e81c530eec864805c4f13250538e50a067eafc4Yifan Hong
14834b0214d0fdeb1aeb63aba0c8a17ba031fb7d6fcfYifan HongTEST_F(HidlTest, InheritRemoteParentTest) {
1484b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    Return<sp<IParent>> ret = fetcher->getParent(true);
1485b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    EXPECT_OK(ret);
1486b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    expectGoodParent(ret);
14871e81c530eec864805c4f13250538e50a067eafc4Yifan Hong}
14881e81c530eec864805c4f13250538e50a067eafc4Yifan Hong
14894b0214d0fdeb1aeb63aba0c8a17ba031fb7d6fcfYifan HongTEST_F(HidlTest, InheritLocalParentTest) {
1490b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    Return<sp<IParent>> ret = fetcher->getParent(false);
1491b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    EXPECT_OK(ret);
1492b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    expectGoodParent(ret);
14931e81c530eec864805c4f13250538e50a067eafc4Yifan Hong}
14941e81c530eec864805c4f13250538e50a067eafc4Yifan Hong
14951e81c530eec864805c4f13250538e50a067eafc4Yifan HongTEST_F(HidlTest, InheritRemoteChildTest) {
1496b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    Return<sp<IChild>> ret = fetcher->getChild(true);
1497b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    EXPECT_OK(ret);
1498b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    expectGoodChild(ret);
14991e81c530eec864805c4f13250538e50a067eafc4Yifan Hong}
15001e81c530eec864805c4f13250538e50a067eafc4Yifan Hong
15011e81c530eec864805c4f13250538e50a067eafc4Yifan HongTEST_F(HidlTest, InheritLocalChildTest) {
1502b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    Return<sp<IChild>> ret = fetcher->getChild(false);
1503b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    EXPECT_OK(ret);
1504b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    expectGoodChild(ret);
15051e81c530eec864805c4f13250538e50a067eafc4Yifan Hong}
15061e81c530eec864805c4f13250538e50a067eafc4Yifan Hong
15075d03477ad46fdddc17eabfbc4d909d51f4647798Andreas HuberTEST_F(HidlTest, TestArrayDimensionality) {
15085d03477ad46fdddc17eabfbc4d909d51f4647798Andreas Huber    hidl_array<int, 2> oneDim;
15095d03477ad46fdddc17eabfbc4d909d51f4647798Andreas Huber    hidl_array<int, 2, 3> twoDim;
15105d03477ad46fdddc17eabfbc4d909d51f4647798Andreas Huber    hidl_array<int, 2, 3, 4> threeDim;
15115d03477ad46fdddc17eabfbc4d909d51f4647798Andreas Huber
15125d03477ad46fdddc17eabfbc4d909d51f4647798Andreas Huber    EXPECT_EQ(oneDim.size(), 2u);
15135d03477ad46fdddc17eabfbc4d909d51f4647798Andreas Huber    EXPECT_EQ(twoDim.size(), std::make_tuple(2u, 3u));
15145d03477ad46fdddc17eabfbc4d909d51f4647798Andreas Huber    EXPECT_EQ(threeDim.size(), std::make_tuple(2u, 3u, 4u));
15155d03477ad46fdddc17eabfbc4d909d51f4647798Andreas Huber}
15165d03477ad46fdddc17eabfbc4d909d51f4647798Andreas Huber
1517c6752dcea3b5dae1e99960b5beb6af394280b393Yifan HongTEST_F(HidlTest, StructEqualTest) {
1518c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    using G = IFoo::Goober;
1519c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    using F = IFoo::Fumble;
1520c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    G g1{
1521c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .q = 42,
1522c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .name = "The Ultimate Question of Life, the Universe, and Everything",
1523c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .address = "North Pole",
1524c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .numbers = std::array<double, 10>{ {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} },
1525c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .fumble = F{.data = {.data = 50}},
1526c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .gumble = F{.data = {.data = 60}}
1527c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    };
1528c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    G g2{
1529c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .q = 42,
1530c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .name = "The Ultimate Question of Life, the Universe, and Everything",
1531c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .address = "North Pole",
1532c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .numbers = std::array<double, 10>{ {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} },
1533c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .fumble = F{.data = {.data = 50}},
1534c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .gumble = F{.data = {.data = 60}}
1535c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    };
1536c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    G g3{
1537c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .q = 42,
1538c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .name = "The Ultimate Question of Life, the Universe, and Everything",
1539c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .address = "North Pole",
1540c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .numbers = std::array<double, 10>{ {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} },
1541c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .fumble = F{.data = {.data = 50}},
1542c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong        .gumble = F{.data = {.data = 61}}
1543c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    };
1544c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    // explicitly invoke operator== here.
1545c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    EXPECT_TRUE(g1 == g2);
1546c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    EXPECT_TRUE(g1 != g3);
1547c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong}
1548c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong
1549c6752dcea3b5dae1e99960b5beb6af394280b393Yifan HongTEST_F(HidlTest, EnumEqualTest) {
1550c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    using E = IFoo::SomeEnum;
1551c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    E e1 = E::quux;
1552c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    E e2 = E::quux;
1553c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    E e3 = E::goober;
1554c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    // explicitly invoke operator== here.
1555c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    EXPECT_TRUE(e1 == e2);
1556c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    EXPECT_TRUE(e1 != e3);
1557c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong}
1558c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong
1559328b39b5862945363daeb661085f04f0cbce85caMartijn CoenenTEST_F(HidlTest, InvalidTransactionTest) {
1560328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    using ::android::hardware::tests::bar::V1_0::BnHwBar;
1561328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    using ::android::hardware::tests::bar::V1_0::BpHwBar;
1562328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    using ::android::hardware::IBinder;
1563328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    using ::android::hardware::Parcel;
1564328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    using ::android::status_t;
1565328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    using ::android::OK;
1566328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen
1567328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    Parcel request, reply;
1568328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    sp<IBinder> binder;
1569328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    status_t status = request.writeInterfaceToken(::android::hardware::tests::bar::V1_0::IBar::descriptor);
1570328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen
1571328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    EXPECT_EQ(status, OK);
1572328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen
1573328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    if (mode == BINDERIZED) {
1574328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen        EXPECT_TRUE(bar->isRemote());
1575328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen        binder = ::android::hardware::toBinder<IBar, BpHwBar>(bar);
1576328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    } else {
1577328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen        // For a local test, just wrap the implementation with a BnHwBar
1578328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen        binder = new BnHwBar(bar);
1579328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    }
1580328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen
1581328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    status = binder->transact(1234, request, &reply);
1582328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen
1583328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    EXPECT_EQ(status, ::android::UNKNOWN_TRANSACTION);
1584328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    // Try another call, to make sure nothing is messed up
1585328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen    EXPECT_OK(bar->thisIsNew());
1586328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen}
1587328b39b5862945363daeb661085f04f0cbce85caMartijn Coenen
1588bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong#if HIDL_RUN_POINTER_TESTS
1589bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
1590bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PassAGraphTest) {
1591bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    IGraph::Graph g;
1592398e6fb53f387f7d3adfb1083d8381b8e813c9daYifan Hong    ::android::simpleGraph(g);
1593398e6fb53f387f7d3adfb1083d8381b8e813c9daYifan Hong    ::android::logSimpleGraph("CLIENT", g);
1594bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    ALOGI("CLIENT call passAGraph");
1595bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(graphInterface->passAGraph(g));
1596bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1597bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
1598bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, GiveAGraphTest) {
1599bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(graphInterface->giveAGraph([&](const auto &newGraph) {
1600398e6fb53f387f7d3adfb1083d8381b8e813c9daYifan Hong        ::android::logSimpleGraph("CLIENT", newGraph);
1601398e6fb53f387f7d3adfb1083d8381b8e813c9daYifan Hong        EXPECT_TRUE(::android::isSimpleGraph(newGraph));
1602bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1603bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1604bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PassANodeTest) {
1605bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    IGraph::Node node; node.data = 10;
1606bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(graphInterface->passANode(node));
1607bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1608bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PassTwoGraphsTest) {
1609bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    IGraph::Graph g;
1610398e6fb53f387f7d3adfb1083d8381b8e813c9daYifan Hong    ::android::simpleGraph(g);
1611bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(graphInterface->passTwoGraphs(&g, &g));
1612bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1613bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PassAGammaTest) {
1614bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    IGraph::Theta s; s.data = 500;
1615bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    IGraph::Alpha a; a.s_ptr = &s;
1616bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    IGraph::Beta  b; b.s_ptr = &s;
1617bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    IGraph::Gamma c; c.a_ptr = &a; c.b_ptr = &b;
1618bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    ALOGI("CLIENT calling passAGamma: c.a = %p, c.b = %p, c.a->s = %p, c.b->s = %p",
1619bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        c.a_ptr, c.b_ptr, c.a_ptr->s_ptr, c.b_ptr->s_ptr);
1620bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(graphInterface->passAGamma(c));
1621bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1622bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PassNullTest) {
1623bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    IGraph::Gamma c;
1624bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    c.a_ptr = nullptr;
1625bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    c.b_ptr = nullptr;
1626bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(graphInterface->passAGamma(c));
1627bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1628bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PassASimpleRefTest) {
1629bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    IGraph::Theta s;
1630bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    s.data = 500;
1631bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    IGraph::Alpha a;
1632bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    a.s_ptr = &s;
1633bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(graphInterface->passASimpleRef(&a));
1634bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1635bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PassASimpleRefSTest) {
1636bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    IGraph::Theta s;
1637bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    s.data = 500;
1638bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    ALOGI("CLIENT call passASimpleRefS with %p", &s);
1639bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(graphInterface->passASimpleRefS(&s));
1640bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1641bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, GiveASimpleRefTest) {
1642bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(graphInterface->giveASimpleRef([&](const auto & a_ptr) {
1643bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_EQ(a_ptr->s_ptr->data, 500);
1644bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1645bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1646bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, GraphReportErrorsTest) {
1647bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    Return<int32_t> ret = graphInterface->getErrors();
1648bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(ret);
1649bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_EQ(int32_t(ret), 0);
1650bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1651b31e10c04421558569e64c3f275b7577e85f5329Iliyan Malchev
1652bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassOldBufferTest) {
16533cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar1([&](const auto& sptr, const auto& s) {
1654bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo1(sptr, s));
1655bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1656bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1657bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassOldBufferTest2) {
16583cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar2([&](const auto& s, const auto& a) {
1659bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo2(s, a));
1660bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1661bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1662bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassSameOldBufferPointerTest) {
16633cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar3([&](const auto& s, const auto& a, const auto& b) {
1664bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo3(s, a, b));
1665bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1666bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1667bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassOnlyTest) {
16683cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar4([&](const auto& s) {
1669bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo4(s));
1670bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1671bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1672bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassTwoEmbeddedTest) {
16733cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar5([&](const auto& a, const auto& b) {
1674bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo5(a, b));
1675bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1676bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1677bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassIndirectBufferHasDataTest) {
16783cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar6([&](const auto& a) {
1679bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo6(a));
1680bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1681bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1682bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassTwoIndirectBufferTest) {
16833cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar7([&](const auto& a, const auto& b) {
1684bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo7(a, b));
1685bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1686bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1687bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassDeeplyIndirectTest) {
16883cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar8([&](const auto& d) {
1689bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo8(d));
1690bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1691bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1692bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassStringRefTest) {
16933cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar9([&](const auto& str) {
1694bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo9(str));
1695bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1696bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1697bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassRefVecTest) {
16983cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar10([&](const auto& v) {
1699bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo10(v));
1700bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1701bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1702bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassVecRefTest) {
17033cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar11([&](const auto& v) {
1704bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo11(v));
1705bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1706bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1707bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassArrayRefTest) {
17083cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar12([&](const auto& array) {
1709bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo12(array));
1710bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1711bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1712bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassRefArrayTest) {
17133cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar13([&](const auto& array) {
1714bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo13(array));
1715bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1716bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1717bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPass3RefTest) {
17183cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar14([&](const auto& p3) {
1719bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo14(p3));
1720bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1721bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1722bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassInt3RefTest) {
17233cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar15([&](const auto& p3) {
1724bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo15(p3));
1725bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1726bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1727bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassEmbeddedPointersTest) {
17283cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar16([&](const auto& p) {
1729bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo16(p));
1730bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1731bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1732bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassEmbeddedPointers2Test) {
17333cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar17([&](const auto& p) {
1734bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo17(p));
1735bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1736bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1737bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassCopiedStringTest) {
17383cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar18([&](const auto& str_ref, const auto& str_ref2, const auto& str) {
1739bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo18(str_ref, str_ref2, str));
1740bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1741bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1742bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassCopiedVecTest) {
17433cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar19([&](const auto& a_vec_ref, const auto& a_vec, const auto& a_vec_ref2) {
1744bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo19(a_vec_ref, a_vec, a_vec_ref2));
1745bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1746bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
174784465909d270461251ca0c195640911b4eb6a7faYifan HongTEST_F(HidlTest, PointerPassBigRefVecTest) {
17483cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar20([&](const auto& v) {
174984465909d270461251ca0c195640911b4eb6a7faYifan Hong        EXPECT_FAIL(pointerInterface->foo20(v));
175084465909d270461251ca0c195640911b4eb6a7faYifan Hong    }));
175184465909d270461251ca0c195640911b4eb6a7faYifan Hong}
1752bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassMultidimArrayRefTest) {
17533cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar21([&](const auto& v) {
1754bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo21(v));
1755bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1756bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1757bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerPassRefMultidimArrayTest) {
17583cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong    EXPECT_OK(validationPointerInterface->bar22([&](const auto& v) {
1759bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        EXPECT_OK(pointerInterface->foo22(v));
1760bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1761bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1762bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveOldBufferTest) {
1763bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar1([&](const auto& sptr, const auto& s) {
17643cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo1(sptr, s));
1765bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1766bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1767bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveOldBufferTest2) {
1768bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar2([&](const auto& s, const auto& a) {
17693cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo2(s, a));
1770bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1771bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1772bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveSameOldBufferPointerTest) {
1773bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar3([&](const auto& s, const auto& a, const auto& b) {
17743cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo3(s, a, b));
1775bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1776bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1777bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveOnlyTest) {
1778bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar4([&](const auto& s) {
17793cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo4(s));
1780bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1781bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1782bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveTwoEmbeddedTest) {
1783bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar5([&](const auto& a, const auto& b) {
17843cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo5(a, b));
1785bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1786bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1787bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveIndirectBufferHasDataTest) {
1788bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar6([&](const auto& a) {
17893cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo6(a));
1790bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1791bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1792bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveTwoIndirectBufferTest) {
1793bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar7([&](const auto& a, const auto& b) {
17943cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo7(a, b));
1795bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1796bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1797bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveDeeplyIndirectTest) {
1798bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar8([&](const auto& d) {
17993cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo8(d));
1800bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1801bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1802bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveStringRefTest) {
1803bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar9([&](const auto& str) {
18043cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo9(str));
1805bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1806bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1807bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveRefVecTest) {
1808bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar10([&](const auto& v) {
18093cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo10(v));
1810bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1811bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1812bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveVecRefTest) {
1813bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar11([&](const auto& v) {
18143cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo11(v));
1815bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1816bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1817bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveArrayRefTest) {
1818bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar12([&](const auto& array) {
18193cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo12(array));
1820bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1821bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1822bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveRefArrayTest) {
1823bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar13([&](const auto& array) {
18243cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo13(array));
1825bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1826bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1827bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGive3RefTest) {
1828bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar14([&](const auto& p3) {
18293cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo14(p3));
1830bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1831bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1832bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveInt3RefTest) {
1833bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar15([&](const auto& p3) {
18343cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo15(p3));
1835bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1836bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1837bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveEmbeddedPointersTest) {
1838bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar16([&](const auto& p) {
18393cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo16(p));
1840bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1841bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1842bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveEmbeddedPointers2Test) {
1843bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar17([&](const auto& p) {
18443cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo17(p));
1845bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1846bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1847bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveCopiedStringTest) {
1848bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar18([&](const auto& str_ref, const auto& str_ref2, const auto& str) {
18493cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo18(str_ref, str_ref2, str));
1850bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1851bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1852bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveCopiedVecTest) {
1853bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar19([&](const auto& a_vec_ref, const auto& a_vec, const auto& a_vec_ref2) {
18543cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo19(a_vec_ref, a_vec, a_vec_ref2));
1855bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1856bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
185784465909d270461251ca0c195640911b4eb6a7faYifan Hong// This cannot be enabled until _hidl_error is not ignored when
185884465909d270461251ca0c195640911b4eb6a7faYifan Hong// the remote writeEmbeddedReferencesToParcel.
185984465909d270461251ca0c195640911b4eb6a7faYifan Hong// TEST_F(HidlTest, PointerGiveBigRefVecTest) {
186084465909d270461251ca0c195640911b4eb6a7faYifan Hong//     EXPECT_FAIL(pointerInterface->bar20([&](const auto& v) {
186184465909d270461251ca0c195640911b4eb6a7faYifan Hong//     }));
186284465909d270461251ca0c195640911b4eb6a7faYifan Hong// }
1863bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveMultidimArrayRefTest) {
1864bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar21([&](const auto& v) {
18653cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo21(v));
1866bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1867bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1868bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerGiveRefMultidimArrayTest) {
1869bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(pointerInterface->bar22([&](const auto& v) {
18703cccc0f3b74c930ec97759c4fa35d21f308e4bfeYifan Hong        EXPECT_OK(validationPointerInterface->foo22(v));
1871bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    }));
1872bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1873bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTEST_F(HidlTest, PointerReportErrorsTest) {
1874bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    Return<int32_t> ret = pointerInterface->getErrors();
1875bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_OK(ret);
1876bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    EXPECT_EQ(int32_t(ret), 0);
1877bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
1878bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong#endif
1879bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
1880f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsarajuint forkAndRunTests(TestMode mode, bool enableDelayMeasurementTests) {
1881c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    pid_t child;
1882c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    int status;
1883c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong
1884c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    const char* modeText = (mode == BINDERIZED) ? "BINDERIZED" : "PASSTHROUGH";
1885c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    ALOGI("Start running tests in %s mode...", modeText);
1886c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    fprintf(stdout, "Start running tests in %s mode...\n", modeText);
1887c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    fflush(stdout);
1888c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong
1889c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    if ((child = fork()) == 0) {
1890179379a911b386023250998f6d257482febb2d86Hridya Valsaraju        gHidlEnvironment = static_cast<HidlEnvironment *>(
1891f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju                ::testing::AddGlobalTestEnvironment(new HidlEnvironment(
1892f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju                        mode, enableDelayMeasurementTests)));
1893c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong        int testStatus = RUN_ALL_TESTS();
1894c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong        if(testStatus == 0) {
1895c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong            exit(0);
1896c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong        }
1897c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong        int failed = ::testing::UnitTest::GetInstance()->failed_test_count();
1898c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong        if (failed == 0) {
1899c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong            exit(-testStatus);
1900c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong        }
1901c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong        exit(failed);
1902c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    }
1903c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    waitpid(child, &status, 0 /* options */);
1904c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    ALOGI("All tests finished in %s mode.", modeText);
1905c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    fprintf(stdout, "All tests finished in %s mode.\n", modeText);
1906c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    fflush(stdout);
1907c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    return status;
1908c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong}
1909c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong
1910c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hongvoid handleStatus(int status, const char *mode) {
1911c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    if (status != 0) {
1912c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong        if (WIFEXITED(status)) {
1913c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong            status = WEXITSTATUS(status);
1914c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong            if (status < 0) {
191548562fd28f5bd359ed1fef23fd3366050259c883Yifan Hong                fprintf(stdout, "    RUN_ALL_TESTS returns %d for %s mode.\n", -status, mode);
1916c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong            } else {
191748562fd28f5bd359ed1fef23fd3366050259c883Yifan Hong                fprintf(stdout, "    %d test(s) failed for %s mode.\n", status, mode);
1918c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong            }
1919c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong        } else {
192048562fd28f5bd359ed1fef23fd3366050259c883Yifan Hong            fprintf(stdout, "    ERROR: %s child process exited abnormally with %d\n", mode, status);
1921c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong        }
1922c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    }
1923c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong}
1924c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong
1925d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hongstatic void usage(const char *me) {
1926d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong    fprintf(stderr,
1927f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju            "usage: %s [-b] [-p] [-d] [GTEST_OPTIONS]\n",
1928d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong            me);
1929d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong
1930d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong    fprintf(stderr, "         -b binderized mode only\n");
1931d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong    fprintf(stderr, "         -p passthrough mode only\n");
1932d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong    fprintf(stderr, "            (if -b and -p are both missing or both present, "
1933d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong                                 "both modes are tested.)\n");
1934f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju    fprintf(stderr, "         -d Enable delay measurement tests\n");
1935d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong}
1936d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong
1937bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongint main(int argc, char **argv) {
1938339898efa1fba6a875b42d2eed268c72270f7780Steven Moreland    setenv("TREBLE_TESTING_OVERRIDE", "true", true);
1939339898efa1fba6a875b42d2eed268c72270f7780Steven Moreland
1940d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong    const char *me = argv[0];
1941d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong    bool b = false;
1942d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong    bool p = false;
1943f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju    bool d = false;
1944d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong    struct option longopts[] = {{0,0,0,0}};
1945d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong    int res;
1946f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju    while ((res = getopt_long(argc, argv, "hbpd", longopts, NULL)) >= 0) {
1947d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong        switch (res) {
1948d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong            case 'h': {
1949d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong                usage(me);
1950d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong                exit(1);
1951d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong            } break;
1952d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong
1953d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong            case 'b': {
1954d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong                b = true;
1955d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong            } break;
1956d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong
1957d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong            case 'p': {
1958d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong                p = true;
1959d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong            } break;
1960d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong
1961f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju            case 'd': {
1962f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju                d = true;
1963f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju            } break;
1964f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju
1965d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong            case '?':
1966d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong            default: {
1967d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong                // ignore. pass to gTest.
1968d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong            } break;
1969d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong        }
1970d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong    }
1971d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong    if (!b && !p) {
1972d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong        b = p = true;
1973d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong    }
1974c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong
19751dc8793c9aac86fe08dbe3150d96d88435a978dfYifan Hong    ::testing::InitGoogleTest(&argc, argv);
1976c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    // put test in child process because RUN_ALL_TESTS
1977c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    // should not be run twice.
1978f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju    int pStatus = p ? forkAndRunTests(PASSTHROUGH, d) : 0;
1979f2556534b609d9e482c05095a8e5b93970c1473fHridya Valsaraju    int bStatus = b ? forkAndRunTests(BINDERIZED, d)  : 0;
1980c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong
198148562fd28f5bd359ed1fef23fd3366050259c883Yifan Hong    fprintf(stdout, "\n=========================================================\n\n"
198248562fd28f5bd359ed1fef23fd3366050259c883Yifan Hong                    "    Summary:\n\n");
1983d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong    if (p) {
1984d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong        ALOGI("PASSTHROUGH Test result = %d", pStatus);
1985d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong        handleStatus(pStatus, "PASSTHROUGH");
1986d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong    }
1987d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong    if (b) {
1988d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong        ALOGI("BINDERIZED Test result = %d", bStatus);
1989d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong        handleStatus(bStatus, "BINDERIZED ");
1990d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong    }
1991d12398dc9796d3b5dd69730c57a5199770e97d68Yifan Hong
1992c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    if (pStatus == 0 && bStatus == 0) {
199348562fd28f5bd359ed1fef23fd3366050259c883Yifan Hong        fprintf(stdout, "    Hooray! All tests passed.\n");
1994c70f0d8f3c55a2bef3d4d42c804e678c03103aa6Yifan Hong    }
199548562fd28f5bd359ed1fef23fd3366050259c883Yifan Hong    fprintf(stdout, "\n=========================================================\n\n");
19969cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber
1997179379a911b386023250998f6d257482febb2d86Hridya Valsaraju    return pStatus + bStatus != 0;
19989cd48d06c94c25516079e4046be7c8e7e7d2098fAndreas Huber}
1999