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