@@ -75,6 +75,8 @@ constexpr bool kEnableSharedLibs = true;
7575constexpr char kTrustyIpcDevice [] = " /dev/trusty-ipc-dev0" ;
7676#endif
7777
78+ constexpr char kKnownAidlService [] = " activity" ;
79+
7880static std::string WaitStatusToString (int wstatus) {
7981 if (WIFEXITED (wstatus)) {
8082 return " exit status " + std::to_string (WEXITSTATUS (wstatus));
@@ -1549,22 +1551,47 @@ TEST_F(BinderARpcNdk, ARpcNullArgs_ConnectionInfo_new) {
15491551 EXPECT_EQ (nullptr , ABinderRpc_ConnectionInfo_new (reinterpret_cast <const sockaddr*>(&addr), 0 ));
15501552}
15511553
1552- TEST_P (BinderRpcAccessor, ARpcGetService) {
1554+ TEST_F (BinderARpcNdk, ARpcDelegateAccessorWrongInstance) {
1555+ AccessorProviderData* data = new AccessorProviderData ();
1556+ ABinderRpc_Accessor* accessor = getAccessor (kARpcInstance , data);
1557+ ASSERT_NE (accessor, nullptr );
1558+ AIBinder* localAccessorBinder = ABinderRpc_Accessor_asBinder (accessor);
1559+ EXPECT_NE (localAccessorBinder, nullptr );
1560+
1561+ AIBinder* delegatorBinder = nullptr ;
1562+ binder_status_t status =
1563+ ABinderRpc_Accessor_delegateAccessor (" bar" , localAccessorBinder, &delegatorBinder);
1564+ EXPECT_EQ (status, NAME_NOT_FOUND);
1565+
1566+ AIBinder_decStrong (localAccessorBinder);
1567+ ABinderRpc_Accessor_delete (accessor);
1568+ delete data;
1569+ }
1570+
1571+ TEST_F (BinderARpcNdk, ARpcDelegateNonAccessor) {
1572+ auto service = defaultServiceManager ()->checkService (String16 (kKnownAidlService ));
1573+ ASSERT_NE (nullptr , service);
1574+ ndk::SpAIBinder binder = ndk::SpAIBinder (AIBinder_fromPlatformBinder (service));
1575+
1576+ AIBinder* delegatorBinder = nullptr ;
1577+ binder_status_t status =
1578+ ABinderRpc_Accessor_delegateAccessor (" bar" , binder.get (), &delegatorBinder);
1579+
1580+ EXPECT_EQ (status, BAD_TYPE);
1581+ }
1582+
1583+ inline void getServiceTest (BinderRpcTestProcessSession& proc,
1584+ ABinderRpc_AccessorProvider_getAccessorCallback getAccessor) {
15531585 constexpr size_t kNumThreads = 10 ;
15541586 bool isDeleted = false ;
15551587
1556- auto proc = createRpcTestSocketServerProcess ({.numThreads = kNumThreads });
1557- EXPECT_EQ (OK, proc.rootBinder ->pingBinder ());
1558-
15591588 AccessorProviderData* data =
15601589 new AccessorProviderData{proc.proc ->sessions [0 ].addr , proc.proc ->sessions [0 ].addrLen ,
15611590 &isDeleted};
1562-
15631591 ABinderRpc_AccessorProvider* provider =
15641592 ABinderRpc_registerAccessorProvider (getAccessor, kARpcSupportedServices ,
15651593 kARpcNumSupportedServices , data,
15661594 accessorProviderDataOnDelete);
1567-
15681595 EXPECT_NE (provider, nullptr );
15691596 EXPECT_FALSE (isDeleted);
15701597
@@ -1580,6 +1607,45 @@ TEST_P(BinderRpcAccessor, ARpcGetService) {
15801607 waitForExtraSessionCleanup (proc);
15811608}
15821609
1610+ TEST_P (BinderRpcAccessor, ARpcGetService) {
1611+ constexpr size_t kNumThreads = 10 ;
1612+ auto proc = createRpcTestSocketServerProcess ({.numThreads = kNumThreads });
1613+ EXPECT_EQ (OK, proc.rootBinder ->pingBinder ());
1614+
1615+ getServiceTest (proc, getAccessor);
1616+ }
1617+
1618+ // Create accessors and wrap each of the accessors in a delegator
1619+ ABinderRpc_Accessor* getDelegatedAccessor (const char * instance, void * cookie) {
1620+ ABinderRpc_Accessor* accessor = getAccessor (instance, cookie);
1621+ AIBinder* accessorBinder = ABinderRpc_Accessor_asBinder (accessor);
1622+ // Once we have a handle to the AIBinder which holds a reference to the
1623+ // underlying accessor IBinder, we can get rid of the ABinderRpc_Accessor
1624+ ABinderRpc_Accessor_delete (accessor);
1625+
1626+ AIBinder* delegatorBinder = nullptr ;
1627+ binder_status_t status =
1628+ ABinderRpc_Accessor_delegateAccessor (instance, accessorBinder, &delegatorBinder);
1629+ // No longer need this AIBinder. The delegator has a reference to the
1630+ // underlying IBinder on success, and on failure we are done here.
1631+ AIBinder_decStrong (accessorBinder);
1632+ if (status != OK || delegatorBinder == nullptr ) {
1633+ ALOGE (" Unexpected behavior. Status: %s, delegator ptr: %p" , statusToString (status).c_str (),
1634+ delegatorBinder);
1635+ return nullptr ;
1636+ }
1637+
1638+ return ABinderRpc_Accessor_fromBinder (instance, delegatorBinder);
1639+ }
1640+
1641+ TEST_P (BinderRpcAccessor, ARpcGetServiceWithDelegator) {
1642+ constexpr size_t kNumThreads = 10 ;
1643+ auto proc = createRpcTestSocketServerProcess ({.numThreads = kNumThreads });
1644+ EXPECT_EQ (OK, proc.rootBinder ->pingBinder ());
1645+
1646+ getServiceTest (proc, getDelegatedAccessor);
1647+ }
1648+
15831649#endif // BINDER_WITH_KERNEL_IPC
15841650
15851651#ifdef BINDER_RPC_TO_TRUSTY_TEST
@@ -1845,7 +1911,7 @@ TEST(BinderRpc, Java) {
18451911 ASSERT_NE (nullptr , sm);
18461912 // Any Java service with non-empty getInterfaceDescriptor() would do.
18471913 // Let's pick activity.
1848- auto binder = sm->checkService (String16 (" activity " ));
1914+ auto binder = sm->checkService (String16 (kKnownAidlService ));
18491915 ASSERT_NE (nullptr , binder);
18501916 auto descriptor = binder->getInterfaceDescriptor ();
18511917 ASSERT_GE (descriptor.size (), 0u );
0 commit comments