xref: /aosp_15_r20/system/libhidl/test_main.cpp (revision 8222fbe171c3d6fadfe95119c180cf3010c392a8)
1*8222fbe1SAndroid Build Coastguard Worker /*
2*8222fbe1SAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*8222fbe1SAndroid Build Coastguard Worker  *
4*8222fbe1SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*8222fbe1SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*8222fbe1SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*8222fbe1SAndroid Build Coastguard Worker  *
8*8222fbe1SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*8222fbe1SAndroid Build Coastguard Worker  *
10*8222fbe1SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*8222fbe1SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*8222fbe1SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8222fbe1SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*8222fbe1SAndroid Build Coastguard Worker  * limitations under the License.
15*8222fbe1SAndroid Build Coastguard Worker  */
16*8222fbe1SAndroid Build Coastguard Worker 
17*8222fbe1SAndroid Build Coastguard Worker #define LOG_TAG "LibHidlTest"
18*8222fbe1SAndroid Build Coastguard Worker 
19*8222fbe1SAndroid Build Coastguard Worker #pragma clang diagnostic push
20*8222fbe1SAndroid Build Coastguard Worker #pragma clang diagnostic error "-Wpadded"
21*8222fbe1SAndroid Build Coastguard Worker #include <hidl/HidlInternal.h>
22*8222fbe1SAndroid Build Coastguard Worker #include <hidl/HidlSupport.h>
23*8222fbe1SAndroid Build Coastguard Worker #pragma clang diagnostic pop
24*8222fbe1SAndroid Build Coastguard Worker 
25*8222fbe1SAndroid Build Coastguard Worker #include <android-base/logging.h>
26*8222fbe1SAndroid Build Coastguard Worker #include <android-base/properties.h>
27*8222fbe1SAndroid Build Coastguard Worker #ifdef __ANDROID__
28*8222fbe1SAndroid Build Coastguard Worker #include <android/api-level.h>
29*8222fbe1SAndroid Build Coastguard Worker #endif
30*8222fbe1SAndroid Build Coastguard Worker #include <android/hidl/memory/1.0/IMemory.h>
31*8222fbe1SAndroid Build Coastguard Worker #include <gmock/gmock.h>
32*8222fbe1SAndroid Build Coastguard Worker #include <gtest/gtest.h>
33*8222fbe1SAndroid Build Coastguard Worker #include <hidl/ServiceManagement.h>
34*8222fbe1SAndroid Build Coastguard Worker #include <hidl/Status.h>
35*8222fbe1SAndroid Build Coastguard Worker #include <hidl/TaskRunner.h>
36*8222fbe1SAndroid Build Coastguard Worker #include <condition_variable>
37*8222fbe1SAndroid Build Coastguard Worker #include <fstream>
38*8222fbe1SAndroid Build Coastguard Worker #include <vector>
39*8222fbe1SAndroid Build Coastguard Worker 
40*8222fbe1SAndroid Build Coastguard Worker #define EXPECT_ARRAYEQ(__a1__, __a2__, __size__) EXPECT_TRUE(isArrayEqual(__a1__, __a2__, __size__))
41*8222fbe1SAndroid Build Coastguard Worker #define EXPECT_2DARRAYEQ(__a1__, __a2__, __size1__, __size2__) \
42*8222fbe1SAndroid Build Coastguard Worker         EXPECT_TRUE(is2dArrayEqual(__a1__, __a2__, __size1__, __size2__))
43*8222fbe1SAndroid Build Coastguard Worker 
44*8222fbe1SAndroid Build Coastguard Worker template<typename T, typename S>
isArrayEqual(const T arr1,const S arr2,size_t size)45*8222fbe1SAndroid Build Coastguard Worker static inline bool isArrayEqual(const T arr1, const S arr2, size_t size) {
46*8222fbe1SAndroid Build Coastguard Worker     for(size_t i = 0; i < size; i++)
47*8222fbe1SAndroid Build Coastguard Worker         if(arr1[i] != arr2[i])
48*8222fbe1SAndroid Build Coastguard Worker             return false;
49*8222fbe1SAndroid Build Coastguard Worker     return true;
50*8222fbe1SAndroid Build Coastguard Worker }
51*8222fbe1SAndroid Build Coastguard Worker 
52*8222fbe1SAndroid Build Coastguard Worker template<typename T, typename S>
is2dArrayEqual(const T arr1,const S arr2,size_t size1,size_t size2)53*8222fbe1SAndroid Build Coastguard Worker static inline bool is2dArrayEqual(const T arr1, const S arr2, size_t size1, size_t size2) {
54*8222fbe1SAndroid Build Coastguard Worker     for(size_t i = 0; i < size1; i++)
55*8222fbe1SAndroid Build Coastguard Worker         for (size_t j = 0; j < size2; j++)
56*8222fbe1SAndroid Build Coastguard Worker             if(arr1[i][j] != arr2[i][j])
57*8222fbe1SAndroid Build Coastguard Worker                 return false;
58*8222fbe1SAndroid Build Coastguard Worker     return true;
59*8222fbe1SAndroid Build Coastguard Worker }
60*8222fbe1SAndroid Build Coastguard Worker 
isLibraryOpen(const std::string & lib)61*8222fbe1SAndroid Build Coastguard Worker bool isLibraryOpen(const std::string& lib) {
62*8222fbe1SAndroid Build Coastguard Worker     std::ifstream ifs("/proc/self/maps");
63*8222fbe1SAndroid Build Coastguard Worker     for (std::string line; std::getline(ifs, line);) {
64*8222fbe1SAndroid Build Coastguard Worker         if (line.size() >= lib.size() && line.substr(line.size() - lib.size()) == lib) {
65*8222fbe1SAndroid Build Coastguard Worker             return true;
66*8222fbe1SAndroid Build Coastguard Worker         }
67*8222fbe1SAndroid Build Coastguard Worker     }
68*8222fbe1SAndroid Build Coastguard Worker 
69*8222fbe1SAndroid Build Coastguard Worker     return false;
70*8222fbe1SAndroid Build Coastguard Worker }
71*8222fbe1SAndroid Build Coastguard Worker 
72*8222fbe1SAndroid Build Coastguard Worker class LibHidlTest : public ::testing::Test {
73*8222fbe1SAndroid Build Coastguard Worker public:
SetUp()74*8222fbe1SAndroid Build Coastguard Worker     virtual void SetUp() override {
75*8222fbe1SAndroid Build Coastguard Worker     }
TearDown()76*8222fbe1SAndroid Build Coastguard Worker     virtual void TearDown() override {
77*8222fbe1SAndroid Build Coastguard Worker     }
78*8222fbe1SAndroid Build Coastguard Worker };
79*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,StringTest)80*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, StringTest) {
81*8222fbe1SAndroid Build Coastguard Worker     using android::hardware::hidl_string;
82*8222fbe1SAndroid Build Coastguard Worker     hidl_string s; // empty constructor
83*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(s.c_str(), "");
84*8222fbe1SAndroid Build Coastguard Worker     hidl_string s1 = "s1"; // copy = from cstr
85*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(s1.c_str(), "s1");
86*8222fbe1SAndroid Build Coastguard Worker     hidl_string s2("s2"); // copy constructor from cstr
87*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(s2.c_str(), "s2");
88*8222fbe1SAndroid Build Coastguard Worker     hidl_string s2a(nullptr); // copy constructor from null cstr
89*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ("", s2a.c_str());
90*8222fbe1SAndroid Build Coastguard Worker     s2a = nullptr; // = from nullptr cstr
91*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(s2a.c_str(), "");
92*8222fbe1SAndroid Build Coastguard Worker     hidl_string s3 = hidl_string("s3"); // move =
93*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(s3.c_str(), "s3");
94*8222fbe1SAndroid Build Coastguard Worker     hidl_string s4 = hidl_string("12345", 3); // copy constructor from cstr w/ length
95*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(s4.c_str(), "123");
96*8222fbe1SAndroid Build Coastguard Worker     hidl_string s5(hidl_string(hidl_string("s5"))); // move constructor
97*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(s5.c_str(), "s5");
98*8222fbe1SAndroid Build Coastguard Worker     hidl_string s6(std::string("s6")); // copy constructor from std::string
99*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(s6.c_str(), "s6");
100*8222fbe1SAndroid Build Coastguard Worker     hidl_string s7 = std::string("s7"); // copy = from std::string
101*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(s7.c_str(), "s7");
102*8222fbe1SAndroid Build Coastguard Worker     hidl_string s8(s7); // copy constructor // NOLINT, test the copy constructor
103*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(s8.c_str(), "s7");
104*8222fbe1SAndroid Build Coastguard Worker     hidl_string s9 = s8; // copy =  // NOLINT, test the copy operator
105*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(s9.c_str(), "s7");
106*8222fbe1SAndroid Build Coastguard Worker     char myCString[20] = "myCString";
107*8222fbe1SAndroid Build Coastguard Worker     s.setToExternal(&myCString[0], strlen(myCString));
108*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(s.c_str(), "myCString");
109*8222fbe1SAndroid Build Coastguard Worker     myCString[2] = 'D';
110*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(s.c_str(), "myDString");
111*8222fbe1SAndroid Build Coastguard Worker     s.clear(); // should not affect myCString
112*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(myCString, "myDString");
113*8222fbe1SAndroid Build Coastguard Worker 
114*8222fbe1SAndroid Build Coastguard Worker     // casts
115*8222fbe1SAndroid Build Coastguard Worker     s = "great";
116*8222fbe1SAndroid Build Coastguard Worker     std::string myString = s;
117*8222fbe1SAndroid Build Coastguard Worker     const char *anotherCString = s.c_str();
118*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(myString, "great");
119*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(anotherCString, "great");
120*8222fbe1SAndroid Build Coastguard Worker 
121*8222fbe1SAndroid Build Coastguard Worker     const hidl_string t = "not so great";
122*8222fbe1SAndroid Build Coastguard Worker     std::string myTString = t;
123*8222fbe1SAndroid Build Coastguard Worker     const char * anotherTCString = t.c_str();
124*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(myTString, "not so great");
125*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(anotherTCString, "not so great");
126*8222fbe1SAndroid Build Coastguard Worker 
127*8222fbe1SAndroid Build Coastguard Worker     // Assignment from hidl_string to std::string
128*8222fbe1SAndroid Build Coastguard Worker     std::string tgt;
129*8222fbe1SAndroid Build Coastguard Worker     hidl_string src("some stuff");
130*8222fbe1SAndroid Build Coastguard Worker     tgt = src;
131*8222fbe1SAndroid Build Coastguard Worker     EXPECT_STREQ(tgt.c_str(), "some stuff");
132*8222fbe1SAndroid Build Coastguard Worker 
133*8222fbe1SAndroid Build Coastguard Worker     // Stream output operator
134*8222fbe1SAndroid Build Coastguard Worker     hidl_string msg("hidl_string works with operator<<");
135*8222fbe1SAndroid Build Coastguard Worker     std::cout << msg;
136*8222fbe1SAndroid Build Coastguard Worker 
137*8222fbe1SAndroid Build Coastguard Worker     // Comparisons
138*8222fbe1SAndroid Build Coastguard Worker     const char * cstr1 = "abc";
139*8222fbe1SAndroid Build Coastguard Worker     std::string string1(cstr1);
140*8222fbe1SAndroid Build Coastguard Worker     hidl_string hs1(cstr1);
141*8222fbe1SAndroid Build Coastguard Worker     const char * cstrE = "abc";
142*8222fbe1SAndroid Build Coastguard Worker     std::string stringE(cstrE);
143*8222fbe1SAndroid Build Coastguard Worker     hidl_string hsE(cstrE);
144*8222fbe1SAndroid Build Coastguard Worker     const char * cstrNE = "ABC";
145*8222fbe1SAndroid Build Coastguard Worker     std::string stringNE(cstrNE);
146*8222fbe1SAndroid Build Coastguard Worker     hidl_string hsNE(cstrNE);
147*8222fbe1SAndroid Build Coastguard Worker     const char * cstr2 = "def";
148*8222fbe1SAndroid Build Coastguard Worker     std::string string2(cstr2);
149*8222fbe1SAndroid Build Coastguard Worker     hidl_string hs2(cstr2);
150*8222fbe1SAndroid Build Coastguard Worker 
151*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hs1  == hsE);
152*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(hs1 == hsNE);
153*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hs1  == cstrE);
154*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(hs1 == cstrNE);
155*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hs1  == stringE);
156*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(hs1 == stringNE);
157*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(hs1 != hsE);
158*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hs1  != hsNE);
159*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(hs1 != cstrE);
160*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hs1  != cstrNE);
161*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(hs1 != stringE);
162*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hs1  != stringNE);
163*8222fbe1SAndroid Build Coastguard Worker 
164*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hs1 < hs2);
165*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(hs2 < hs1);
166*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hs2 > hs1);
167*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(hs1 > hs2);
168*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hs1 <= hs1);
169*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hs1 <= hs2);
170*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(hs2 <= hs1);
171*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hs1 >= hs1);
172*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hs2 >= hs1);
173*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(hs2 <= hs1);
174*8222fbe1SAndroid Build Coastguard Worker }
175*8222fbe1SAndroid Build Coastguard Worker 
176*8222fbe1SAndroid Build Coastguard Worker // empty string optimization should apply for any constructor
TEST_F(LibHidlTest,HidlStringEmptyLiteralAllocation)177*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, HidlStringEmptyLiteralAllocation) {
178*8222fbe1SAndroid Build Coastguard Worker     using android::hardware::hidl_string;
179*8222fbe1SAndroid Build Coastguard Worker 
180*8222fbe1SAndroid Build Coastguard Worker     hidl_string empty1;
181*8222fbe1SAndroid Build Coastguard Worker     hidl_string empty2("");
182*8222fbe1SAndroid Build Coastguard Worker     hidl_string empty3("foo", 0);
183*8222fbe1SAndroid Build Coastguard Worker     hidl_string empty4((std::string()));
184*8222fbe1SAndroid Build Coastguard Worker 
185*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(empty1.c_str(), empty2.c_str());
186*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(empty1.c_str(), empty3.c_str());
187*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(empty1.c_str(), empty4.c_str());
188*8222fbe1SAndroid Build Coastguard Worker }
189*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,MemoryTest)190*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, MemoryTest) {
191*8222fbe1SAndroid Build Coastguard Worker     using android::hardware::hidl_memory;
192*8222fbe1SAndroid Build Coastguard Worker 
193*8222fbe1SAndroid Build Coastguard Worker     hidl_memory mem1 = hidl_memory(); // default constructor
194*8222fbe1SAndroid Build Coastguard Worker     hidl_memory mem2 = mem1; // copy constructor (nullptr), NOLINT
195*8222fbe1SAndroid Build Coastguard Worker 
196*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, mem2.handle());
197*8222fbe1SAndroid Build Coastguard Worker 
198*8222fbe1SAndroid Build Coastguard Worker     native_handle_t* testHandle = native_handle_create(0 /* numInts */, 0 /* numFds */);
199*8222fbe1SAndroid Build Coastguard Worker 
200*8222fbe1SAndroid Build Coastguard Worker     hidl_memory mem3 = hidl_memory("foo", testHandle, 42 /* size */); // owns testHandle
201*8222fbe1SAndroid Build Coastguard Worker     hidl_memory mem4 = mem3; // copy constructor (regular handle), NOLINT
202*8222fbe1SAndroid Build Coastguard Worker 
203*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(mem3.name(), mem4.name());
204*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(mem3.size(), mem4.size());
205*8222fbe1SAndroid Build Coastguard Worker     EXPECT_NE(nullptr, mem4.handle());
206*8222fbe1SAndroid Build Coastguard Worker     EXPECT_NE(mem3.handle(), mem4.handle()); // check handle cloned
207*8222fbe1SAndroid Build Coastguard Worker 
208*8222fbe1SAndroid Build Coastguard Worker     hidl_memory mem5 = hidl_memory("foo", nullptr, 0); // hidl memory works with nullptr handle
209*8222fbe1SAndroid Build Coastguard Worker     hidl_memory mem6 = mem5; // NOLINT, test copying
210*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, mem5.handle());
211*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, mem6.handle());
212*8222fbe1SAndroid Build Coastguard Worker }
213*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,VecInitTest)214*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, VecInitTest) {
215*8222fbe1SAndroid Build Coastguard Worker     using android::hardware::hidl_vec;
216*8222fbe1SAndroid Build Coastguard Worker     using std::vector;
217*8222fbe1SAndroid Build Coastguard Worker     int32_t array[] = {5, 6, 7};
218*8222fbe1SAndroid Build Coastguard Worker     vector<int32_t> v(array, array + 3);
219*8222fbe1SAndroid Build Coastguard Worker 
220*8222fbe1SAndroid Build Coastguard Worker     hidl_vec<int32_t> hv0(3);  // size
221*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(hv0.size(), 3ul);  // cannot say anything about its contents
222*8222fbe1SAndroid Build Coastguard Worker 
223*8222fbe1SAndroid Build Coastguard Worker     hidl_vec<int32_t> hv1 = v; // copy =
224*8222fbe1SAndroid Build Coastguard Worker     EXPECT_ARRAYEQ(hv1, array, 3);
225*8222fbe1SAndroid Build Coastguard Worker     EXPECT_ARRAYEQ(hv1, v, 3);
226*8222fbe1SAndroid Build Coastguard Worker     hidl_vec<int32_t> hv2(v); // copy constructor
227*8222fbe1SAndroid Build Coastguard Worker     EXPECT_ARRAYEQ(hv2, v, 3);
228*8222fbe1SAndroid Build Coastguard Worker 
229*8222fbe1SAndroid Build Coastguard Worker     vector<int32_t> v2 = hv1; // cast
230*8222fbe1SAndroid Build Coastguard Worker     EXPECT_ARRAYEQ(v2, v, 3);
231*8222fbe1SAndroid Build Coastguard Worker 
232*8222fbe1SAndroid Build Coastguard Worker     hidl_vec<int32_t> v3 = {5, 6, 7}; // initializer_list
233*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(v3.size(), 3ul);
234*8222fbe1SAndroid Build Coastguard Worker     EXPECT_ARRAYEQ(v3, array, v3.size());
235*8222fbe1SAndroid Build Coastguard Worker }
236*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,VecReleaseTest)237*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, VecReleaseTest) {
238*8222fbe1SAndroid Build Coastguard Worker     // this test indicates an inconsistency of behaviors which is undesirable.
239*8222fbe1SAndroid Build Coastguard Worker     // Perhaps hidl-vec should always allocate an empty vector whenever it
240*8222fbe1SAndroid Build Coastguard Worker     // exposes its data. Alternatively, perhaps it should always free/reject
241*8222fbe1SAndroid Build Coastguard Worker     // empty vectors and always return nullptr for this state. While this second
242*8222fbe1SAndroid Build Coastguard Worker     // alternative is faster, it makes client code harder to write, and it would
243*8222fbe1SAndroid Build Coastguard Worker     // break existing client code.
244*8222fbe1SAndroid Build Coastguard Worker     using android::hardware::hidl_vec;
245*8222fbe1SAndroid Build Coastguard Worker 
246*8222fbe1SAndroid Build Coastguard Worker     hidl_vec<int32_t> empty;
247*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, empty.releaseData());
248*8222fbe1SAndroid Build Coastguard Worker 
249*8222fbe1SAndroid Build Coastguard Worker     empty.resize(0);
250*8222fbe1SAndroid Build Coastguard Worker     int32_t* data = empty.releaseData();
251*8222fbe1SAndroid Build Coastguard Worker     EXPECT_NE(nullptr, data);
252*8222fbe1SAndroid Build Coastguard Worker     delete data;
253*8222fbe1SAndroid Build Coastguard Worker }
254*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,VecIterTest)255*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, VecIterTest) {
256*8222fbe1SAndroid Build Coastguard Worker     int32_t array[] = {5, 6, 7};
257*8222fbe1SAndroid Build Coastguard Worker     android::hardware::hidl_vec<int32_t> hv1 = std::vector<int32_t>(array, array + 3);
258*8222fbe1SAndroid Build Coastguard Worker 
259*8222fbe1SAndroid Build Coastguard Worker     auto iter = hv1.begin();    // iterator begin()
260*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(*iter++, 5);
261*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(*iter, 6);
262*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(*++iter, 7);
263*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(*iter--, 7);
264*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(*iter, 6);
265*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(*--iter, 5);
266*8222fbe1SAndroid Build Coastguard Worker 
267*8222fbe1SAndroid Build Coastguard Worker     iter += 2;
268*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(*iter, 7);
269*8222fbe1SAndroid Build Coastguard Worker     iter -= 2;
270*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(*iter, 5);
271*8222fbe1SAndroid Build Coastguard Worker 
272*8222fbe1SAndroid Build Coastguard Worker     iter++;
273*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(*(iter + 1), 7);
274*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(*(1 + iter), 7);
275*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(*(iter - 1), 5);
276*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(*iter, 6);
277*8222fbe1SAndroid Build Coastguard Worker 
278*8222fbe1SAndroid Build Coastguard Worker     auto five = iter - 1;
279*8222fbe1SAndroid Build Coastguard Worker     auto seven = iter + 1;
280*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(seven - five, 2);
281*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(five - seven, -2);
282*8222fbe1SAndroid Build Coastguard Worker 
283*8222fbe1SAndroid Build Coastguard Worker     EXPECT_LT(five, seven);
284*8222fbe1SAndroid Build Coastguard Worker     EXPECT_LE(five, seven);
285*8222fbe1SAndroid Build Coastguard Worker     EXPECT_GT(seven, five);
286*8222fbe1SAndroid Build Coastguard Worker     EXPECT_GE(seven, five);
287*8222fbe1SAndroid Build Coastguard Worker 
288*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(seven[0], 7);
289*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(five[1], 6);
290*8222fbe1SAndroid Build Coastguard Worker }
291*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,VecIterForTest)292*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, VecIterForTest) {
293*8222fbe1SAndroid Build Coastguard Worker     using android::hardware::hidl_vec;
294*8222fbe1SAndroid Build Coastguard Worker     int32_t array[] = {5, 6, 7};
295*8222fbe1SAndroid Build Coastguard Worker     hidl_vec<int32_t> hv1 = std::vector<int32_t>(array, array + 3);
296*8222fbe1SAndroid Build Coastguard Worker 
297*8222fbe1SAndroid Build Coastguard Worker     int32_t sum = 0;            // range based for loop interoperability
298*8222fbe1SAndroid Build Coastguard Worker     for (auto &&i: hv1) {
299*8222fbe1SAndroid Build Coastguard Worker         sum += i;
300*8222fbe1SAndroid Build Coastguard Worker     }
301*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(sum, 5+6+7);
302*8222fbe1SAndroid Build Coastguard Worker 
303*8222fbe1SAndroid Build Coastguard Worker     for (auto iter = hv1.begin(); iter < hv1.end(); ++iter) {
304*8222fbe1SAndroid Build Coastguard Worker         *iter += 10;
305*8222fbe1SAndroid Build Coastguard Worker     }
306*8222fbe1SAndroid Build Coastguard Worker     const hidl_vec<int32_t> &v4 = hv1;
307*8222fbe1SAndroid Build Coastguard Worker     sum = 0;
308*8222fbe1SAndroid Build Coastguard Worker     for (const auto &i : v4) {
309*8222fbe1SAndroid Build Coastguard Worker         sum += i;
310*8222fbe1SAndroid Build Coastguard Worker     }
311*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(sum, 15+16+17);
312*8222fbe1SAndroid Build Coastguard Worker }
313*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,VecEqTest)314*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, VecEqTest) {
315*8222fbe1SAndroid Build Coastguard Worker     android::hardware::hidl_vec<int32_t> hv1{5, 6, 7};
316*8222fbe1SAndroid Build Coastguard Worker     android::hardware::hidl_vec<int32_t> hv2{5, 6, 7};
317*8222fbe1SAndroid Build Coastguard Worker     android::hardware::hidl_vec<int32_t> hv3{5, 6, 8};
318*8222fbe1SAndroid Build Coastguard Worker 
319*8222fbe1SAndroid Build Coastguard Worker     // use the == and != operator intentionally here
320*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hv1 == hv2);
321*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hv1 != hv3);
322*8222fbe1SAndroid Build Coastguard Worker }
323*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,VecEqInitializerTest)324*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, VecEqInitializerTest) {
325*8222fbe1SAndroid Build Coastguard Worker     std::vector<int32_t> reference{5, 6, 7};
326*8222fbe1SAndroid Build Coastguard Worker     android::hardware::hidl_vec<int32_t> hv1{1, 2, 3};
327*8222fbe1SAndroid Build Coastguard Worker     hv1 = {5, 6, 7};
328*8222fbe1SAndroid Build Coastguard Worker     android::hardware::hidl_vec<int32_t> hv2;
329*8222fbe1SAndroid Build Coastguard Worker     hv2 = {5, 6, 7};
330*8222fbe1SAndroid Build Coastguard Worker     android::hardware::hidl_vec<int32_t> hv3;
331*8222fbe1SAndroid Build Coastguard Worker     hv3 = {5, 6, 8};
332*8222fbe1SAndroid Build Coastguard Worker 
333*8222fbe1SAndroid Build Coastguard Worker     // use the == and != operator intentionally here
334*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hv1 == hv2);
335*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hv1 == reference);
336*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hv1 != hv3);
337*8222fbe1SAndroid Build Coastguard Worker }
338*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,VecRangeCtorTest)339*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, VecRangeCtorTest) {
340*8222fbe1SAndroid Build Coastguard Worker     struct ConvertibleType {
341*8222fbe1SAndroid Build Coastguard Worker         int val;
342*8222fbe1SAndroid Build Coastguard Worker 
343*8222fbe1SAndroid Build Coastguard Worker         explicit ConvertibleType(int val) : val(val) {}
344*8222fbe1SAndroid Build Coastguard Worker         explicit operator int() const { return val; }
345*8222fbe1SAndroid Build Coastguard Worker         bool operator==(const int& other) const { return val == other; }
346*8222fbe1SAndroid Build Coastguard Worker     };
347*8222fbe1SAndroid Build Coastguard Worker 
348*8222fbe1SAndroid Build Coastguard Worker     std::vector<ConvertibleType> input{
349*8222fbe1SAndroid Build Coastguard Worker         ConvertibleType(1), ConvertibleType(2), ConvertibleType(3),
350*8222fbe1SAndroid Build Coastguard Worker     };
351*8222fbe1SAndroid Build Coastguard Worker 
352*8222fbe1SAndroid Build Coastguard Worker     android::hardware::hidl_vec<int> hv(input.begin(), input.end());
353*8222fbe1SAndroid Build Coastguard Worker 
354*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(input.size(), hv.size());
355*8222fbe1SAndroid Build Coastguard Worker     int sum = 0;
356*8222fbe1SAndroid Build Coastguard Worker     for (unsigned i = 0; i < input.size(); i++) {
357*8222fbe1SAndroid Build Coastguard Worker         EXPECT_EQ(input[i], hv[i]);
358*8222fbe1SAndroid Build Coastguard Worker         sum += hv[i];
359*8222fbe1SAndroid Build Coastguard Worker     }
360*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(sum, 1 + 2 + 3);
361*8222fbe1SAndroid Build Coastguard Worker }
362*8222fbe1SAndroid Build Coastguard Worker 
363*8222fbe1SAndroid Build Coastguard Worker struct FailsIfCopied {
FailsIfCopiedFailsIfCopied364*8222fbe1SAndroid Build Coastguard Worker     FailsIfCopied() {}
365*8222fbe1SAndroid Build Coastguard Worker 
366*8222fbe1SAndroid Build Coastguard Worker     // add failure if copied since in general this can be expensive
FailsIfCopiedFailsIfCopied367*8222fbe1SAndroid Build Coastguard Worker     FailsIfCopied(const FailsIfCopied& o) { *this = o; }
operator =FailsIfCopied368*8222fbe1SAndroid Build Coastguard Worker     FailsIfCopied& operator=(const FailsIfCopied&) {
369*8222fbe1SAndroid Build Coastguard Worker         ADD_FAILURE() << "FailsIfCopied copied";
370*8222fbe1SAndroid Build Coastguard Worker         return *this;
371*8222fbe1SAndroid Build Coastguard Worker     }
372*8222fbe1SAndroid Build Coastguard Worker 
373*8222fbe1SAndroid Build Coastguard Worker     // fine to move this type since in general this is cheaper
374*8222fbe1SAndroid Build Coastguard Worker     FailsIfCopied(FailsIfCopied&& o) = default;
375*8222fbe1SAndroid Build Coastguard Worker     FailsIfCopied& operator=(FailsIfCopied&&) = default;
376*8222fbe1SAndroid Build Coastguard Worker };
377*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,VecResizeNoCopy)378*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, VecResizeNoCopy) {
379*8222fbe1SAndroid Build Coastguard Worker     using android::hardware::hidl_vec;
380*8222fbe1SAndroid Build Coastguard Worker 
381*8222fbe1SAndroid Build Coastguard Worker     hidl_vec<FailsIfCopied> noCopies;
382*8222fbe1SAndroid Build Coastguard Worker     noCopies.resize(3);  // instantiates three elements
383*8222fbe1SAndroid Build Coastguard Worker 
384*8222fbe1SAndroid Build Coastguard Worker     FailsIfCopied* oldPointer = noCopies.data();
385*8222fbe1SAndroid Build Coastguard Worker 
386*8222fbe1SAndroid Build Coastguard Worker     noCopies.resize(6);  // should move three elements, not copy
387*8222fbe1SAndroid Build Coastguard Worker 
388*8222fbe1SAndroid Build Coastguard Worker     // oldPointer should be invalidated at this point.
389*8222fbe1SAndroid Build Coastguard Worker     // hidl_vec doesn't currently try to realloc but if it ever switches
390*8222fbe1SAndroid Build Coastguard Worker     // to an implementation that does, this test wouldn't do anything.
391*8222fbe1SAndroid Build Coastguard Worker     EXPECT_NE(oldPointer, noCopies.data());
392*8222fbe1SAndroid Build Coastguard Worker }
393*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,VecFindTest)394*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, VecFindTest) {
395*8222fbe1SAndroid Build Coastguard Worker     using android::hardware::hidl_vec;
396*8222fbe1SAndroid Build Coastguard Worker     hidl_vec<int32_t> hv1 = {10, 20, 30, 40};
397*8222fbe1SAndroid Build Coastguard Worker     const hidl_vec<int32_t> hv2 = {1, 2, 3, 4};
398*8222fbe1SAndroid Build Coastguard Worker 
399*8222fbe1SAndroid Build Coastguard Worker     auto it = hv1.find(20);
400*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(20, *it);
401*8222fbe1SAndroid Build Coastguard Worker     *it = 21;
402*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(21, *it);
403*8222fbe1SAndroid Build Coastguard Worker     it = hv1.find(20);
404*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(hv1.end(), it);
405*8222fbe1SAndroid Build Coastguard Worker     it = hv1.find(21);
406*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(21, *it);
407*8222fbe1SAndroid Build Coastguard Worker 
408*8222fbe1SAndroid Build Coastguard Worker     auto cit = hv2.find(4);
409*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(4, *cit);
410*8222fbe1SAndroid Build Coastguard Worker }
411*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,VecContainsTest)412*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, VecContainsTest) {
413*8222fbe1SAndroid Build Coastguard Worker     using android::hardware::hidl_vec;
414*8222fbe1SAndroid Build Coastguard Worker     hidl_vec<int32_t> hv1 = {10, 20, 30, 40};
415*8222fbe1SAndroid Build Coastguard Worker     const hidl_vec<int32_t> hv2 = {0, 1, 2, 3, 4};
416*8222fbe1SAndroid Build Coastguard Worker 
417*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hv1.contains(10));
418*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hv1.contains(40));
419*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(hv1.contains(1));
420*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(hv1.contains(0));
421*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hv2.contains(0));
422*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(hv2.contains(10));
423*8222fbe1SAndroid Build Coastguard Worker 
424*8222fbe1SAndroid Build Coastguard Worker     hv1[0] = 11;
425*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(hv1.contains(10));
426*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hv1.contains(11));
427*8222fbe1SAndroid Build Coastguard Worker }
428*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,ArrayTest)429*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, ArrayTest) {
430*8222fbe1SAndroid Build Coastguard Worker     using android::hardware::hidl_array;
431*8222fbe1SAndroid Build Coastguard Worker     int32_t array[] = {5, 6, 7};
432*8222fbe1SAndroid Build Coastguard Worker 
433*8222fbe1SAndroid Build Coastguard Worker     hidl_array<int32_t, 3> ha(array);
434*8222fbe1SAndroid Build Coastguard Worker     EXPECT_ARRAYEQ(ha, array, 3);
435*8222fbe1SAndroid Build Coastguard Worker }
436*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,TaskRunnerTest)437*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, TaskRunnerTest) {
438*8222fbe1SAndroid Build Coastguard Worker     using android::hardware::details::TaskRunner;
439*8222fbe1SAndroid Build Coastguard Worker     using namespace std::chrono_literals;
440*8222fbe1SAndroid Build Coastguard Worker 
441*8222fbe1SAndroid Build Coastguard Worker     std::condition_variable cv;
442*8222fbe1SAndroid Build Coastguard Worker     std::mutex m;
443*8222fbe1SAndroid Build Coastguard Worker 
444*8222fbe1SAndroid Build Coastguard Worker     TaskRunner tr;
445*8222fbe1SAndroid Build Coastguard Worker     tr.start(1 /* limit */);
446*8222fbe1SAndroid Build Coastguard Worker     bool flag = false;
447*8222fbe1SAndroid Build Coastguard Worker     tr.push([&] {
448*8222fbe1SAndroid Build Coastguard Worker         flag = true;
449*8222fbe1SAndroid Build Coastguard Worker         cv.notify_all();
450*8222fbe1SAndroid Build Coastguard Worker     });
451*8222fbe1SAndroid Build Coastguard Worker 
452*8222fbe1SAndroid Build Coastguard Worker     std::unique_lock<std::mutex> lock(m);
453*8222fbe1SAndroid Build Coastguard Worker 
454*8222fbe1SAndroid Build Coastguard Worker     // 1s so this doesn't deadlock. This isn't a performance test.
455*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(cv.wait_for(lock, 1s, [&]{return flag;}));
456*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(flag);
457*8222fbe1SAndroid Build Coastguard Worker }
458*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,StringCmpTest)459*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, StringCmpTest) {
460*8222fbe1SAndroid Build Coastguard Worker     using android::hardware::hidl_string;
461*8222fbe1SAndroid Build Coastguard Worker     const char * s = "good";
462*8222fbe1SAndroid Build Coastguard Worker     hidl_string hs(s);
463*8222fbe1SAndroid Build Coastguard Worker     EXPECT_NE(hs.c_str(), s);
464*8222fbe1SAndroid Build Coastguard Worker 
465*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(hs == s); // operator ==
466*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(s == hs);
467*8222fbe1SAndroid Build Coastguard Worker 
468*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(hs != s); // operator ==
469*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(s != hs);
470*8222fbe1SAndroid Build Coastguard Worker }
471*8222fbe1SAndroid Build Coastguard Worker 
472*8222fbe1SAndroid Build Coastguard Worker template <typename T>
great(android::hardware::hidl_vec<T>)473*8222fbe1SAndroid Build Coastguard Worker void great(android::hardware::hidl_vec<T>) {}
474*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,VecCopyTest)475*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, VecCopyTest) {
476*8222fbe1SAndroid Build Coastguard Worker     android::hardware::hidl_vec<int32_t> v;
477*8222fbe1SAndroid Build Coastguard Worker     great(v);
478*8222fbe1SAndroid Build Coastguard Worker }
479*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,StdArrayTest)480*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, StdArrayTest) {
481*8222fbe1SAndroid Build Coastguard Worker     using android::hardware::hidl_array;
482*8222fbe1SAndroid Build Coastguard Worker     hidl_array<int32_t, 5> array{(int32_t[5]){1, 2, 3, 4, 5}};
483*8222fbe1SAndroid Build Coastguard Worker     std::array<int32_t, 5> stdArray = array;
484*8222fbe1SAndroid Build Coastguard Worker     EXPECT_ARRAYEQ(array.data(), stdArray.data(), 5);
485*8222fbe1SAndroid Build Coastguard Worker     hidl_array<int32_t, 5> array2 = stdArray;
486*8222fbe1SAndroid Build Coastguard Worker     EXPECT_ARRAYEQ(array.data(), array2.data(), 5);
487*8222fbe1SAndroid Build Coastguard Worker }
488*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,MultiDimStdArrayTest)489*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, MultiDimStdArrayTest) {
490*8222fbe1SAndroid Build Coastguard Worker     using android::hardware::hidl_array;
491*8222fbe1SAndroid Build Coastguard Worker     hidl_array<int32_t, 2, 3> array;
492*8222fbe1SAndroid Build Coastguard Worker     for (size_t i = 0; i < 2; i++) {
493*8222fbe1SAndroid Build Coastguard Worker         for (size_t j = 0; j < 3; j++) {
494*8222fbe1SAndroid Build Coastguard Worker             array[i][j] = i + j + i * j;
495*8222fbe1SAndroid Build Coastguard Worker         }
496*8222fbe1SAndroid Build Coastguard Worker     }
497*8222fbe1SAndroid Build Coastguard Worker     std::array<std::array<int32_t, 3>, 2> stdArray = array;
498*8222fbe1SAndroid Build Coastguard Worker     EXPECT_2DARRAYEQ(array, stdArray, 2, 3);
499*8222fbe1SAndroid Build Coastguard Worker     hidl_array<int32_t, 2, 3> array2 = stdArray;
500*8222fbe1SAndroid Build Coastguard Worker     EXPECT_2DARRAYEQ(array, array2, 2, 3);
501*8222fbe1SAndroid Build Coastguard Worker }
502*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,HidlVersionTest)503*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, HidlVersionTest) {
504*8222fbe1SAndroid Build Coastguard Worker     using android::hardware::hidl_version;
505*8222fbe1SAndroid Build Coastguard Worker     hidl_version v1_0{1, 0};
506*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(1, v1_0.get_major());
507*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(0, v1_0.get_minor());
508*8222fbe1SAndroid Build Coastguard Worker     hidl_version v2_0{2, 0};
509*8222fbe1SAndroid Build Coastguard Worker     hidl_version v2_1{2, 1};
510*8222fbe1SAndroid Build Coastguard Worker     hidl_version v2_2{2, 2};
511*8222fbe1SAndroid Build Coastguard Worker     hidl_version v3_0{3, 0};
512*8222fbe1SAndroid Build Coastguard Worker     hidl_version v3_0b{3,0};
513*8222fbe1SAndroid Build Coastguard Worker 
514*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(v1_0 < v2_0);
515*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(v1_0 != v2_0);
516*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(v2_0 < v2_1);
517*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(v2_1 < v3_0);
518*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(v2_0 > v1_0);
519*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(v2_0 != v1_0);
520*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(v2_1 > v2_0);
521*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(v3_0 > v2_1);
522*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(v3_0 == v3_0b);
523*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(v3_0 != v3_0b);
524*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(v3_0 <= v3_0b);
525*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(v2_2 <= v3_0);
526*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(v3_0 >= v3_0b);
527*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(v3_0 >= v2_2);
528*8222fbe1SAndroid Build Coastguard Worker }
529*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,ReturnMoveTest)530*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, ReturnMoveTest) {
531*8222fbe1SAndroid Build Coastguard Worker     using namespace ::android;
532*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::Return;
533*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::Status;
534*8222fbe1SAndroid Build Coastguard Worker     Return<void> ret{Status::fromStatusT(DEAD_OBJECT)};
535*8222fbe1SAndroid Build Coastguard Worker     ret.isOk();
536*8222fbe1SAndroid Build Coastguard Worker     ret = {Status::fromStatusT(DEAD_OBJECT)};
537*8222fbe1SAndroid Build Coastguard Worker     ret.isOk();
538*8222fbe1SAndroid Build Coastguard Worker }
539*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,ReturnTest)540*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, ReturnTest) {
541*8222fbe1SAndroid Build Coastguard Worker     using ::android::DEAD_OBJECT;
542*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::Return;
543*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::Status;
544*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::hidl_string;
545*8222fbe1SAndroid Build Coastguard Worker 
546*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(Return<void>(Status::fromStatusT(DEAD_OBJECT)).isOk());
547*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(Return<void>(Status::ok()).isOk());
548*8222fbe1SAndroid Build Coastguard Worker 
549*8222fbe1SAndroid Build Coastguard Worker     hidl_string one = "1";
550*8222fbe1SAndroid Build Coastguard Worker     hidl_string two = "2";
551*8222fbe1SAndroid Build Coastguard Worker     const Return<hidl_string> ret = Return<hidl_string>(Status::fromStatusT(DEAD_OBJECT));
552*8222fbe1SAndroid Build Coastguard Worker 
553*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(one, Return<hidl_string>(one).withDefault(two));
554*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(two, ret.withDefault(two));
555*8222fbe1SAndroid Build Coastguard Worker 
556*8222fbe1SAndroid Build Coastguard Worker     hidl_string&& moved = ret.withDefault(std::move(two));
557*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ("2", moved);
558*8222fbe1SAndroid Build Coastguard Worker 
559*8222fbe1SAndroid Build Coastguard Worker     const hidl_string three = "3";
560*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(three, ret.withDefault(three));
561*8222fbe1SAndroid Build Coastguard Worker }
562*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,ReturnDies)563*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, ReturnDies) {
564*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::Return;
565*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::Status;
566*8222fbe1SAndroid Build Coastguard Worker 
567*8222fbe1SAndroid Build Coastguard Worker     EXPECT_DEATH({ Return<void>(Status::fromStatusT(-EBUSY)); }, "");
568*8222fbe1SAndroid Build Coastguard Worker     EXPECT_DEATH({ Return<void>(Status::fromStatusT(-EBUSY)).isDeadObject(); }, "");
569*8222fbe1SAndroid Build Coastguard Worker     EXPECT_DEATH(
570*8222fbe1SAndroid Build Coastguard Worker             {
571*8222fbe1SAndroid Build Coastguard Worker                 Return<int> ret = Return<int>(Status::fromStatusT(-EBUSY));
572*8222fbe1SAndroid Build Coastguard Worker                 int foo = ret;  // should crash here
573*8222fbe1SAndroid Build Coastguard Worker                 (void)foo;
574*8222fbe1SAndroid Build Coastguard Worker                 ret.isOk();
575*8222fbe1SAndroid Build Coastguard Worker             },
576*8222fbe1SAndroid Build Coastguard Worker             "");
577*8222fbe1SAndroid Build Coastguard Worker }
578*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,DetectUncheckedReturn)579*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, DetectUncheckedReturn) {
580*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::HidlReturnRestriction;
581*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::Return;
582*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::setProcessHidlReturnRestriction;
583*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::Status;
584*8222fbe1SAndroid Build Coastguard Worker 
585*8222fbe1SAndroid Build Coastguard Worker     setProcessHidlReturnRestriction(HidlReturnRestriction::FATAL_IF_UNCHECKED);
586*8222fbe1SAndroid Build Coastguard Worker 
587*8222fbe1SAndroid Build Coastguard Worker     EXPECT_DEATH(
588*8222fbe1SAndroid Build Coastguard Worker             {
589*8222fbe1SAndroid Build Coastguard Worker                 auto ret = Return<void>(Status::ok());
590*8222fbe1SAndroid Build Coastguard Worker                 (void)ret;
591*8222fbe1SAndroid Build Coastguard Worker             },
592*8222fbe1SAndroid Build Coastguard Worker             "");
593*8222fbe1SAndroid Build Coastguard Worker     EXPECT_DEATH(
594*8222fbe1SAndroid Build Coastguard Worker             {
595*8222fbe1SAndroid Build Coastguard Worker                 auto ret = Return<void>(Status::ok());
596*8222fbe1SAndroid Build Coastguard Worker                 ret = Return<void>(Status::ok());
597*8222fbe1SAndroid Build Coastguard Worker                 ret.isOk();
598*8222fbe1SAndroid Build Coastguard Worker             },
599*8222fbe1SAndroid Build Coastguard Worker             "");
600*8222fbe1SAndroid Build Coastguard Worker 
601*8222fbe1SAndroid Build Coastguard Worker     auto ret = Return<void>(Status::ok());
602*8222fbe1SAndroid Build Coastguard Worker     (void)ret.isOk();
603*8222fbe1SAndroid Build Coastguard Worker     ret = Return<void>(Status::ok());
604*8222fbe1SAndroid Build Coastguard Worker     (void)ret.isOk();
605*8222fbe1SAndroid Build Coastguard Worker 
606*8222fbe1SAndroid Build Coastguard Worker     setProcessHidlReturnRestriction(HidlReturnRestriction::NONE);
607*8222fbe1SAndroid Build Coastguard Worker }
608*8222fbe1SAndroid Build Coastguard Worker 
toString(const::android::hardware::Status & s)609*8222fbe1SAndroid Build Coastguard Worker std::string toString(const ::android::hardware::Status &s) {
610*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::operator<<;
611*8222fbe1SAndroid Build Coastguard Worker     std::ostringstream oss;
612*8222fbe1SAndroid Build Coastguard Worker     oss << s;
613*8222fbe1SAndroid Build Coastguard Worker     return oss.str();
614*8222fbe1SAndroid Build Coastguard Worker }
615*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,StatusStringTest)616*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, StatusStringTest) {
617*8222fbe1SAndroid Build Coastguard Worker     using namespace ::android;
618*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::Status;
619*8222fbe1SAndroid Build Coastguard Worker     using ::testing::HasSubstr;
620*8222fbe1SAndroid Build Coastguard Worker 
621*8222fbe1SAndroid Build Coastguard Worker     EXPECT_EQ(toString(Status::ok()), "No error");
622*8222fbe1SAndroid Build Coastguard Worker 
623*8222fbe1SAndroid Build Coastguard Worker     EXPECT_THAT(toString(Status::fromStatusT(DEAD_OBJECT)), HasSubstr("DEAD_OBJECT"));
624*8222fbe1SAndroid Build Coastguard Worker 
625*8222fbe1SAndroid Build Coastguard Worker     EXPECT_THAT(toString(Status::fromStatusT(-EBUSY)), HasSubstr("busy"));
626*8222fbe1SAndroid Build Coastguard Worker 
627*8222fbe1SAndroid Build Coastguard Worker     EXPECT_THAT(toString(Status::fromExceptionCode(Status::EX_NULL_POINTER)),
628*8222fbe1SAndroid Build Coastguard Worker             HasSubstr("EX_NULL_POINTER"));
629*8222fbe1SAndroid Build Coastguard Worker }
630*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,PreloadTest)631*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, PreloadTest) {
632*8222fbe1SAndroid Build Coastguard Worker     // HIDL doesn't have support to load passthrough implementations on host, but we
633*8222fbe1SAndroid Build Coastguard Worker     // could do this by loading implementations from the output directory
634*8222fbe1SAndroid Build Coastguard Worker #ifndef __ANDROID__
635*8222fbe1SAndroid Build Coastguard Worker     GTEST_SKIP();
636*8222fbe1SAndroid Build Coastguard Worker #else
637*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::preloadPassthroughService;
638*8222fbe1SAndroid Build Coastguard Worker     using ::android::hidl::memory::V1_0::IMemory;
639*8222fbe1SAndroid Build Coastguard Worker 
640*8222fbe1SAndroid Build Coastguard Worker     // [email protected] is installed on all devices by default up
641*8222fbe1SAndroid Build Coastguard Worker     // to Android U in both bitnesses and not otherwise a dependency of this
642*8222fbe1SAndroid Build Coastguard Worker     // test.
643*8222fbe1SAndroid Build Coastguard Worker     // Android V+ devices do not have this installed by default, so skip the
644*8222fbe1SAndroid Build Coastguard Worker     // test.
645*8222fbe1SAndroid Build Coastguard Worker     if (android::base::GetIntProperty("ro.vendor.api_level", 0) >= __ANDROID_API_V__) {
646*8222fbe1SAndroid Build Coastguard Worker         GTEST_SKIP();
647*8222fbe1SAndroid Build Coastguard Worker     }
648*8222fbe1SAndroid Build Coastguard Worker     static const std::string kLib = "[email protected]";
649*8222fbe1SAndroid Build Coastguard Worker 
650*8222fbe1SAndroid Build Coastguard Worker     EXPECT_FALSE(isLibraryOpen(kLib));
651*8222fbe1SAndroid Build Coastguard Worker     preloadPassthroughService<IMemory>();
652*8222fbe1SAndroid Build Coastguard Worker     EXPECT_TRUE(isLibraryOpen(kLib));
653*8222fbe1SAndroid Build Coastguard Worker #endif
654*8222fbe1SAndroid Build Coastguard Worker }
655*8222fbe1SAndroid Build Coastguard Worker 
656*8222fbe1SAndroid Build Coastguard Worker template <typename T, size_t start, size_t end>
assertZeroInRange(const T * t)657*8222fbe1SAndroid Build Coastguard Worker static void assertZeroInRange(const T* t) {
658*8222fbe1SAndroid Build Coastguard Worker     static_assert(start < sizeof(T));
659*8222fbe1SAndroid Build Coastguard Worker     static_assert(end <= sizeof(T));
660*8222fbe1SAndroid Build Coastguard Worker 
661*8222fbe1SAndroid Build Coastguard Worker     const uint8_t* ptr = reinterpret_cast<const uint8_t*>(t);
662*8222fbe1SAndroid Build Coastguard Worker 
663*8222fbe1SAndroid Build Coastguard Worker     for (size_t i = start; i < end; i++) {
664*8222fbe1SAndroid Build Coastguard Worker         EXPECT_EQ(0, ptr[i]);
665*8222fbe1SAndroid Build Coastguard Worker     }
666*8222fbe1SAndroid Build Coastguard Worker }
667*8222fbe1SAndroid Build Coastguard Worker 
668*8222fbe1SAndroid Build Coastguard Worker template <typename T, size_t start, size_t end>
uninitTest()669*8222fbe1SAndroid Build Coastguard Worker static void uninitTest() {
670*8222fbe1SAndroid Build Coastguard Worker     uint8_t buf[sizeof(T)];
671*8222fbe1SAndroid Build Coastguard Worker     memset(buf, 0xFF, sizeof(T));
672*8222fbe1SAndroid Build Coastguard Worker 
673*8222fbe1SAndroid Build Coastguard Worker     T* type = new (buf) T;
674*8222fbe1SAndroid Build Coastguard Worker     assertZeroInRange<T, start, end>(type);
675*8222fbe1SAndroid Build Coastguard Worker     type->~T();
676*8222fbe1SAndroid Build Coastguard Worker }
677*8222fbe1SAndroid Build Coastguard Worker 
TEST_F(LibHidlTest,HidlVecUninit)678*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, HidlVecUninit) {
679*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::hidl_vec;
680*8222fbe1SAndroid Build Coastguard Worker     struct SomeType {};
681*8222fbe1SAndroid Build Coastguard Worker     static_assert(sizeof(hidl_vec<SomeType>) == 16);
682*8222fbe1SAndroid Build Coastguard Worker 
683*8222fbe1SAndroid Build Coastguard Worker     // padding after mOwnsBuffer
684*8222fbe1SAndroid Build Coastguard Worker     uninitTest<hidl_vec<SomeType>, 13, 16>();
685*8222fbe1SAndroid Build Coastguard Worker }
TEST_F(LibHidlTest,HidlHandleUninit)686*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, HidlHandleUninit) {
687*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::hidl_handle;
688*8222fbe1SAndroid Build Coastguard Worker     static_assert(sizeof(hidl_handle) == 16);
689*8222fbe1SAndroid Build Coastguard Worker 
690*8222fbe1SAndroid Build Coastguard Worker     // padding after mOwnsHandle
691*8222fbe1SAndroid Build Coastguard Worker     uninitTest<hidl_handle, 9, 16>();
692*8222fbe1SAndroid Build Coastguard Worker }
TEST_F(LibHidlTest,HidlStringUninit)693*8222fbe1SAndroid Build Coastguard Worker TEST_F(LibHidlTest, HidlStringUninit) {
694*8222fbe1SAndroid Build Coastguard Worker     using ::android::hardware::hidl_string;
695*8222fbe1SAndroid Build Coastguard Worker     static_assert(sizeof(hidl_string) == 16);
696*8222fbe1SAndroid Build Coastguard Worker 
697*8222fbe1SAndroid Build Coastguard Worker     // padding after mOwnsBuffer
698*8222fbe1SAndroid Build Coastguard Worker     uninitTest<hidl_string, 13, 16>();
699*8222fbe1SAndroid Build Coastguard Worker }
700*8222fbe1SAndroid Build Coastguard Worker 
main(int argc,char ** argv)701*8222fbe1SAndroid Build Coastguard Worker int main(int argc, char **argv) {
702*8222fbe1SAndroid Build Coastguard Worker     ::testing::InitGoogleTest(&argc, argv);
703*8222fbe1SAndroid Build Coastguard Worker     return RUN_ALL_TESTS();
704*8222fbe1SAndroid Build Coastguard Worker }
705