1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker *
4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker *
8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker *
10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker */
16*38e8c45fSAndroid Build Coastguard Worker
17*38e8c45fSAndroid Build Coastguard Worker #include <chrono>
18*38e8c45fSAndroid Build Coastguard Worker #include <cstdlib>
19*38e8c45fSAndroid Build Coastguard Worker #include <type_traits>
20*38e8c45fSAndroid Build Coastguard Worker
21*38e8c45fSAndroid Build Coastguard Worker #include "binderRpcTestCommon.h"
22*38e8c45fSAndroid Build Coastguard Worker #include "binderRpcTestFixture.h"
23*38e8c45fSAndroid Build Coastguard Worker
24*38e8c45fSAndroid Build Coastguard Worker using namespace std::chrono_literals;
25*38e8c45fSAndroid Build Coastguard Worker using namespace std::placeholders;
26*38e8c45fSAndroid Build Coastguard Worker using testing::AssertionFailure;
27*38e8c45fSAndroid Build Coastguard Worker using testing::AssertionResult;
28*38e8c45fSAndroid Build Coastguard Worker using testing::AssertionSuccess;
29*38e8c45fSAndroid Build Coastguard Worker
30*38e8c45fSAndroid Build Coastguard Worker namespace android {
31*38e8c45fSAndroid Build Coastguard Worker
32*38e8c45fSAndroid Build Coastguard Worker static_assert(RPC_WIRE_PROTOCOL_VERSION + 1 == RPC_WIRE_PROTOCOL_VERSION_NEXT ||
33*38e8c45fSAndroid Build Coastguard Worker RPC_WIRE_PROTOCOL_VERSION == RPC_WIRE_PROTOCOL_VERSION_EXPERIMENTAL);
34*38e8c45fSAndroid Build Coastguard Worker
TEST(BinderRpcParcel,EntireParcelFormatted)35*38e8c45fSAndroid Build Coastguard Worker TEST(BinderRpcParcel, EntireParcelFormatted) {
36*38e8c45fSAndroid Build Coastguard Worker Parcel p;
37*38e8c45fSAndroid Build Coastguard Worker p.writeInt32(3);
38*38e8c45fSAndroid Build Coastguard Worker
39*38e8c45fSAndroid Build Coastguard Worker EXPECT_DEATH_IF_SUPPORTED(p.markForBinder(sp<BBinder>::make()),
40*38e8c45fSAndroid Build Coastguard Worker "format must be set before data is written");
41*38e8c45fSAndroid Build Coastguard Worker }
42*38e8c45fSAndroid Build Coastguard Worker
TEST(BinderRpc,CannotUseNextWireVersion)43*38e8c45fSAndroid Build Coastguard Worker TEST(BinderRpc, CannotUseNextWireVersion) {
44*38e8c45fSAndroid Build Coastguard Worker auto session = RpcSession::make();
45*38e8c45fSAndroid Build Coastguard Worker EXPECT_FALSE(session->setProtocolVersion(RPC_WIRE_PROTOCOL_VERSION_NEXT));
46*38e8c45fSAndroid Build Coastguard Worker EXPECT_FALSE(session->setProtocolVersion(RPC_WIRE_PROTOCOL_VERSION_NEXT + 1));
47*38e8c45fSAndroid Build Coastguard Worker EXPECT_FALSE(session->setProtocolVersion(RPC_WIRE_PROTOCOL_VERSION_NEXT + 2));
48*38e8c45fSAndroid Build Coastguard Worker EXPECT_FALSE(session->setProtocolVersion(RPC_WIRE_PROTOCOL_VERSION_NEXT + 15));
49*38e8c45fSAndroid Build Coastguard Worker }
50*38e8c45fSAndroid Build Coastguard Worker
51*38e8c45fSAndroid Build Coastguard Worker #ifndef BINDER_RPC_TO_TRUSTY_TEST
TEST(BinderRpc,CanUseExperimentalWireVersion)52*38e8c45fSAndroid Build Coastguard Worker TEST(BinderRpc, CanUseExperimentalWireVersion) {
53*38e8c45fSAndroid Build Coastguard Worker auto session = RpcSession::make();
54*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(hasExperimentalRpc(),
55*38e8c45fSAndroid Build Coastguard Worker session->setProtocolVersion(RPC_WIRE_PROTOCOL_VERSION_EXPERIMENTAL));
56*38e8c45fSAndroid Build Coastguard Worker }
57*38e8c45fSAndroid Build Coastguard Worker #endif
58*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,Ping)59*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, Ping) {
60*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
61*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(proc.rootBinder, nullptr);
62*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, proc.rootBinder->pingBinder());
63*38e8c45fSAndroid Build Coastguard Worker }
64*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,GetInterfaceDescriptor)65*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, GetInterfaceDescriptor) {
66*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
67*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(proc.rootBinder, nullptr);
68*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(IBinderRpcTest::descriptor, proc.rootBinder->getInterfaceDescriptor());
69*38e8c45fSAndroid Build Coastguard Worker }
70*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,MultipleSessions)71*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, MultipleSessions) {
72*38e8c45fSAndroid Build Coastguard Worker if (serverSingleThreaded()) {
73*38e8c45fSAndroid Build Coastguard Worker // Tests with multiple sessions require a multi-threaded service,
74*38e8c45fSAndroid Build Coastguard Worker // but work fine on a single-threaded client
75*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "This test requires a multi-threaded service";
76*38e8c45fSAndroid Build Coastguard Worker }
77*38e8c45fSAndroid Build Coastguard Worker
78*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({.numThreads = 1, .numSessions = 5});
79*38e8c45fSAndroid Build Coastguard Worker for (auto session : proc.proc->sessions) {
80*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(nullptr, session.root);
81*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, session.root->pingBinder());
82*38e8c45fSAndroid Build Coastguard Worker }
83*38e8c45fSAndroid Build Coastguard Worker }
84*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,SeparateRootObject)85*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, SeparateRootObject) {
86*38e8c45fSAndroid Build Coastguard Worker if (serverSingleThreaded()) {
87*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "This test requires a multi-threaded service";
88*38e8c45fSAndroid Build Coastguard Worker }
89*38e8c45fSAndroid Build Coastguard Worker
90*38e8c45fSAndroid Build Coastguard Worker SocketType type = GetParam().type;
91*38e8c45fSAndroid Build Coastguard Worker if (type == SocketType::PRECONNECTED || type == SocketType::UNIX ||
92*38e8c45fSAndroid Build Coastguard Worker type == SocketType::UNIX_BOOTSTRAP || type == SocketType::UNIX_RAW) {
93*38e8c45fSAndroid Build Coastguard Worker // we can't get port numbers for unix sockets
94*38e8c45fSAndroid Build Coastguard Worker return;
95*38e8c45fSAndroid Build Coastguard Worker }
96*38e8c45fSAndroid Build Coastguard Worker
97*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({.numSessions = 2});
98*38e8c45fSAndroid Build Coastguard Worker
99*38e8c45fSAndroid Build Coastguard Worker int port1 = 0;
100*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->getClientPort(&port1));
101*38e8c45fSAndroid Build Coastguard Worker
102*38e8c45fSAndroid Build Coastguard Worker sp<IBinderRpcTest> rootIface2 = interface_cast<IBinderRpcTest>(proc.proc->sessions.at(1).root);
103*38e8c45fSAndroid Build Coastguard Worker int port2;
104*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(rootIface2->getClientPort(&port2));
105*38e8c45fSAndroid Build Coastguard Worker
106*38e8c45fSAndroid Build Coastguard Worker // we should have a different IBinderRpcTest object created for each
107*38e8c45fSAndroid Build Coastguard Worker // session, because we use setPerSessionRootObject
108*38e8c45fSAndroid Build Coastguard Worker EXPECT_NE(port1, port2);
109*38e8c45fSAndroid Build Coastguard Worker }
110*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,TransactionsMustBeMarkedRpc)111*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, TransactionsMustBeMarkedRpc) {
112*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
113*38e8c45fSAndroid Build Coastguard Worker Parcel data;
114*38e8c45fSAndroid Build Coastguard Worker Parcel reply;
115*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BAD_TYPE, proc.rootBinder->transact(IBinder::PING_TRANSACTION, data, &reply, 0));
116*38e8c45fSAndroid Build Coastguard Worker }
117*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,AppendSeparateFormats)118*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, AppendSeparateFormats) {
119*38e8c45fSAndroid Build Coastguard Worker if (socketType() == SocketType::TIPC) {
120*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "Trusty does not support multiple server processes";
121*38e8c45fSAndroid Build Coastguard Worker }
122*38e8c45fSAndroid Build Coastguard Worker
123*38e8c45fSAndroid Build Coastguard Worker auto proc1 = createRpcTestSocketServerProcess({});
124*38e8c45fSAndroid Build Coastguard Worker auto proc2 = createRpcTestSocketServerProcess({});
125*38e8c45fSAndroid Build Coastguard Worker
126*38e8c45fSAndroid Build Coastguard Worker Parcel pRaw;
127*38e8c45fSAndroid Build Coastguard Worker
128*38e8c45fSAndroid Build Coastguard Worker Parcel p1;
129*38e8c45fSAndroid Build Coastguard Worker p1.markForBinder(proc1.rootBinder);
130*38e8c45fSAndroid Build Coastguard Worker p1.writeInt32(3);
131*38e8c45fSAndroid Build Coastguard Worker
132*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BAD_TYPE, p1.appendFrom(&pRaw, 0, pRaw.dataSize()));
133*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BAD_TYPE, pRaw.appendFrom(&p1, 0, p1.dataSize()));
134*38e8c45fSAndroid Build Coastguard Worker
135*38e8c45fSAndroid Build Coastguard Worker Parcel p2;
136*38e8c45fSAndroid Build Coastguard Worker p2.markForBinder(proc2.rootBinder);
137*38e8c45fSAndroid Build Coastguard Worker p2.writeInt32(7);
138*38e8c45fSAndroid Build Coastguard Worker
139*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BAD_TYPE, p1.appendFrom(&p2, 0, p2.dataSize()));
140*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BAD_TYPE, p2.appendFrom(&p1, 0, p1.dataSize()));
141*38e8c45fSAndroid Build Coastguard Worker }
142*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,UnknownTransaction)143*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, UnknownTransaction) {
144*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
145*38e8c45fSAndroid Build Coastguard Worker Parcel data;
146*38e8c45fSAndroid Build Coastguard Worker data.markForBinder(proc.rootBinder);
147*38e8c45fSAndroid Build Coastguard Worker Parcel reply;
148*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(UNKNOWN_TRANSACTION, proc.rootBinder->transact(1337, data, &reply, 0));
149*38e8c45fSAndroid Build Coastguard Worker }
150*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,SendSomethingOneway)151*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, SendSomethingOneway) {
152*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
153*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->sendString("asdf"));
154*38e8c45fSAndroid Build Coastguard Worker }
155*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,SendAndGetResultBack)156*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, SendAndGetResultBack) {
157*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
158*38e8c45fSAndroid Build Coastguard Worker std::string doubled;
159*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->doubleString("cool ", &doubled));
160*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ("cool cool ", doubled);
161*38e8c45fSAndroid Build Coastguard Worker }
162*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,SendAndGetResultBackBig)163*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, SendAndGetResultBackBig) {
164*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
165*38e8c45fSAndroid Build Coastguard Worker // Trusty has a limit of 4096 bytes for the entire RPC Binder message
166*38e8c45fSAndroid Build Coastguard Worker size_t singleLen = socketType() == SocketType::TIPC ? 512 : 4096;
167*38e8c45fSAndroid Build Coastguard Worker std::string single = std::string(singleLen, 'a');
168*38e8c45fSAndroid Build Coastguard Worker std::string doubled;
169*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->doubleString(single, &doubled));
170*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(single + single, doubled);
171*38e8c45fSAndroid Build Coastguard Worker }
172*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,InvalidNullBinderReturn)173*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, InvalidNullBinderReturn) {
174*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
175*38e8c45fSAndroid Build Coastguard Worker
176*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> outBinder;
177*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(proc.rootIface->getNullBinder(&outBinder).transactionError(), UNEXPECTED_NULL);
178*38e8c45fSAndroid Build Coastguard Worker }
179*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,CallMeBack)180*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, CallMeBack) {
181*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
182*38e8c45fSAndroid Build Coastguard Worker
183*38e8c45fSAndroid Build Coastguard Worker int32_t pingResult;
184*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->pingMe(new MyBinderRpcSession("foo"), &pingResult));
185*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, pingResult);
186*38e8c45fSAndroid Build Coastguard Worker
187*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0, MyBinderRpcSession::gNum);
188*38e8c45fSAndroid Build Coastguard Worker }
189*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,RepeatBinder)190*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, RepeatBinder) {
191*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
192*38e8c45fSAndroid Build Coastguard Worker
193*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> inBinder = new MyBinderRpcSession("foo");
194*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> outBinder;
195*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->repeatBinder(inBinder, &outBinder));
196*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(inBinder, outBinder);
197*38e8c45fSAndroid Build Coastguard Worker
198*38e8c45fSAndroid Build Coastguard Worker wp<IBinder> weak = inBinder;
199*38e8c45fSAndroid Build Coastguard Worker inBinder = nullptr;
200*38e8c45fSAndroid Build Coastguard Worker outBinder = nullptr;
201*38e8c45fSAndroid Build Coastguard Worker
202*38e8c45fSAndroid Build Coastguard Worker // Force reading a reply, to process any pending dec refs from the other
203*38e8c45fSAndroid Build Coastguard Worker // process (the other process will process dec refs there before processing
204*38e8c45fSAndroid Build Coastguard Worker // the ping here).
205*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, proc.rootBinder->pingBinder());
206*38e8c45fSAndroid Build Coastguard Worker
207*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(nullptr, weak.promote());
208*38e8c45fSAndroid Build Coastguard Worker
209*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0, MyBinderRpcSession::gNum);
210*38e8c45fSAndroid Build Coastguard Worker }
211*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,RepeatTheirBinder)212*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, RepeatTheirBinder) {
213*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
214*38e8c45fSAndroid Build Coastguard Worker
215*38e8c45fSAndroid Build Coastguard Worker sp<IBinderRpcSession> session;
216*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->openSession("aoeu", &session));
217*38e8c45fSAndroid Build Coastguard Worker
218*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> inBinder = IInterface::asBinder(session);
219*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> outBinder;
220*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->repeatBinder(inBinder, &outBinder));
221*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(inBinder, outBinder);
222*38e8c45fSAndroid Build Coastguard Worker
223*38e8c45fSAndroid Build Coastguard Worker wp<IBinder> weak = inBinder;
224*38e8c45fSAndroid Build Coastguard Worker session = nullptr;
225*38e8c45fSAndroid Build Coastguard Worker inBinder = nullptr;
226*38e8c45fSAndroid Build Coastguard Worker outBinder = nullptr;
227*38e8c45fSAndroid Build Coastguard Worker
228*38e8c45fSAndroid Build Coastguard Worker // Force reading a reply, to process any pending dec refs from the other
229*38e8c45fSAndroid Build Coastguard Worker // process (the other process will process dec refs there before processing
230*38e8c45fSAndroid Build Coastguard Worker // the ping here).
231*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, proc.rootBinder->pingBinder());
232*38e8c45fSAndroid Build Coastguard Worker
233*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(nullptr, weak.promote());
234*38e8c45fSAndroid Build Coastguard Worker }
235*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,RepeatBinderNull)236*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, RepeatBinderNull) {
237*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
238*38e8c45fSAndroid Build Coastguard Worker
239*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> outBinder;
240*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->repeatBinder(nullptr, &outBinder));
241*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(nullptr, outBinder);
242*38e8c45fSAndroid Build Coastguard Worker }
243*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,HoldBinder)244*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, HoldBinder) {
245*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
246*38e8c45fSAndroid Build Coastguard Worker
247*38e8c45fSAndroid Build Coastguard Worker IBinder* ptr = nullptr;
248*38e8c45fSAndroid Build Coastguard Worker {
249*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder = new BBinder();
250*38e8c45fSAndroid Build Coastguard Worker ptr = binder.get();
251*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->holdBinder(binder));
252*38e8c45fSAndroid Build Coastguard Worker }
253*38e8c45fSAndroid Build Coastguard Worker
254*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> held;
255*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->getHeldBinder(&held));
256*38e8c45fSAndroid Build Coastguard Worker
257*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(held.get(), ptr);
258*38e8c45fSAndroid Build Coastguard Worker
259*38e8c45fSAndroid Build Coastguard Worker // stop holding binder, because we test to make sure references are cleaned
260*38e8c45fSAndroid Build Coastguard Worker // up
261*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->holdBinder(nullptr));
262*38e8c45fSAndroid Build Coastguard Worker // and flush ref counts
263*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, proc.rootBinder->pingBinder());
264*38e8c45fSAndroid Build Coastguard Worker }
265*38e8c45fSAndroid Build Coastguard Worker
266*38e8c45fSAndroid Build Coastguard Worker // START TESTS FOR LIMITATIONS OF SOCKET BINDER
267*38e8c45fSAndroid Build Coastguard Worker // These are behavioral differences form regular binder, where certain usecases
268*38e8c45fSAndroid Build Coastguard Worker // aren't supported.
269*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,CannotMixBindersBetweenUnrelatedSocketSessions)270*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, CannotMixBindersBetweenUnrelatedSocketSessions) {
271*38e8c45fSAndroid Build Coastguard Worker if (socketType() == SocketType::TIPC) {
272*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "Trusty does not support multiple server processes";
273*38e8c45fSAndroid Build Coastguard Worker }
274*38e8c45fSAndroid Build Coastguard Worker
275*38e8c45fSAndroid Build Coastguard Worker auto proc1 = createRpcTestSocketServerProcess({});
276*38e8c45fSAndroid Build Coastguard Worker auto proc2 = createRpcTestSocketServerProcess({});
277*38e8c45fSAndroid Build Coastguard Worker
278*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> outBinder;
279*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(INVALID_OPERATION,
280*38e8c45fSAndroid Build Coastguard Worker proc1.rootIface->repeatBinder(proc2.rootBinder, &outBinder).transactionError());
281*38e8c45fSAndroid Build Coastguard Worker }
282*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,CannotMixBindersBetweenTwoSessionsToTheSameServer)283*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, CannotMixBindersBetweenTwoSessionsToTheSameServer) {
284*38e8c45fSAndroid Build Coastguard Worker if (serverSingleThreaded()) {
285*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "This test requires a multi-threaded service";
286*38e8c45fSAndroid Build Coastguard Worker }
287*38e8c45fSAndroid Build Coastguard Worker
288*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({.numThreads = 1, .numSessions = 2});
289*38e8c45fSAndroid Build Coastguard Worker
290*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> outBinder;
291*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(INVALID_OPERATION,
292*38e8c45fSAndroid Build Coastguard Worker proc.rootIface->repeatBinder(proc.proc->sessions.at(1).root, &outBinder)
293*38e8c45fSAndroid Build Coastguard Worker .transactionError());
294*38e8c45fSAndroid Build Coastguard Worker }
295*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,CannotSendRegularBinderOverSocketBinder)296*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, CannotSendRegularBinderOverSocketBinder) {
297*38e8c45fSAndroid Build Coastguard Worker if (!kEnableKernelIpc || noKernel()) {
298*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "Test disabled because Binder kernel driver was disabled "
299*38e8c45fSAndroid Build Coastguard Worker "at build time.";
300*38e8c45fSAndroid Build Coastguard Worker }
301*38e8c45fSAndroid Build Coastguard Worker
302*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
303*38e8c45fSAndroid Build Coastguard Worker
304*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> someRealBinder = defaultServiceManager()->getService(String16("activity"));
305*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(someRealBinder, nullptr);
306*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> outBinder;
307*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(INVALID_OPERATION,
308*38e8c45fSAndroid Build Coastguard Worker proc.rootIface->repeatBinder(someRealBinder, &outBinder).transactionError());
309*38e8c45fSAndroid Build Coastguard Worker }
310*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,CannotSendSocketBinderOverRegularBinder)311*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, CannotSendSocketBinderOverRegularBinder) {
312*38e8c45fSAndroid Build Coastguard Worker if (!kEnableKernelIpc || noKernel()) {
313*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "Test disabled because Binder kernel driver was disabled "
314*38e8c45fSAndroid Build Coastguard Worker "at build time.";
315*38e8c45fSAndroid Build Coastguard Worker }
316*38e8c45fSAndroid Build Coastguard Worker
317*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
318*38e8c45fSAndroid Build Coastguard Worker
319*38e8c45fSAndroid Build Coastguard Worker // for historical reasons, IServiceManager interface only returns the
320*38e8c45fSAndroid Build Coastguard Worker // exception code
321*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(binder::Status::EX_TRANSACTION_FAILED,
322*38e8c45fSAndroid Build Coastguard Worker defaultServiceManager()->addService(String16("not_suspicious"), proc.rootBinder));
323*38e8c45fSAndroid Build Coastguard Worker }
324*38e8c45fSAndroid Build Coastguard Worker
325*38e8c45fSAndroid Build Coastguard Worker // END TESTS FOR LIMITATIONS OF SOCKET BINDER
326*38e8c45fSAndroid Build Coastguard Worker
327*38e8c45fSAndroid Build Coastguard Worker class TestFrozenStateChangeCallback : public IBinder::FrozenStateChangeCallback {
328*38e8c45fSAndroid Build Coastguard Worker public:
onStateChanged(const wp<IBinder> &,State)329*38e8c45fSAndroid Build Coastguard Worker virtual void onStateChanged(const wp<IBinder>&, State) {}
330*38e8c45fSAndroid Build Coastguard Worker };
331*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,RpcBinderShouldFailOnFrozenStateCallbacks)332*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, RpcBinderShouldFailOnFrozenStateCallbacks) {
333*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
334*38e8c45fSAndroid Build Coastguard Worker
335*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> a;
336*38e8c45fSAndroid Build Coastguard Worker sp<TestFrozenStateChangeCallback> callback = sp<TestFrozenStateChangeCallback>::make();
337*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->alwaysGiveMeTheSameBinder(&a));
338*38e8c45fSAndroid Build Coastguard Worker EXPECT_DEATH_IF_SUPPORTED(
339*38e8c45fSAndroid Build Coastguard Worker { std::ignore = a->addFrozenStateChangeCallback(callback); },
340*38e8c45fSAndroid Build Coastguard Worker "addFrozenStateChangeCallback\\(\\) is not supported for RPC Binder.");
341*38e8c45fSAndroid Build Coastguard Worker }
342*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,RepeatRootObject)343*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, RepeatRootObject) {
344*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
345*38e8c45fSAndroid Build Coastguard Worker
346*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> outBinder;
347*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->repeatBinder(proc.rootBinder, &outBinder));
348*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(proc.rootBinder, outBinder);
349*38e8c45fSAndroid Build Coastguard Worker }
350*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,NestedTransactions)351*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, NestedTransactions) {
352*38e8c45fSAndroid Build Coastguard Worker auto fileDescriptorTransportMode = RpcSession::FileDescriptorTransportMode::UNIX;
353*38e8c45fSAndroid Build Coastguard Worker if (socketType() == SocketType::TIPC) {
354*38e8c45fSAndroid Build Coastguard Worker // TIPC does not support file descriptors yet
355*38e8c45fSAndroid Build Coastguard Worker fileDescriptorTransportMode = RpcSession::FileDescriptorTransportMode::NONE;
356*38e8c45fSAndroid Build Coastguard Worker }
357*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({
358*38e8c45fSAndroid Build Coastguard Worker // Enable FD support because it uses more stack space and so represents
359*38e8c45fSAndroid Build Coastguard Worker // something closer to a worst case scenario.
360*38e8c45fSAndroid Build Coastguard Worker .clientFileDescriptorTransportMode = fileDescriptorTransportMode,
361*38e8c45fSAndroid Build Coastguard Worker .serverSupportedFileDescriptorTransportModes = {fileDescriptorTransportMode},
362*38e8c45fSAndroid Build Coastguard Worker });
363*38e8c45fSAndroid Build Coastguard Worker
364*38e8c45fSAndroid Build Coastguard Worker auto nastyNester = sp<MyBinderRpcTestDefault>::make();
365*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->nestMe(nastyNester, 10));
366*38e8c45fSAndroid Build Coastguard Worker
367*38e8c45fSAndroid Build Coastguard Worker wp<IBinder> weak = nastyNester;
368*38e8c45fSAndroid Build Coastguard Worker nastyNester = nullptr;
369*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(nullptr, weak.promote());
370*38e8c45fSAndroid Build Coastguard Worker }
371*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,SameBinderEquality)372*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, SameBinderEquality) {
373*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
374*38e8c45fSAndroid Build Coastguard Worker
375*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> a;
376*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->alwaysGiveMeTheSameBinder(&a));
377*38e8c45fSAndroid Build Coastguard Worker
378*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> b;
379*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->alwaysGiveMeTheSameBinder(&b));
380*38e8c45fSAndroid Build Coastguard Worker
381*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(a, b);
382*38e8c45fSAndroid Build Coastguard Worker }
383*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,SameBinderEqualityWeak)384*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, SameBinderEqualityWeak) {
385*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
386*38e8c45fSAndroid Build Coastguard Worker
387*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> a;
388*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->alwaysGiveMeTheSameBinder(&a));
389*38e8c45fSAndroid Build Coastguard Worker wp<IBinder> weak = a;
390*38e8c45fSAndroid Build Coastguard Worker a = nullptr;
391*38e8c45fSAndroid Build Coastguard Worker
392*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> b;
393*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->alwaysGiveMeTheSameBinder(&b));
394*38e8c45fSAndroid Build Coastguard Worker
395*38e8c45fSAndroid Build Coastguard Worker // this is the wrong behavior, since BpBinder
396*38e8c45fSAndroid Build Coastguard Worker // doesn't implement onIncStrongAttempted
397*38e8c45fSAndroid Build Coastguard Worker // but make sure there is no crash
398*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(nullptr, weak.promote());
399*38e8c45fSAndroid Build Coastguard Worker
400*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "Weak binders aren't currently re-promotable for RPC binder.";
401*38e8c45fSAndroid Build Coastguard Worker
402*38e8c45fSAndroid Build Coastguard Worker // In order to fix this:
403*38e8c45fSAndroid Build Coastguard Worker // - need to have incStrongAttempted reflected across IPC boundary (wait for
404*38e8c45fSAndroid Build Coastguard Worker // response to promote - round trip...)
405*38e8c45fSAndroid Build Coastguard Worker // - sendOnLastWeakRef, to delete entries out of RpcState table
406*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(b, weak.promote());
407*38e8c45fSAndroid Build Coastguard Worker }
408*38e8c45fSAndroid Build Coastguard Worker
409*38e8c45fSAndroid Build Coastguard Worker #define EXPECT_SESSIONS(expected, iface) \
410*38e8c45fSAndroid Build Coastguard Worker do { \
411*38e8c45fSAndroid Build Coastguard Worker int session; \
412*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK((iface)->getNumOpenSessions(&session)); \
413*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<int>(expected), session); \
414*38e8c45fSAndroid Build Coastguard Worker } while (false)
415*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,SingleSession)416*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, SingleSession) {
417*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
418*38e8c45fSAndroid Build Coastguard Worker
419*38e8c45fSAndroid Build Coastguard Worker sp<IBinderRpcSession> session;
420*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->openSession("aoeu", &session));
421*38e8c45fSAndroid Build Coastguard Worker std::string out;
422*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(session->getName(&out));
423*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ("aoeu", out);
424*38e8c45fSAndroid Build Coastguard Worker
425*38e8c45fSAndroid Build Coastguard Worker EXPECT_SESSIONS(1, proc.rootIface);
426*38e8c45fSAndroid Build Coastguard Worker session = nullptr;
427*38e8c45fSAndroid Build Coastguard Worker EXPECT_SESSIONS(0, proc.rootIface);
428*38e8c45fSAndroid Build Coastguard Worker }
429*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,ManySessions)430*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, ManySessions) {
431*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
432*38e8c45fSAndroid Build Coastguard Worker
433*38e8c45fSAndroid Build Coastguard Worker std::vector<sp<IBinderRpcSession>> sessions;
434*38e8c45fSAndroid Build Coastguard Worker
435*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < 15; i++) {
436*38e8c45fSAndroid Build Coastguard Worker EXPECT_SESSIONS(i, proc.rootIface);
437*38e8c45fSAndroid Build Coastguard Worker sp<IBinderRpcSession> session;
438*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->openSession(std::to_string(i), &session));
439*38e8c45fSAndroid Build Coastguard Worker sessions.push_back(session);
440*38e8c45fSAndroid Build Coastguard Worker }
441*38e8c45fSAndroid Build Coastguard Worker EXPECT_SESSIONS(sessions.size(), proc.rootIface);
442*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < sessions.size(); i++) {
443*38e8c45fSAndroid Build Coastguard Worker std::string out;
444*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(sessions.at(i)->getName(&out));
445*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(std::to_string(i), out);
446*38e8c45fSAndroid Build Coastguard Worker }
447*38e8c45fSAndroid Build Coastguard Worker EXPECT_SESSIONS(sessions.size(), proc.rootIface);
448*38e8c45fSAndroid Build Coastguard Worker
449*38e8c45fSAndroid Build Coastguard Worker while (!sessions.empty()) {
450*38e8c45fSAndroid Build Coastguard Worker sessions.pop_back();
451*38e8c45fSAndroid Build Coastguard Worker EXPECT_SESSIONS(sessions.size(), proc.rootIface);
452*38e8c45fSAndroid Build Coastguard Worker }
453*38e8c45fSAndroid Build Coastguard Worker EXPECT_SESSIONS(0, proc.rootIface);
454*38e8c45fSAndroid Build Coastguard Worker }
455*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,OnewayCallDoesNotWait)456*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, OnewayCallDoesNotWait) {
457*38e8c45fSAndroid Build Coastguard Worker constexpr size_t kReallyLongTimeMs = 100;
458*38e8c45fSAndroid Build Coastguard Worker constexpr size_t kSleepMs = kReallyLongTimeMs * 5;
459*38e8c45fSAndroid Build Coastguard Worker
460*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
461*38e8c45fSAndroid Build Coastguard Worker
462*38e8c45fSAndroid Build Coastguard Worker size_t epochMsBefore = epochMillis();
463*38e8c45fSAndroid Build Coastguard Worker
464*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->sleepMsAsync(kSleepMs));
465*38e8c45fSAndroid Build Coastguard Worker
466*38e8c45fSAndroid Build Coastguard Worker size_t epochMsAfter = epochMillis();
467*38e8c45fSAndroid Build Coastguard Worker EXPECT_LT(epochMsAfter, epochMsBefore + kReallyLongTimeMs);
468*38e8c45fSAndroid Build Coastguard Worker }
469*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,Callbacks)470*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, Callbacks) {
471*38e8c45fSAndroid Build Coastguard Worker const static std::string kTestString = "good afternoon!";
472*38e8c45fSAndroid Build Coastguard Worker
473*38e8c45fSAndroid Build Coastguard Worker for (bool callIsOneway : {true, false}) {
474*38e8c45fSAndroid Build Coastguard Worker for (bool callbackIsOneway : {true, false}) {
475*38e8c45fSAndroid Build Coastguard Worker for (bool delayed : {true, false}) {
476*38e8c45fSAndroid Build Coastguard Worker if (clientOrServerSingleThreaded() &&
477*38e8c45fSAndroid Build Coastguard Worker (callIsOneway || callbackIsOneway || delayed)) {
478*38e8c45fSAndroid Build Coastguard Worker // we have no incoming connections to receive the callback
479*38e8c45fSAndroid Build Coastguard Worker continue;
480*38e8c45fSAndroid Build Coastguard Worker }
481*38e8c45fSAndroid Build Coastguard Worker
482*38e8c45fSAndroid Build Coastguard Worker size_t numIncomingConnections = clientOrServerSingleThreaded() ? 0 : 1;
483*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess(
484*38e8c45fSAndroid Build Coastguard Worker {.numThreads = 1,
485*38e8c45fSAndroid Build Coastguard Worker .numSessions = 1,
486*38e8c45fSAndroid Build Coastguard Worker .numIncomingConnectionsBySession = {numIncomingConnections}});
487*38e8c45fSAndroid Build Coastguard Worker auto cb = sp<MyBinderRpcCallback>::make();
488*38e8c45fSAndroid Build Coastguard Worker
489*38e8c45fSAndroid Build Coastguard Worker if (callIsOneway) {
490*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(proc.rootIface->doCallbackAsync(cb, callbackIsOneway, delayed,
491*38e8c45fSAndroid Build Coastguard Worker kTestString));
492*38e8c45fSAndroid Build Coastguard Worker } else {
493*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(
494*38e8c45fSAndroid Build Coastguard Worker proc.rootIface->doCallback(cb, callbackIsOneway, delayed, kTestString));
495*38e8c45fSAndroid Build Coastguard Worker }
496*38e8c45fSAndroid Build Coastguard Worker
497*38e8c45fSAndroid Build Coastguard Worker // if both transactions are synchronous and the response is sent back on the
498*38e8c45fSAndroid Build Coastguard Worker // same thread, everything should have happened in a nested call. Otherwise,
499*38e8c45fSAndroid Build Coastguard Worker // the callback will be processed on another thread.
500*38e8c45fSAndroid Build Coastguard Worker if (callIsOneway || callbackIsOneway || delayed) {
501*38e8c45fSAndroid Build Coastguard Worker using std::literals::chrono_literals::operator""s;
502*38e8c45fSAndroid Build Coastguard Worker RpcMutexUniqueLock _l(cb->mMutex);
503*38e8c45fSAndroid Build Coastguard Worker cb->mCv.wait_for(_l, 1s, [&] { return !cb->mValues.empty(); });
504*38e8c45fSAndroid Build Coastguard Worker }
505*38e8c45fSAndroid Build Coastguard Worker
506*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(cb->mValues.size(), 1UL)
507*38e8c45fSAndroid Build Coastguard Worker << "callIsOneway: " << callIsOneway
508*38e8c45fSAndroid Build Coastguard Worker << " callbackIsOneway: " << callbackIsOneway << " delayed: " << delayed;
509*38e8c45fSAndroid Build Coastguard Worker if (cb->mValues.empty()) continue;
510*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(cb->mValues.at(0), kTestString)
511*38e8c45fSAndroid Build Coastguard Worker << "callIsOneway: " << callIsOneway
512*38e8c45fSAndroid Build Coastguard Worker << " callbackIsOneway: " << callbackIsOneway << " delayed: " << delayed;
513*38e8c45fSAndroid Build Coastguard Worker
514*38e8c45fSAndroid Build Coastguard Worker proc.forceShutdown();
515*38e8c45fSAndroid Build Coastguard Worker }
516*38e8c45fSAndroid Build Coastguard Worker }
517*38e8c45fSAndroid Build Coastguard Worker }
518*38e8c45fSAndroid Build Coastguard Worker }
519*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,OnewayCallbackWithNoThread)520*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, OnewayCallbackWithNoThread) {
521*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
522*38e8c45fSAndroid Build Coastguard Worker auto cb = sp<MyBinderRpcCallback>::make();
523*38e8c45fSAndroid Build Coastguard Worker
524*38e8c45fSAndroid Build Coastguard Worker Status status = proc.rootIface->doCallback(cb, true /*oneway*/, false /*delayed*/, "anything");
525*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(WOULD_BLOCK, status.transactionError());
526*38e8c45fSAndroid Build Coastguard Worker }
527*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderRpc,AidlDelegatorTest)528*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderRpc, AidlDelegatorTest) {
529*38e8c45fSAndroid Build Coastguard Worker auto proc = createRpcTestSocketServerProcess({});
530*38e8c45fSAndroid Build Coastguard Worker auto myDelegator = sp<IBinderRpcTestDelegator>::make(proc.rootIface);
531*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(nullptr, myDelegator);
532*38e8c45fSAndroid Build Coastguard Worker
533*38e8c45fSAndroid Build Coastguard Worker std::string doubled;
534*38e8c45fSAndroid Build Coastguard Worker EXPECT_OK(myDelegator->doubleString("cool ", &doubled));
535*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ("cool cool ", doubled);
536*38e8c45fSAndroid Build Coastguard Worker }
537*38e8c45fSAndroid Build Coastguard Worker
538*38e8c45fSAndroid Build Coastguard Worker } // namespace android
539