xref: /aosp_15_r20/cts/tests/tests/binder_ndk/libbinder_ndk_test/test_ibinder.cpp (revision b7c941bb3fa97aba169d73cee0bed2de8ac964bf)
1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #define LOG_TAG "Cts-NdkBinderTest"
17 
18 #include <android/binder_ibinder.h>
19 #include <gtest/gtest.h>
20 
21 #include "utilities.h"
22 
23 class NdkBinderTest_AIBinder : public NdkBinderTest {};
24 
TEST_F(NdkBinderTest_AIBinder,Destruction)25 TEST_F(NdkBinderTest_AIBinder, Destruction) {
26   bool destroyed = false;
27   AIBinder* binder =
28       SampleData::newBinder(nullptr, [&](SampleData*) { destroyed = true; });
29   EXPECT_FALSE(destroyed);
30   AIBinder_incStrong(binder);  // 1 -> 2
31   EXPECT_FALSE(destroyed);
32   AIBinder_decStrong(binder);  // 2 -> 1
33   EXPECT_FALSE(destroyed);
34   AIBinder_decStrong(binder);  // 1 -> 0
35   EXPECT_TRUE(destroyed);
36 }
37 
TEST_F(NdkBinderTest_AIBinder,GetClass)38 TEST_F(NdkBinderTest_AIBinder, GetClass) {
39   AIBinder* binder = SampleData::newBinder();
40   // class is already set since this local binder is contructed with it
41   EXPECT_EQ(SampleData::kClass, AIBinder_getClass(binder));
42   AIBinder_decStrong(binder);
43 }
44 
TEST_F(NdkBinderTest_AIBinder,AssociateClass)45 TEST_F(NdkBinderTest_AIBinder, AssociateClass) {
46   AIBinder* binder = SampleData::newBinder();
47   EXPECT_TRUE(AIBinder_associateClass(binder, SampleData::kClass));
48   AIBinder_decStrong(binder);
49 }
50 
TEST_F(NdkBinderTest_AIBinder,AssociateUnrelatedClassWithSameDescriptorFails)51 TEST_F(NdkBinderTest_AIBinder, AssociateUnrelatedClassWithSameDescriptorFails) {
52   AIBinder* binder = SampleData::newBinder();
53   EXPECT_FALSE(AIBinder_associateClass(binder, SampleData::kAnotherClassWithSameDescriptor));
54   AIBinder_decStrong(binder);
55 }
56 
TEST_F(NdkBinderTest_AIBinder,AssociateWrongClassFails)57 TEST_F(NdkBinderTest_AIBinder, AssociateWrongClassFails) {
58   AIBinder* binder = SampleData::newBinder();
59   EXPECT_FALSE(AIBinder_associateClass(binder, SampleData::kAnotherClass));
60   AIBinder_decStrong(binder);
61 }
62 
63 // TEST_F(NdkBinderTest_AIBinder, CrashGetDescriptor) {
64 //   EXPECT_DEATH({ AIBinder_Class_getDescriptor(nullptr); }, "getDescriptor requires non-null clazz");
65 // }
66 
TEST_F(NdkBinderTest_AIBinder,ClassGetDescriptor)67 TEST_F(NdkBinderTest_AIBinder, ClassGetDescriptor) {
68   EXPECT_NE(SampleData::kClass, SampleData::kAnotherClassWithSameDescriptor);
69   EXPECT_STREQ(SampleData::kDescriptor, AIBinder_Class_getDescriptor(SampleData::kClass));
70   EXPECT_STREQ(SampleData::kDescriptor,
71                AIBinder_Class_getDescriptor(SampleData::kAnotherClassWithSameDescriptor));
72 
73   AIBinder* binder = SampleData::newBinder();
74   EXPECT_STREQ(SampleData::kDescriptor, AIBinder_Class_getDescriptor(AIBinder_getClass(binder)));
75   AIBinder_decStrong(binder);
76 }
77 
TEST_F(NdkBinderTest_AIBinder,GetUserData)78 TEST_F(NdkBinderTest_AIBinder, GetUserData) {
79   // This test can't use the helper utility since SampleData isn't exposed
80   SampleData* data = new SampleData;
81   // Takes ownership of data
82   AIBinder* binder = AIBinder_new(SampleData::kClass, static_cast<void*>(data));
83   EXPECT_EQ(data, AIBinder_getUserData(binder));
84   AIBinder_decStrong(binder);
85 }
86 
TEST_F(NdkBinderTest_AIBinder,DestructionGivesUserData)87 TEST_F(NdkBinderTest_AIBinder, DestructionGivesUserData) {
88   // This test can't use the helper utility since SampleData isn't exposed
89   SampleData* destroyedPointer = nullptr;
90   SampleData* data = new SampleData(
91       nullptr, [&](SampleData* data) { destroyedPointer = data; });
92   // Takes ownership of data
93   AIBinder* binder = AIBinder_new(SampleData::kClass, static_cast<void*>(data));
94   EXPECT_EQ(nullptr, destroyedPointer);
95   AIBinder_decStrong(binder);
96 
97   // These pointers no longer reference valid memory locations, but the pointers
98   // themselves are valid
99   EXPECT_EQ(data, destroyedPointer);
100 }
101 
onBinderDied(void *)102 void onBinderDied(void* /*cookie*/) {}
103 
TEST_F(NdkBinderTest_AIBinder,LinkInProcess)104 TEST_F(NdkBinderTest_AIBinder, LinkInProcess) {
105   AIBinder* binder = SampleData::newBinder();
106   AIBinder_DeathRecipient* recipient =
107       AIBinder_DeathRecipient_new(onBinderDied);
108 
109   EXPECT_EQ(STATUS_INVALID_OPERATION,
110             AIBinder_linkToDeath(binder, recipient, nullptr /*cookie*/));
111 
112   AIBinder_DeathRecipient_delete(recipient);
113   AIBinder_decStrong(binder);
114 }
115 
TEST_F(NdkBinderTest_AIBinder,GetCallingWhenNoCalling)116 TEST_F(NdkBinderTest_AIBinder, GetCallingWhenNoCalling) {
117   // Calling UID/PID are current calling UID/PID if there isn't an incoming
118   // call.
119   EXPECT_EQ(getuid(), AIBinder_getCallingUid());
120   EXPECT_EQ(getpid(), AIBinder_getCallingPid());
121 }
122 
TEST_F(NdkBinderTest_AIBinder,DebugRefCount)123 TEST_F(NdkBinderTest_AIBinder, DebugRefCount) {
124   AIBinder* binder = SampleData::newBinder();
125   EXPECT_EQ(1, AIBinder_debugGetRefCount(binder));
126   AIBinder_decStrong(binder);
127 }
128 
TEST_F(NdkBinderTest_AIBinder,WeakPointerCanPromote)129 TEST_F(NdkBinderTest_AIBinder, WeakPointerCanPromote) {
130   AIBinder* binder = SampleData::newBinder();
131   AIBinder_Weak* weak = AIBinder_Weak_new(binder);
132   AIBinder* promoted = AIBinder_Weak_promote(weak);
133   EXPECT_EQ(binder, promoted);
134   AIBinder_Weak_delete(weak);
135   AIBinder_decStrong(binder);
136   AIBinder_decStrong(promoted);
137 }
138 
TEST_F(NdkBinderTest_AIBinder,WeakPointerCanNotPromote)139 TEST_F(NdkBinderTest_AIBinder, WeakPointerCanNotPromote) {
140   AIBinder* binder = SampleData::newBinder();
141   AIBinder_Weak* weak = AIBinder_Weak_new(binder);
142   AIBinder_decStrong(binder);
143 
144   AIBinder* promoted = AIBinder_Weak_promote(weak);
145   EXPECT_EQ(nullptr, promoted);
146 
147   AIBinder_Weak_delete(weak);
148 }
149 
TEST_F(NdkBinderTest_AIBinder,WeakPointerClonePromotes)150 TEST_F(NdkBinderTest_AIBinder, WeakPointerClonePromotes) {
151   AIBinder* binder = SampleData::newBinder();
152   AIBinder_Weak* weak = AIBinder_Weak_new(binder);
153   AIBinder_Weak* copy = AIBinder_Weak_clone(weak);
154   AIBinder_Weak_delete(weak);
155 
156   AIBinder* promoted = AIBinder_Weak_promote(copy);
157   EXPECT_EQ(binder, promoted);
158 
159   AIBinder_Weak_delete(copy);
160   AIBinder_decStrong(promoted);
161   AIBinder_decStrong(binder);
162 }
163 
TEST_F(NdkBinderTest_AIBinder,WeakPointerCloneNoPromote)164 TEST_F(NdkBinderTest_AIBinder, WeakPointerCloneNoPromote) {
165   AIBinder* binder = SampleData::newBinder();
166   AIBinder_Weak* weak = AIBinder_Weak_new(binder);
167   AIBinder_Weak* copy = AIBinder_Weak_clone(weak);
168   AIBinder_Weak_delete(weak);
169 
170   AIBinder_decStrong(binder);
171 
172   AIBinder* promoted = AIBinder_Weak_promote(copy);
173   EXPECT_EQ(nullptr, promoted);
174 
175   AIBinder_Weak_delete(copy);
176 }
177 
TEST_F(NdkBinderTest_AIBinder,BinderEqual)178 TEST_F(NdkBinderTest_AIBinder, BinderEqual) {
179   AIBinder* binder = SampleData::newBinder();
180 
181   EXPECT_FALSE(AIBinder_lt(binder, binder));
182 
183   AIBinder_decStrong(binder);
184 }
185 
TEST_F(NdkBinderTest_AIBinder,BinderNotEqual)186 TEST_F(NdkBinderTest_AIBinder, BinderNotEqual) {
187   AIBinder* b1 = SampleData::newBinder();
188   AIBinder* b2 = SampleData::newBinder();
189 
190   EXPECT_NE(AIBinder_lt(b1, b2), AIBinder_lt(b2, b1));
191 
192   AIBinder_decStrong(b2);
193   AIBinder_decStrong(b1);
194 }
195 
TEST_F(NdkBinderTest_AIBinder,WeakPointerEqual)196 TEST_F(NdkBinderTest_AIBinder, WeakPointerEqual) {
197   AIBinder* binder = SampleData::newBinder();
198   AIBinder_Weak* weak1 = AIBinder_Weak_new(binder);
199   AIBinder_Weak* weak2 = AIBinder_Weak_new(binder);
200 
201   // doesn't need to be promotable to remember ordering
202   AIBinder_decStrong(binder);
203 
204   // they are different objects
205   EXPECT_NE(weak1, weak2);
206 
207   // they point to the same binder
208   EXPECT_FALSE(AIBinder_Weak_lt(weak1, weak2));
209   EXPECT_FALSE(AIBinder_Weak_lt(weak2, weak1));
210 
211   AIBinder_Weak_delete(weak1);
212   AIBinder_Weak_delete(weak2);
213 }
214 
TEST_F(NdkBinderTest_AIBinder,WeakPointerNotEqual)215 TEST_F(NdkBinderTest_AIBinder, WeakPointerNotEqual) {
216   AIBinder* b1 = SampleData::newBinder();
217   AIBinder_Weak* w1 = AIBinder_Weak_new(b1);
218   AIBinder* b2 = SampleData::newBinder();
219   AIBinder_Weak* w2 = AIBinder_Weak_new(b2);
220 
221   bool b1ltb2 = AIBinder_lt(b1, b2);
222 
223   // doesn't need to be promotable to remember ordering
224   AIBinder_decStrong(b2);
225   AIBinder_decStrong(b1);
226 
227   EXPECT_EQ(b1ltb2, AIBinder_Weak_lt(w1, w2));
228   EXPECT_EQ(!b1ltb2, AIBinder_Weak_lt(w2, w1));
229 
230   AIBinder_Weak_delete(w1);
231   AIBinder_Weak_delete(w2);
232 }
233 
TEST_F(NdkBinderTest_AIBinder,IsHandlingTransactionFalse)234 TEST_F(NdkBinderTest_AIBinder, IsHandlingTransactionFalse) {
235   EXPECT_FALSE(AIBinder_isHandlingTransaction());
236 }
237 
TEST_F(NdkBinderTest_AIBinder,LocalIsLocal)238 TEST_F(NdkBinderTest_AIBinder, LocalIsLocal) {
239   AIBinder* binder = SampleData::newBinder();
240   EXPECT_FALSE(AIBinder_isRemote(binder));
241   AIBinder_decStrong(binder);
242 }
243 
TEST_F(NdkBinderTest_AIBinder,IsAlive)244 TEST_F(NdkBinderTest_AIBinder, IsAlive) {
245   AIBinder* binder = SampleData::newBinder();
246   EXPECT_TRUE(AIBinder_isAlive(binder));
247   AIBinder_decStrong(binder);
248 }
249 
TEST_F(NdkBinderTest_AIBinder,CanPing)250 TEST_F(NdkBinderTest_AIBinder, CanPing) {
251   AIBinder* binder = SampleData::newBinder();
252   EXPECT_OK(AIBinder_ping(binder));
253   AIBinder_decStrong(binder);
254 }
255 
TEST_F(NdkBinderTest_AIBinder,GetExtensionImmediatelyReturnsNull)256 TEST_F(NdkBinderTest_AIBinder, GetExtensionImmediatelyReturnsNull) {
257   AIBinder* binder = SampleData::newBinder();
258   AIBinder* ext;
259   EXPECT_OK(AIBinder_getExtension(binder, &ext));
260   EXPECT_EQ(ext, nullptr);
261   AIBinder_decStrong(binder);
262 }
263 
TEST_F(NdkBinderTest_AIBinder,GetSetExtensionLocally)264 TEST_F(NdkBinderTest_AIBinder, GetSetExtensionLocally) {
265   AIBinder* binder = SampleData::newBinder();
266   AIBinder* ext = SampleData::newBinder();
267   EXPECT_OK(AIBinder_setExtension(binder, ext));
268 
269   AIBinder* getExt;
270   EXPECT_OK(AIBinder_getExtension(binder, &getExt));
271   ASSERT_EQ(ext, getExt);
272 
273   AIBinder_decStrong(ext);
274   AIBinder_decStrong(getExt);
275   AIBinder_decStrong(binder);
276 }
277 
TEST_F(NdkBinderTest_AIBinder,GetSetExtensionRepeatedly)278 TEST_F(NdkBinderTest_AIBinder, GetSetExtensionRepeatedly) {
279   AIBinder* binder = SampleData::newBinder();
280   AIBinder* ext1 = SampleData::newBinder();
281   AIBinder* ext2 = SampleData::newBinder();
282   EXPECT_OK(AIBinder_setExtension(binder, ext1));
283   EXPECT_OK(AIBinder_setExtension(binder, ext2));
284 
285   AIBinder* getExt;
286   EXPECT_OK(AIBinder_getExtension(binder, &getExt));
287   ASSERT_EQ(ext2, getExt);
288 
289   AIBinder_decStrong(ext1);
290   AIBinder_decStrong(ext2);
291   AIBinder_decStrong(getExt);
292   AIBinder_decStrong(binder);
293 }
294 
TEST_F(NdkBinderTest_AIBinder,TransactionHappens)295 TEST_F(NdkBinderTest_AIBinder, TransactionHappens) {
296   AIBinder* binder = SampleData::newBinder(TransactionsReturn(STATUS_OK),
297                                            ExpectLifetimeTransactions(1));
298   EXPECT_OK(SampleData::transact(binder, kCode));
299   AIBinder_decStrong(binder);
300 }
301 
TEST_F(NdkBinderTest_AIBinder,OnewayTransactionHappens)302 TEST_F(NdkBinderTest_AIBinder, OnewayTransactionHappens) {
303   AIBinder* binder = SampleData::newBinder(TransactionsReturn(STATUS_OK),
304                                            ExpectLifetimeTransactions(1));
305   EXPECT_OK(SampleData::transact(binder, kCode, WriteNothingToParcel,
306                                  ReadNothingFromParcel, FLAG_ONEWAY));
307   AIBinder_decStrong(binder);
308 }
309 
TEST_F(NdkBinderTest_AIBinder,TransactionCodeMaintained)310 TEST_F(NdkBinderTest_AIBinder, TransactionCodeMaintained) {
311   AIBinder* binder = SampleData::newBinder(
312       [&](transaction_code_t code, const AParcel*, AParcel*) {
313         EXPECT_EQ(code, kCode);
314         return STATUS_OK;
315       },
316       ExpectLifetimeTransactions(1));
317   EXPECT_OK(SampleData::transact(binder, kCode));
318   AIBinder_decStrong(binder);
319 }
320 
TEST_F(NdkBinderTest_AIBinder,TransactionCodeRangeRespected)321 TEST_F(NdkBinderTest_AIBinder, TransactionCodeRangeRespected) {
322   AIBinder* binder = SampleData::newBinder(TransactionsReturn(STATUS_OK));
323   EXPECT_OK(SampleData::transact(binder, FIRST_CALL_TRANSACTION));
324   EXPECT_OK(SampleData::transact(binder, FIRST_CALL_TRANSACTION + 1));
325   EXPECT_OK(SampleData::transact(binder, LAST_CALL_TRANSACTION - 1));
326   EXPECT_OK(SampleData::transact(binder, LAST_CALL_TRANSACTION));
327 
328   EXPECT_EQ(STATUS_UNKNOWN_TRANSACTION,
329             SampleData::transact(binder, FIRST_CALL_TRANSACTION - 1));
330   EXPECT_EQ(STATUS_UNKNOWN_TRANSACTION,
331             SampleData::transact(binder, LAST_CALL_TRANSACTION + 1));
332   AIBinder_decStrong(binder);
333 }
334 
TEST_F(NdkBinderTest_AIBinder,UnknownFlagsRejected)335 TEST_F(NdkBinderTest_AIBinder, UnknownFlagsRejected) {
336   AIBinder* binder =
337       SampleData::newBinder(nullptr, ExpectLifetimeTransactions(0));
338   EXPECT_EQ(STATUS_BAD_VALUE,
339             SampleData::transact(binder, kCode, WriteNothingToParcel,
340                                  ReadNothingFromParcel, +1 + 415));
341   EXPECT_EQ(STATUS_BAD_VALUE,
342             SampleData::transact(binder, kCode, WriteNothingToParcel,
343                                  ReadNothingFromParcel, FLAG_ONEWAY + 1));
344   EXPECT_EQ(STATUS_BAD_VALUE,
345             SampleData::transact(binder, kCode, WriteNothingToParcel,
346                                  ReadNothingFromParcel, ~0));
347   AIBinder_decStrong(binder);
348 }
349 
TEST_F(NdkBinderTest_AIBinder,UnassociatedBinderRejected)350 TEST_F(NdkBinderTest_AIBinder, UnassociatedBinderRejected) {
351   AIBinder* binder1 = SampleData::newBinder(nullptr, ExpectLifetimeTransactions(0));
352 
353   AParcel* in;
354   EXPECT_EQ(STATUS_OK, AIBinder_prepareTransaction(binder1, &in));
355 
356   AIBinder* binder2 = SampleData::newBinder(nullptr, ExpectLifetimeTransactions(0));
357 
358   AParcel* out;
359   // transaction on different binder object from prepare fails
360   EXPECT_EQ(STATUS_BAD_VALUE, AIBinder_transact(binder2, kCode, &in, &out, 0));
361 
362   AParcel_delete(out);
363 
364   AIBinder_decStrong(binder2);
365   AIBinder_decStrong(binder1);
366 }
367 
EmptyOnCreate(void * args)368 void* EmptyOnCreate(void* args) { return args; }
EmptyOnDestroy(void *)369 void EmptyOnDestroy(void* /*userData*/) {}
EmptyOnTransact(AIBinder *,transaction_code_t,const AParcel *,AParcel *)370 binder_status_t EmptyOnTransact(AIBinder* /*binder*/,
371                                 transaction_code_t /*code*/,
372                                 const AParcel* /*in*/, AParcel* /*out*/) {
373   return STATUS_OK;
374 }
375 
TEST_F(NdkBinderTest_AIBinder,NullArguments)376 TEST_F(NdkBinderTest_AIBinder, NullArguments) {
377   void* const kVoidStar = reinterpret_cast<void*>(0xDEADBEEF);
378   const char* const kStr = "asdf";
379   AIBinder* binder = SampleData::newBinder();
380   AIBinder_DeathRecipient* recipient =
381       AIBinder_DeathRecipient_new(onBinderDied);
382   EXPECT_NE(nullptr, recipient);
383 
384   EXPECT_EQ(nullptr, AIBinder_Class_define(nullptr, EmptyOnCreate,
385                                            EmptyOnDestroy, EmptyOnTransact));
386   EXPECT_EQ(nullptr, AIBinder_Class_define(kStr, nullptr, EmptyOnDestroy,
387                                            EmptyOnTransact));
388   EXPECT_EQ(nullptr, AIBinder_Class_define(kStr, EmptyOnCreate, nullptr,
389                                            EmptyOnTransact));
390   EXPECT_EQ(nullptr, AIBinder_Class_define(kStr, EmptyOnCreate, EmptyOnDestroy,
391                                            nullptr));
392 
393   EXPECT_EQ(nullptr, AIBinder_new(nullptr /*clazz*/, kVoidStar /*args*/));
394   EXPECT_EQ(false, AIBinder_isRemote(nullptr));
395   EXPECT_EQ(false, AIBinder_isAlive(nullptr));
396   EXPECT_EQ(STATUS_UNEXPECTED_NULL, AIBinder_ping(nullptr));
397 
398   EXPECT_EQ(STATUS_UNEXPECTED_NULL,
399             AIBinder_linkToDeath(nullptr, recipient, kVoidStar /*cookie*/));
400   EXPECT_EQ(STATUS_UNEXPECTED_NULL,
401             AIBinder_linkToDeath(binder, nullptr, kVoidStar /*cookie*/));
402   EXPECT_EQ(STATUS_UNEXPECTED_NULL,
403             AIBinder_unlinkToDeath(nullptr, recipient, kVoidStar /*cookie*/));
404   EXPECT_EQ(STATUS_UNEXPECTED_NULL,
405             AIBinder_unlinkToDeath(binder, nullptr, kVoidStar /*cookie*/));
406 
407   // Does not crash
408   AIBinder_incStrong(nullptr);
409   AIBinder_decStrong(nullptr);
410 
411   EXPECT_EQ(-1, AIBinder_debugGetRefCount(nullptr));
412   EXPECT_EQ(false, AIBinder_associateClass(binder, nullptr));
413   EXPECT_EQ(false, AIBinder_associateClass(nullptr, SampleData::kClass));
414   EXPECT_EQ(nullptr, AIBinder_getClass(nullptr));
415   EXPECT_EQ(nullptr, AIBinder_getUserData(nullptr));
416 
417   AParcel* parcel = nullptr;
418   EXPECT_EQ(STATUS_UNEXPECTED_NULL,
419             AIBinder_prepareTransaction(binder, nullptr));
420   EXPECT_EQ(STATUS_UNEXPECTED_NULL,
421             AIBinder_prepareTransaction(nullptr, &parcel));
422   EXPECT_EQ(nullptr, parcel);  // not modified
423 
424   {
425     auto newParcel = [&] {
426       AParcel* parcel = nullptr;
427       EXPECT_OK(AIBinder_prepareTransaction(binder, &parcel));
428       return parcel;
429     };
430 
431     AParcel* inParcel = nullptr;
432     AParcel* outParcel = nullptr;
433 
434     inParcel = newParcel();
435     EXPECT_NE(nullptr, inParcel);
436     EXPECT_EQ(
437         STATUS_UNEXPECTED_NULL,
438         AIBinder_transact(nullptr, kCode, &inParcel, &outParcel, 0 /*flags*/));
439     EXPECT_EQ(nullptr, inParcel);   // ownership taken
440     EXPECT_EQ(nullptr, outParcel);  // not modified
441 
442     EXPECT_EQ(
443         STATUS_UNEXPECTED_NULL,
444         AIBinder_transact(binder, kCode, nullptr, &outParcel, 0 /*flags*/));
445     EXPECT_EQ(nullptr, outParcel);  // not modified
446 
447     inParcel = newParcel();
448     EXPECT_NE(nullptr, inParcel);
449     EXPECT_EQ(
450         STATUS_UNEXPECTED_NULL,
451         AIBinder_transact(binder, kCode, &inParcel, nullptr, 0 /*flags*/));
452     EXPECT_EQ(nullptr, inParcel);   // ownership taken
453     EXPECT_EQ(nullptr, outParcel);  // not modified
454   }
455 
456   EXPECT_EQ(nullptr, AIBinder_Weak_new(nullptr));
457 
458   // Does not crash
459   AIBinder_Weak_delete(nullptr);
460 
461   EXPECT_EQ(nullptr, AIBinder_Weak_promote(nullptr));
462 
463   EXPECT_EQ(nullptr, AIBinder_DeathRecipient_new(nullptr));
464 
465   EXPECT_EQ(nullptr, AIBinder_Weak_clone(nullptr));
466 
467   AIBinder_Weak* weak = AIBinder_Weak_new(binder);
468   EXPECT_TRUE(AIBinder_Weak_lt(nullptr, weak));
469   EXPECT_FALSE(AIBinder_Weak_lt(weak, nullptr));
470   AIBinder_Weak_delete(weak);
471 
472   // Does not crash
473   AIBinder_DeathRecipient_delete(nullptr);
474   AIBinder_DeathRecipient_setOnUnlinked(recipient, nullptr);
475   AIBinder_DeathRecipient_setOnUnlinked(nullptr, nullptr);
476 
477   AIBinder_DeathRecipient_delete(recipient);
478   AIBinder_decStrong(binder);
479 
480   EXPECT_EQ(STATUS_UNEXPECTED_NULL, AIBinder_getExtension(nullptr, nullptr));
481   EXPECT_EQ(STATUS_UNEXPECTED_NULL, AIBinder_setExtension(nullptr, nullptr));
482 }
483 
TEST_F(NdkBinderTest_AIBinder,SetTransactionCodeMap)484 TEST_F(NdkBinderTest_AIBinder, SetTransactionCodeMap) {
485   const char* codeToFunction[] = {"function-1", "function-2", "function-3"};
486   const char* interfaceName = "interface_descriptor";
487   AIBinder_Class* clazz =
488       AIBinder_Class_define(interfaceName, EmptyOnCreate, EmptyOnDestroy, EmptyOnTransact);
489   AIBinder_Class_setTransactionCodeToFunctionNameMap(clazz, codeToFunction, 3);
490   EXPECT_EQ(codeToFunction[0], AIBinder_Class_getFunctionName(clazz, 1));
491   EXPECT_EQ(codeToFunction[1], AIBinder_Class_getFunctionName(clazz, 2));
492   EXPECT_EQ(codeToFunction[2], AIBinder_Class_getFunctionName(clazz, 3));
493 
494   // check invalid codes which don't have associated function names
495   EXPECT_EQ(nullptr, AIBinder_Class_getFunctionName(clazz, 0));
496   EXPECT_EQ(nullptr, AIBinder_Class_getFunctionName(clazz, 10));
497 }
498 
TEST_F(NdkBinderTest_AIBinder,GetFunctionNameOnNullMap)499 TEST_F(NdkBinderTest_AIBinder, GetFunctionNameOnNullMap) {
500   const char* interfaceName = "interface_descriptor";
501   AIBinder_Class* clazz =
502       AIBinder_Class_define(interfaceName, EmptyOnCreate, EmptyOnDestroy, EmptyOnTransact);
503 
504   // AIBinder_Class_setTransactionCodeToFunctionNameMap hasn't been called first.
505   EXPECT_EQ(nullptr, AIBinder_Class_getFunctionName(clazz, 2));
506 }
507