• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
TEST_F(NdkBinderTest_AIBinder,ClassGetDescriptor)63 TEST_F(NdkBinderTest_AIBinder, ClassGetDescriptor) {
64   EXPECT_NE(SampleData::kClass, SampleData::kAnotherClassWithSameDescriptor);
65   EXPECT_STREQ(SampleData::kDescriptor, AIBinder_Class_getDescriptor(SampleData::kClass));
66   EXPECT_STREQ(SampleData::kDescriptor,
67                AIBinder_Class_getDescriptor(SampleData::kAnotherClassWithSameDescriptor));
68 
69   AIBinder* binder = SampleData::newBinder();
70   EXPECT_STREQ(SampleData::kDescriptor, AIBinder_Class_getDescriptor(AIBinder_getClass(binder)));
71   AIBinder_decStrong(binder);
72 }
73 
TEST_F(NdkBinderTest_AIBinder,GetUserData)74 TEST_F(NdkBinderTest_AIBinder, GetUserData) {
75   // This test can't use the helper utility since SampleData isn't exposed
76   SampleData* data = new SampleData;
77   // Takes ownership of data
78   AIBinder* binder = AIBinder_new(SampleData::kClass, static_cast<void*>(data));
79   EXPECT_EQ(data, AIBinder_getUserData(binder));
80   AIBinder_decStrong(binder);
81 }
82 
TEST_F(NdkBinderTest_AIBinder,DestructionGivesUserData)83 TEST_F(NdkBinderTest_AIBinder, DestructionGivesUserData) {
84   // This test can't use the helper utility since SampleData isn't exposed
85   SampleData* destroyedPointer = nullptr;
86   SampleData* data = new SampleData(
87       nullptr, [&](SampleData* data) { destroyedPointer = data; });
88   // Takes ownership of data
89   AIBinder* binder = AIBinder_new(SampleData::kClass, static_cast<void*>(data));
90   EXPECT_EQ(nullptr, destroyedPointer);
91   AIBinder_decStrong(binder);
92 
93   // These pointers no longer reference valid memory locations, but the pointers
94   // themselves are valid
95   EXPECT_EQ(data, destroyedPointer);
96 }
97 
onBinderDied(void *)98 void onBinderDied(void* /*cookie*/) {}
99 
TEST_F(NdkBinderTest_AIBinder,LinkInProcess)100 TEST_F(NdkBinderTest_AIBinder, LinkInProcess) {
101   AIBinder* binder = SampleData::newBinder();
102   AIBinder_DeathRecipient* recipient =
103       AIBinder_DeathRecipient_new(onBinderDied);
104 
105   EXPECT_EQ(STATUS_INVALID_OPERATION,
106             AIBinder_linkToDeath(binder, recipient, nullptr /*cookie*/));
107 
108   AIBinder_DeathRecipient_delete(recipient);
109   AIBinder_decStrong(binder);
110 }
111 
TEST_F(NdkBinderTest_AIBinder,GetCallingWhenNoCalling)112 TEST_F(NdkBinderTest_AIBinder, GetCallingWhenNoCalling) {
113   // Calling UID/PID are current calling UID/PID if there isn't an incoming
114   // call.
115   EXPECT_EQ(getuid(), AIBinder_getCallingUid());
116   EXPECT_EQ(getpid(), AIBinder_getCallingPid());
117 }
118 
TEST_F(NdkBinderTest_AIBinder,DebugRefCount)119 TEST_F(NdkBinderTest_AIBinder, DebugRefCount) {
120   AIBinder* binder = SampleData::newBinder();
121   EXPECT_EQ(1, AIBinder_debugGetRefCount(binder));
122   AIBinder_decStrong(binder);
123 }
124 
TEST_F(NdkBinderTest_AIBinder,WeakPointerCanPromote)125 TEST_F(NdkBinderTest_AIBinder, WeakPointerCanPromote) {
126   AIBinder* binder = SampleData::newBinder();
127   AIBinder_Weak* weak = AIBinder_Weak_new(binder);
128   AIBinder* promoted = AIBinder_Weak_promote(weak);
129   EXPECT_EQ(binder, promoted);
130   AIBinder_Weak_delete(weak);
131   AIBinder_decStrong(binder);
132   AIBinder_decStrong(promoted);
133 }
134 
TEST_F(NdkBinderTest_AIBinder,WeakPointerCanNotPromote)135 TEST_F(NdkBinderTest_AIBinder, WeakPointerCanNotPromote) {
136   AIBinder* binder = SampleData::newBinder();
137   AIBinder_Weak* weak = AIBinder_Weak_new(binder);
138   AIBinder_decStrong(binder);
139 
140   AIBinder* promoted = AIBinder_Weak_promote(weak);
141   EXPECT_EQ(nullptr, promoted);
142 
143   AIBinder_Weak_delete(weak);
144 }
145 
TEST_F(NdkBinderTest_AIBinder,WeakPointerClonePromotes)146 TEST_F(NdkBinderTest_AIBinder, WeakPointerClonePromotes) {
147   AIBinder* binder = SampleData::newBinder();
148   AIBinder_Weak* weak = AIBinder_Weak_new(binder);
149   AIBinder_Weak* copy = AIBinder_Weak_clone(weak);
150   AIBinder_Weak_delete(weak);
151 
152   AIBinder* promoted = AIBinder_Weak_promote(copy);
153   EXPECT_EQ(binder, promoted);
154 
155   AIBinder_Weak_delete(copy);
156   AIBinder_decStrong(promoted);
157   AIBinder_decStrong(binder);
158 }
159 
TEST_F(NdkBinderTest_AIBinder,WeakPointerCloneNoPromote)160 TEST_F(NdkBinderTest_AIBinder, WeakPointerCloneNoPromote) {
161   AIBinder* binder = SampleData::newBinder();
162   AIBinder_Weak* weak = AIBinder_Weak_new(binder);
163   AIBinder_Weak* copy = AIBinder_Weak_clone(weak);
164   AIBinder_Weak_delete(weak);
165 
166   AIBinder_decStrong(binder);
167 
168   AIBinder* promoted = AIBinder_Weak_promote(copy);
169   EXPECT_EQ(nullptr, promoted);
170 
171   AIBinder_Weak_delete(copy);
172 }
173 
TEST_F(NdkBinderTest_AIBinder,BinderEqual)174 TEST_F(NdkBinderTest_AIBinder, BinderEqual) {
175   AIBinder* binder = SampleData::newBinder();
176 
177   EXPECT_FALSE(AIBinder_lt(binder, binder));
178 
179   AIBinder_decStrong(binder);
180 }
181 
TEST_F(NdkBinderTest_AIBinder,BinderNotEqual)182 TEST_F(NdkBinderTest_AIBinder, BinderNotEqual) {
183   AIBinder* b1 = SampleData::newBinder();
184   AIBinder* b2 = SampleData::newBinder();
185 
186   EXPECT_NE(AIBinder_lt(b1, b2), AIBinder_lt(b2, b1));
187 
188   AIBinder_decStrong(b2);
189   AIBinder_decStrong(b1);
190 }
191 
TEST_F(NdkBinderTest_AIBinder,WeakPointerEqual)192 TEST_F(NdkBinderTest_AIBinder, WeakPointerEqual) {
193   AIBinder* binder = SampleData::newBinder();
194   AIBinder_Weak* weak1 = AIBinder_Weak_new(binder);
195   AIBinder_Weak* weak2 = AIBinder_Weak_new(binder);
196 
197   // doesn't need to be promotable to remember ordering
198   AIBinder_decStrong(binder);
199 
200   // they are different objects
201   EXPECT_NE(weak1, weak2);
202 
203   // they point to the same binder
204   EXPECT_FALSE(AIBinder_Weak_lt(weak1, weak2));
205   EXPECT_FALSE(AIBinder_Weak_lt(weak2, weak1));
206 
207   AIBinder_Weak_delete(weak1);
208   AIBinder_Weak_delete(weak2);
209 }
210 
TEST_F(NdkBinderTest_AIBinder,WeakPointerNotEqual)211 TEST_F(NdkBinderTest_AIBinder, WeakPointerNotEqual) {
212   AIBinder* b1 = SampleData::newBinder();
213   AIBinder_Weak* w1 = AIBinder_Weak_new(b1);
214   AIBinder* b2 = SampleData::newBinder();
215   AIBinder_Weak* w2 = AIBinder_Weak_new(b2);
216 
217   bool b1ltb2 = AIBinder_lt(b1, b2);
218 
219   // doesn't need to be promotable to remember ordering
220   AIBinder_decStrong(b2);
221   AIBinder_decStrong(b1);
222 
223   EXPECT_EQ(b1ltb2, AIBinder_Weak_lt(w1, w2));
224   EXPECT_EQ(!b1ltb2, AIBinder_Weak_lt(w2, w1));
225 
226   AIBinder_Weak_delete(w1);
227   AIBinder_Weak_delete(w2);
228 }
229 
TEST_F(NdkBinderTest_AIBinder,IsHandlingTransactionFalse)230 TEST_F(NdkBinderTest_AIBinder, IsHandlingTransactionFalse) {
231   EXPECT_FALSE(AIBinder_isHandlingTransaction());
232 }
233 
TEST_F(NdkBinderTest_AIBinder,LocalIsLocal)234 TEST_F(NdkBinderTest_AIBinder, LocalIsLocal) {
235   AIBinder* binder = SampleData::newBinder();
236   EXPECT_FALSE(AIBinder_isRemote(binder));
237   AIBinder_decStrong(binder);
238 }
239 
TEST_F(NdkBinderTest_AIBinder,IsAlive)240 TEST_F(NdkBinderTest_AIBinder, IsAlive) {
241   AIBinder* binder = SampleData::newBinder();
242   EXPECT_TRUE(AIBinder_isAlive(binder));
243   AIBinder_decStrong(binder);
244 }
245 
TEST_F(NdkBinderTest_AIBinder,CanPing)246 TEST_F(NdkBinderTest_AIBinder, CanPing) {
247   AIBinder* binder = SampleData::newBinder();
248   EXPECT_OK(AIBinder_ping(binder));
249   AIBinder_decStrong(binder);
250 }
251 
TEST_F(NdkBinderTest_AIBinder,GetExtensionImmediatelyReturnsNull)252 TEST_F(NdkBinderTest_AIBinder, GetExtensionImmediatelyReturnsNull) {
253   AIBinder* binder = SampleData::newBinder();
254   AIBinder* ext;
255   EXPECT_OK(AIBinder_getExtension(binder, &ext));
256   EXPECT_EQ(ext, nullptr);
257   AIBinder_decStrong(binder);
258 }
259 
TEST_F(NdkBinderTest_AIBinder,GetSetExtensionLocally)260 TEST_F(NdkBinderTest_AIBinder, GetSetExtensionLocally) {
261   AIBinder* binder = SampleData::newBinder();
262   AIBinder* ext = SampleData::newBinder();
263   EXPECT_OK(AIBinder_setExtension(binder, ext));
264 
265   AIBinder* getExt;
266   EXPECT_OK(AIBinder_getExtension(binder, &getExt));
267   ASSERT_EQ(ext, getExt);
268 
269   AIBinder_decStrong(ext);
270   AIBinder_decStrong(getExt);
271   AIBinder_decStrong(binder);
272 }
273 
TEST_F(NdkBinderTest_AIBinder,GetSetExtensionRepeatedly)274 TEST_F(NdkBinderTest_AIBinder, GetSetExtensionRepeatedly) {
275   AIBinder* binder = SampleData::newBinder();
276   AIBinder* ext1 = SampleData::newBinder();
277   AIBinder* ext2 = SampleData::newBinder();
278   EXPECT_OK(AIBinder_setExtension(binder, ext1));
279   EXPECT_OK(AIBinder_setExtension(binder, ext2));
280 
281   AIBinder* getExt;
282   EXPECT_OK(AIBinder_getExtension(binder, &getExt));
283   ASSERT_EQ(ext2, getExt);
284 
285   AIBinder_decStrong(ext1);
286   AIBinder_decStrong(ext2);
287   AIBinder_decStrong(getExt);
288   AIBinder_decStrong(binder);
289 }
290 
TEST_F(NdkBinderTest_AIBinder,TransactionHappens)291 TEST_F(NdkBinderTest_AIBinder, TransactionHappens) {
292   AIBinder* binder = SampleData::newBinder(TransactionsReturn(STATUS_OK),
293                                            ExpectLifetimeTransactions(1));
294   EXPECT_OK(SampleData::transact(binder, kCode));
295   AIBinder_decStrong(binder);
296 }
297 
TEST_F(NdkBinderTest_AIBinder,OnewayTransactionHappens)298 TEST_F(NdkBinderTest_AIBinder, OnewayTransactionHappens) {
299   AIBinder* binder = SampleData::newBinder(TransactionsReturn(STATUS_OK),
300                                            ExpectLifetimeTransactions(1));
301   EXPECT_OK(SampleData::transact(binder, kCode, WriteNothingToParcel,
302                                  ReadNothingFromParcel, FLAG_ONEWAY));
303   AIBinder_decStrong(binder);
304 }
305 
TEST_F(NdkBinderTest_AIBinder,TransactionCodeMaintained)306 TEST_F(NdkBinderTest_AIBinder, TransactionCodeMaintained) {
307   AIBinder* binder = SampleData::newBinder(
308       [&](transaction_code_t code, const AParcel*, AParcel*) {
309         EXPECT_EQ(code, kCode);
310         return STATUS_OK;
311       },
312       ExpectLifetimeTransactions(1));
313   EXPECT_OK(SampleData::transact(binder, kCode));
314   AIBinder_decStrong(binder);
315 }
316 
TEST_F(NdkBinderTest_AIBinder,TransactionCodeRangeRespected)317 TEST_F(NdkBinderTest_AIBinder, TransactionCodeRangeRespected) {
318   AIBinder* binder = SampleData::newBinder(TransactionsReturn(STATUS_OK));
319   EXPECT_OK(SampleData::transact(binder, FIRST_CALL_TRANSACTION));
320   EXPECT_OK(SampleData::transact(binder, FIRST_CALL_TRANSACTION + 1));
321   EXPECT_OK(SampleData::transact(binder, LAST_CALL_TRANSACTION - 1));
322   EXPECT_OK(SampleData::transact(binder, LAST_CALL_TRANSACTION));
323 
324   EXPECT_EQ(STATUS_UNKNOWN_TRANSACTION,
325             SampleData::transact(binder, FIRST_CALL_TRANSACTION - 1));
326   EXPECT_EQ(STATUS_UNKNOWN_TRANSACTION,
327             SampleData::transact(binder, LAST_CALL_TRANSACTION + 1));
328   AIBinder_decStrong(binder);
329 }
330 
TEST_F(NdkBinderTest_AIBinder,UnknownFlagsRejected)331 TEST_F(NdkBinderTest_AIBinder, UnknownFlagsRejected) {
332   AIBinder* binder =
333       SampleData::newBinder(nullptr, ExpectLifetimeTransactions(0));
334   EXPECT_EQ(STATUS_BAD_VALUE,
335             SampleData::transact(binder, kCode, WriteNothingToParcel,
336                                  ReadNothingFromParcel, +1 + 415));
337   EXPECT_EQ(STATUS_BAD_VALUE,
338             SampleData::transact(binder, kCode, WriteNothingToParcel,
339                                  ReadNothingFromParcel, FLAG_ONEWAY + 1));
340   EXPECT_EQ(STATUS_BAD_VALUE,
341             SampleData::transact(binder, kCode, WriteNothingToParcel,
342                                  ReadNothingFromParcel, ~0));
343   AIBinder_decStrong(binder);
344 }
345 
TEST_F(NdkBinderTest_AIBinder,UnassociatedBinderRejected)346 TEST_F(NdkBinderTest_AIBinder, UnassociatedBinderRejected) {
347   AIBinder* binder1 = SampleData::newBinder(nullptr, ExpectLifetimeTransactions(0));
348 
349   AParcel* in;
350   EXPECT_EQ(STATUS_OK, AIBinder_prepareTransaction(binder1, &in));
351 
352   AIBinder* binder2 = SampleData::newBinder(nullptr, ExpectLifetimeTransactions(0));
353 
354   AParcel* out;
355   // transaction on different binder object from prepare fails
356   EXPECT_EQ(STATUS_BAD_VALUE, AIBinder_transact(binder2, kCode, &in, &out, 0));
357 
358   AParcel_delete(out);
359 
360   AIBinder_decStrong(binder2);
361   AIBinder_decStrong(binder1);
362 }
363 
EmptyOnCreate(void * args)364 void* EmptyOnCreate(void* args) { return args; }
EmptyOnDestroy(void *)365 void EmptyOnDestroy(void* /*userData*/) {}
EmptyOnTransact(AIBinder *,transaction_code_t,const AParcel *,AParcel *)366 binder_status_t EmptyOnTransact(AIBinder* /*binder*/,
367                                 transaction_code_t /*code*/,
368                                 const AParcel* /*in*/, AParcel* /*out*/) {
369   return STATUS_OK;
370 }
371 
TEST_F(NdkBinderTest_AIBinder,NullArguments)372 TEST_F(NdkBinderTest_AIBinder, NullArguments) {
373   void* const kVoidStar = reinterpret_cast<void*>(0xDEADBEEF);
374   const char* const kStr = "asdf";
375   AIBinder* binder = SampleData::newBinder();
376   AIBinder_DeathRecipient* recipient =
377       AIBinder_DeathRecipient_new(onBinderDied);
378   EXPECT_NE(nullptr, recipient);
379 
380   EXPECT_EQ(nullptr, AIBinder_Class_define(nullptr, EmptyOnCreate,
381                                            EmptyOnDestroy, EmptyOnTransact));
382   EXPECT_EQ(nullptr, AIBinder_Class_define(kStr, nullptr, EmptyOnDestroy,
383                                            EmptyOnTransact));
384   EXPECT_EQ(nullptr, AIBinder_Class_define(kStr, EmptyOnCreate, nullptr,
385                                            EmptyOnTransact));
386   EXPECT_EQ(nullptr, AIBinder_Class_define(kStr, EmptyOnCreate, EmptyOnDestroy,
387                                            nullptr));
388 
389   EXPECT_EQ(nullptr, AIBinder_new(nullptr /*clazz*/, kVoidStar /*args*/));
390   EXPECT_EQ(false, AIBinder_isRemote(nullptr));
391   EXPECT_EQ(false, AIBinder_isAlive(nullptr));
392   EXPECT_EQ(STATUS_UNEXPECTED_NULL, AIBinder_ping(nullptr));
393 
394   EXPECT_EQ(STATUS_UNEXPECTED_NULL,
395             AIBinder_linkToDeath(nullptr, recipient, kVoidStar /*cookie*/));
396   EXPECT_EQ(STATUS_UNEXPECTED_NULL,
397             AIBinder_linkToDeath(binder, nullptr, kVoidStar /*cookie*/));
398   EXPECT_EQ(STATUS_UNEXPECTED_NULL,
399             AIBinder_unlinkToDeath(nullptr, recipient, kVoidStar /*cookie*/));
400   EXPECT_EQ(STATUS_UNEXPECTED_NULL,
401             AIBinder_unlinkToDeath(binder, nullptr, kVoidStar /*cookie*/));
402 
403   // Does not crash
404   AIBinder_incStrong(nullptr);
405   AIBinder_decStrong(nullptr);
406 
407   EXPECT_EQ(-1, AIBinder_debugGetRefCount(nullptr));
408   EXPECT_EQ(false, AIBinder_associateClass(binder, nullptr));
409   EXPECT_EQ(false, AIBinder_associateClass(nullptr, SampleData::kClass));
410   EXPECT_EQ(nullptr, AIBinder_getClass(nullptr));
411   EXPECT_EQ(nullptr, AIBinder_getUserData(nullptr));
412 
413   AParcel* parcel = nullptr;
414   EXPECT_EQ(STATUS_UNEXPECTED_NULL,
415             AIBinder_prepareTransaction(binder, nullptr));
416   EXPECT_EQ(STATUS_UNEXPECTED_NULL,
417             AIBinder_prepareTransaction(nullptr, &parcel));
418   EXPECT_EQ(nullptr, parcel);  // not modified
419 
420   {
421     auto newParcel = [&] {
422       AParcel* parcel = nullptr;
423       EXPECT_OK(AIBinder_prepareTransaction(binder, &parcel));
424       return parcel;
425     };
426 
427     AParcel* inParcel = nullptr;
428     AParcel* outParcel = nullptr;
429 
430     inParcel = newParcel();
431     EXPECT_NE(nullptr, inParcel);
432     EXPECT_EQ(
433         STATUS_UNEXPECTED_NULL,
434         AIBinder_transact(nullptr, kCode, &inParcel, &outParcel, 0 /*flags*/));
435     EXPECT_EQ(nullptr, inParcel);   // ownership taken
436     EXPECT_EQ(nullptr, outParcel);  // not modified
437 
438     EXPECT_EQ(
439         STATUS_UNEXPECTED_NULL,
440         AIBinder_transact(binder, kCode, nullptr, &outParcel, 0 /*flags*/));
441     EXPECT_EQ(nullptr, outParcel);  // not modified
442 
443     inParcel = newParcel();
444     EXPECT_NE(nullptr, inParcel);
445     EXPECT_EQ(
446         STATUS_UNEXPECTED_NULL,
447         AIBinder_transact(binder, kCode, &inParcel, nullptr, 0 /*flags*/));
448     EXPECT_EQ(nullptr, inParcel);   // ownership taken
449     EXPECT_EQ(nullptr, outParcel);  // not modified
450   }
451 
452   EXPECT_EQ(nullptr, AIBinder_Weak_new(nullptr));
453 
454   // Does not crash
455   AIBinder_Weak_delete(nullptr);
456 
457   EXPECT_EQ(nullptr, AIBinder_Weak_promote(nullptr));
458 
459   EXPECT_EQ(nullptr, AIBinder_DeathRecipient_new(nullptr));
460 
461   EXPECT_EQ(nullptr, AIBinder_Weak_clone(nullptr));
462 
463   AIBinder_Weak* weak = AIBinder_Weak_new(binder);
464   EXPECT_TRUE(AIBinder_Weak_lt(nullptr, weak));
465   EXPECT_FALSE(AIBinder_Weak_lt(weak, nullptr));
466   AIBinder_Weak_delete(weak);
467 
468   // Does not crash
469   AIBinder_DeathRecipient_delete(nullptr);
470   AIBinder_DeathRecipient_setOnUnlinked(recipient, nullptr);
471   AIBinder_DeathRecipient_setOnUnlinked(nullptr, nullptr);
472 
473   AIBinder_DeathRecipient_delete(recipient);
474   AIBinder_decStrong(binder);
475 
476   EXPECT_EQ(STATUS_UNEXPECTED_NULL, AIBinder_getExtension(nullptr, nullptr));
477   EXPECT_EQ(STATUS_UNEXPECTED_NULL, AIBinder_setExtension(nullptr, nullptr));
478 }
479