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> ®istered){ 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> ®istered) { 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 [¬ification]() { 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 [¬ification]() { 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