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