1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2014 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 <errno.h>
18*38e8c45fSAndroid Build Coastguard Worker #include <poll.h>
19*38e8c45fSAndroid Build Coastguard Worker #include <pthread.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <stdio.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <stdlib.h>
22*38e8c45fSAndroid Build Coastguard Worker
23*38e8c45fSAndroid Build Coastguard Worker #include <chrono>
24*38e8c45fSAndroid Build Coastguard Worker #include <fstream>
25*38e8c45fSAndroid Build Coastguard Worker #include <thread>
26*38e8c45fSAndroid Build Coastguard Worker
27*38e8c45fSAndroid Build Coastguard Worker #include <gmock/gmock.h>
28*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
29*38e8c45fSAndroid Build Coastguard Worker
30*38e8c45fSAndroid Build Coastguard Worker #include <android-base/logging.h>
31*38e8c45fSAndroid Build Coastguard Worker #include <android-base/properties.h>
32*38e8c45fSAndroid Build Coastguard Worker #include <android-base/result-gmock.h>
33*38e8c45fSAndroid Build Coastguard Worker #include <binder/Binder.h>
34*38e8c45fSAndroid Build Coastguard Worker #include <binder/BpBinder.h>
35*38e8c45fSAndroid Build Coastguard Worker #include <binder/Functional.h>
36*38e8c45fSAndroid Build Coastguard Worker #include <binder/IBinder.h>
37*38e8c45fSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
38*38e8c45fSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
39*38e8c45fSAndroid Build Coastguard Worker #include <binder/RpcServer.h>
40*38e8c45fSAndroid Build Coastguard Worker #include <binder/RpcSession.h>
41*38e8c45fSAndroid Build Coastguard Worker #include <binder/Status.h>
42*38e8c45fSAndroid Build Coastguard Worker #include <binder/unique_fd.h>
43*38e8c45fSAndroid Build Coastguard Worker #include <input/BlockingQueue.h>
44*38e8c45fSAndroid Build Coastguard Worker #include <processgroup/processgroup.h>
45*38e8c45fSAndroid Build Coastguard Worker #include <utils/Flattenable.h>
46*38e8c45fSAndroid Build Coastguard Worker #include <utils/SystemClock.h>
47*38e8c45fSAndroid Build Coastguard Worker
48*38e8c45fSAndroid Build Coastguard Worker #include <linux/sched.h>
49*38e8c45fSAndroid Build Coastguard Worker #include <sys/epoll.h>
50*38e8c45fSAndroid Build Coastguard Worker #include <sys/mman.h>
51*38e8c45fSAndroid Build Coastguard Worker #include <sys/prctl.h>
52*38e8c45fSAndroid Build Coastguard Worker #include <sys/socket.h>
53*38e8c45fSAndroid Build Coastguard Worker #include <sys/un.h>
54*38e8c45fSAndroid Build Coastguard Worker
55*38e8c45fSAndroid Build Coastguard Worker #include "../Utils.h"
56*38e8c45fSAndroid Build Coastguard Worker #include "../binder_module.h"
57*38e8c45fSAndroid Build Coastguard Worker
58*38e8c45fSAndroid Build Coastguard Worker using namespace android;
59*38e8c45fSAndroid Build Coastguard Worker using namespace android::binder::impl;
60*38e8c45fSAndroid Build Coastguard Worker using namespace std::string_literals;
61*38e8c45fSAndroid Build Coastguard Worker using namespace std::chrono_literals;
62*38e8c45fSAndroid Build Coastguard Worker using android::base::testing::HasValue;
63*38e8c45fSAndroid Build Coastguard Worker using android::binder::Status;
64*38e8c45fSAndroid Build Coastguard Worker using android::binder::unique_fd;
65*38e8c45fSAndroid Build Coastguard Worker using std::chrono_literals::operator""ms;
66*38e8c45fSAndroid Build Coastguard Worker using testing::ExplainMatchResult;
67*38e8c45fSAndroid Build Coastguard Worker using testing::Matcher;
68*38e8c45fSAndroid Build Coastguard Worker using testing::Not;
69*38e8c45fSAndroid Build Coastguard Worker using testing::WithParamInterface;
70*38e8c45fSAndroid Build Coastguard Worker
71*38e8c45fSAndroid Build Coastguard Worker // e.g. EXPECT_THAT(expr, StatusEq(OK)) << "additional message";
72*38e8c45fSAndroid Build Coastguard Worker MATCHER_P(StatusEq, expected, (negation ? "not " : "") + statusToString(expected)) {
73*38e8c45fSAndroid Build Coastguard Worker *result_listener << statusToString(arg);
74*38e8c45fSAndroid Build Coastguard Worker return expected == arg;
75*38e8c45fSAndroid Build Coastguard Worker }
76*38e8c45fSAndroid Build Coastguard Worker
IsPageAligned(void * buf)77*38e8c45fSAndroid Build Coastguard Worker static ::testing::AssertionResult IsPageAligned(void *buf) {
78*38e8c45fSAndroid Build Coastguard Worker if (((unsigned long)buf & ((unsigned long)getpagesize() - 1)) == 0)
79*38e8c45fSAndroid Build Coastguard Worker return ::testing::AssertionSuccess();
80*38e8c45fSAndroid Build Coastguard Worker else
81*38e8c45fSAndroid Build Coastguard Worker return ::testing::AssertionFailure() << buf << " is not page aligned";
82*38e8c45fSAndroid Build Coastguard Worker }
83*38e8c45fSAndroid Build Coastguard Worker
84*38e8c45fSAndroid Build Coastguard Worker static testing::Environment* binder_env;
85*38e8c45fSAndroid Build Coastguard Worker static char *binderservername;
86*38e8c45fSAndroid Build Coastguard Worker static char *binderserversuffix;
87*38e8c45fSAndroid Build Coastguard Worker static char binderserverarg[] = "--binderserver";
88*38e8c45fSAndroid Build Coastguard Worker
89*38e8c45fSAndroid Build Coastguard Worker static constexpr int kSchedPolicy = SCHED_RR;
90*38e8c45fSAndroid Build Coastguard Worker static constexpr int kSchedPriority = 7;
91*38e8c45fSAndroid Build Coastguard Worker static constexpr int kSchedPriorityMore = 8;
92*38e8c45fSAndroid Build Coastguard Worker static constexpr int kKernelThreads = 17; // anything different than the default
93*38e8c45fSAndroid Build Coastguard Worker
94*38e8c45fSAndroid Build Coastguard Worker static String16 binderLibTestServiceName = String16("test.binderLib");
95*38e8c45fSAndroid Build Coastguard Worker
96*38e8c45fSAndroid Build Coastguard Worker enum BinderLibTestTranscationCode {
97*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_NOP_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION,
98*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_REGISTER_SERVER,
99*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_ADD_SERVER,
100*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_ADD_POLL_SERVER,
101*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_USE_CALLING_GUARD_TRANSACTION,
102*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_CALL_BACK,
103*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_CALL_BACK_VERIFY_BUF,
104*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_DELAYED_CALL_BACK,
105*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_NOP_CALL_BACK,
106*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_GET_SELF_TRANSACTION,
107*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_GET_ID_TRANSACTION,
108*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_INDIRECT_TRANSACTION,
109*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_SET_ERROR_TRANSACTION,
110*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_GET_STATUS_TRANSACTION,
111*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION,
112*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_LINK_DEATH_TRANSACTION,
113*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_WRITE_FILE_TRANSACTION,
114*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_WRITE_PARCEL_FILE_DESCRIPTOR_TRANSACTION,
115*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_GET_FILE_DESCRIPTORS_OWNED_TRANSACTION,
116*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_GET_FILE_DESCRIPTORS_UNOWNED_TRANSACTION,
117*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_EXIT_TRANSACTION,
118*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_DELAYED_EXIT_TRANSACTION,
119*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_GET_PTR_SIZE_TRANSACTION,
120*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_CREATE_BINDER_TRANSACTION,
121*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION,
122*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_GET_SCHEDULING_POLICY,
123*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_NOP_TRANSACTION_WAIT,
124*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_GETPID,
125*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_GETUID,
126*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_LISTEN_FOR_FROZEN_STATE_CHANGE,
127*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_CONSUME_STATE_CHANGE_EVENTS,
128*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_ECHO_VECTOR,
129*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_GET_NON_BLOCKING_FD,
130*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_REJECT_OBJECTS,
131*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_CAN_GET_SID,
132*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_GET_MAX_THREAD_COUNT,
133*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_SET_MAX_THREAD_COUNT,
134*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_IS_THREADPOOL_STARTED,
135*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_LOCK_UNLOCK,
136*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_PROCESS_LOCK,
137*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_UNLOCK_AFTER_MS,
138*38e8c45fSAndroid Build Coastguard Worker BINDER_LIB_TEST_PROCESS_TEMPORARY_LOCK
139*38e8c45fSAndroid Build Coastguard Worker };
140*38e8c45fSAndroid Build Coastguard Worker
start_server_process(int arg2,bool usePoll=false)141*38e8c45fSAndroid Build Coastguard Worker pid_t start_server_process(int arg2, bool usePoll = false)
142*38e8c45fSAndroid Build Coastguard Worker {
143*38e8c45fSAndroid Build Coastguard Worker int ret;
144*38e8c45fSAndroid Build Coastguard Worker pid_t pid;
145*38e8c45fSAndroid Build Coastguard Worker status_t status;
146*38e8c45fSAndroid Build Coastguard Worker int pipefd[2];
147*38e8c45fSAndroid Build Coastguard Worker char stri[16];
148*38e8c45fSAndroid Build Coastguard Worker char strpipefd1[16];
149*38e8c45fSAndroid Build Coastguard Worker char usepoll[2];
150*38e8c45fSAndroid Build Coastguard Worker char *childargv[] = {
151*38e8c45fSAndroid Build Coastguard Worker binderservername,
152*38e8c45fSAndroid Build Coastguard Worker binderserverarg,
153*38e8c45fSAndroid Build Coastguard Worker stri,
154*38e8c45fSAndroid Build Coastguard Worker strpipefd1,
155*38e8c45fSAndroid Build Coastguard Worker usepoll,
156*38e8c45fSAndroid Build Coastguard Worker binderserversuffix,
157*38e8c45fSAndroid Build Coastguard Worker nullptr
158*38e8c45fSAndroid Build Coastguard Worker };
159*38e8c45fSAndroid Build Coastguard Worker
160*38e8c45fSAndroid Build Coastguard Worker ret = pipe(pipefd);
161*38e8c45fSAndroid Build Coastguard Worker if (ret < 0)
162*38e8c45fSAndroid Build Coastguard Worker return ret;
163*38e8c45fSAndroid Build Coastguard Worker
164*38e8c45fSAndroid Build Coastguard Worker snprintf(stri, sizeof(stri), "%d", arg2);
165*38e8c45fSAndroid Build Coastguard Worker snprintf(strpipefd1, sizeof(strpipefd1), "%d", pipefd[1]);
166*38e8c45fSAndroid Build Coastguard Worker snprintf(usepoll, sizeof(usepoll), "%d", usePoll ? 1 : 0);
167*38e8c45fSAndroid Build Coastguard Worker
168*38e8c45fSAndroid Build Coastguard Worker pid = fork();
169*38e8c45fSAndroid Build Coastguard Worker if (pid == -1)
170*38e8c45fSAndroid Build Coastguard Worker return pid;
171*38e8c45fSAndroid Build Coastguard Worker if (pid == 0) {
172*38e8c45fSAndroid Build Coastguard Worker prctl(PR_SET_PDEATHSIG, SIGHUP);
173*38e8c45fSAndroid Build Coastguard Worker close(pipefd[0]);
174*38e8c45fSAndroid Build Coastguard Worker execv(binderservername, childargv);
175*38e8c45fSAndroid Build Coastguard Worker status = -errno;
176*38e8c45fSAndroid Build Coastguard Worker write(pipefd[1], &status, sizeof(status));
177*38e8c45fSAndroid Build Coastguard Worker fprintf(stderr, "execv failed, %s\n", strerror(errno));
178*38e8c45fSAndroid Build Coastguard Worker _exit(EXIT_FAILURE);
179*38e8c45fSAndroid Build Coastguard Worker }
180*38e8c45fSAndroid Build Coastguard Worker close(pipefd[1]);
181*38e8c45fSAndroid Build Coastguard Worker ret = read(pipefd[0], &status, sizeof(status));
182*38e8c45fSAndroid Build Coastguard Worker //printf("pipe read returned %d, status %d\n", ret, status);
183*38e8c45fSAndroid Build Coastguard Worker close(pipefd[0]);
184*38e8c45fSAndroid Build Coastguard Worker if (ret == sizeof(status)) {
185*38e8c45fSAndroid Build Coastguard Worker ret = status;
186*38e8c45fSAndroid Build Coastguard Worker } else {
187*38e8c45fSAndroid Build Coastguard Worker kill(pid, SIGKILL);
188*38e8c45fSAndroid Build Coastguard Worker if (ret >= 0) {
189*38e8c45fSAndroid Build Coastguard Worker ret = NO_INIT;
190*38e8c45fSAndroid Build Coastguard Worker }
191*38e8c45fSAndroid Build Coastguard Worker }
192*38e8c45fSAndroid Build Coastguard Worker if (ret < 0) {
193*38e8c45fSAndroid Build Coastguard Worker wait(nullptr);
194*38e8c45fSAndroid Build Coastguard Worker return ret;
195*38e8c45fSAndroid Build Coastguard Worker }
196*38e8c45fSAndroid Build Coastguard Worker return pid;
197*38e8c45fSAndroid Build Coastguard Worker }
198*38e8c45fSAndroid Build Coastguard Worker
GetId(sp<IBinder> service)199*38e8c45fSAndroid Build Coastguard Worker android::base::Result<int32_t> GetId(sp<IBinder> service) {
200*38e8c45fSAndroid Build Coastguard Worker using android::base::Error;
201*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
202*38e8c45fSAndroid Build Coastguard Worker data.markForBinder(service);
203*38e8c45fSAndroid Build Coastguard Worker const char *prefix = data.isForRpc() ? "On RPC server, " : "On binder server, ";
204*38e8c45fSAndroid Build Coastguard Worker status_t status = service->transact(BINDER_LIB_TEST_GET_ID_TRANSACTION, data, &reply);
205*38e8c45fSAndroid Build Coastguard Worker if (status != OK)
206*38e8c45fSAndroid Build Coastguard Worker return Error(status) << prefix << "transact(GET_ID): " << statusToString(status);
207*38e8c45fSAndroid Build Coastguard Worker int32_t result = 0;
208*38e8c45fSAndroid Build Coastguard Worker status = reply.readInt32(&result);
209*38e8c45fSAndroid Build Coastguard Worker if (status != OK) return Error(status) << prefix << "readInt32: " << statusToString(status);
210*38e8c45fSAndroid Build Coastguard Worker return result;
211*38e8c45fSAndroid Build Coastguard Worker }
212*38e8c45fSAndroid Build Coastguard Worker
213*38e8c45fSAndroid Build Coastguard Worker class BinderLibTestEnv : public ::testing::Environment {
214*38e8c45fSAndroid Build Coastguard Worker public:
BinderLibTestEnv()215*38e8c45fSAndroid Build Coastguard Worker BinderLibTestEnv() {}
getServer(void)216*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> getServer(void) {
217*38e8c45fSAndroid Build Coastguard Worker return m_server;
218*38e8c45fSAndroid Build Coastguard Worker }
219*38e8c45fSAndroid Build Coastguard Worker
220*38e8c45fSAndroid Build Coastguard Worker private:
SetUp()221*38e8c45fSAndroid Build Coastguard Worker virtual void SetUp() {
222*38e8c45fSAndroid Build Coastguard Worker m_serverpid = start_server_process(0);
223*38e8c45fSAndroid Build Coastguard Worker //printf("m_serverpid %d\n", m_serverpid);
224*38e8c45fSAndroid Build Coastguard Worker ASSERT_GT(m_serverpid, 0);
225*38e8c45fSAndroid Build Coastguard Worker
226*38e8c45fSAndroid Build Coastguard Worker sp<IServiceManager> sm = defaultServiceManager();
227*38e8c45fSAndroid Build Coastguard Worker // disable caching during addService.
228*38e8c45fSAndroid Build Coastguard Worker sm->enableAddServiceCache(false);
229*38e8c45fSAndroid Build Coastguard Worker //printf("%s: pid %d, get service\n", __func__, m_pid);
230*38e8c45fSAndroid Build Coastguard Worker LIBBINDER_IGNORE("-Wdeprecated-declarations")
231*38e8c45fSAndroid Build Coastguard Worker m_server = sm->getService(binderLibTestServiceName);
232*38e8c45fSAndroid Build Coastguard Worker LIBBINDER_IGNORE_END()
233*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(m_server != nullptr);
234*38e8c45fSAndroid Build Coastguard Worker //printf("%s: pid %d, get service done\n", __func__, m_pid);
235*38e8c45fSAndroid Build Coastguard Worker }
TearDown()236*38e8c45fSAndroid Build Coastguard Worker virtual void TearDown() {
237*38e8c45fSAndroid Build Coastguard Worker status_t ret;
238*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
239*38e8c45fSAndroid Build Coastguard Worker int exitStatus;
240*38e8c45fSAndroid Build Coastguard Worker pid_t pid;
241*38e8c45fSAndroid Build Coastguard Worker
242*38e8c45fSAndroid Build Coastguard Worker //printf("%s: pid %d\n", __func__, m_pid);
243*38e8c45fSAndroid Build Coastguard Worker if (m_server != nullptr) {
244*38e8c45fSAndroid Build Coastguard Worker ret = m_server->transact(BINDER_LIB_TEST_GET_STATUS_TRANSACTION, data, &reply);
245*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0, ret);
246*38e8c45fSAndroid Build Coastguard Worker ret = m_server->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY);
247*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0, ret);
248*38e8c45fSAndroid Build Coastguard Worker }
249*38e8c45fSAndroid Build Coastguard Worker if (m_serverpid > 0) {
250*38e8c45fSAndroid Build Coastguard Worker //printf("wait for %d\n", m_pids[i]);
251*38e8c45fSAndroid Build Coastguard Worker pid = wait(&exitStatus);
252*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(m_serverpid, pid);
253*38e8c45fSAndroid Build Coastguard Worker EXPECT_TRUE(WIFEXITED(exitStatus));
254*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0, WEXITSTATUS(exitStatus));
255*38e8c45fSAndroid Build Coastguard Worker }
256*38e8c45fSAndroid Build Coastguard Worker }
257*38e8c45fSAndroid Build Coastguard Worker
258*38e8c45fSAndroid Build Coastguard Worker pid_t m_serverpid;
259*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> m_server;
260*38e8c45fSAndroid Build Coastguard Worker };
261*38e8c45fSAndroid Build Coastguard Worker
262*38e8c45fSAndroid Build Coastguard Worker class TestFrozenStateChangeCallback : public IBinder::FrozenStateChangeCallback {
263*38e8c45fSAndroid Build Coastguard Worker public:
264*38e8c45fSAndroid Build Coastguard Worker BlockingQueue<std::pair<const wp<IBinder>, State>> events;
265*38e8c45fSAndroid Build Coastguard Worker
onStateChanged(const wp<IBinder> & who,State state)266*38e8c45fSAndroid Build Coastguard Worker virtual void onStateChanged(const wp<IBinder>& who, State state) {
267*38e8c45fSAndroid Build Coastguard Worker events.push(std::make_pair(who, state));
268*38e8c45fSAndroid Build Coastguard Worker }
269*38e8c45fSAndroid Build Coastguard Worker
ensureFrozenEventReceived()270*38e8c45fSAndroid Build Coastguard Worker void ensureFrozenEventReceived() {
271*38e8c45fSAndroid Build Coastguard Worker auto event = events.popWithTimeout(500ms);
272*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(event.has_value());
273*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(State::FROZEN, event->second); // isFrozen should be true
274*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0u, events.size());
275*38e8c45fSAndroid Build Coastguard Worker }
276*38e8c45fSAndroid Build Coastguard Worker
ensureUnfrozenEventReceived()277*38e8c45fSAndroid Build Coastguard Worker void ensureUnfrozenEventReceived() {
278*38e8c45fSAndroid Build Coastguard Worker auto event = events.popWithTimeout(500ms);
279*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(event.has_value());
280*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(State::UNFROZEN, event->second); // isFrozen should be false
281*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0u, events.size());
282*38e8c45fSAndroid Build Coastguard Worker }
283*38e8c45fSAndroid Build Coastguard Worker
getAllAndClear()284*38e8c45fSAndroid Build Coastguard Worker std::vector<bool> getAllAndClear() {
285*38e8c45fSAndroid Build Coastguard Worker std::vector<bool> results;
286*38e8c45fSAndroid Build Coastguard Worker while (true) {
287*38e8c45fSAndroid Build Coastguard Worker auto event = events.popWithTimeout(0ms);
288*38e8c45fSAndroid Build Coastguard Worker if (!event.has_value()) {
289*38e8c45fSAndroid Build Coastguard Worker break;
290*38e8c45fSAndroid Build Coastguard Worker }
291*38e8c45fSAndroid Build Coastguard Worker results.push_back(event->second == State::FROZEN);
292*38e8c45fSAndroid Build Coastguard Worker }
293*38e8c45fSAndroid Build Coastguard Worker return results;
294*38e8c45fSAndroid Build Coastguard Worker }
295*38e8c45fSAndroid Build Coastguard Worker
296*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder;
297*38e8c45fSAndroid Build Coastguard Worker };
298*38e8c45fSAndroid Build Coastguard Worker
299*38e8c45fSAndroid Build Coastguard Worker class BinderLibTest : public ::testing::Test {
300*38e8c45fSAndroid Build Coastguard Worker public:
SetUp()301*38e8c45fSAndroid Build Coastguard Worker virtual void SetUp() {
302*38e8c45fSAndroid Build Coastguard Worker m_server = static_cast<BinderLibTestEnv *>(binder_env)->getServer();
303*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->restoreCallingWorkSource(0);
304*38e8c45fSAndroid Build Coastguard Worker sp<IServiceManager> sm = defaultServiceManager();
305*38e8c45fSAndroid Build Coastguard Worker // disable caching during addService.
306*38e8c45fSAndroid Build Coastguard Worker sm->enableAddServiceCache(false);
307*38e8c45fSAndroid Build Coastguard Worker }
TearDown()308*38e8c45fSAndroid Build Coastguard Worker virtual void TearDown() {
309*38e8c45fSAndroid Build Coastguard Worker }
310*38e8c45fSAndroid Build Coastguard Worker protected:
addServerEtc(int32_t * idPtr,int code)311*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> addServerEtc(int32_t *idPtr, int code)
312*38e8c45fSAndroid Build Coastguard Worker {
313*38e8c45fSAndroid Build Coastguard Worker int32_t id;
314*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
315*38e8c45fSAndroid Build Coastguard Worker
316*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(m_server->transact(code, data, &reply), StatusEq(NO_ERROR));
317*38e8c45fSAndroid Build Coastguard Worker
318*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder = reply.readStrongBinder();
319*38e8c45fSAndroid Build Coastguard Worker EXPECT_NE(nullptr, binder);
320*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(reply.readInt32(&id), StatusEq(NO_ERROR));
321*38e8c45fSAndroid Build Coastguard Worker if (idPtr)
322*38e8c45fSAndroid Build Coastguard Worker *idPtr = id;
323*38e8c45fSAndroid Build Coastguard Worker return binder;
324*38e8c45fSAndroid Build Coastguard Worker }
325*38e8c45fSAndroid Build Coastguard Worker
addServer(int32_t * idPtr=nullptr)326*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> addServer(int32_t *idPtr = nullptr)
327*38e8c45fSAndroid Build Coastguard Worker {
328*38e8c45fSAndroid Build Coastguard Worker return addServerEtc(idPtr, BINDER_LIB_TEST_ADD_SERVER);
329*38e8c45fSAndroid Build Coastguard Worker }
330*38e8c45fSAndroid Build Coastguard Worker
addPollServer(int32_t * idPtr=nullptr)331*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> addPollServer(int32_t *idPtr = nullptr)
332*38e8c45fSAndroid Build Coastguard Worker {
333*38e8c45fSAndroid Build Coastguard Worker return addServerEtc(idPtr, BINDER_LIB_TEST_ADD_POLL_SERVER);
334*38e8c45fSAndroid Build Coastguard Worker }
335*38e8c45fSAndroid Build Coastguard Worker
waitForReadData(int fd,int timeout_ms)336*38e8c45fSAndroid Build Coastguard Worker void waitForReadData(int fd, int timeout_ms) {
337*38e8c45fSAndroid Build Coastguard Worker int ret;
338*38e8c45fSAndroid Build Coastguard Worker pollfd pfd = pollfd();
339*38e8c45fSAndroid Build Coastguard Worker
340*38e8c45fSAndroid Build Coastguard Worker pfd.fd = fd;
341*38e8c45fSAndroid Build Coastguard Worker pfd.events = POLLIN;
342*38e8c45fSAndroid Build Coastguard Worker ret = poll(&pfd, 1, timeout_ms);
343*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(1, ret);
344*38e8c45fSAndroid Build Coastguard Worker }
345*38e8c45fSAndroid Build Coastguard Worker
checkFreezeSupport()346*38e8c45fSAndroid Build Coastguard Worker bool checkFreezeSupport() {
347*38e8c45fSAndroid Build Coastguard Worker std::ifstream freezer_file("/sys/fs/cgroup/uid_0/cgroup.freeze");
348*38e8c45fSAndroid Build Coastguard Worker // Pass test on devices where the cgroup v2 freezer is not supported
349*38e8c45fSAndroid Build Coastguard Worker if (freezer_file.fail()) {
350*38e8c45fSAndroid Build Coastguard Worker return false;
351*38e8c45fSAndroid Build Coastguard Worker }
352*38e8c45fSAndroid Build Coastguard Worker return IPCThreadState::self()->freeze(getpid(), false, 0) == NO_ERROR;
353*38e8c45fSAndroid Build Coastguard Worker }
354*38e8c45fSAndroid Build Coastguard Worker
checkFreezeAndNotificationSupport()355*38e8c45fSAndroid Build Coastguard Worker bool checkFreezeAndNotificationSupport() {
356*38e8c45fSAndroid Build Coastguard Worker if (!checkFreezeSupport()) {
357*38e8c45fSAndroid Build Coastguard Worker return false;
358*38e8c45fSAndroid Build Coastguard Worker }
359*38e8c45fSAndroid Build Coastguard Worker return ProcessState::isDriverFeatureEnabled(
360*38e8c45fSAndroid Build Coastguard Worker ProcessState::DriverFeature::FREEZE_NOTIFICATION);
361*38e8c45fSAndroid Build Coastguard Worker }
362*38e8c45fSAndroid Build Coastguard Worker
getBinderPid(int32_t * pid,sp<IBinder> server)363*38e8c45fSAndroid Build Coastguard Worker bool getBinderPid(int32_t* pid, sp<IBinder> server) {
364*38e8c45fSAndroid Build Coastguard Worker Parcel data, replypid;
365*38e8c45fSAndroid Build Coastguard Worker if (server->transact(BINDER_LIB_TEST_GETPID, data, &replypid) != NO_ERROR) {
366*38e8c45fSAndroid Build Coastguard Worker ALOGE("BINDER_LIB_TEST_GETPID failed");
367*38e8c45fSAndroid Build Coastguard Worker return false;
368*38e8c45fSAndroid Build Coastguard Worker }
369*38e8c45fSAndroid Build Coastguard Worker *pid = replypid.readInt32();
370*38e8c45fSAndroid Build Coastguard Worker if (*pid <= 0) {
371*38e8c45fSAndroid Build Coastguard Worker ALOGE("pid should be greater than zero");
372*38e8c45fSAndroid Build Coastguard Worker return false;
373*38e8c45fSAndroid Build Coastguard Worker }
374*38e8c45fSAndroid Build Coastguard Worker return true;
375*38e8c45fSAndroid Build Coastguard Worker }
376*38e8c45fSAndroid Build Coastguard Worker
freezeProcess(int32_t pid)377*38e8c45fSAndroid Build Coastguard Worker void freezeProcess(int32_t pid) {
378*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, true, 1000));
379*38e8c45fSAndroid Build Coastguard Worker }
380*38e8c45fSAndroid Build Coastguard Worker
unfreezeProcess(int32_t pid)381*38e8c45fSAndroid Build Coastguard Worker void unfreezeProcess(int32_t pid) {
382*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, false, 0));
383*38e8c45fSAndroid Build Coastguard Worker }
384*38e8c45fSAndroid Build Coastguard Worker
removeCallbackAndValidateNoEvent(sp<IBinder> binder,sp<TestFrozenStateChangeCallback> callback)385*38e8c45fSAndroid Build Coastguard Worker void removeCallbackAndValidateNoEvent(sp<IBinder> binder,
386*38e8c45fSAndroid Build Coastguard Worker sp<TestFrozenStateChangeCallback> callback) {
387*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(binder->removeFrozenStateChangeCallback(callback), StatusEq(NO_ERROR));
388*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0u, callback->events.size());
389*38e8c45fSAndroid Build Coastguard Worker }
390*38e8c45fSAndroid Build Coastguard Worker
391*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> m_server;
392*38e8c45fSAndroid Build Coastguard Worker };
393*38e8c45fSAndroid Build Coastguard Worker
394*38e8c45fSAndroid Build Coastguard Worker class BinderLibTestBundle : public Parcel
395*38e8c45fSAndroid Build Coastguard Worker {
396*38e8c45fSAndroid Build Coastguard Worker public:
BinderLibTestBundle(void)397*38e8c45fSAndroid Build Coastguard Worker BinderLibTestBundle(void) {}
BinderLibTestBundle(const Parcel * source)398*38e8c45fSAndroid Build Coastguard Worker explicit BinderLibTestBundle(const Parcel *source) : m_isValid(false) {
399*38e8c45fSAndroid Build Coastguard Worker int32_t mark;
400*38e8c45fSAndroid Build Coastguard Worker int32_t bundleLen;
401*38e8c45fSAndroid Build Coastguard Worker size_t pos;
402*38e8c45fSAndroid Build Coastguard Worker
403*38e8c45fSAndroid Build Coastguard Worker if (source->readInt32(&mark))
404*38e8c45fSAndroid Build Coastguard Worker return;
405*38e8c45fSAndroid Build Coastguard Worker if (mark != MARK_START)
406*38e8c45fSAndroid Build Coastguard Worker return;
407*38e8c45fSAndroid Build Coastguard Worker if (source->readInt32(&bundleLen))
408*38e8c45fSAndroid Build Coastguard Worker return;
409*38e8c45fSAndroid Build Coastguard Worker pos = source->dataPosition();
410*38e8c45fSAndroid Build Coastguard Worker if (Parcel::appendFrom(source, pos, bundleLen))
411*38e8c45fSAndroid Build Coastguard Worker return;
412*38e8c45fSAndroid Build Coastguard Worker source->setDataPosition(pos + bundleLen);
413*38e8c45fSAndroid Build Coastguard Worker if (source->readInt32(&mark))
414*38e8c45fSAndroid Build Coastguard Worker return;
415*38e8c45fSAndroid Build Coastguard Worker if (mark != MARK_END)
416*38e8c45fSAndroid Build Coastguard Worker return;
417*38e8c45fSAndroid Build Coastguard Worker m_isValid = true;
418*38e8c45fSAndroid Build Coastguard Worker setDataPosition(0);
419*38e8c45fSAndroid Build Coastguard Worker }
appendTo(Parcel * dest)420*38e8c45fSAndroid Build Coastguard Worker void appendTo(Parcel *dest) {
421*38e8c45fSAndroid Build Coastguard Worker dest->writeInt32(MARK_START);
422*38e8c45fSAndroid Build Coastguard Worker dest->writeInt32(dataSize());
423*38e8c45fSAndroid Build Coastguard Worker dest->appendFrom(this, 0, dataSize());
424*38e8c45fSAndroid Build Coastguard Worker dest->writeInt32(MARK_END);
425*38e8c45fSAndroid Build Coastguard Worker };
isValid(void)426*38e8c45fSAndroid Build Coastguard Worker bool isValid(void) {
427*38e8c45fSAndroid Build Coastguard Worker return m_isValid;
428*38e8c45fSAndroid Build Coastguard Worker }
429*38e8c45fSAndroid Build Coastguard Worker private:
430*38e8c45fSAndroid Build Coastguard Worker enum {
431*38e8c45fSAndroid Build Coastguard Worker MARK_START = B_PACK_CHARS('B','T','B','S'),
432*38e8c45fSAndroid Build Coastguard Worker MARK_END = B_PACK_CHARS('B','T','B','E'),
433*38e8c45fSAndroid Build Coastguard Worker };
434*38e8c45fSAndroid Build Coastguard Worker bool m_isValid;
435*38e8c45fSAndroid Build Coastguard Worker };
436*38e8c45fSAndroid Build Coastguard Worker
437*38e8c45fSAndroid Build Coastguard Worker class BinderLibTestEvent
438*38e8c45fSAndroid Build Coastguard Worker {
439*38e8c45fSAndroid Build Coastguard Worker public:
BinderLibTestEvent(void)440*38e8c45fSAndroid Build Coastguard Worker BinderLibTestEvent(void)
441*38e8c45fSAndroid Build Coastguard Worker : m_eventTriggered(false)
442*38e8c45fSAndroid Build Coastguard Worker {
443*38e8c45fSAndroid Build Coastguard Worker pthread_mutex_init(&m_waitMutex, nullptr);
444*38e8c45fSAndroid Build Coastguard Worker pthread_cond_init(&m_waitCond, nullptr);
445*38e8c45fSAndroid Build Coastguard Worker }
waitEvent(int timeout_s)446*38e8c45fSAndroid Build Coastguard Worker int waitEvent(int timeout_s)
447*38e8c45fSAndroid Build Coastguard Worker {
448*38e8c45fSAndroid Build Coastguard Worker int ret;
449*38e8c45fSAndroid Build Coastguard Worker pthread_mutex_lock(&m_waitMutex);
450*38e8c45fSAndroid Build Coastguard Worker if (!m_eventTriggered) {
451*38e8c45fSAndroid Build Coastguard Worker struct timespec ts;
452*38e8c45fSAndroid Build Coastguard Worker clock_gettime(CLOCK_REALTIME, &ts);
453*38e8c45fSAndroid Build Coastguard Worker ts.tv_sec += timeout_s;
454*38e8c45fSAndroid Build Coastguard Worker pthread_cond_timedwait(&m_waitCond, &m_waitMutex, &ts);
455*38e8c45fSAndroid Build Coastguard Worker }
456*38e8c45fSAndroid Build Coastguard Worker ret = m_eventTriggered ? NO_ERROR : TIMED_OUT;
457*38e8c45fSAndroid Build Coastguard Worker pthread_mutex_unlock(&m_waitMutex);
458*38e8c45fSAndroid Build Coastguard Worker return ret;
459*38e8c45fSAndroid Build Coastguard Worker }
getTriggeringThread()460*38e8c45fSAndroid Build Coastguard Worker pthread_t getTriggeringThread()
461*38e8c45fSAndroid Build Coastguard Worker {
462*38e8c45fSAndroid Build Coastguard Worker return m_triggeringThread;
463*38e8c45fSAndroid Build Coastguard Worker }
464*38e8c45fSAndroid Build Coastguard Worker protected:
triggerEvent(void)465*38e8c45fSAndroid Build Coastguard Worker void triggerEvent(void) {
466*38e8c45fSAndroid Build Coastguard Worker pthread_mutex_lock(&m_waitMutex);
467*38e8c45fSAndroid Build Coastguard Worker pthread_cond_signal(&m_waitCond);
468*38e8c45fSAndroid Build Coastguard Worker m_eventTriggered = true;
469*38e8c45fSAndroid Build Coastguard Worker m_triggeringThread = pthread_self();
470*38e8c45fSAndroid Build Coastguard Worker pthread_mutex_unlock(&m_waitMutex);
471*38e8c45fSAndroid Build Coastguard Worker };
472*38e8c45fSAndroid Build Coastguard Worker private:
473*38e8c45fSAndroid Build Coastguard Worker pthread_mutex_t m_waitMutex;
474*38e8c45fSAndroid Build Coastguard Worker pthread_cond_t m_waitCond;
475*38e8c45fSAndroid Build Coastguard Worker bool m_eventTriggered;
476*38e8c45fSAndroid Build Coastguard Worker pthread_t m_triggeringThread;
477*38e8c45fSAndroid Build Coastguard Worker };
478*38e8c45fSAndroid Build Coastguard Worker
479*38e8c45fSAndroid Build Coastguard Worker class BinderLibTestCallBack : public BBinder, public BinderLibTestEvent
480*38e8c45fSAndroid Build Coastguard Worker {
481*38e8c45fSAndroid Build Coastguard Worker public:
BinderLibTestCallBack()482*38e8c45fSAndroid Build Coastguard Worker BinderLibTestCallBack()
483*38e8c45fSAndroid Build Coastguard Worker : m_result(NOT_ENOUGH_DATA)
484*38e8c45fSAndroid Build Coastguard Worker , m_prev_end(nullptr)
485*38e8c45fSAndroid Build Coastguard Worker {
486*38e8c45fSAndroid Build Coastguard Worker }
getResult(void)487*38e8c45fSAndroid Build Coastguard Worker status_t getResult(void)
488*38e8c45fSAndroid Build Coastguard Worker {
489*38e8c45fSAndroid Build Coastguard Worker return m_result;
490*38e8c45fSAndroid Build Coastguard Worker }
491*38e8c45fSAndroid Build Coastguard Worker
492*38e8c45fSAndroid Build Coastguard Worker private:
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags=0)493*38e8c45fSAndroid Build Coastguard Worker virtual status_t onTransact(uint32_t code,
494*38e8c45fSAndroid Build Coastguard Worker const Parcel& data, Parcel* reply,
495*38e8c45fSAndroid Build Coastguard Worker uint32_t flags = 0)
496*38e8c45fSAndroid Build Coastguard Worker {
497*38e8c45fSAndroid Build Coastguard Worker (void)reply;
498*38e8c45fSAndroid Build Coastguard Worker (void)flags;
499*38e8c45fSAndroid Build Coastguard Worker switch(code) {
500*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_CALL_BACK: {
501*38e8c45fSAndroid Build Coastguard Worker status_t status = data.readInt32(&m_result);
502*38e8c45fSAndroid Build Coastguard Worker if (status != NO_ERROR) {
503*38e8c45fSAndroid Build Coastguard Worker m_result = status;
504*38e8c45fSAndroid Build Coastguard Worker }
505*38e8c45fSAndroid Build Coastguard Worker triggerEvent();
506*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
507*38e8c45fSAndroid Build Coastguard Worker }
508*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_CALL_BACK_VERIFY_BUF: {
509*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server;
510*38e8c45fSAndroid Build Coastguard Worker int ret;
511*38e8c45fSAndroid Build Coastguard Worker const uint8_t *buf = data.data();
512*38e8c45fSAndroid Build Coastguard Worker size_t size = data.dataSize();
513*38e8c45fSAndroid Build Coastguard Worker if (m_prev_end) {
514*38e8c45fSAndroid Build Coastguard Worker /* 64-bit kernel needs at most 8 bytes to align buffer end */
515*38e8c45fSAndroid Build Coastguard Worker EXPECT_LE((size_t)(buf - m_prev_end), (size_t)8);
516*38e8c45fSAndroid Build Coastguard Worker } else {
517*38e8c45fSAndroid Build Coastguard Worker EXPECT_TRUE(IsPageAligned((void *)buf));
518*38e8c45fSAndroid Build Coastguard Worker }
519*38e8c45fSAndroid Build Coastguard Worker
520*38e8c45fSAndroid Build Coastguard Worker m_prev_end = buf + size + data.objectsCount() * sizeof(binder_size_t);
521*38e8c45fSAndroid Build Coastguard Worker
522*38e8c45fSAndroid Build Coastguard Worker if (size > 0) {
523*38e8c45fSAndroid Build Coastguard Worker server = static_cast<BinderLibTestEnv *>(binder_env)->getServer();
524*38e8c45fSAndroid Build Coastguard Worker ret = server->transact(BINDER_LIB_TEST_INDIRECT_TRANSACTION,
525*38e8c45fSAndroid Build Coastguard Worker data, reply);
526*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, ret);
527*38e8c45fSAndroid Build Coastguard Worker }
528*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
529*38e8c45fSAndroid Build Coastguard Worker }
530*38e8c45fSAndroid Build Coastguard Worker default:
531*38e8c45fSAndroid Build Coastguard Worker return UNKNOWN_TRANSACTION;
532*38e8c45fSAndroid Build Coastguard Worker }
533*38e8c45fSAndroid Build Coastguard Worker }
534*38e8c45fSAndroid Build Coastguard Worker
535*38e8c45fSAndroid Build Coastguard Worker status_t m_result;
536*38e8c45fSAndroid Build Coastguard Worker const uint8_t *m_prev_end;
537*38e8c45fSAndroid Build Coastguard Worker };
538*38e8c45fSAndroid Build Coastguard Worker
539*38e8c45fSAndroid Build Coastguard Worker class TestDeathRecipient : public IBinder::DeathRecipient, public BinderLibTestEvent
540*38e8c45fSAndroid Build Coastguard Worker {
541*38e8c45fSAndroid Build Coastguard Worker private:
binderDied(const wp<IBinder> & who)542*38e8c45fSAndroid Build Coastguard Worker virtual void binderDied(const wp<IBinder>& who) {
543*38e8c45fSAndroid Build Coastguard Worker (void)who;
544*38e8c45fSAndroid Build Coastguard Worker triggerEvent();
545*38e8c45fSAndroid Build Coastguard Worker };
546*38e8c45fSAndroid Build Coastguard Worker };
547*38e8c45fSAndroid Build Coastguard Worker
countFds()548*38e8c45fSAndroid Build Coastguard Worker ssize_t countFds() {
549*38e8c45fSAndroid Build Coastguard Worker return std::distance(std::filesystem::directory_iterator("/proc/self/fd"),
550*38e8c45fSAndroid Build Coastguard Worker std::filesystem::directory_iterator{});
551*38e8c45fSAndroid Build Coastguard Worker }
552*38e8c45fSAndroid Build Coastguard Worker
553*38e8c45fSAndroid Build Coastguard Worker struct FdLeakDetector {
554*38e8c45fSAndroid Build Coastguard Worker int startCount;
555*38e8c45fSAndroid Build Coastguard Worker
FdLeakDetectorFdLeakDetector556*38e8c45fSAndroid Build Coastguard Worker FdLeakDetector() {
557*38e8c45fSAndroid Build Coastguard Worker // This log statement is load bearing. We have to log something before
558*38e8c45fSAndroid Build Coastguard Worker // counting FDs to make sure the logging system is initialized, otherwise
559*38e8c45fSAndroid Build Coastguard Worker // the sockets it opens will look like a leak.
560*38e8c45fSAndroid Build Coastguard Worker ALOGW("FdLeakDetector counting FDs.");
561*38e8c45fSAndroid Build Coastguard Worker startCount = countFds();
562*38e8c45fSAndroid Build Coastguard Worker }
~FdLeakDetectorFdLeakDetector563*38e8c45fSAndroid Build Coastguard Worker ~FdLeakDetector() {
564*38e8c45fSAndroid Build Coastguard Worker int endCount = countFds();
565*38e8c45fSAndroid Build Coastguard Worker if (startCount != endCount) {
566*38e8c45fSAndroid Build Coastguard Worker ADD_FAILURE() << "fd count changed (" << startCount << " -> " << endCount
567*38e8c45fSAndroid Build Coastguard Worker << ") fd leak?";
568*38e8c45fSAndroid Build Coastguard Worker }
569*38e8c45fSAndroid Build Coastguard Worker }
570*38e8c45fSAndroid Build Coastguard Worker };
571*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,CannotUseBinderAfterFork)572*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, CannotUseBinderAfterFork) {
573*38e8c45fSAndroid Build Coastguard Worker // EXPECT_DEATH works by forking the process
574*38e8c45fSAndroid Build Coastguard Worker EXPECT_DEATH({ ProcessState::self(); }, "libbinder ProcessState can not be used after fork");
575*38e8c45fSAndroid Build Coastguard Worker }
576*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,AddManagerToManager)577*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, AddManagerToManager) {
578*38e8c45fSAndroid Build Coastguard Worker sp<IServiceManager> sm = defaultServiceManager();
579*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder = IInterface::asBinder(sm);
580*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, sm->addService(String16("binderLibTest-manager"), binder));
581*38e8c45fSAndroid Build Coastguard Worker }
582*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,RegisterForNotificationsFailure)583*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, RegisterForNotificationsFailure) {
584*38e8c45fSAndroid Build Coastguard Worker auto sm = defaultServiceManager();
585*38e8c45fSAndroid Build Coastguard Worker using LocalRegistrationCallback = IServiceManager::LocalRegistrationCallback;
586*38e8c45fSAndroid Build Coastguard Worker class LocalRegistrationCallbackImpl : public virtual LocalRegistrationCallback {
587*38e8c45fSAndroid Build Coastguard Worker void onServiceRegistration(const String16&, const sp<IBinder>&) override {}
588*38e8c45fSAndroid Build Coastguard Worker virtual ~LocalRegistrationCallbackImpl() {}
589*38e8c45fSAndroid Build Coastguard Worker };
590*38e8c45fSAndroid Build Coastguard Worker sp<LocalRegistrationCallback> cb = sp<LocalRegistrationCallbackImpl>::make();
591*38e8c45fSAndroid Build Coastguard Worker
592*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BAD_VALUE, sm->registerForNotifications(String16("ValidName"), nullptr));
593*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(UNKNOWN_ERROR, sm->registerForNotifications(String16("InvalidName!$"), cb));
594*38e8c45fSAndroid Build Coastguard Worker }
595*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,UnregisterForNotificationsFailure)596*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, UnregisterForNotificationsFailure) {
597*38e8c45fSAndroid Build Coastguard Worker auto sm = defaultServiceManager();
598*38e8c45fSAndroid Build Coastguard Worker using LocalRegistrationCallback = IServiceManager::LocalRegistrationCallback;
599*38e8c45fSAndroid Build Coastguard Worker class LocalRegistrationCallbackImpl : public virtual LocalRegistrationCallback {
600*38e8c45fSAndroid Build Coastguard Worker void onServiceRegistration(const String16&, const sp<IBinder>&) override {}
601*38e8c45fSAndroid Build Coastguard Worker virtual ~LocalRegistrationCallbackImpl() {}
602*38e8c45fSAndroid Build Coastguard Worker };
603*38e8c45fSAndroid Build Coastguard Worker sp<LocalRegistrationCallback> cb = sp<LocalRegistrationCallbackImpl>::make();
604*38e8c45fSAndroid Build Coastguard Worker
605*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, sm->registerForNotifications(String16("ValidName"), cb));
606*38e8c45fSAndroid Build Coastguard Worker
607*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BAD_VALUE, sm->unregisterForNotifications(String16("ValidName"), nullptr));
608*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BAD_VALUE, sm->unregisterForNotifications(String16("AnotherValidName"), cb));
609*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BAD_VALUE, sm->unregisterForNotifications(String16("InvalidName!!!"), cb));
610*38e8c45fSAndroid Build Coastguard Worker }
611*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,WasParceled)612*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, WasParceled) {
613*38e8c45fSAndroid Build Coastguard Worker auto binder = sp<BBinder>::make();
614*38e8c45fSAndroid Build Coastguard Worker EXPECT_FALSE(binder->wasParceled());
615*38e8c45fSAndroid Build Coastguard Worker Parcel data;
616*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(binder);
617*38e8c45fSAndroid Build Coastguard Worker EXPECT_TRUE(binder->wasParceled());
618*38e8c45fSAndroid Build Coastguard Worker }
619*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,NopTransaction)620*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, NopTransaction) {
621*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
622*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply),
623*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
624*38e8c45fSAndroid Build Coastguard Worker }
625*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,NopTransactionOneway)626*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, NopTransactionOneway) {
627*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
628*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply, TF_ONE_WAY),
629*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
630*38e8c45fSAndroid Build Coastguard Worker }
631*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,NopTransactionClear)632*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, NopTransactionClear) {
633*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
634*38e8c45fSAndroid Build Coastguard Worker // make sure it accepts the transaction flag
635*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply, TF_CLEAR_BUF),
636*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
637*38e8c45fSAndroid Build Coastguard Worker }
638*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,Freeze)639*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, Freeze) {
640*38e8c45fSAndroid Build Coastguard Worker if (!checkFreezeSupport()) {
641*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "Skipping test for kernels that do not support proceess freezing";
642*38e8c45fSAndroid Build Coastguard Worker return;
643*38e8c45fSAndroid Build Coastguard Worker }
644*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply, replypid;
645*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_GETPID, data, &replypid), StatusEq(NO_ERROR));
646*38e8c45fSAndroid Build Coastguard Worker int32_t pid = replypid.readInt32();
647*38e8c45fSAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) {
648*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION_WAIT, data, &reply, TF_ONE_WAY));
649*38e8c45fSAndroid Build Coastguard Worker }
650*38e8c45fSAndroid Build Coastguard Worker
651*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, false, 0));
652*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(-EAGAIN, IPCThreadState::self()->freeze(pid, true, 0));
653*38e8c45fSAndroid Build Coastguard Worker
654*38e8c45fSAndroid Build Coastguard Worker // b/268232063 - succeeds ~0.08% of the time
655*38e8c45fSAndroid Build Coastguard Worker {
656*38e8c45fSAndroid Build Coastguard Worker auto ret = IPCThreadState::self()->freeze(pid, true, 0);
657*38e8c45fSAndroid Build Coastguard Worker EXPECT_TRUE(ret == -EAGAIN || ret == OK);
658*38e8c45fSAndroid Build Coastguard Worker }
659*38e8c45fSAndroid Build Coastguard Worker
660*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, true, 1000));
661*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(FAILED_TRANSACTION, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply));
662*38e8c45fSAndroid Build Coastguard Worker
663*38e8c45fSAndroid Build Coastguard Worker uint32_t sync_received, async_received;
664*38e8c45fSAndroid Build Coastguard Worker
665*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, IPCThreadState::self()->getProcessFreezeInfo(pid, &sync_received,
666*38e8c45fSAndroid Build Coastguard Worker &async_received));
667*38e8c45fSAndroid Build Coastguard Worker
668*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sync_received, 1u);
669*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(async_received, 0u);
670*38e8c45fSAndroid Build Coastguard Worker
671*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, false, 0));
672*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply));
673*38e8c45fSAndroid Build Coastguard Worker }
674*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,SetError)675*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, SetError) {
676*38e8c45fSAndroid Build Coastguard Worker int32_t testValue[] = { 0, -123, 123 };
677*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < countof(testValue); i++) {
678*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
679*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(testValue[i]);
680*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_SET_ERROR_TRANSACTION, data, &reply),
681*38e8c45fSAndroid Build Coastguard Worker StatusEq(testValue[i]));
682*38e8c45fSAndroid Build Coastguard Worker }
683*38e8c45fSAndroid Build Coastguard Worker }
684*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,GetId)685*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, GetId) {
686*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(GetId(m_server), HasValue(0));
687*38e8c45fSAndroid Build Coastguard Worker }
688*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,PtrSize)689*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, PtrSize) {
690*38e8c45fSAndroid Build Coastguard Worker int32_t ptrsize;
691*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
692*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
693*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
694*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_GET_PTR_SIZE_TRANSACTION, data, &reply),
695*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
696*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(reply.readInt32(&ptrsize), StatusEq(NO_ERROR));
697*38e8c45fSAndroid Build Coastguard Worker RecordProperty("TestPtrSize", sizeof(void *));
698*38e8c45fSAndroid Build Coastguard Worker RecordProperty("ServerPtrSize", sizeof(void *));
699*38e8c45fSAndroid Build Coastguard Worker }
700*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,IndirectGetId2)701*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, IndirectGetId2)
702*38e8c45fSAndroid Build Coastguard Worker {
703*38e8c45fSAndroid Build Coastguard Worker int32_t id;
704*38e8c45fSAndroid Build Coastguard Worker int32_t count;
705*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
706*38e8c45fSAndroid Build Coastguard Worker int32_t serverId[3];
707*38e8c45fSAndroid Build Coastguard Worker
708*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(countof(serverId));
709*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < countof(serverId); i++) {
710*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server;
711*38e8c45fSAndroid Build Coastguard Worker BinderLibTestBundle datai;
712*38e8c45fSAndroid Build Coastguard Worker
713*38e8c45fSAndroid Build Coastguard Worker server = addServer(&serverId[i]);
714*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
715*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(server);
716*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(BINDER_LIB_TEST_GET_ID_TRANSACTION);
717*38e8c45fSAndroid Build Coastguard Worker datai.appendTo(&data);
718*38e8c45fSAndroid Build Coastguard Worker }
719*38e8c45fSAndroid Build Coastguard Worker
720*38e8c45fSAndroid Build Coastguard Worker ASSERT_THAT(m_server->transact(BINDER_LIB_TEST_INDIRECT_TRANSACTION, data, &reply),
721*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
722*38e8c45fSAndroid Build Coastguard Worker
723*38e8c45fSAndroid Build Coastguard Worker ASSERT_THAT(reply.readInt32(&id), StatusEq(NO_ERROR));
724*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0, id);
725*38e8c45fSAndroid Build Coastguard Worker
726*38e8c45fSAndroid Build Coastguard Worker ASSERT_THAT(reply.readInt32(&count), StatusEq(NO_ERROR));
727*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(countof(serverId), (size_t)count);
728*38e8c45fSAndroid Build Coastguard Worker
729*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < (size_t)count; i++) {
730*38e8c45fSAndroid Build Coastguard Worker BinderLibTestBundle replyi(&reply);
731*38e8c45fSAndroid Build Coastguard Worker EXPECT_TRUE(replyi.isValid());
732*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(replyi.readInt32(&id), StatusEq(NO_ERROR));
733*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(serverId[i], id);
734*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(replyi.dataSize(), replyi.dataPosition());
735*38e8c45fSAndroid Build Coastguard Worker }
736*38e8c45fSAndroid Build Coastguard Worker
737*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(reply.dataSize(), reply.dataPosition());
738*38e8c45fSAndroid Build Coastguard Worker }
739*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,IndirectGetId3)740*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, IndirectGetId3)
741*38e8c45fSAndroid Build Coastguard Worker {
742*38e8c45fSAndroid Build Coastguard Worker int32_t id;
743*38e8c45fSAndroid Build Coastguard Worker int32_t count;
744*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
745*38e8c45fSAndroid Build Coastguard Worker int32_t serverId[3];
746*38e8c45fSAndroid Build Coastguard Worker
747*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(countof(serverId));
748*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < countof(serverId); i++) {
749*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server;
750*38e8c45fSAndroid Build Coastguard Worker BinderLibTestBundle datai;
751*38e8c45fSAndroid Build Coastguard Worker BinderLibTestBundle datai2;
752*38e8c45fSAndroid Build Coastguard Worker
753*38e8c45fSAndroid Build Coastguard Worker server = addServer(&serverId[i]);
754*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
755*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(server);
756*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(BINDER_LIB_TEST_INDIRECT_TRANSACTION);
757*38e8c45fSAndroid Build Coastguard Worker
758*38e8c45fSAndroid Build Coastguard Worker datai.writeInt32(1);
759*38e8c45fSAndroid Build Coastguard Worker datai.writeStrongBinder(m_server);
760*38e8c45fSAndroid Build Coastguard Worker datai.writeInt32(BINDER_LIB_TEST_GET_ID_TRANSACTION);
761*38e8c45fSAndroid Build Coastguard Worker datai2.appendTo(&datai);
762*38e8c45fSAndroid Build Coastguard Worker
763*38e8c45fSAndroid Build Coastguard Worker datai.appendTo(&data);
764*38e8c45fSAndroid Build Coastguard Worker }
765*38e8c45fSAndroid Build Coastguard Worker
766*38e8c45fSAndroid Build Coastguard Worker ASSERT_THAT(m_server->transact(BINDER_LIB_TEST_INDIRECT_TRANSACTION, data, &reply),
767*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
768*38e8c45fSAndroid Build Coastguard Worker
769*38e8c45fSAndroid Build Coastguard Worker ASSERT_THAT(reply.readInt32(&id), StatusEq(NO_ERROR));
770*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0, id);
771*38e8c45fSAndroid Build Coastguard Worker
772*38e8c45fSAndroid Build Coastguard Worker ASSERT_THAT(reply.readInt32(&count), StatusEq(NO_ERROR));
773*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(countof(serverId), (size_t)count);
774*38e8c45fSAndroid Build Coastguard Worker
775*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < (size_t)count; i++) {
776*38e8c45fSAndroid Build Coastguard Worker int32_t counti;
777*38e8c45fSAndroid Build Coastguard Worker
778*38e8c45fSAndroid Build Coastguard Worker BinderLibTestBundle replyi(&reply);
779*38e8c45fSAndroid Build Coastguard Worker EXPECT_TRUE(replyi.isValid());
780*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(replyi.readInt32(&id), StatusEq(NO_ERROR));
781*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(serverId[i], id);
782*38e8c45fSAndroid Build Coastguard Worker
783*38e8c45fSAndroid Build Coastguard Worker ASSERT_THAT(replyi.readInt32(&counti), StatusEq(NO_ERROR));
784*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(1, counti);
785*38e8c45fSAndroid Build Coastguard Worker
786*38e8c45fSAndroid Build Coastguard Worker BinderLibTestBundle replyi2(&replyi);
787*38e8c45fSAndroid Build Coastguard Worker EXPECT_TRUE(replyi2.isValid());
788*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(replyi2.readInt32(&id), StatusEq(NO_ERROR));
789*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0, id);
790*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(replyi2.dataSize(), replyi2.dataPosition());
791*38e8c45fSAndroid Build Coastguard Worker
792*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(replyi.dataSize(), replyi.dataPosition());
793*38e8c45fSAndroid Build Coastguard Worker }
794*38e8c45fSAndroid Build Coastguard Worker
795*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(reply.dataSize(), reply.dataPosition());
796*38e8c45fSAndroid Build Coastguard Worker }
797*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,CallBack)798*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, CallBack)
799*38e8c45fSAndroid Build Coastguard Worker {
800*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
801*38e8c45fSAndroid Build Coastguard Worker sp<BinderLibTestCallBack> callBack = new BinderLibTestCallBack();
802*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(callBack);
803*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_NOP_CALL_BACK, data, &reply, TF_ONE_WAY),
804*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
805*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(callBack->waitEvent(5), StatusEq(NO_ERROR));
806*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(callBack->getResult(), StatusEq(NO_ERROR));
807*38e8c45fSAndroid Build Coastguard Worker }
808*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,BinderCallContextGuard)809*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, BinderCallContextGuard) {
810*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder = addServer();
811*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
812*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(binder->transact(BINDER_LIB_TEST_USE_CALLING_GUARD_TRANSACTION, data, &reply),
813*38e8c45fSAndroid Build Coastguard Worker StatusEq(DEAD_OBJECT));
814*38e8c45fSAndroid Build Coastguard Worker }
815*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,AddServer)816*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, AddServer)
817*38e8c45fSAndroid Build Coastguard Worker {
818*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
819*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
820*38e8c45fSAndroid Build Coastguard Worker }
821*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,DeathNotificationStrongRef)822*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, DeathNotificationStrongRef)
823*38e8c45fSAndroid Build Coastguard Worker {
824*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> sbinder;
825*38e8c45fSAndroid Build Coastguard Worker
826*38e8c45fSAndroid Build Coastguard Worker sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient();
827*38e8c45fSAndroid Build Coastguard Worker
828*38e8c45fSAndroid Build Coastguard Worker {
829*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder = addServer();
830*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(binder != nullptr);
831*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(binder->linkToDeath(testDeathRecipient), StatusEq(NO_ERROR));
832*38e8c45fSAndroid Build Coastguard Worker sbinder = binder;
833*38e8c45fSAndroid Build Coastguard Worker }
834*38e8c45fSAndroid Build Coastguard Worker {
835*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
836*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(sbinder->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY),
837*38e8c45fSAndroid Build Coastguard Worker StatusEq(OK));
838*38e8c45fSAndroid Build Coastguard Worker }
839*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->flushCommands();
840*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(testDeathRecipient->waitEvent(5), StatusEq(NO_ERROR));
841*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(sbinder->unlinkToDeath(testDeathRecipient), StatusEq(DEAD_OBJECT));
842*38e8c45fSAndroid Build Coastguard Worker }
843*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,DeathNotificationMultiple)844*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, DeathNotificationMultiple)
845*38e8c45fSAndroid Build Coastguard Worker {
846*38e8c45fSAndroid Build Coastguard Worker status_t ret;
847*38e8c45fSAndroid Build Coastguard Worker const int clientcount = 2;
848*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> target;
849*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> linkedclient[clientcount];
850*38e8c45fSAndroid Build Coastguard Worker sp<BinderLibTestCallBack> callBack[clientcount];
851*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> passiveclient[clientcount];
852*38e8c45fSAndroid Build Coastguard Worker
853*38e8c45fSAndroid Build Coastguard Worker target = addServer();
854*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(target != nullptr);
855*38e8c45fSAndroid Build Coastguard Worker for (int i = 0; i < clientcount; i++) {
856*38e8c45fSAndroid Build Coastguard Worker {
857*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
858*38e8c45fSAndroid Build Coastguard Worker
859*38e8c45fSAndroid Build Coastguard Worker linkedclient[i] = addServer();
860*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(linkedclient[i] != nullptr);
861*38e8c45fSAndroid Build Coastguard Worker callBack[i] = new BinderLibTestCallBack();
862*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(target);
863*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(callBack[i]);
864*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(linkedclient[i]->transact(BINDER_LIB_TEST_LINK_DEATH_TRANSACTION, data,
865*38e8c45fSAndroid Build Coastguard Worker &reply, TF_ONE_WAY),
866*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
867*38e8c45fSAndroid Build Coastguard Worker }
868*38e8c45fSAndroid Build Coastguard Worker {
869*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
870*38e8c45fSAndroid Build Coastguard Worker
871*38e8c45fSAndroid Build Coastguard Worker passiveclient[i] = addServer();
872*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(passiveclient[i] != nullptr);
873*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(target);
874*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(passiveclient[i]->transact(BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION, data,
875*38e8c45fSAndroid Build Coastguard Worker &reply, TF_ONE_WAY),
876*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
877*38e8c45fSAndroid Build Coastguard Worker }
878*38e8c45fSAndroid Build Coastguard Worker }
879*38e8c45fSAndroid Build Coastguard Worker {
880*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
881*38e8c45fSAndroid Build Coastguard Worker ret = target->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY);
882*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0, ret);
883*38e8c45fSAndroid Build Coastguard Worker }
884*38e8c45fSAndroid Build Coastguard Worker
885*38e8c45fSAndroid Build Coastguard Worker for (int i = 0; i < clientcount; i++) {
886*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(callBack[i]->waitEvent(5), StatusEq(NO_ERROR));
887*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(callBack[i]->getResult(), StatusEq(NO_ERROR));
888*38e8c45fSAndroid Build Coastguard Worker }
889*38e8c45fSAndroid Build Coastguard Worker }
890*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,DeathNotificationThread)891*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, DeathNotificationThread)
892*38e8c45fSAndroid Build Coastguard Worker {
893*38e8c45fSAndroid Build Coastguard Worker status_t ret;
894*38e8c45fSAndroid Build Coastguard Worker sp<BinderLibTestCallBack> callback;
895*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> target = addServer();
896*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(target != nullptr);
897*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> client = addServer();
898*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(client != nullptr);
899*38e8c45fSAndroid Build Coastguard Worker
900*38e8c45fSAndroid Build Coastguard Worker sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient();
901*38e8c45fSAndroid Build Coastguard Worker
902*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(target->linkToDeath(testDeathRecipient), StatusEq(NO_ERROR));
903*38e8c45fSAndroid Build Coastguard Worker
904*38e8c45fSAndroid Build Coastguard Worker {
905*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
906*38e8c45fSAndroid Build Coastguard Worker ret = target->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY);
907*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0, ret);
908*38e8c45fSAndroid Build Coastguard Worker }
909*38e8c45fSAndroid Build Coastguard Worker
910*38e8c45fSAndroid Build Coastguard Worker /* Make sure it's dead */
911*38e8c45fSAndroid Build Coastguard Worker testDeathRecipient->waitEvent(5);
912*38e8c45fSAndroid Build Coastguard Worker
913*38e8c45fSAndroid Build Coastguard Worker /* Now, pass the ref to another process and ask that process to
914*38e8c45fSAndroid Build Coastguard Worker * call linkToDeath() on it, and wait for a response. This tests
915*38e8c45fSAndroid Build Coastguard Worker * two things:
916*38e8c45fSAndroid Build Coastguard Worker * 1) You still get death notifications when calling linkToDeath()
917*38e8c45fSAndroid Build Coastguard Worker * on a ref that is already dead when it was passed to you.
918*38e8c45fSAndroid Build Coastguard Worker * 2) That death notifications are not directly pushed to the thread
919*38e8c45fSAndroid Build Coastguard Worker * registering them, but to the threadpool (proc workqueue) instead.
920*38e8c45fSAndroid Build Coastguard Worker *
921*38e8c45fSAndroid Build Coastguard Worker * 2) is tested because the thread handling BINDER_LIB_TEST_DEATH_TRANSACTION
922*38e8c45fSAndroid Build Coastguard Worker * is blocked on a condition variable waiting for the death notification to be
923*38e8c45fSAndroid Build Coastguard Worker * called; therefore, that thread is not available for handling proc work.
924*38e8c45fSAndroid Build Coastguard Worker * So, if the death notification was pushed to the thread workqueue, the callback
925*38e8c45fSAndroid Build Coastguard Worker * would never be called, and the test would timeout and fail.
926*38e8c45fSAndroid Build Coastguard Worker *
927*38e8c45fSAndroid Build Coastguard Worker * Note that we can't do this part of the test from this thread itself, because
928*38e8c45fSAndroid Build Coastguard Worker * the binder driver would only push death notifications to the thread if
929*38e8c45fSAndroid Build Coastguard Worker * it is a looper thread, which this thread is not.
930*38e8c45fSAndroid Build Coastguard Worker *
931*38e8c45fSAndroid Build Coastguard Worker * See b/23525545 for details.
932*38e8c45fSAndroid Build Coastguard Worker */
933*38e8c45fSAndroid Build Coastguard Worker {
934*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
935*38e8c45fSAndroid Build Coastguard Worker
936*38e8c45fSAndroid Build Coastguard Worker callback = new BinderLibTestCallBack();
937*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(target);
938*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(callback);
939*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(client->transact(BINDER_LIB_TEST_LINK_DEATH_TRANSACTION, data, &reply,
940*38e8c45fSAndroid Build Coastguard Worker TF_ONE_WAY),
941*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
942*38e8c45fSAndroid Build Coastguard Worker }
943*38e8c45fSAndroid Build Coastguard Worker
944*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(callback->waitEvent(5), StatusEq(NO_ERROR));
945*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(callback->getResult(), StatusEq(NO_ERROR));
946*38e8c45fSAndroid Build Coastguard Worker }
947*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,ReturnErrorIfKernelDoesNotSupportFreezeNotification)948*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, ReturnErrorIfKernelDoesNotSupportFreezeNotification) {
949*38e8c45fSAndroid Build Coastguard Worker if (ProcessState::isDriverFeatureEnabled(ProcessState::DriverFeature::FREEZE_NOTIFICATION)) {
950*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "Skipping test for kernels that support FREEZE_NOTIFICATION";
951*38e8c45fSAndroid Build Coastguard Worker return;
952*38e8c45fSAndroid Build Coastguard Worker }
953*38e8c45fSAndroid Build Coastguard Worker sp<TestFrozenStateChangeCallback> callback = sp<TestFrozenStateChangeCallback>::make();
954*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder = addServer();
955*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(nullptr, binder);
956*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(nullptr, binder->localBinder());
957*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(binder->addFrozenStateChangeCallback(callback), StatusEq(INVALID_OPERATION));
958*38e8c45fSAndroid Build Coastguard Worker }
959*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,FrozenStateChangeNotificatiion)960*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, FrozenStateChangeNotificatiion) {
961*38e8c45fSAndroid Build Coastguard Worker if (!checkFreezeAndNotificationSupport()) {
962*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "Skipping test for kernels that do not support FREEZE_NOTIFICATION";
963*38e8c45fSAndroid Build Coastguard Worker return;
964*38e8c45fSAndroid Build Coastguard Worker }
965*38e8c45fSAndroid Build Coastguard Worker sp<TestFrozenStateChangeCallback> callback = sp<TestFrozenStateChangeCallback>::make();
966*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder = addServer();
967*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(nullptr, binder);
968*38e8c45fSAndroid Build Coastguard Worker int32_t pid;
969*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(getBinderPid(&pid, binder));
970*38e8c45fSAndroid Build Coastguard Worker
971*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(binder->addFrozenStateChangeCallback(callback), StatusEq(NO_ERROR));
972*38e8c45fSAndroid Build Coastguard Worker // Expect current state (unfrozen) to be delivered immediately.
973*38e8c45fSAndroid Build Coastguard Worker callback->ensureUnfrozenEventReceived();
974*38e8c45fSAndroid Build Coastguard Worker // Check that the process hasn't died otherwise there's a risk of freezing
975*38e8c45fSAndroid Build Coastguard Worker // the wrong process.
976*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, binder->pingBinder());
977*38e8c45fSAndroid Build Coastguard Worker freezeProcess(pid);
978*38e8c45fSAndroid Build Coastguard Worker callback->ensureFrozenEventReceived();
979*38e8c45fSAndroid Build Coastguard Worker unfreezeProcess(pid);
980*38e8c45fSAndroid Build Coastguard Worker callback->ensureUnfrozenEventReceived();
981*38e8c45fSAndroid Build Coastguard Worker removeCallbackAndValidateNoEvent(binder, callback);
982*38e8c45fSAndroid Build Coastguard Worker }
983*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,AddFrozenCallbackWhenFrozen)984*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, AddFrozenCallbackWhenFrozen) {
985*38e8c45fSAndroid Build Coastguard Worker if (!checkFreezeAndNotificationSupport()) {
986*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "Skipping test for kernels that do not support FREEZE_NOTIFICATION";
987*38e8c45fSAndroid Build Coastguard Worker return;
988*38e8c45fSAndroid Build Coastguard Worker }
989*38e8c45fSAndroid Build Coastguard Worker sp<TestFrozenStateChangeCallback> callback = sp<TestFrozenStateChangeCallback>::make();
990*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder = addServer();
991*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(nullptr, binder);
992*38e8c45fSAndroid Build Coastguard Worker int32_t pid;
993*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(getBinderPid(&pid, binder));
994*38e8c45fSAndroid Build Coastguard Worker
995*38e8c45fSAndroid Build Coastguard Worker // Check that the process hasn't died otherwise there's a risk of freezing
996*38e8c45fSAndroid Build Coastguard Worker // the wrong process.
997*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, binder->pingBinder());
998*38e8c45fSAndroid Build Coastguard Worker freezeProcess(pid);
999*38e8c45fSAndroid Build Coastguard Worker // Add the callback while the target process is frozen.
1000*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(binder->addFrozenStateChangeCallback(callback), StatusEq(NO_ERROR));
1001*38e8c45fSAndroid Build Coastguard Worker callback->ensureFrozenEventReceived();
1002*38e8c45fSAndroid Build Coastguard Worker unfreezeProcess(pid);
1003*38e8c45fSAndroid Build Coastguard Worker callback->ensureUnfrozenEventReceived();
1004*38e8c45fSAndroid Build Coastguard Worker removeCallbackAndValidateNoEvent(binder, callback);
1005*38e8c45fSAndroid Build Coastguard Worker
1006*38e8c45fSAndroid Build Coastguard Worker // Check that the process hasn't died otherwise there's a risk of freezing
1007*38e8c45fSAndroid Build Coastguard Worker // the wrong process.
1008*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, binder->pingBinder());
1009*38e8c45fSAndroid Build Coastguard Worker freezeProcess(pid);
1010*38e8c45fSAndroid Build Coastguard Worker unfreezeProcess(pid);
1011*38e8c45fSAndroid Build Coastguard Worker // Make sure no callback happens since the listener has been removed.
1012*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0u, callback->events.size());
1013*38e8c45fSAndroid Build Coastguard Worker }
1014*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,NoFrozenNotificationAfterCallbackRemoval)1015*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, NoFrozenNotificationAfterCallbackRemoval) {
1016*38e8c45fSAndroid Build Coastguard Worker if (!checkFreezeAndNotificationSupport()) {
1017*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "Skipping test for kernels that do not support FREEZE_NOTIFICATION";
1018*38e8c45fSAndroid Build Coastguard Worker return;
1019*38e8c45fSAndroid Build Coastguard Worker }
1020*38e8c45fSAndroid Build Coastguard Worker sp<TestFrozenStateChangeCallback> callback = sp<TestFrozenStateChangeCallback>::make();
1021*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder = addServer();
1022*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(nullptr, binder);
1023*38e8c45fSAndroid Build Coastguard Worker int32_t pid;
1024*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(getBinderPid(&pid, binder));
1025*38e8c45fSAndroid Build Coastguard Worker
1026*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(binder->addFrozenStateChangeCallback(callback), StatusEq(NO_ERROR));
1027*38e8c45fSAndroid Build Coastguard Worker callback->ensureUnfrozenEventReceived();
1028*38e8c45fSAndroid Build Coastguard Worker removeCallbackAndValidateNoEvent(binder, callback);
1029*38e8c45fSAndroid Build Coastguard Worker
1030*38e8c45fSAndroid Build Coastguard Worker // Make sure no callback happens after the listener is removed.
1031*38e8c45fSAndroid Build Coastguard Worker freezeProcess(pid);
1032*38e8c45fSAndroid Build Coastguard Worker unfreezeProcess(pid);
1033*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0u, callback->events.size());
1034*38e8c45fSAndroid Build Coastguard Worker }
1035*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,MultipleFrozenStateChangeCallbacks)1036*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, MultipleFrozenStateChangeCallbacks) {
1037*38e8c45fSAndroid Build Coastguard Worker if (!checkFreezeAndNotificationSupport()) {
1038*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "Skipping test for kernels that do not support FREEZE_NOTIFICATION";
1039*38e8c45fSAndroid Build Coastguard Worker return;
1040*38e8c45fSAndroid Build Coastguard Worker }
1041*38e8c45fSAndroid Build Coastguard Worker sp<TestFrozenStateChangeCallback> callback1 = sp<TestFrozenStateChangeCallback>::make();
1042*38e8c45fSAndroid Build Coastguard Worker sp<TestFrozenStateChangeCallback> callback2 = sp<TestFrozenStateChangeCallback>::make();
1043*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder = addServer();
1044*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(nullptr, binder);
1045*38e8c45fSAndroid Build Coastguard Worker int32_t pid;
1046*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(getBinderPid(&pid, binder));
1047*38e8c45fSAndroid Build Coastguard Worker
1048*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(binder->addFrozenStateChangeCallback(callback1), StatusEq(NO_ERROR));
1049*38e8c45fSAndroid Build Coastguard Worker // Expect current state (unfrozen) to be delivered immediately.
1050*38e8c45fSAndroid Build Coastguard Worker callback1->ensureUnfrozenEventReceived();
1051*38e8c45fSAndroid Build Coastguard Worker
1052*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(binder->addFrozenStateChangeCallback(callback2), StatusEq(NO_ERROR));
1053*38e8c45fSAndroid Build Coastguard Worker // Expect current state (unfrozen) to be delivered immediately.
1054*38e8c45fSAndroid Build Coastguard Worker callback2->ensureUnfrozenEventReceived();
1055*38e8c45fSAndroid Build Coastguard Worker
1056*38e8c45fSAndroid Build Coastguard Worker freezeProcess(pid);
1057*38e8c45fSAndroid Build Coastguard Worker callback1->ensureFrozenEventReceived();
1058*38e8c45fSAndroid Build Coastguard Worker callback2->ensureFrozenEventReceived();
1059*38e8c45fSAndroid Build Coastguard Worker
1060*38e8c45fSAndroid Build Coastguard Worker removeCallbackAndValidateNoEvent(binder, callback1);
1061*38e8c45fSAndroid Build Coastguard Worker unfreezeProcess(pid);
1062*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0u, callback1->events.size());
1063*38e8c45fSAndroid Build Coastguard Worker callback2->ensureUnfrozenEventReceived();
1064*38e8c45fSAndroid Build Coastguard Worker removeCallbackAndValidateNoEvent(binder, callback2);
1065*38e8c45fSAndroid Build Coastguard Worker
1066*38e8c45fSAndroid Build Coastguard Worker freezeProcess(pid);
1067*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0u, callback2->events.size());
1068*38e8c45fSAndroid Build Coastguard Worker }
1069*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,RemoveThenAddFrozenStateChangeCallbacks)1070*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, RemoveThenAddFrozenStateChangeCallbacks) {
1071*38e8c45fSAndroid Build Coastguard Worker if (!checkFreezeAndNotificationSupport()) {
1072*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "Skipping test for kernels that do not support FREEZE_NOTIFICATION";
1073*38e8c45fSAndroid Build Coastguard Worker return;
1074*38e8c45fSAndroid Build Coastguard Worker }
1075*38e8c45fSAndroid Build Coastguard Worker sp<TestFrozenStateChangeCallback> callback = sp<TestFrozenStateChangeCallback>::make();
1076*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder = addServer();
1077*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(nullptr, binder);
1078*38e8c45fSAndroid Build Coastguard Worker int32_t pid;
1079*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(getBinderPid(&pid, binder));
1080*38e8c45fSAndroid Build Coastguard Worker
1081*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(binder->addFrozenStateChangeCallback(callback), StatusEq(NO_ERROR));
1082*38e8c45fSAndroid Build Coastguard Worker // Expect current state (unfrozen) to be delivered immediately.
1083*38e8c45fSAndroid Build Coastguard Worker callback->ensureUnfrozenEventReceived();
1084*38e8c45fSAndroid Build Coastguard Worker removeCallbackAndValidateNoEvent(binder, callback);
1085*38e8c45fSAndroid Build Coastguard Worker
1086*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(binder->addFrozenStateChangeCallback(callback), StatusEq(NO_ERROR));
1087*38e8c45fSAndroid Build Coastguard Worker callback->ensureUnfrozenEventReceived();
1088*38e8c45fSAndroid Build Coastguard Worker }
1089*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,CoalesceFreezeCallbacksWhenListenerIsFrozen)1090*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, CoalesceFreezeCallbacksWhenListenerIsFrozen) {
1091*38e8c45fSAndroid Build Coastguard Worker if (!checkFreezeAndNotificationSupport()) {
1092*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "Skipping test for kernels that do not support FREEZE_NOTIFICATION";
1093*38e8c45fSAndroid Build Coastguard Worker return;
1094*38e8c45fSAndroid Build Coastguard Worker }
1095*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder = addServer();
1096*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> listener = addServer();
1097*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(nullptr, binder);
1098*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(nullptr, listener);
1099*38e8c45fSAndroid Build Coastguard Worker int32_t pid, listenerPid;
1100*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(getBinderPid(&pid, binder));
1101*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(getBinderPid(&listenerPid, listener));
1102*38e8c45fSAndroid Build Coastguard Worker
1103*38e8c45fSAndroid Build Coastguard Worker // Ask the listener process to register for state change callbacks.
1104*38e8c45fSAndroid Build Coastguard Worker {
1105*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1106*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(binder);
1107*38e8c45fSAndroid Build Coastguard Worker ASSERT_THAT(listener->transact(BINDER_LIB_TEST_LISTEN_FOR_FROZEN_STATE_CHANGE, data,
1108*38e8c45fSAndroid Build Coastguard Worker &reply),
1109*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
1110*38e8c45fSAndroid Build Coastguard Worker }
1111*38e8c45fSAndroid Build Coastguard Worker // Freeze the listener process.
1112*38e8c45fSAndroid Build Coastguard Worker freezeProcess(listenerPid);
1113*38e8c45fSAndroid Build Coastguard Worker createProcessGroup(getuid(), listenerPid);
1114*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(SetProcessProfiles(getuid(), listenerPid, {"Frozen"}));
1115*38e8c45fSAndroid Build Coastguard Worker // Repeatedly flip the target process between frozen and unfrozen states.
1116*38e8c45fSAndroid Build Coastguard Worker for (int i = 0; i < 1000; i++) {
1117*38e8c45fSAndroid Build Coastguard Worker usleep(50);
1118*38e8c45fSAndroid Build Coastguard Worker unfreezeProcess(pid);
1119*38e8c45fSAndroid Build Coastguard Worker usleep(50);
1120*38e8c45fSAndroid Build Coastguard Worker freezeProcess(pid);
1121*38e8c45fSAndroid Build Coastguard Worker }
1122*38e8c45fSAndroid Build Coastguard Worker // Unfreeze the listener process. Now it should receive the frozen state
1123*38e8c45fSAndroid Build Coastguard Worker // change notifications.
1124*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(SetProcessProfiles(getuid(), listenerPid, {"Unfrozen"}));
1125*38e8c45fSAndroid Build Coastguard Worker unfreezeProcess(listenerPid);
1126*38e8c45fSAndroid Build Coastguard Worker // Wait for 500ms to give the process enough time to wake up and handle
1127*38e8c45fSAndroid Build Coastguard Worker // notifications.
1128*38e8c45fSAndroid Build Coastguard Worker usleep(500 * 1000);
1129*38e8c45fSAndroid Build Coastguard Worker {
1130*38e8c45fSAndroid Build Coastguard Worker std::vector<bool> events;
1131*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1132*38e8c45fSAndroid Build Coastguard Worker ASSERT_THAT(listener->transact(BINDER_LIB_TEST_CONSUME_STATE_CHANGE_EVENTS, data, &reply),
1133*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
1134*38e8c45fSAndroid Build Coastguard Worker reply.readBoolVector(&events);
1135*38e8c45fSAndroid Build Coastguard Worker // There should only be one single state change notifications delievered.
1136*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(1u, events.size());
1137*38e8c45fSAndroid Build Coastguard Worker EXPECT_TRUE(events[0]);
1138*38e8c45fSAndroid Build Coastguard Worker }
1139*38e8c45fSAndroid Build Coastguard Worker }
1140*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,PassFile)1141*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, PassFile) {
1142*38e8c45fSAndroid Build Coastguard Worker int ret;
1143*38e8c45fSAndroid Build Coastguard Worker int pipefd[2];
1144*38e8c45fSAndroid Build Coastguard Worker uint8_t buf[1] = { 0 };
1145*38e8c45fSAndroid Build Coastguard Worker uint8_t write_value = 123;
1146*38e8c45fSAndroid Build Coastguard Worker
1147*38e8c45fSAndroid Build Coastguard Worker ret = pipe2(pipefd, O_NONBLOCK);
1148*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(0, ret);
1149*38e8c45fSAndroid Build Coastguard Worker
1150*38e8c45fSAndroid Build Coastguard Worker {
1151*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1152*38e8c45fSAndroid Build Coastguard Worker uint8_t writebuf[1] = { write_value };
1153*38e8c45fSAndroid Build Coastguard Worker
1154*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(data.writeFileDescriptor(pipefd[1], true), StatusEq(NO_ERROR));
1155*38e8c45fSAndroid Build Coastguard Worker
1156*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(data.writeInt32(sizeof(writebuf)), StatusEq(NO_ERROR));
1157*38e8c45fSAndroid Build Coastguard Worker
1158*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(data.write(writebuf, sizeof(writebuf)), StatusEq(NO_ERROR));
1159*38e8c45fSAndroid Build Coastguard Worker
1160*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_WRITE_FILE_TRANSACTION, data, &reply),
1161*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
1162*38e8c45fSAndroid Build Coastguard Worker }
1163*38e8c45fSAndroid Build Coastguard Worker
1164*38e8c45fSAndroid Build Coastguard Worker ret = read(pipefd[0], buf, sizeof(buf));
1165*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sizeof(buf), (size_t)ret);
1166*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(write_value, buf[0]);
1167*38e8c45fSAndroid Build Coastguard Worker
1168*38e8c45fSAndroid Build Coastguard Worker waitForReadData(pipefd[0], 5000); /* wait for other proccess to close pipe */
1169*38e8c45fSAndroid Build Coastguard Worker
1170*38e8c45fSAndroid Build Coastguard Worker ret = read(pipefd[0], buf, sizeof(buf));
1171*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0, ret);
1172*38e8c45fSAndroid Build Coastguard Worker
1173*38e8c45fSAndroid Build Coastguard Worker close(pipefd[0]);
1174*38e8c45fSAndroid Build Coastguard Worker }
1175*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,PassParcelFileDescriptor)1176*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, PassParcelFileDescriptor) {
1177*38e8c45fSAndroid Build Coastguard Worker const int datasize = 123;
1178*38e8c45fSAndroid Build Coastguard Worker std::vector<uint8_t> writebuf(datasize);
1179*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < writebuf.size(); ++i) {
1180*38e8c45fSAndroid Build Coastguard Worker writebuf[i] = i;
1181*38e8c45fSAndroid Build Coastguard Worker }
1182*38e8c45fSAndroid Build Coastguard Worker
1183*38e8c45fSAndroid Build Coastguard Worker unique_fd read_end, write_end;
1184*38e8c45fSAndroid Build Coastguard Worker {
1185*38e8c45fSAndroid Build Coastguard Worker int pipefd[2];
1186*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(0, pipe2(pipefd, O_NONBLOCK));
1187*38e8c45fSAndroid Build Coastguard Worker read_end.reset(pipefd[0]);
1188*38e8c45fSAndroid Build Coastguard Worker write_end.reset(pipefd[1]);
1189*38e8c45fSAndroid Build Coastguard Worker }
1190*38e8c45fSAndroid Build Coastguard Worker {
1191*38e8c45fSAndroid Build Coastguard Worker Parcel data;
1192*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, data.writeDupParcelFileDescriptor(write_end.get()));
1193*38e8c45fSAndroid Build Coastguard Worker write_end.reset();
1194*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, data.writeInt32(datasize));
1195*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, data.write(writebuf.data(), datasize));
1196*38e8c45fSAndroid Build Coastguard Worker
1197*38e8c45fSAndroid Build Coastguard Worker Parcel reply;
1198*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR,
1199*38e8c45fSAndroid Build Coastguard Worker m_server->transact(BINDER_LIB_TEST_WRITE_PARCEL_FILE_DESCRIPTOR_TRANSACTION, data,
1200*38e8c45fSAndroid Build Coastguard Worker &reply));
1201*38e8c45fSAndroid Build Coastguard Worker }
1202*38e8c45fSAndroid Build Coastguard Worker std::vector<uint8_t> readbuf(datasize);
1203*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(datasize, read(read_end.get(), readbuf.data(), datasize));
1204*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(writebuf, readbuf);
1205*38e8c45fSAndroid Build Coastguard Worker
1206*38e8c45fSAndroid Build Coastguard Worker waitForReadData(read_end.get(), 5000); /* wait for other proccess to close pipe */
1207*38e8c45fSAndroid Build Coastguard Worker
1208*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0, read(read_end.get(), readbuf.data(), datasize));
1209*38e8c45fSAndroid Build Coastguard Worker }
1210*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,RecvOwnedFileDescriptors)1211*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, RecvOwnedFileDescriptors) {
1212*38e8c45fSAndroid Build Coastguard Worker FdLeakDetector fd_leak_detector;
1213*38e8c45fSAndroid Build Coastguard Worker
1214*38e8c45fSAndroid Build Coastguard Worker Parcel data;
1215*38e8c45fSAndroid Build Coastguard Worker Parcel reply;
1216*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR,
1217*38e8c45fSAndroid Build Coastguard Worker m_server->transact(BINDER_LIB_TEST_GET_FILE_DESCRIPTORS_OWNED_TRANSACTION, data,
1218*38e8c45fSAndroid Build Coastguard Worker &reply));
1219*38e8c45fSAndroid Build Coastguard Worker unique_fd a, b;
1220*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, reply.readUniqueFileDescriptor(&a));
1221*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, reply.readUniqueFileDescriptor(&b));
1222*38e8c45fSAndroid Build Coastguard Worker }
1223*38e8c45fSAndroid Build Coastguard Worker
1224*38e8c45fSAndroid Build Coastguard Worker // Used to trigger fdsan error (b/239222407).
TEST_F(BinderLibTest,RecvOwnedFileDescriptorsAndWriteInt)1225*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, RecvOwnedFileDescriptorsAndWriteInt) {
1226*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "triggers fdsan false positive: b/370824489";
1227*38e8c45fSAndroid Build Coastguard Worker
1228*38e8c45fSAndroid Build Coastguard Worker FdLeakDetector fd_leak_detector;
1229*38e8c45fSAndroid Build Coastguard Worker
1230*38e8c45fSAndroid Build Coastguard Worker Parcel data;
1231*38e8c45fSAndroid Build Coastguard Worker Parcel reply;
1232*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR,
1233*38e8c45fSAndroid Build Coastguard Worker m_server->transact(BINDER_LIB_TEST_GET_FILE_DESCRIPTORS_OWNED_TRANSACTION, data,
1234*38e8c45fSAndroid Build Coastguard Worker &reply));
1235*38e8c45fSAndroid Build Coastguard Worker reply.setDataPosition(reply.dataSize());
1236*38e8c45fSAndroid Build Coastguard Worker reply.writeInt32(0);
1237*38e8c45fSAndroid Build Coastguard Worker reply.setDataPosition(0);
1238*38e8c45fSAndroid Build Coastguard Worker unique_fd a, b;
1239*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, reply.readUniqueFileDescriptor(&a));
1240*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, reply.readUniqueFileDescriptor(&b));
1241*38e8c45fSAndroid Build Coastguard Worker }
1242*38e8c45fSAndroid Build Coastguard Worker
1243*38e8c45fSAndroid Build Coastguard Worker // Used to trigger fdsan error (b/239222407).
TEST_F(BinderLibTest,RecvOwnedFileDescriptorsAndTruncate)1244*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, RecvOwnedFileDescriptorsAndTruncate) {
1245*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "triggers fdsan false positive: b/370824489";
1246*38e8c45fSAndroid Build Coastguard Worker
1247*38e8c45fSAndroid Build Coastguard Worker FdLeakDetector fd_leak_detector;
1248*38e8c45fSAndroid Build Coastguard Worker
1249*38e8c45fSAndroid Build Coastguard Worker Parcel data;
1250*38e8c45fSAndroid Build Coastguard Worker Parcel reply;
1251*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR,
1252*38e8c45fSAndroid Build Coastguard Worker m_server->transact(BINDER_LIB_TEST_GET_FILE_DESCRIPTORS_OWNED_TRANSACTION, data,
1253*38e8c45fSAndroid Build Coastguard Worker &reply));
1254*38e8c45fSAndroid Build Coastguard Worker reply.setDataSize(reply.dataSize() - sizeof(flat_binder_object));
1255*38e8c45fSAndroid Build Coastguard Worker unique_fd a, b;
1256*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, reply.readUniqueFileDescriptor(&a));
1257*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BAD_TYPE, reply.readUniqueFileDescriptor(&b));
1258*38e8c45fSAndroid Build Coastguard Worker }
1259*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,RecvUnownedFileDescriptors)1260*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, RecvUnownedFileDescriptors) {
1261*38e8c45fSAndroid Build Coastguard Worker FdLeakDetector fd_leak_detector;
1262*38e8c45fSAndroid Build Coastguard Worker
1263*38e8c45fSAndroid Build Coastguard Worker Parcel data;
1264*38e8c45fSAndroid Build Coastguard Worker Parcel reply;
1265*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR,
1266*38e8c45fSAndroid Build Coastguard Worker m_server->transact(BINDER_LIB_TEST_GET_FILE_DESCRIPTORS_UNOWNED_TRANSACTION, data,
1267*38e8c45fSAndroid Build Coastguard Worker &reply));
1268*38e8c45fSAndroid Build Coastguard Worker unique_fd a, b;
1269*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, reply.readUniqueFileDescriptor(&a));
1270*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, reply.readUniqueFileDescriptor(&b));
1271*38e8c45fSAndroid Build Coastguard Worker }
1272*38e8c45fSAndroid Build Coastguard Worker
1273*38e8c45fSAndroid Build Coastguard Worker // Used to trigger fdsan error (b/239222407).
TEST_F(BinderLibTest,RecvUnownedFileDescriptorsAndWriteInt)1274*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, RecvUnownedFileDescriptorsAndWriteInt) {
1275*38e8c45fSAndroid Build Coastguard Worker FdLeakDetector fd_leak_detector;
1276*38e8c45fSAndroid Build Coastguard Worker
1277*38e8c45fSAndroid Build Coastguard Worker Parcel data;
1278*38e8c45fSAndroid Build Coastguard Worker Parcel reply;
1279*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR,
1280*38e8c45fSAndroid Build Coastguard Worker m_server->transact(BINDER_LIB_TEST_GET_FILE_DESCRIPTORS_UNOWNED_TRANSACTION, data,
1281*38e8c45fSAndroid Build Coastguard Worker &reply));
1282*38e8c45fSAndroid Build Coastguard Worker reply.setDataPosition(reply.dataSize());
1283*38e8c45fSAndroid Build Coastguard Worker reply.writeInt32(0);
1284*38e8c45fSAndroid Build Coastguard Worker reply.setDataPosition(0);
1285*38e8c45fSAndroid Build Coastguard Worker unique_fd a, b;
1286*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, reply.readUniqueFileDescriptor(&a));
1287*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, reply.readUniqueFileDescriptor(&b));
1288*38e8c45fSAndroid Build Coastguard Worker }
1289*38e8c45fSAndroid Build Coastguard Worker
1290*38e8c45fSAndroid Build Coastguard Worker // Used to trigger fdsan error (b/239222407).
TEST_F(BinderLibTest,RecvUnownedFileDescriptorsAndTruncate)1291*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, RecvUnownedFileDescriptorsAndTruncate) {
1292*38e8c45fSAndroid Build Coastguard Worker FdLeakDetector fd_leak_detector;
1293*38e8c45fSAndroid Build Coastguard Worker
1294*38e8c45fSAndroid Build Coastguard Worker Parcel data;
1295*38e8c45fSAndroid Build Coastguard Worker Parcel reply;
1296*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR,
1297*38e8c45fSAndroid Build Coastguard Worker m_server->transact(BINDER_LIB_TEST_GET_FILE_DESCRIPTORS_UNOWNED_TRANSACTION, data,
1298*38e8c45fSAndroid Build Coastguard Worker &reply));
1299*38e8c45fSAndroid Build Coastguard Worker reply.setDataSize(reply.dataSize() - sizeof(flat_binder_object));
1300*38e8c45fSAndroid Build Coastguard Worker unique_fd a, b;
1301*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, reply.readUniqueFileDescriptor(&a));
1302*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BAD_TYPE, reply.readUniqueFileDescriptor(&b));
1303*38e8c45fSAndroid Build Coastguard Worker }
1304*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,PromoteLocal)1305*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, PromoteLocal) {
1306*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> strong = new BBinder();
1307*38e8c45fSAndroid Build Coastguard Worker wp<IBinder> weak = strong;
1308*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> strong_from_weak = weak.promote();
1309*38e8c45fSAndroid Build Coastguard Worker EXPECT_TRUE(strong != nullptr);
1310*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(strong, strong_from_weak);
1311*38e8c45fSAndroid Build Coastguard Worker strong = nullptr;
1312*38e8c45fSAndroid Build Coastguard Worker strong_from_weak = nullptr;
1313*38e8c45fSAndroid Build Coastguard Worker strong_from_weak = weak.promote();
1314*38e8c45fSAndroid Build Coastguard Worker EXPECT_TRUE(strong_from_weak == nullptr);
1315*38e8c45fSAndroid Build Coastguard Worker }
1316*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,LocalGetExtension)1317*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, LocalGetExtension) {
1318*38e8c45fSAndroid Build Coastguard Worker sp<BBinder> binder = new BBinder();
1319*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> ext = new BBinder();
1320*38e8c45fSAndroid Build Coastguard Worker binder->setExtension(ext);
1321*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(ext, binder->getExtension());
1322*38e8c45fSAndroid Build Coastguard Worker }
1323*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,RemoteGetExtension)1324*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, RemoteGetExtension) {
1325*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
1326*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
1327*38e8c45fSAndroid Build Coastguard Worker
1328*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> extension;
1329*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, server->getExtension(&extension));
1330*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(nullptr, extension.get());
1331*38e8c45fSAndroid Build Coastguard Worker
1332*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, extension->pingBinder());
1333*38e8c45fSAndroid Build Coastguard Worker }
1334*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,CheckHandleZeroBinderHighBitsZeroCookie)1335*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, CheckHandleZeroBinderHighBitsZeroCookie) {
1336*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1337*38e8c45fSAndroid Build Coastguard Worker
1338*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_GET_SELF_TRANSACTION, data, &reply),
1339*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
1340*38e8c45fSAndroid Build Coastguard Worker
1341*38e8c45fSAndroid Build Coastguard Worker const flat_binder_object *fb = reply.readObject(false);
1342*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(fb != nullptr);
1343*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BINDER_TYPE_HANDLE, fb->hdr.type);
1344*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(m_server, ProcessState::self()->getStrongProxyForHandle(fb->handle));
1345*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ((binder_uintptr_t)0, fb->cookie);
1346*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ((uint64_t)0, (uint64_t)fb->binder >> 32);
1347*38e8c45fSAndroid Build Coastguard Worker }
1348*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,FreedBinder)1349*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, FreedBinder) {
1350*38e8c45fSAndroid Build Coastguard Worker status_t ret;
1351*38e8c45fSAndroid Build Coastguard Worker
1352*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
1353*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
1354*38e8c45fSAndroid Build Coastguard Worker
1355*38e8c45fSAndroid Build Coastguard Worker __u32 freedHandle;
1356*38e8c45fSAndroid Build Coastguard Worker wp<IBinder> keepFreedBinder;
1357*38e8c45fSAndroid Build Coastguard Worker {
1358*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1359*38e8c45fSAndroid Build Coastguard Worker ASSERT_THAT(server->transact(BINDER_LIB_TEST_CREATE_BINDER_TRANSACTION, data, &reply),
1360*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
1361*38e8c45fSAndroid Build Coastguard Worker struct flat_binder_object *freed = (struct flat_binder_object *)(reply.data());
1362*38e8c45fSAndroid Build Coastguard Worker freedHandle = freed->handle;
1363*38e8c45fSAndroid Build Coastguard Worker /* Add a weak ref to the freed binder so the driver does not
1364*38e8c45fSAndroid Build Coastguard Worker * delete its reference to it - otherwise the transaction
1365*38e8c45fSAndroid Build Coastguard Worker * fails regardless of whether the driver is fixed.
1366*38e8c45fSAndroid Build Coastguard Worker */
1367*38e8c45fSAndroid Build Coastguard Worker keepFreedBinder = reply.readStrongBinder();
1368*38e8c45fSAndroid Build Coastguard Worker }
1369*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->flushCommands();
1370*38e8c45fSAndroid Build Coastguard Worker {
1371*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1372*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(server);
1373*38e8c45fSAndroid Build Coastguard Worker /* Replace original handle with handle to the freed binder */
1374*38e8c45fSAndroid Build Coastguard Worker struct flat_binder_object *strong = (struct flat_binder_object *)(data.data());
1375*38e8c45fSAndroid Build Coastguard Worker __u32 oldHandle = strong->handle;
1376*38e8c45fSAndroid Build Coastguard Worker strong->handle = freedHandle;
1377*38e8c45fSAndroid Build Coastguard Worker ret = server->transact(BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION, data, &reply);
1378*38e8c45fSAndroid Build Coastguard Worker /* Returns DEAD_OBJECT (-32) if target crashes and
1379*38e8c45fSAndroid Build Coastguard Worker * FAILED_TRANSACTION if the driver rejects the invalid
1380*38e8c45fSAndroid Build Coastguard Worker * object.
1381*38e8c45fSAndroid Build Coastguard Worker */
1382*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ((status_t)FAILED_TRANSACTION, ret);
1383*38e8c45fSAndroid Build Coastguard Worker /* Restore original handle so parcel destructor does not use
1384*38e8c45fSAndroid Build Coastguard Worker * the wrong handle.
1385*38e8c45fSAndroid Build Coastguard Worker */
1386*38e8c45fSAndroid Build Coastguard Worker strong->handle = oldHandle;
1387*38e8c45fSAndroid Build Coastguard Worker }
1388*38e8c45fSAndroid Build Coastguard Worker }
1389*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,CheckNoHeaderMappedInUser)1390*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, CheckNoHeaderMappedInUser) {
1391*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1392*38e8c45fSAndroid Build Coastguard Worker sp<BinderLibTestCallBack> callBack = new BinderLibTestCallBack();
1393*38e8c45fSAndroid Build Coastguard Worker for (int i = 0; i < 2; i++) {
1394*38e8c45fSAndroid Build Coastguard Worker BinderLibTestBundle datai;
1395*38e8c45fSAndroid Build Coastguard Worker datai.appendFrom(&data, 0, data.dataSize());
1396*38e8c45fSAndroid Build Coastguard Worker
1397*38e8c45fSAndroid Build Coastguard Worker data.freeData();
1398*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(1);
1399*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(callBack);
1400*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(BINDER_LIB_TEST_CALL_BACK_VERIFY_BUF);
1401*38e8c45fSAndroid Build Coastguard Worker
1402*38e8c45fSAndroid Build Coastguard Worker datai.appendTo(&data);
1403*38e8c45fSAndroid Build Coastguard Worker }
1404*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_INDIRECT_TRANSACTION, data, &reply),
1405*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
1406*38e8c45fSAndroid Build Coastguard Worker }
1407*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,OnewayQueueing)1408*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, OnewayQueueing)
1409*38e8c45fSAndroid Build Coastguard Worker {
1410*38e8c45fSAndroid Build Coastguard Worker Parcel data, data2;
1411*38e8c45fSAndroid Build Coastguard Worker
1412*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> pollServer = addPollServer();
1413*38e8c45fSAndroid Build Coastguard Worker
1414*38e8c45fSAndroid Build Coastguard Worker sp<BinderLibTestCallBack> callBack = new BinderLibTestCallBack();
1415*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(callBack);
1416*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(500000); // delay in us before calling back
1417*38e8c45fSAndroid Build Coastguard Worker
1418*38e8c45fSAndroid Build Coastguard Worker sp<BinderLibTestCallBack> callBack2 = new BinderLibTestCallBack();
1419*38e8c45fSAndroid Build Coastguard Worker data2.writeStrongBinder(callBack2);
1420*38e8c45fSAndroid Build Coastguard Worker data2.writeInt32(0); // delay in us
1421*38e8c45fSAndroid Build Coastguard Worker
1422*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(pollServer->transact(BINDER_LIB_TEST_DELAYED_CALL_BACK, data, nullptr, TF_ONE_WAY),
1423*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
1424*38e8c45fSAndroid Build Coastguard Worker
1425*38e8c45fSAndroid Build Coastguard Worker // The delay ensures that this second transaction will end up on the async_todo list
1426*38e8c45fSAndroid Build Coastguard Worker // (for a single-threaded server)
1427*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(pollServer->transact(BINDER_LIB_TEST_DELAYED_CALL_BACK, data2, nullptr, TF_ONE_WAY),
1428*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
1429*38e8c45fSAndroid Build Coastguard Worker
1430*38e8c45fSAndroid Build Coastguard Worker // The server will ensure that the two transactions are handled in the expected order;
1431*38e8c45fSAndroid Build Coastguard Worker // If the ordering is not as expected, an error will be returned through the callbacks.
1432*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(callBack->waitEvent(2), StatusEq(NO_ERROR));
1433*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(callBack->getResult(), StatusEq(NO_ERROR));
1434*38e8c45fSAndroid Build Coastguard Worker
1435*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(callBack2->waitEvent(2), StatusEq(NO_ERROR));
1436*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(callBack2->getResult(), StatusEq(NO_ERROR));
1437*38e8c45fSAndroid Build Coastguard Worker }
1438*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,WorkSourceUnsetByDefault)1439*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, WorkSourceUnsetByDefault)
1440*38e8c45fSAndroid Build Coastguard Worker {
1441*38e8c45fSAndroid Build Coastguard Worker status_t ret;
1442*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1443*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(binderLibTestServiceName);
1444*38e8c45fSAndroid Build Coastguard Worker ret = m_server->transact(BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION, data, &reply);
1445*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(-1, reply.readInt32());
1446*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, ret);
1447*38e8c45fSAndroid Build Coastguard Worker }
1448*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,WorkSourceSet)1449*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, WorkSourceSet)
1450*38e8c45fSAndroid Build Coastguard Worker {
1451*38e8c45fSAndroid Build Coastguard Worker status_t ret;
1452*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1453*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->clearCallingWorkSource();
1454*38e8c45fSAndroid Build Coastguard Worker int64_t previousWorkSource = IPCThreadState::self()->setCallingWorkSourceUid(100);
1455*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(binderLibTestServiceName);
1456*38e8c45fSAndroid Build Coastguard Worker ret = m_server->transact(BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION, data, &reply);
1457*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(100, reply.readInt32());
1458*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(-1, previousWorkSource);
1459*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(true, IPCThreadState::self()->shouldPropagateWorkSource());
1460*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, ret);
1461*38e8c45fSAndroid Build Coastguard Worker }
1462*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,WorkSourceSetWithoutPropagation)1463*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, WorkSourceSetWithoutPropagation)
1464*38e8c45fSAndroid Build Coastguard Worker {
1465*38e8c45fSAndroid Build Coastguard Worker status_t ret;
1466*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1467*38e8c45fSAndroid Build Coastguard Worker
1468*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->setCallingWorkSourceUidWithoutPropagation(100);
1469*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(false, IPCThreadState::self()->shouldPropagateWorkSource());
1470*38e8c45fSAndroid Build Coastguard Worker
1471*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(binderLibTestServiceName);
1472*38e8c45fSAndroid Build Coastguard Worker ret = m_server->transact(BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION, data, &reply);
1473*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(-1, reply.readInt32());
1474*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(false, IPCThreadState::self()->shouldPropagateWorkSource());
1475*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, ret);
1476*38e8c45fSAndroid Build Coastguard Worker }
1477*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,WorkSourceCleared)1478*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, WorkSourceCleared)
1479*38e8c45fSAndroid Build Coastguard Worker {
1480*38e8c45fSAndroid Build Coastguard Worker status_t ret;
1481*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1482*38e8c45fSAndroid Build Coastguard Worker
1483*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->setCallingWorkSourceUid(100);
1484*38e8c45fSAndroid Build Coastguard Worker int64_t token = IPCThreadState::self()->clearCallingWorkSource();
1485*38e8c45fSAndroid Build Coastguard Worker int32_t previousWorkSource = (int32_t)token;
1486*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(binderLibTestServiceName);
1487*38e8c45fSAndroid Build Coastguard Worker ret = m_server->transact(BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION, data, &reply);
1488*38e8c45fSAndroid Build Coastguard Worker
1489*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(-1, reply.readInt32());
1490*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(100, previousWorkSource);
1491*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, ret);
1492*38e8c45fSAndroid Build Coastguard Worker }
1493*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,WorkSourceRestored)1494*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, WorkSourceRestored)
1495*38e8c45fSAndroid Build Coastguard Worker {
1496*38e8c45fSAndroid Build Coastguard Worker status_t ret;
1497*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1498*38e8c45fSAndroid Build Coastguard Worker
1499*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->setCallingWorkSourceUid(100);
1500*38e8c45fSAndroid Build Coastguard Worker int64_t token = IPCThreadState::self()->clearCallingWorkSource();
1501*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->restoreCallingWorkSource(token);
1502*38e8c45fSAndroid Build Coastguard Worker
1503*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(binderLibTestServiceName);
1504*38e8c45fSAndroid Build Coastguard Worker ret = m_server->transact(BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION, data, &reply);
1505*38e8c45fSAndroid Build Coastguard Worker
1506*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(100, reply.readInt32());
1507*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(true, IPCThreadState::self()->shouldPropagateWorkSource());
1508*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, ret);
1509*38e8c45fSAndroid Build Coastguard Worker }
1510*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,PropagateFlagSet)1511*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, PropagateFlagSet)
1512*38e8c45fSAndroid Build Coastguard Worker {
1513*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->clearPropagateWorkSource();
1514*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->setCallingWorkSourceUid(100);
1515*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(true, IPCThreadState::self()->shouldPropagateWorkSource());
1516*38e8c45fSAndroid Build Coastguard Worker }
1517*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,PropagateFlagCleared)1518*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, PropagateFlagCleared)
1519*38e8c45fSAndroid Build Coastguard Worker {
1520*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->setCallingWorkSourceUid(100);
1521*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->clearPropagateWorkSource();
1522*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(false, IPCThreadState::self()->shouldPropagateWorkSource());
1523*38e8c45fSAndroid Build Coastguard Worker }
1524*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,PropagateFlagRestored)1525*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, PropagateFlagRestored)
1526*38e8c45fSAndroid Build Coastguard Worker {
1527*38e8c45fSAndroid Build Coastguard Worker int token = IPCThreadState::self()->setCallingWorkSourceUid(100);
1528*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->restoreCallingWorkSource(token);
1529*38e8c45fSAndroid Build Coastguard Worker
1530*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(false, IPCThreadState::self()->shouldPropagateWorkSource());
1531*38e8c45fSAndroid Build Coastguard Worker }
1532*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,WorkSourcePropagatedForAllFollowingBinderCalls)1533*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, WorkSourcePropagatedForAllFollowingBinderCalls)
1534*38e8c45fSAndroid Build Coastguard Worker {
1535*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->setCallingWorkSourceUid(100);
1536*38e8c45fSAndroid Build Coastguard Worker
1537*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1538*38e8c45fSAndroid Build Coastguard Worker status_t ret;
1539*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(binderLibTestServiceName);
1540*38e8c45fSAndroid Build Coastguard Worker ret = m_server->transact(BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION, data, &reply);
1541*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, ret);
1542*38e8c45fSAndroid Build Coastguard Worker
1543*38e8c45fSAndroid Build Coastguard Worker Parcel data2, reply2;
1544*38e8c45fSAndroid Build Coastguard Worker status_t ret2;
1545*38e8c45fSAndroid Build Coastguard Worker data2.writeInterfaceToken(binderLibTestServiceName);
1546*38e8c45fSAndroid Build Coastguard Worker ret2 = m_server->transact(BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION, data2, &reply2);
1547*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(100, reply2.readInt32());
1548*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(NO_ERROR, ret2);
1549*38e8c45fSAndroid Build Coastguard Worker }
1550*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,SchedPolicySet)1551*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, SchedPolicySet) {
1552*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
1553*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
1554*38e8c45fSAndroid Build Coastguard Worker
1555*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1556*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_GET_SCHEDULING_POLICY, data, &reply),
1557*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
1558*38e8c45fSAndroid Build Coastguard Worker
1559*38e8c45fSAndroid Build Coastguard Worker int policy = reply.readInt32();
1560*38e8c45fSAndroid Build Coastguard Worker int priority = reply.readInt32();
1561*38e8c45fSAndroid Build Coastguard Worker
1562*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(kSchedPolicy, policy & (~SCHED_RESET_ON_FORK));
1563*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(kSchedPriority, priority);
1564*38e8c45fSAndroid Build Coastguard Worker }
1565*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,InheritRt)1566*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, InheritRt) {
1567*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
1568*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
1569*38e8c45fSAndroid Build Coastguard Worker
1570*38e8c45fSAndroid Build Coastguard Worker const struct sched_param param {
1571*38e8c45fSAndroid Build Coastguard Worker .sched_priority = kSchedPriorityMore,
1572*38e8c45fSAndroid Build Coastguard Worker };
1573*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(0, sched_setscheduler(getpid(), SCHED_RR, ¶m));
1574*38e8c45fSAndroid Build Coastguard Worker
1575*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1576*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_GET_SCHEDULING_POLICY, data, &reply),
1577*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
1578*38e8c45fSAndroid Build Coastguard Worker
1579*38e8c45fSAndroid Build Coastguard Worker int policy = reply.readInt32();
1580*38e8c45fSAndroid Build Coastguard Worker int priority = reply.readInt32();
1581*38e8c45fSAndroid Build Coastguard Worker
1582*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(kSchedPolicy, policy & (~SCHED_RESET_ON_FORK));
1583*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(kSchedPriorityMore, priority);
1584*38e8c45fSAndroid Build Coastguard Worker }
1585*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,VectorSent)1586*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, VectorSent) {
1587*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1588*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
1589*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
1590*38e8c45fSAndroid Build Coastguard Worker
1591*38e8c45fSAndroid Build Coastguard Worker std::vector<uint64_t> const testValue = { std::numeric_limits<uint64_t>::max(), 0, 200 };
1592*38e8c45fSAndroid Build Coastguard Worker data.writeUint64Vector(testValue);
1593*38e8c45fSAndroid Build Coastguard Worker
1594*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_ECHO_VECTOR, data, &reply), StatusEq(NO_ERROR));
1595*38e8c45fSAndroid Build Coastguard Worker std::vector<uint64_t> readValue;
1596*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(reply.readUint64Vector(&readValue), StatusEq(OK));
1597*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(readValue, testValue);
1598*38e8c45fSAndroid Build Coastguard Worker }
1599*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,FileDescriptorRemainsNonBlocking)1600*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, FileDescriptorRemainsNonBlocking) {
1601*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
1602*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
1603*38e8c45fSAndroid Build Coastguard Worker
1604*38e8c45fSAndroid Build Coastguard Worker Parcel reply;
1605*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_GET_NON_BLOCKING_FD, {} /*data*/, &reply),
1606*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
1607*38e8c45fSAndroid Build Coastguard Worker unique_fd fd;
1608*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(reply.readUniqueFileDescriptor(&fd), StatusEq(OK));
1609*38e8c45fSAndroid Build Coastguard Worker
1610*38e8c45fSAndroid Build Coastguard Worker const int result = fcntl(fd.get(), F_GETFL);
1611*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(result, -1);
1612*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(result & O_NONBLOCK, O_NONBLOCK);
1613*38e8c45fSAndroid Build Coastguard Worker }
1614*38e8c45fSAndroid Build Coastguard Worker
1615*38e8c45fSAndroid Build Coastguard Worker // see ProcessState.cpp BINDER_VM_SIZE = 1MB.
1616*38e8c45fSAndroid Build Coastguard Worker // This value is not exposed, but some code in the framework relies on being able to use
1617*38e8c45fSAndroid Build Coastguard Worker // buffers near the cap size.
1618*38e8c45fSAndroid Build Coastguard Worker constexpr size_t kSizeBytesAlmostFull = 950'000;
1619*38e8c45fSAndroid Build Coastguard Worker constexpr size_t kSizeBytesOverFull = 1'050'000;
1620*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,GargantuanVectorSent)1621*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, GargantuanVectorSent) {
1622*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
1623*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
1624*38e8c45fSAndroid Build Coastguard Worker
1625*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < 10; i++) {
1626*38e8c45fSAndroid Build Coastguard Worker // a slight variation in size is used to consider certain possible caching implementations
1627*38e8c45fSAndroid Build Coastguard Worker const std::vector<uint64_t> testValue((kSizeBytesAlmostFull + i) / sizeof(uint64_t), 42);
1628*38e8c45fSAndroid Build Coastguard Worker
1629*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1630*38e8c45fSAndroid Build Coastguard Worker data.writeUint64Vector(testValue);
1631*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_ECHO_VECTOR, data, &reply), StatusEq(NO_ERROR))
1632*38e8c45fSAndroid Build Coastguard Worker << i;
1633*38e8c45fSAndroid Build Coastguard Worker std::vector<uint64_t> readValue;
1634*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(reply.readUint64Vector(&readValue), StatusEq(OK));
1635*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(readValue, testValue);
1636*38e8c45fSAndroid Build Coastguard Worker }
1637*38e8c45fSAndroid Build Coastguard Worker }
1638*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,LimitExceededVectorSent)1639*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, LimitExceededVectorSent) {
1640*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
1641*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
1642*38e8c45fSAndroid Build Coastguard Worker const std::vector<uint64_t> testValue(kSizeBytesOverFull / sizeof(uint64_t), 42);
1643*38e8c45fSAndroid Build Coastguard Worker
1644*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1645*38e8c45fSAndroid Build Coastguard Worker data.writeUint64Vector(testValue);
1646*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_ECHO_VECTOR, data, &reply),
1647*38e8c45fSAndroid Build Coastguard Worker StatusEq(FAILED_TRANSACTION));
1648*38e8c45fSAndroid Build Coastguard Worker }
1649*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,BufRejected)1650*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, BufRejected) {
1651*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1652*38e8c45fSAndroid Build Coastguard Worker uint32_t buf;
1653*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
1654*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
1655*38e8c45fSAndroid Build Coastguard Worker
1656*38e8c45fSAndroid Build Coastguard Worker binder_buffer_object obj {
1657*38e8c45fSAndroid Build Coastguard Worker .hdr = { .type = BINDER_TYPE_PTR },
1658*38e8c45fSAndroid Build Coastguard Worker .flags = 0,
1659*38e8c45fSAndroid Build Coastguard Worker .buffer = reinterpret_cast<binder_uintptr_t>((void*)&buf),
1660*38e8c45fSAndroid Build Coastguard Worker .length = 4,
1661*38e8c45fSAndroid Build Coastguard Worker };
1662*38e8c45fSAndroid Build Coastguard Worker data.setDataCapacity(1024);
1663*38e8c45fSAndroid Build Coastguard Worker // Write a bogus object at offset 0 to get an entry in the offset table
1664*38e8c45fSAndroid Build Coastguard Worker data.writeFileDescriptor(0);
1665*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(data.objectsCount(), 1u);
1666*38e8c45fSAndroid Build Coastguard Worker uint8_t *parcelData = const_cast<uint8_t*>(data.data());
1667*38e8c45fSAndroid Build Coastguard Worker // And now, overwrite it with the buffer object
1668*38e8c45fSAndroid Build Coastguard Worker memcpy(parcelData, &obj, sizeof(obj));
1669*38e8c45fSAndroid Build Coastguard Worker data.setDataSize(sizeof(obj));
1670*38e8c45fSAndroid Build Coastguard Worker
1671*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(data.objectsCount(), 1u);
1672*38e8c45fSAndroid Build Coastguard Worker
1673*38e8c45fSAndroid Build Coastguard Worker // Either the kernel should reject this transaction (if it's correct), but
1674*38e8c45fSAndroid Build Coastguard Worker // if it's not, the server implementation should return an error if it
1675*38e8c45fSAndroid Build Coastguard Worker // finds an object in the received Parcel.
1676*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_REJECT_OBJECTS, data, &reply),
1677*38e8c45fSAndroid Build Coastguard Worker Not(StatusEq(NO_ERROR)));
1678*38e8c45fSAndroid Build Coastguard Worker }
1679*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,WeakRejected)1680*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, WeakRejected) {
1681*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1682*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
1683*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
1684*38e8c45fSAndroid Build Coastguard Worker
1685*38e8c45fSAndroid Build Coastguard Worker auto binder = sp<BBinder>::make();
1686*38e8c45fSAndroid Build Coastguard Worker wp<BBinder> wpBinder(binder);
1687*38e8c45fSAndroid Build Coastguard Worker flat_binder_object obj{
1688*38e8c45fSAndroid Build Coastguard Worker .hdr = {.type = BINDER_TYPE_WEAK_BINDER},
1689*38e8c45fSAndroid Build Coastguard Worker .flags = 0,
1690*38e8c45fSAndroid Build Coastguard Worker .binder = reinterpret_cast<uintptr_t>(wpBinder.get_refs()),
1691*38e8c45fSAndroid Build Coastguard Worker .cookie = reinterpret_cast<uintptr_t>(wpBinder.unsafe_get()),
1692*38e8c45fSAndroid Build Coastguard Worker };
1693*38e8c45fSAndroid Build Coastguard Worker data.setDataCapacity(1024);
1694*38e8c45fSAndroid Build Coastguard Worker // Write a bogus object at offset 0 to get an entry in the offset table
1695*38e8c45fSAndroid Build Coastguard Worker data.writeFileDescriptor(0);
1696*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(data.objectsCount(), 1u);
1697*38e8c45fSAndroid Build Coastguard Worker uint8_t *parcelData = const_cast<uint8_t *>(data.data());
1698*38e8c45fSAndroid Build Coastguard Worker // And now, overwrite it with the weak binder
1699*38e8c45fSAndroid Build Coastguard Worker memcpy(parcelData, &obj, sizeof(obj));
1700*38e8c45fSAndroid Build Coastguard Worker data.setDataSize(sizeof(obj));
1701*38e8c45fSAndroid Build Coastguard Worker
1702*38e8c45fSAndroid Build Coastguard Worker // a previous bug caused other objects to be released an extra time, so we
1703*38e8c45fSAndroid Build Coastguard Worker // test with an object that libbinder will actually try to release
1704*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, data.writeStrongBinder(sp<BBinder>::make()));
1705*38e8c45fSAndroid Build Coastguard Worker
1706*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(data.objectsCount(), 2u);
1707*38e8c45fSAndroid Build Coastguard Worker
1708*38e8c45fSAndroid Build Coastguard Worker // send it many times, since previous error was memory corruption, make it
1709*38e8c45fSAndroid Build Coastguard Worker // more likely that the server crashes
1710*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < 100; i++) {
1711*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_REJECT_OBJECTS, data, &reply),
1712*38e8c45fSAndroid Build Coastguard Worker StatusEq(BAD_VALUE));
1713*38e8c45fSAndroid Build Coastguard Worker }
1714*38e8c45fSAndroid Build Coastguard Worker
1715*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->pingBinder(), StatusEq(NO_ERROR));
1716*38e8c45fSAndroid Build Coastguard Worker }
1717*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,GotSid)1718*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, GotSid) {
1719*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
1720*38e8c45fSAndroid Build Coastguard Worker
1721*38e8c45fSAndroid Build Coastguard Worker Parcel data;
1722*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_CAN_GET_SID, data, nullptr), StatusEq(OK));
1723*38e8c45fSAndroid Build Coastguard Worker }
1724*38e8c45fSAndroid Build Coastguard Worker
1725*38e8c45fSAndroid Build Coastguard Worker struct TooManyFdsFlattenable : Flattenable<TooManyFdsFlattenable> {
TooManyFdsFlattenableTooManyFdsFlattenable1726*38e8c45fSAndroid Build Coastguard Worker TooManyFdsFlattenable(size_t fdCount) : mFdCount(fdCount) {}
1727*38e8c45fSAndroid Build Coastguard Worker
1728*38e8c45fSAndroid Build Coastguard Worker // Flattenable protocol
getFlattenedSizeTooManyFdsFlattenable1729*38e8c45fSAndroid Build Coastguard Worker size_t getFlattenedSize() const {
1730*38e8c45fSAndroid Build Coastguard Worker // Return a valid non-zero size here so we don't get an unintended
1731*38e8c45fSAndroid Build Coastguard Worker // BAD_VALUE from Parcel::write
1732*38e8c45fSAndroid Build Coastguard Worker return 16;
1733*38e8c45fSAndroid Build Coastguard Worker }
getFdCountTooManyFdsFlattenable1734*38e8c45fSAndroid Build Coastguard Worker size_t getFdCount() const { return mFdCount; }
flattenTooManyFdsFlattenable1735*38e8c45fSAndroid Build Coastguard Worker status_t flatten(void *& /*buffer*/, size_t & /*size*/, int *&fds, size_t &count) const {
1736*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < count; i++) {
1737*38e8c45fSAndroid Build Coastguard Worker fds[i] = STDIN_FILENO;
1738*38e8c45fSAndroid Build Coastguard Worker }
1739*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
1740*38e8c45fSAndroid Build Coastguard Worker }
unflattenTooManyFdsFlattenable1741*38e8c45fSAndroid Build Coastguard Worker status_t unflatten(void const *& /*buffer*/, size_t & /*size*/, int const *& /*fds*/,
1742*38e8c45fSAndroid Build Coastguard Worker size_t & /*count*/) {
1743*38e8c45fSAndroid Build Coastguard Worker /* This doesn't get called */
1744*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
1745*38e8c45fSAndroid Build Coastguard Worker }
1746*38e8c45fSAndroid Build Coastguard Worker
1747*38e8c45fSAndroid Build Coastguard Worker size_t mFdCount;
1748*38e8c45fSAndroid Build Coastguard Worker };
1749*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,TooManyFdsFlattenable)1750*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, TooManyFdsFlattenable) {
1751*38e8c45fSAndroid Build Coastguard Worker rlimit origNofile;
1752*38e8c45fSAndroid Build Coastguard Worker int ret = getrlimit(RLIMIT_NOFILE, &origNofile);
1753*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(0, ret);
1754*38e8c45fSAndroid Build Coastguard Worker
1755*38e8c45fSAndroid Build Coastguard Worker // Restore the original file limits when the test finishes
1756*38e8c45fSAndroid Build Coastguard Worker auto guardUnguard = make_scope_guard([&]() { setrlimit(RLIMIT_NOFILE, &origNofile); });
1757*38e8c45fSAndroid Build Coastguard Worker
1758*38e8c45fSAndroid Build Coastguard Worker rlimit testNofile = {1024, 1024};
1759*38e8c45fSAndroid Build Coastguard Worker ret = setrlimit(RLIMIT_NOFILE, &testNofile);
1760*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(0, ret);
1761*38e8c45fSAndroid Build Coastguard Worker
1762*38e8c45fSAndroid Build Coastguard Worker Parcel parcel;
1763*38e8c45fSAndroid Build Coastguard Worker // Try to write more file descriptors than supported by the OS
1764*38e8c45fSAndroid Build Coastguard Worker TooManyFdsFlattenable tooManyFds1(1024);
1765*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(parcel.write(tooManyFds1), StatusEq(-EMFILE));
1766*38e8c45fSAndroid Build Coastguard Worker
1767*38e8c45fSAndroid Build Coastguard Worker // Try to write more file descriptors than the internal limit
1768*38e8c45fSAndroid Build Coastguard Worker TooManyFdsFlattenable tooManyFds2(1025);
1769*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(parcel.write(tooManyFds2), StatusEq(BAD_VALUE));
1770*38e8c45fSAndroid Build Coastguard Worker }
1771*38e8c45fSAndroid Build Coastguard Worker
TEST(ServiceNotifications,Unregister)1772*38e8c45fSAndroid Build Coastguard Worker TEST(ServiceNotifications, Unregister) {
1773*38e8c45fSAndroid Build Coastguard Worker auto sm = defaultServiceManager();
1774*38e8c45fSAndroid Build Coastguard Worker sm->enableAddServiceCache(false);
1775*38e8c45fSAndroid Build Coastguard Worker using LocalRegistrationCallback = IServiceManager::LocalRegistrationCallback;
1776*38e8c45fSAndroid Build Coastguard Worker class LocalRegistrationCallbackImpl : public virtual LocalRegistrationCallback {
1777*38e8c45fSAndroid Build Coastguard Worker void onServiceRegistration(const String16 &, const sp<IBinder> &) override {}
1778*38e8c45fSAndroid Build Coastguard Worker virtual ~LocalRegistrationCallbackImpl() {}
1779*38e8c45fSAndroid Build Coastguard Worker };
1780*38e8c45fSAndroid Build Coastguard Worker sp<LocalRegistrationCallback> cb = sp<LocalRegistrationCallbackImpl>::make();
1781*38e8c45fSAndroid Build Coastguard Worker
1782*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->registerForNotifications(String16("RogerRafa"), cb), OK);
1783*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->unregisterForNotifications(String16("RogerRafa"), cb), OK);
1784*38e8c45fSAndroid Build Coastguard Worker }
1785*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,ThreadPoolAvailableThreads)1786*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, ThreadPoolAvailableThreads) {
1787*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1788*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
1789*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
1790*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_GET_MAX_THREAD_COUNT, data, &reply),
1791*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
1792*38e8c45fSAndroid Build Coastguard Worker int32_t replyi = reply.readInt32();
1793*38e8c45fSAndroid Build Coastguard Worker // see getThreadPoolMaxTotalThreadCount for why there is a race
1794*38e8c45fSAndroid Build Coastguard Worker EXPECT_TRUE(replyi == kKernelThreads + 1 || replyi == kKernelThreads + 2) << replyi;
1795*38e8c45fSAndroid Build Coastguard Worker
1796*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_PROCESS_LOCK, data, &reply), NO_ERROR);
1797*38e8c45fSAndroid Build Coastguard Worker
1798*38e8c45fSAndroid Build Coastguard Worker /*
1799*38e8c45fSAndroid Build Coastguard Worker * This will use all threads in the pool but one. There are actually kKernelThreads+2
1800*38e8c45fSAndroid Build Coastguard Worker * available in the other process (startThreadPool, joinThreadPool, + the kernel-
1801*38e8c45fSAndroid Build Coastguard Worker * started threads from setThreadPoolMaxThreadCount
1802*38e8c45fSAndroid Build Coastguard Worker *
1803*38e8c45fSAndroid Build Coastguard Worker * Adding one more will cause it to deadlock.
1804*38e8c45fSAndroid Build Coastguard Worker */
1805*38e8c45fSAndroid Build Coastguard Worker std::vector<std::thread> ts;
1806*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < kKernelThreads + 1; i++) {
1807*38e8c45fSAndroid Build Coastguard Worker ts.push_back(std::thread([&] {
1808*38e8c45fSAndroid Build Coastguard Worker Parcel local_reply;
1809*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_LOCK_UNLOCK, data, &local_reply),
1810*38e8c45fSAndroid Build Coastguard Worker NO_ERROR);
1811*38e8c45fSAndroid Build Coastguard Worker }));
1812*38e8c45fSAndroid Build Coastguard Worker }
1813*38e8c45fSAndroid Build Coastguard Worker
1814*38e8c45fSAndroid Build Coastguard Worker // make sure all of the above calls will be queued in parallel. Otherwise, most of
1815*38e8c45fSAndroid Build Coastguard Worker // the time, the below call will pre-empt them (presumably because we have the
1816*38e8c45fSAndroid Build Coastguard Worker // scheduler timeslice already + scheduler hint).
1817*38e8c45fSAndroid Build Coastguard Worker sleep(1);
1818*38e8c45fSAndroid Build Coastguard Worker
1819*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(1000);
1820*38e8c45fSAndroid Build Coastguard Worker // Give a chance for all threads to be used (kKernelThreads + 1 thread in use)
1821*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_UNLOCK_AFTER_MS, data, &reply), NO_ERROR);
1822*38e8c45fSAndroid Build Coastguard Worker
1823*38e8c45fSAndroid Build Coastguard Worker for (auto &t : ts) {
1824*38e8c45fSAndroid Build Coastguard Worker t.join();
1825*38e8c45fSAndroid Build Coastguard Worker }
1826*38e8c45fSAndroid Build Coastguard Worker
1827*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_GET_MAX_THREAD_COUNT, data, &reply),
1828*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
1829*38e8c45fSAndroid Build Coastguard Worker replyi = reply.readInt32();
1830*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(replyi, kKernelThreads + 2);
1831*38e8c45fSAndroid Build Coastguard Worker }
1832*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,ThreadPoolStarted)1833*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, ThreadPoolStarted) {
1834*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1835*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
1836*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
1837*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_IS_THREADPOOL_STARTED, data, &reply), NO_ERROR);
1838*38e8c45fSAndroid Build Coastguard Worker EXPECT_TRUE(reply.readBool());
1839*38e8c45fSAndroid Build Coastguard Worker }
1840*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,HangingServices)1841*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, HangingServices) {
1842*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1843*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
1844*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(server != nullptr);
1845*38e8c45fSAndroid Build Coastguard Worker int32_t delay = 1000; // ms
1846*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(delay);
1847*38e8c45fSAndroid Build Coastguard Worker // b/266537959 - must take before taking lock, since countdown is started in the remote
1848*38e8c45fSAndroid Build Coastguard Worker // process there.
1849*38e8c45fSAndroid Build Coastguard Worker int64_t timeBefore = uptimeMillis();
1850*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_PROCESS_TEMPORARY_LOCK, data, &reply), NO_ERROR);
1851*38e8c45fSAndroid Build Coastguard Worker std::vector<std::thread> ts;
1852*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < kKernelThreads + 1; i++) {
1853*38e8c45fSAndroid Build Coastguard Worker ts.push_back(std::thread([&] {
1854*38e8c45fSAndroid Build Coastguard Worker Parcel local_reply;
1855*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(server->transact(BINDER_LIB_TEST_LOCK_UNLOCK, data, &local_reply),
1856*38e8c45fSAndroid Build Coastguard Worker NO_ERROR);
1857*38e8c45fSAndroid Build Coastguard Worker }));
1858*38e8c45fSAndroid Build Coastguard Worker }
1859*38e8c45fSAndroid Build Coastguard Worker
1860*38e8c45fSAndroid Build Coastguard Worker for (auto &t : ts) {
1861*38e8c45fSAndroid Build Coastguard Worker t.join();
1862*38e8c45fSAndroid Build Coastguard Worker }
1863*38e8c45fSAndroid Build Coastguard Worker int64_t timeAfter = uptimeMillis();
1864*38e8c45fSAndroid Build Coastguard Worker
1865*38e8c45fSAndroid Build Coastguard Worker // deadlock occurred and threads only finished after 1s passed.
1866*38e8c45fSAndroid Build Coastguard Worker EXPECT_GE(timeAfter, timeBefore + delay);
1867*38e8c45fSAndroid Build Coastguard Worker }
1868*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,BinderProxyCount)1869*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, BinderProxyCount) {
1870*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1871*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
1872*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(server, nullptr);
1873*38e8c45fSAndroid Build Coastguard Worker
1874*38e8c45fSAndroid Build Coastguard Worker uint32_t initialCount = BpBinder::getBinderProxyCount();
1875*38e8c45fSAndroid Build Coastguard Worker size_t iterations = 100;
1876*38e8c45fSAndroid Build Coastguard Worker {
1877*38e8c45fSAndroid Build Coastguard Worker uint32_t count = initialCount;
1878*38e8c45fSAndroid Build Coastguard Worker std::vector<sp<IBinder> > proxies;
1879*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> proxy;
1880*38e8c45fSAndroid Build Coastguard Worker // Create binder proxies and verify the count.
1881*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < iterations; i++) {
1882*38e8c45fSAndroid Build Coastguard Worker ASSERT_THAT(server->transact(BINDER_LIB_TEST_CREATE_BINDER_TRANSACTION, data, &reply),
1883*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
1884*38e8c45fSAndroid Build Coastguard Worker proxies.push_back(reply.readStrongBinder());
1885*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BpBinder::getBinderProxyCount(), ++count);
1886*38e8c45fSAndroid Build Coastguard Worker }
1887*38e8c45fSAndroid Build Coastguard Worker // Remove every other one and verify the count.
1888*38e8c45fSAndroid Build Coastguard Worker auto it = proxies.begin();
1889*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; it != proxies.end(); i++) {
1890*38e8c45fSAndroid Build Coastguard Worker if (i % 2 == 0) {
1891*38e8c45fSAndroid Build Coastguard Worker it = proxies.erase(it);
1892*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BpBinder::getBinderProxyCount(), --count);
1893*38e8c45fSAndroid Build Coastguard Worker }
1894*38e8c45fSAndroid Build Coastguard Worker }
1895*38e8c45fSAndroid Build Coastguard Worker }
1896*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BpBinder::getBinderProxyCount(), initialCount);
1897*38e8c45fSAndroid Build Coastguard Worker }
1898*38e8c45fSAndroid Build Coastguard Worker
1899*38e8c45fSAndroid Build Coastguard Worker static constexpr int kBpCountHighWatermark = 20;
1900*38e8c45fSAndroid Build Coastguard Worker static constexpr int kBpCountLowWatermark = 10;
1901*38e8c45fSAndroid Build Coastguard Worker static constexpr int kBpCountWarningWatermark = 15;
1902*38e8c45fSAndroid Build Coastguard Worker static constexpr int kInvalidUid = -1;
1903*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibTest,BinderProxyCountCallback)1904*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibTest, BinderProxyCountCallback) {
1905*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
1906*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = addServer();
1907*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(server, nullptr);
1908*38e8c45fSAndroid Build Coastguard Worker
1909*38e8c45fSAndroid Build Coastguard Worker BpBinder::enableCountByUid();
1910*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_GETUID, data, &reply), StatusEq(NO_ERROR));
1911*38e8c45fSAndroid Build Coastguard Worker int32_t uid = reply.readInt32();
1912*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(uid, kInvalidUid);
1913*38e8c45fSAndroid Build Coastguard Worker
1914*38e8c45fSAndroid Build Coastguard Worker uint32_t initialCount = BpBinder::getBinderProxyCount();
1915*38e8c45fSAndroid Build Coastguard Worker {
1916*38e8c45fSAndroid Build Coastguard Worker uint32_t count = initialCount;
1917*38e8c45fSAndroid Build Coastguard Worker BpBinder::setBinderProxyCountWatermarks(kBpCountHighWatermark,
1918*38e8c45fSAndroid Build Coastguard Worker kBpCountLowWatermark,
1919*38e8c45fSAndroid Build Coastguard Worker kBpCountWarningWatermark);
1920*38e8c45fSAndroid Build Coastguard Worker int limitCallbackUid = kInvalidUid;
1921*38e8c45fSAndroid Build Coastguard Worker int warningCallbackUid = kInvalidUid;
1922*38e8c45fSAndroid Build Coastguard Worker BpBinder::setBinderProxyCountEventCallback([&](int uid) { limitCallbackUid = uid; },
1923*38e8c45fSAndroid Build Coastguard Worker [&](int uid) { warningCallbackUid = uid; });
1924*38e8c45fSAndroid Build Coastguard Worker
1925*38e8c45fSAndroid Build Coastguard Worker std::vector<sp<IBinder> > proxies;
1926*38e8c45fSAndroid Build Coastguard Worker auto createProxyOnce = [&](int expectedWarningCallbackUid, int expectedLimitCallbackUid) {
1927*38e8c45fSAndroid Build Coastguard Worker warningCallbackUid = limitCallbackUid = kInvalidUid;
1928*38e8c45fSAndroid Build Coastguard Worker ASSERT_THAT(server->transact(BINDER_LIB_TEST_CREATE_BINDER_TRANSACTION, data, &reply),
1929*38e8c45fSAndroid Build Coastguard Worker StatusEq(NO_ERROR));
1930*38e8c45fSAndroid Build Coastguard Worker proxies.push_back(reply.readStrongBinder());
1931*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BpBinder::getBinderProxyCount(), ++count);
1932*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(warningCallbackUid, expectedWarningCallbackUid);
1933*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(limitCallbackUid, expectedLimitCallbackUid);
1934*38e8c45fSAndroid Build Coastguard Worker };
1935*38e8c45fSAndroid Build Coastguard Worker auto removeProxyOnce = [&](int expectedWarningCallbackUid, int expectedLimitCallbackUid) {
1936*38e8c45fSAndroid Build Coastguard Worker warningCallbackUid = limitCallbackUid = kInvalidUid;
1937*38e8c45fSAndroid Build Coastguard Worker proxies.pop_back();
1938*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BpBinder::getBinderProxyCount(), --count);
1939*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(warningCallbackUid, expectedWarningCallbackUid);
1940*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(limitCallbackUid, expectedLimitCallbackUid);
1941*38e8c45fSAndroid Build Coastguard Worker };
1942*38e8c45fSAndroid Build Coastguard Worker
1943*38e8c45fSAndroid Build Coastguard Worker // Test the increment/decrement of the binder proxies.
1944*38e8c45fSAndroid Build Coastguard Worker for (int i = 1; i <= kBpCountWarningWatermark; i++) {
1945*38e8c45fSAndroid Build Coastguard Worker createProxyOnce(kInvalidUid, kInvalidUid);
1946*38e8c45fSAndroid Build Coastguard Worker }
1947*38e8c45fSAndroid Build Coastguard Worker createProxyOnce(uid, kInvalidUid); // Warning callback should have been triggered.
1948*38e8c45fSAndroid Build Coastguard Worker for (int i = kBpCountWarningWatermark + 2; i <= kBpCountHighWatermark; i++) {
1949*38e8c45fSAndroid Build Coastguard Worker createProxyOnce(kInvalidUid, kInvalidUid);
1950*38e8c45fSAndroid Build Coastguard Worker }
1951*38e8c45fSAndroid Build Coastguard Worker createProxyOnce(kInvalidUid, uid); // Limit callback should have been triggered.
1952*38e8c45fSAndroid Build Coastguard Worker createProxyOnce(kInvalidUid, kInvalidUid);
1953*38e8c45fSAndroid Build Coastguard Worker for (int i = kBpCountHighWatermark + 2; i >= kBpCountHighWatermark; i--) {
1954*38e8c45fSAndroid Build Coastguard Worker removeProxyOnce(kInvalidUid, kInvalidUid);
1955*38e8c45fSAndroid Build Coastguard Worker }
1956*38e8c45fSAndroid Build Coastguard Worker createProxyOnce(kInvalidUid, kInvalidUid);
1957*38e8c45fSAndroid Build Coastguard Worker
1958*38e8c45fSAndroid Build Coastguard Worker // Go down below the low watermark.
1959*38e8c45fSAndroid Build Coastguard Worker for (int i = kBpCountHighWatermark; i >= kBpCountLowWatermark; i--) {
1960*38e8c45fSAndroid Build Coastguard Worker removeProxyOnce(kInvalidUid, kInvalidUid);
1961*38e8c45fSAndroid Build Coastguard Worker }
1962*38e8c45fSAndroid Build Coastguard Worker for (int i = kBpCountLowWatermark; i <= kBpCountWarningWatermark; i++) {
1963*38e8c45fSAndroid Build Coastguard Worker createProxyOnce(kInvalidUid, kInvalidUid);
1964*38e8c45fSAndroid Build Coastguard Worker }
1965*38e8c45fSAndroid Build Coastguard Worker createProxyOnce(uid, kInvalidUid); // Warning callback should have been triggered.
1966*38e8c45fSAndroid Build Coastguard Worker for (int i = kBpCountWarningWatermark + 2; i <= kBpCountHighWatermark; i++) {
1967*38e8c45fSAndroid Build Coastguard Worker createProxyOnce(kInvalidUid, kInvalidUid);
1968*38e8c45fSAndroid Build Coastguard Worker }
1969*38e8c45fSAndroid Build Coastguard Worker createProxyOnce(kInvalidUid, uid); // Limit callback should have been triggered.
1970*38e8c45fSAndroid Build Coastguard Worker createProxyOnce(kInvalidUid, kInvalidUid);
1971*38e8c45fSAndroid Build Coastguard Worker for (int i = kBpCountHighWatermark + 2; i >= kBpCountHighWatermark; i--) {
1972*38e8c45fSAndroid Build Coastguard Worker removeProxyOnce(kInvalidUid, kInvalidUid);
1973*38e8c45fSAndroid Build Coastguard Worker }
1974*38e8c45fSAndroid Build Coastguard Worker createProxyOnce(kInvalidUid, kInvalidUid);
1975*38e8c45fSAndroid Build Coastguard Worker }
1976*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(BpBinder::getBinderProxyCount(), initialCount);
1977*38e8c45fSAndroid Build Coastguard Worker }
1978*38e8c45fSAndroid Build Coastguard Worker
1979*38e8c45fSAndroid Build Coastguard Worker class BinderLibRpcTestBase : public BinderLibTest {
1980*38e8c45fSAndroid Build Coastguard Worker public:
SetUp()1981*38e8c45fSAndroid Build Coastguard Worker void SetUp() override {
1982*38e8c45fSAndroid Build Coastguard Worker if (!base::GetBoolProperty("ro.debuggable", false)) {
1983*38e8c45fSAndroid Build Coastguard Worker GTEST_SKIP() << "Binder RPC is only enabled on debuggable builds, skipping test on "
1984*38e8c45fSAndroid Build Coastguard Worker "non-debuggable builds.";
1985*38e8c45fSAndroid Build Coastguard Worker }
1986*38e8c45fSAndroid Build Coastguard Worker BinderLibTest::SetUp();
1987*38e8c45fSAndroid Build Coastguard Worker }
1988*38e8c45fSAndroid Build Coastguard Worker
CreateSocket()1989*38e8c45fSAndroid Build Coastguard Worker std::tuple<unique_fd, unsigned int> CreateSocket() {
1990*38e8c45fSAndroid Build Coastguard Worker auto rpcServer = RpcServer::make();
1991*38e8c45fSAndroid Build Coastguard Worker EXPECT_NE(nullptr, rpcServer);
1992*38e8c45fSAndroid Build Coastguard Worker if (rpcServer == nullptr) return {};
1993*38e8c45fSAndroid Build Coastguard Worker unsigned int port;
1994*38e8c45fSAndroid Build Coastguard Worker if (status_t status = rpcServer->setupInetServer("127.0.0.1", 0, &port); status != OK) {
1995*38e8c45fSAndroid Build Coastguard Worker ADD_FAILURE() << "setupInetServer failed" << statusToString(status);
1996*38e8c45fSAndroid Build Coastguard Worker return {};
1997*38e8c45fSAndroid Build Coastguard Worker }
1998*38e8c45fSAndroid Build Coastguard Worker return {rpcServer->releaseServer(), port};
1999*38e8c45fSAndroid Build Coastguard Worker }
2000*38e8c45fSAndroid Build Coastguard Worker };
2001*38e8c45fSAndroid Build Coastguard Worker
2002*38e8c45fSAndroid Build Coastguard Worker class BinderLibRpcTest : public BinderLibRpcTestBase {};
2003*38e8c45fSAndroid Build Coastguard Worker
2004*38e8c45fSAndroid Build Coastguard Worker // e.g. EXPECT_THAT(expr, Debuggable(StatusEq(...))
2005*38e8c45fSAndroid Build Coastguard Worker // If device is debuggable AND not on user builds, expects matcher.
2006*38e8c45fSAndroid Build Coastguard Worker // Otherwise expects INVALID_OPERATION.
2007*38e8c45fSAndroid Build Coastguard Worker // Debuggable + non user builds is necessary but not sufficient for setRpcClientDebug to work.
Debuggable(const Matcher<status_t> & matcher)2008*38e8c45fSAndroid Build Coastguard Worker static Matcher<status_t> Debuggable(const Matcher<status_t> &matcher) {
2009*38e8c45fSAndroid Build Coastguard Worker bool isDebuggable = android::base::GetBoolProperty("ro.debuggable", false) &&
2010*38e8c45fSAndroid Build Coastguard Worker android::base::GetProperty("ro.build.type", "") != "user";
2011*38e8c45fSAndroid Build Coastguard Worker return isDebuggable ? matcher : StatusEq(INVALID_OPERATION);
2012*38e8c45fSAndroid Build Coastguard Worker }
2013*38e8c45fSAndroid Build Coastguard Worker
TEST_F(BinderLibRpcTest,SetRpcClientDebug)2014*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibRpcTest, SetRpcClientDebug) {
2015*38e8c45fSAndroid Build Coastguard Worker auto binder = addServer();
2016*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(binder != nullptr);
2017*38e8c45fSAndroid Build Coastguard Worker auto [socket, port] = CreateSocket();
2018*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(socket.ok());
2019*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(binder->setRpcClientDebug(std::move(socket), sp<BBinder>::make()),
2020*38e8c45fSAndroid Build Coastguard Worker Debuggable(StatusEq(OK)));
2021*38e8c45fSAndroid Build Coastguard Worker }
2022*38e8c45fSAndroid Build Coastguard Worker
2023*38e8c45fSAndroid Build Coastguard Worker // Tests for multiple RpcServer's on the same binder object.
TEST_F(BinderLibRpcTest,SetRpcClientDebugTwice)2024*38e8c45fSAndroid Build Coastguard Worker TEST_F(BinderLibRpcTest, SetRpcClientDebugTwice) {
2025*38e8c45fSAndroid Build Coastguard Worker auto binder = addServer();
2026*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(binder != nullptr);
2027*38e8c45fSAndroid Build Coastguard Worker
2028*38e8c45fSAndroid Build Coastguard Worker auto [socket1, port1] = CreateSocket();
2029*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(socket1.ok());
2030*38e8c45fSAndroid Build Coastguard Worker auto keepAliveBinder1 = sp<BBinder>::make();
2031*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(binder->setRpcClientDebug(std::move(socket1), keepAliveBinder1),
2032*38e8c45fSAndroid Build Coastguard Worker Debuggable(StatusEq(OK)));
2033*38e8c45fSAndroid Build Coastguard Worker
2034*38e8c45fSAndroid Build Coastguard Worker auto [socket2, port2] = CreateSocket();
2035*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(socket2.ok());
2036*38e8c45fSAndroid Build Coastguard Worker auto keepAliveBinder2 = sp<BBinder>::make();
2037*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(binder->setRpcClientDebug(std::move(socket2), keepAliveBinder2),
2038*38e8c45fSAndroid Build Coastguard Worker Debuggable(StatusEq(OK)));
2039*38e8c45fSAndroid Build Coastguard Worker }
2040*38e8c45fSAndroid Build Coastguard Worker
2041*38e8c45fSAndroid Build Coastguard Worker // Negative tests for RPC APIs on IBinder. Call should fail in the same way on both remote and
2042*38e8c45fSAndroid Build Coastguard Worker // local binders.
2043*38e8c45fSAndroid Build Coastguard Worker class BinderLibRpcTestP : public BinderLibRpcTestBase, public WithParamInterface<bool> {
2044*38e8c45fSAndroid Build Coastguard Worker public:
GetService()2045*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> GetService() {
2046*38e8c45fSAndroid Build Coastguard Worker return GetParam() ? sp<IBinder>(addServer()) : sp<IBinder>(sp<BBinder>::make());
2047*38e8c45fSAndroid Build Coastguard Worker }
ParamToString(const testing::TestParamInfo<ParamType> & info)2048*38e8c45fSAndroid Build Coastguard Worker static std::string ParamToString(const testing::TestParamInfo<ParamType> &info) {
2049*38e8c45fSAndroid Build Coastguard Worker return info.param ? "remote" : "local";
2050*38e8c45fSAndroid Build Coastguard Worker }
2051*38e8c45fSAndroid Build Coastguard Worker };
2052*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderLibRpcTestP,SetRpcClientDebugNoFd)2053*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderLibRpcTestP, SetRpcClientDebugNoFd) {
2054*38e8c45fSAndroid Build Coastguard Worker auto binder = GetService();
2055*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(binder != nullptr);
2056*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(binder->setRpcClientDebug(unique_fd(), sp<BBinder>::make()),
2057*38e8c45fSAndroid Build Coastguard Worker Debuggable(StatusEq(BAD_VALUE)));
2058*38e8c45fSAndroid Build Coastguard Worker }
2059*38e8c45fSAndroid Build Coastguard Worker
TEST_P(BinderLibRpcTestP,SetRpcClientDebugNoKeepAliveBinder)2060*38e8c45fSAndroid Build Coastguard Worker TEST_P(BinderLibRpcTestP, SetRpcClientDebugNoKeepAliveBinder) {
2061*38e8c45fSAndroid Build Coastguard Worker auto binder = GetService();
2062*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(binder != nullptr);
2063*38e8c45fSAndroid Build Coastguard Worker auto [socket, port] = CreateSocket();
2064*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(socket.ok());
2065*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(binder->setRpcClientDebug(std::move(socket), nullptr),
2066*38e8c45fSAndroid Build Coastguard Worker Debuggable(StatusEq(UNEXPECTED_NULL)));
2067*38e8c45fSAndroid Build Coastguard Worker }
2068*38e8c45fSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(BinderLibTest, BinderLibRpcTestP, testing::Bool(),
2069*38e8c45fSAndroid Build Coastguard Worker BinderLibRpcTestP::ParamToString);
2070*38e8c45fSAndroid Build Coastguard Worker
2071*38e8c45fSAndroid Build Coastguard Worker class BinderLibTestService : public BBinder {
2072*38e8c45fSAndroid Build Coastguard Worker public:
BinderLibTestService(int32_t id,bool exitOnDestroy=true)2073*38e8c45fSAndroid Build Coastguard Worker explicit BinderLibTestService(int32_t id, bool exitOnDestroy = true)
2074*38e8c45fSAndroid Build Coastguard Worker : m_id(id),
2075*38e8c45fSAndroid Build Coastguard Worker m_nextServerId(id + 1),
2076*38e8c45fSAndroid Build Coastguard Worker m_serverStartRequested(false),
2077*38e8c45fSAndroid Build Coastguard Worker m_callback(nullptr),
2078*38e8c45fSAndroid Build Coastguard Worker m_exitOnDestroy(exitOnDestroy) {
2079*38e8c45fSAndroid Build Coastguard Worker pthread_mutex_init(&m_serverWaitMutex, nullptr);
2080*38e8c45fSAndroid Build Coastguard Worker pthread_cond_init(&m_serverWaitCond, nullptr);
2081*38e8c45fSAndroid Build Coastguard Worker }
~BinderLibTestService()2082*38e8c45fSAndroid Build Coastguard Worker ~BinderLibTestService() {
2083*38e8c45fSAndroid Build Coastguard Worker if (m_exitOnDestroy) exit(EXIT_SUCCESS);
2084*38e8c45fSAndroid Build Coastguard Worker }
2085*38e8c45fSAndroid Build Coastguard Worker
processPendingCall()2086*38e8c45fSAndroid Build Coastguard Worker void processPendingCall() {
2087*38e8c45fSAndroid Build Coastguard Worker if (m_callback != nullptr) {
2088*38e8c45fSAndroid Build Coastguard Worker Parcel data;
2089*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(NO_ERROR);
2090*38e8c45fSAndroid Build Coastguard Worker m_callback->transact(BINDER_LIB_TEST_CALL_BACK, data, nullptr, TF_ONE_WAY);
2091*38e8c45fSAndroid Build Coastguard Worker m_callback = nullptr;
2092*38e8c45fSAndroid Build Coastguard Worker }
2093*38e8c45fSAndroid Build Coastguard Worker }
2094*38e8c45fSAndroid Build Coastguard Worker
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags=0)2095*38e8c45fSAndroid Build Coastguard Worker virtual status_t onTransact(uint32_t code, const Parcel &data, Parcel *reply,
2096*38e8c45fSAndroid Build Coastguard Worker uint32_t flags = 0) {
2097*38e8c45fSAndroid Build Coastguard Worker // TODO(b/182914638): also checks getCallingUid() for RPC
2098*38e8c45fSAndroid Build Coastguard Worker if (!data.isForRpc() && getuid() != (uid_t)IPCThreadState::self()->getCallingUid()) {
2099*38e8c45fSAndroid Build Coastguard Worker return PERMISSION_DENIED;
2100*38e8c45fSAndroid Build Coastguard Worker }
2101*38e8c45fSAndroid Build Coastguard Worker switch (code) {
2102*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_REGISTER_SERVER: {
2103*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder;
2104*38e8c45fSAndroid Build Coastguard Worker /*id =*/data.readInt32();
2105*38e8c45fSAndroid Build Coastguard Worker binder = data.readStrongBinder();
2106*38e8c45fSAndroid Build Coastguard Worker if (binder == nullptr) {
2107*38e8c45fSAndroid Build Coastguard Worker return BAD_VALUE;
2108*38e8c45fSAndroid Build Coastguard Worker }
2109*38e8c45fSAndroid Build Coastguard Worker
2110*38e8c45fSAndroid Build Coastguard Worker if (m_id != 0) return INVALID_OPERATION;
2111*38e8c45fSAndroid Build Coastguard Worker
2112*38e8c45fSAndroid Build Coastguard Worker pthread_mutex_lock(&m_serverWaitMutex);
2113*38e8c45fSAndroid Build Coastguard Worker if (m_serverStartRequested) {
2114*38e8c45fSAndroid Build Coastguard Worker m_serverStartRequested = false;
2115*38e8c45fSAndroid Build Coastguard Worker m_serverStarted = binder;
2116*38e8c45fSAndroid Build Coastguard Worker pthread_cond_signal(&m_serverWaitCond);
2117*38e8c45fSAndroid Build Coastguard Worker }
2118*38e8c45fSAndroid Build Coastguard Worker pthread_mutex_unlock(&m_serverWaitMutex);
2119*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2120*38e8c45fSAndroid Build Coastguard Worker }
2121*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_ADD_POLL_SERVER:
2122*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_ADD_SERVER: {
2123*38e8c45fSAndroid Build Coastguard Worker int ret;
2124*38e8c45fSAndroid Build Coastguard Worker int serverid;
2125*38e8c45fSAndroid Build Coastguard Worker
2126*38e8c45fSAndroid Build Coastguard Worker if (m_id != 0) {
2127*38e8c45fSAndroid Build Coastguard Worker return INVALID_OPERATION;
2128*38e8c45fSAndroid Build Coastguard Worker }
2129*38e8c45fSAndroid Build Coastguard Worker pthread_mutex_lock(&m_serverWaitMutex);
2130*38e8c45fSAndroid Build Coastguard Worker if (m_serverStartRequested) {
2131*38e8c45fSAndroid Build Coastguard Worker ret = -EBUSY;
2132*38e8c45fSAndroid Build Coastguard Worker } else {
2133*38e8c45fSAndroid Build Coastguard Worker serverid = m_nextServerId++;
2134*38e8c45fSAndroid Build Coastguard Worker m_serverStartRequested = true;
2135*38e8c45fSAndroid Build Coastguard Worker bool usePoll = code == BINDER_LIB_TEST_ADD_POLL_SERVER;
2136*38e8c45fSAndroid Build Coastguard Worker
2137*38e8c45fSAndroid Build Coastguard Worker pthread_mutex_unlock(&m_serverWaitMutex);
2138*38e8c45fSAndroid Build Coastguard Worker ret = start_server_process(serverid, usePoll);
2139*38e8c45fSAndroid Build Coastguard Worker pthread_mutex_lock(&m_serverWaitMutex);
2140*38e8c45fSAndroid Build Coastguard Worker }
2141*38e8c45fSAndroid Build Coastguard Worker if (ret > 0) {
2142*38e8c45fSAndroid Build Coastguard Worker if (m_serverStartRequested) {
2143*38e8c45fSAndroid Build Coastguard Worker struct timespec ts;
2144*38e8c45fSAndroid Build Coastguard Worker clock_gettime(CLOCK_REALTIME, &ts);
2145*38e8c45fSAndroid Build Coastguard Worker ts.tv_sec += 5;
2146*38e8c45fSAndroid Build Coastguard Worker ret = pthread_cond_timedwait(&m_serverWaitCond, &m_serverWaitMutex, &ts);
2147*38e8c45fSAndroid Build Coastguard Worker }
2148*38e8c45fSAndroid Build Coastguard Worker if (m_serverStartRequested) {
2149*38e8c45fSAndroid Build Coastguard Worker m_serverStartRequested = false;
2150*38e8c45fSAndroid Build Coastguard Worker ret = -ETIMEDOUT;
2151*38e8c45fSAndroid Build Coastguard Worker } else {
2152*38e8c45fSAndroid Build Coastguard Worker reply->writeStrongBinder(m_serverStarted);
2153*38e8c45fSAndroid Build Coastguard Worker reply->writeInt32(serverid);
2154*38e8c45fSAndroid Build Coastguard Worker m_serverStarted = nullptr;
2155*38e8c45fSAndroid Build Coastguard Worker ret = NO_ERROR;
2156*38e8c45fSAndroid Build Coastguard Worker }
2157*38e8c45fSAndroid Build Coastguard Worker } else if (ret >= 0) {
2158*38e8c45fSAndroid Build Coastguard Worker m_serverStartRequested = false;
2159*38e8c45fSAndroid Build Coastguard Worker ret = UNKNOWN_ERROR;
2160*38e8c45fSAndroid Build Coastguard Worker }
2161*38e8c45fSAndroid Build Coastguard Worker pthread_mutex_unlock(&m_serverWaitMutex);
2162*38e8c45fSAndroid Build Coastguard Worker return ret;
2163*38e8c45fSAndroid Build Coastguard Worker }
2164*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_USE_CALLING_GUARD_TRANSACTION: {
2165*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::SpGuard spGuard{
2166*38e8c45fSAndroid Build Coastguard Worker .address = __builtin_frame_address(0),
2167*38e8c45fSAndroid Build Coastguard Worker .context = "GuardInBinderTransaction",
2168*38e8c45fSAndroid Build Coastguard Worker };
2169*38e8c45fSAndroid Build Coastguard Worker const IPCThreadState::SpGuard *origGuard =
2170*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->pushGetCallingSpGuard(&spGuard);
2171*38e8c45fSAndroid Build Coastguard Worker
2172*38e8c45fSAndroid Build Coastguard Worker // if the guard works, this should abort
2173*38e8c45fSAndroid Build Coastguard Worker (void)IPCThreadState::self()->getCallingPid();
2174*38e8c45fSAndroid Build Coastguard Worker
2175*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->restoreGetCallingSpGuard(origGuard);
2176*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2177*38e8c45fSAndroid Build Coastguard Worker }
2178*38e8c45fSAndroid Build Coastguard Worker
2179*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_GETPID:
2180*38e8c45fSAndroid Build Coastguard Worker reply->writeInt32(getpid());
2181*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2182*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_GETUID:
2183*38e8c45fSAndroid Build Coastguard Worker reply->writeInt32(getuid());
2184*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2185*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_NOP_TRANSACTION_WAIT:
2186*38e8c45fSAndroid Build Coastguard Worker usleep(5000);
2187*38e8c45fSAndroid Build Coastguard Worker [[fallthrough]];
2188*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_NOP_TRANSACTION:
2189*38e8c45fSAndroid Build Coastguard Worker // oneway error codes should be ignored
2190*38e8c45fSAndroid Build Coastguard Worker if (flags & TF_ONE_WAY) {
2191*38e8c45fSAndroid Build Coastguard Worker return UNKNOWN_ERROR;
2192*38e8c45fSAndroid Build Coastguard Worker }
2193*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2194*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_DELAYED_CALL_BACK: {
2195*38e8c45fSAndroid Build Coastguard Worker // Note: this transaction is only designed for use with a
2196*38e8c45fSAndroid Build Coastguard Worker // poll() server. See comments around epoll_wait().
2197*38e8c45fSAndroid Build Coastguard Worker if (m_callback != nullptr) {
2198*38e8c45fSAndroid Build Coastguard Worker // A callback was already pending; this means that
2199*38e8c45fSAndroid Build Coastguard Worker // we received a second call while still processing
2200*38e8c45fSAndroid Build Coastguard Worker // the first one. Fail the test.
2201*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> callback = data.readStrongBinder();
2202*38e8c45fSAndroid Build Coastguard Worker Parcel data2;
2203*38e8c45fSAndroid Build Coastguard Worker data2.writeInt32(UNKNOWN_ERROR);
2204*38e8c45fSAndroid Build Coastguard Worker
2205*38e8c45fSAndroid Build Coastguard Worker callback->transact(BINDER_LIB_TEST_CALL_BACK, data2, nullptr, TF_ONE_WAY);
2206*38e8c45fSAndroid Build Coastguard Worker } else {
2207*38e8c45fSAndroid Build Coastguard Worker m_callback = data.readStrongBinder();
2208*38e8c45fSAndroid Build Coastguard Worker int32_t delayUs = data.readInt32();
2209*38e8c45fSAndroid Build Coastguard Worker /*
2210*38e8c45fSAndroid Build Coastguard Worker * It's necessary that we sleep here, so the next
2211*38e8c45fSAndroid Build Coastguard Worker * transaction the caller makes will be queued to
2212*38e8c45fSAndroid Build Coastguard Worker * the async queue.
2213*38e8c45fSAndroid Build Coastguard Worker */
2214*38e8c45fSAndroid Build Coastguard Worker usleep(delayUs);
2215*38e8c45fSAndroid Build Coastguard Worker
2216*38e8c45fSAndroid Build Coastguard Worker /*
2217*38e8c45fSAndroid Build Coastguard Worker * Now when we return, libbinder will tell the kernel
2218*38e8c45fSAndroid Build Coastguard Worker * we are done with this transaction, and the kernel
2219*38e8c45fSAndroid Build Coastguard Worker * can move the queued transaction to either the
2220*38e8c45fSAndroid Build Coastguard Worker * thread todo worklist (for kernels without the fix),
2221*38e8c45fSAndroid Build Coastguard Worker * or the proc todo worklist. In case of the former,
2222*38e8c45fSAndroid Build Coastguard Worker * the next outbound call will pick up the pending
2223*38e8c45fSAndroid Build Coastguard Worker * transaction, which leads to undesired reentrant
2224*38e8c45fSAndroid Build Coastguard Worker * behavior. This is caught in the if() branch above.
2225*38e8c45fSAndroid Build Coastguard Worker */
2226*38e8c45fSAndroid Build Coastguard Worker }
2227*38e8c45fSAndroid Build Coastguard Worker
2228*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2229*38e8c45fSAndroid Build Coastguard Worker }
2230*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_NOP_CALL_BACK: {
2231*38e8c45fSAndroid Build Coastguard Worker Parcel data2, reply2;
2232*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder;
2233*38e8c45fSAndroid Build Coastguard Worker binder = data.readStrongBinder();
2234*38e8c45fSAndroid Build Coastguard Worker if (binder == nullptr) {
2235*38e8c45fSAndroid Build Coastguard Worker return BAD_VALUE;
2236*38e8c45fSAndroid Build Coastguard Worker }
2237*38e8c45fSAndroid Build Coastguard Worker data2.writeInt32(NO_ERROR);
2238*38e8c45fSAndroid Build Coastguard Worker binder->transact(BINDER_LIB_TEST_CALL_BACK, data2, &reply2);
2239*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2240*38e8c45fSAndroid Build Coastguard Worker }
2241*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_GET_SELF_TRANSACTION:
2242*38e8c45fSAndroid Build Coastguard Worker reply->writeStrongBinder(this);
2243*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2244*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_GET_ID_TRANSACTION:
2245*38e8c45fSAndroid Build Coastguard Worker reply->writeInt32(m_id);
2246*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2247*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_INDIRECT_TRANSACTION: {
2248*38e8c45fSAndroid Build Coastguard Worker int32_t count;
2249*38e8c45fSAndroid Build Coastguard Worker uint32_t indirect_code;
2250*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder;
2251*38e8c45fSAndroid Build Coastguard Worker
2252*38e8c45fSAndroid Build Coastguard Worker count = data.readInt32();
2253*38e8c45fSAndroid Build Coastguard Worker reply->writeInt32(m_id);
2254*38e8c45fSAndroid Build Coastguard Worker reply->writeInt32(count);
2255*38e8c45fSAndroid Build Coastguard Worker for (int i = 0; i < count; i++) {
2256*38e8c45fSAndroid Build Coastguard Worker binder = data.readStrongBinder();
2257*38e8c45fSAndroid Build Coastguard Worker if (binder == nullptr) {
2258*38e8c45fSAndroid Build Coastguard Worker return BAD_VALUE;
2259*38e8c45fSAndroid Build Coastguard Worker }
2260*38e8c45fSAndroid Build Coastguard Worker indirect_code = data.readInt32();
2261*38e8c45fSAndroid Build Coastguard Worker BinderLibTestBundle data2(&data);
2262*38e8c45fSAndroid Build Coastguard Worker if (!data2.isValid()) {
2263*38e8c45fSAndroid Build Coastguard Worker return BAD_VALUE;
2264*38e8c45fSAndroid Build Coastguard Worker }
2265*38e8c45fSAndroid Build Coastguard Worker BinderLibTestBundle reply2;
2266*38e8c45fSAndroid Build Coastguard Worker binder->transact(indirect_code, data2, &reply2);
2267*38e8c45fSAndroid Build Coastguard Worker reply2.appendTo(reply);
2268*38e8c45fSAndroid Build Coastguard Worker }
2269*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2270*38e8c45fSAndroid Build Coastguard Worker }
2271*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_SET_ERROR_TRANSACTION:
2272*38e8c45fSAndroid Build Coastguard Worker reply->setError(data.readInt32());
2273*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2274*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_GET_PTR_SIZE_TRANSACTION:
2275*38e8c45fSAndroid Build Coastguard Worker reply->writeInt32(sizeof(void *));
2276*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2277*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_GET_STATUS_TRANSACTION:
2278*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2279*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION:
2280*38e8c45fSAndroid Build Coastguard Worker m_strongRef = data.readStrongBinder();
2281*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2282*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_LINK_DEATH_TRANSACTION: {
2283*38e8c45fSAndroid Build Coastguard Worker int ret;
2284*38e8c45fSAndroid Build Coastguard Worker Parcel data2, reply2;
2285*38e8c45fSAndroid Build Coastguard Worker sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient();
2286*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> target;
2287*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> callback;
2288*38e8c45fSAndroid Build Coastguard Worker
2289*38e8c45fSAndroid Build Coastguard Worker target = data.readStrongBinder();
2290*38e8c45fSAndroid Build Coastguard Worker if (target == nullptr) {
2291*38e8c45fSAndroid Build Coastguard Worker return BAD_VALUE;
2292*38e8c45fSAndroid Build Coastguard Worker }
2293*38e8c45fSAndroid Build Coastguard Worker callback = data.readStrongBinder();
2294*38e8c45fSAndroid Build Coastguard Worker if (callback == nullptr) {
2295*38e8c45fSAndroid Build Coastguard Worker return BAD_VALUE;
2296*38e8c45fSAndroid Build Coastguard Worker }
2297*38e8c45fSAndroid Build Coastguard Worker ret = target->linkToDeath(testDeathRecipient);
2298*38e8c45fSAndroid Build Coastguard Worker if (ret == NO_ERROR) ret = testDeathRecipient->waitEvent(5);
2299*38e8c45fSAndroid Build Coastguard Worker data2.writeInt32(ret);
2300*38e8c45fSAndroid Build Coastguard Worker callback->transact(BINDER_LIB_TEST_CALL_BACK, data2, &reply2);
2301*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2302*38e8c45fSAndroid Build Coastguard Worker }
2303*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_WRITE_FILE_TRANSACTION: {
2304*38e8c45fSAndroid Build Coastguard Worker int ret;
2305*38e8c45fSAndroid Build Coastguard Worker int32_t size;
2306*38e8c45fSAndroid Build Coastguard Worker const void *buf;
2307*38e8c45fSAndroid Build Coastguard Worker int fd;
2308*38e8c45fSAndroid Build Coastguard Worker
2309*38e8c45fSAndroid Build Coastguard Worker fd = data.readFileDescriptor();
2310*38e8c45fSAndroid Build Coastguard Worker if (fd < 0) {
2311*38e8c45fSAndroid Build Coastguard Worker return BAD_VALUE;
2312*38e8c45fSAndroid Build Coastguard Worker }
2313*38e8c45fSAndroid Build Coastguard Worker ret = data.readInt32(&size);
2314*38e8c45fSAndroid Build Coastguard Worker if (ret != NO_ERROR) {
2315*38e8c45fSAndroid Build Coastguard Worker return ret;
2316*38e8c45fSAndroid Build Coastguard Worker }
2317*38e8c45fSAndroid Build Coastguard Worker buf = data.readInplace(size);
2318*38e8c45fSAndroid Build Coastguard Worker if (buf == nullptr) {
2319*38e8c45fSAndroid Build Coastguard Worker return BAD_VALUE;
2320*38e8c45fSAndroid Build Coastguard Worker }
2321*38e8c45fSAndroid Build Coastguard Worker ret = write(fd, buf, size);
2322*38e8c45fSAndroid Build Coastguard Worker if (ret != size) return UNKNOWN_ERROR;
2323*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2324*38e8c45fSAndroid Build Coastguard Worker }
2325*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_WRITE_PARCEL_FILE_DESCRIPTOR_TRANSACTION: {
2326*38e8c45fSAndroid Build Coastguard Worker int ret;
2327*38e8c45fSAndroid Build Coastguard Worker int32_t size;
2328*38e8c45fSAndroid Build Coastguard Worker const void *buf;
2329*38e8c45fSAndroid Build Coastguard Worker unique_fd fd;
2330*38e8c45fSAndroid Build Coastguard Worker
2331*38e8c45fSAndroid Build Coastguard Worker ret = data.readUniqueParcelFileDescriptor(&fd);
2332*38e8c45fSAndroid Build Coastguard Worker if (ret != NO_ERROR) {
2333*38e8c45fSAndroid Build Coastguard Worker return ret;
2334*38e8c45fSAndroid Build Coastguard Worker }
2335*38e8c45fSAndroid Build Coastguard Worker ret = data.readInt32(&size);
2336*38e8c45fSAndroid Build Coastguard Worker if (ret != NO_ERROR) {
2337*38e8c45fSAndroid Build Coastguard Worker return ret;
2338*38e8c45fSAndroid Build Coastguard Worker }
2339*38e8c45fSAndroid Build Coastguard Worker buf = data.readInplace(size);
2340*38e8c45fSAndroid Build Coastguard Worker if (buf == nullptr) {
2341*38e8c45fSAndroid Build Coastguard Worker return BAD_VALUE;
2342*38e8c45fSAndroid Build Coastguard Worker }
2343*38e8c45fSAndroid Build Coastguard Worker ret = write(fd.get(), buf, size);
2344*38e8c45fSAndroid Build Coastguard Worker if (ret != size) return UNKNOWN_ERROR;
2345*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2346*38e8c45fSAndroid Build Coastguard Worker }
2347*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_GET_FILE_DESCRIPTORS_OWNED_TRANSACTION: {
2348*38e8c45fSAndroid Build Coastguard Worker unique_fd fd1(memfd_create("memfd1", MFD_CLOEXEC));
2349*38e8c45fSAndroid Build Coastguard Worker if (!fd1.ok()) {
2350*38e8c45fSAndroid Build Coastguard Worker PLOGE("memfd_create failed");
2351*38e8c45fSAndroid Build Coastguard Worker return UNKNOWN_ERROR;
2352*38e8c45fSAndroid Build Coastguard Worker }
2353*38e8c45fSAndroid Build Coastguard Worker unique_fd fd2(memfd_create("memfd2", MFD_CLOEXEC));
2354*38e8c45fSAndroid Build Coastguard Worker if (!fd2.ok()) {
2355*38e8c45fSAndroid Build Coastguard Worker PLOGE("memfd_create failed");
2356*38e8c45fSAndroid Build Coastguard Worker return UNKNOWN_ERROR;
2357*38e8c45fSAndroid Build Coastguard Worker }
2358*38e8c45fSAndroid Build Coastguard Worker status_t ret;
2359*38e8c45fSAndroid Build Coastguard Worker ret = reply->writeFileDescriptor(fd1.release(), true);
2360*38e8c45fSAndroid Build Coastguard Worker if (ret != NO_ERROR) {
2361*38e8c45fSAndroid Build Coastguard Worker return ret;
2362*38e8c45fSAndroid Build Coastguard Worker }
2363*38e8c45fSAndroid Build Coastguard Worker ret = reply->writeFileDescriptor(fd2.release(), true);
2364*38e8c45fSAndroid Build Coastguard Worker if (ret != NO_ERROR) {
2365*38e8c45fSAndroid Build Coastguard Worker return ret;
2366*38e8c45fSAndroid Build Coastguard Worker }
2367*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2368*38e8c45fSAndroid Build Coastguard Worker }
2369*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_GET_FILE_DESCRIPTORS_UNOWNED_TRANSACTION: {
2370*38e8c45fSAndroid Build Coastguard Worker status_t ret;
2371*38e8c45fSAndroid Build Coastguard Worker ret = reply->writeFileDescriptor(STDOUT_FILENO, false);
2372*38e8c45fSAndroid Build Coastguard Worker if (ret != NO_ERROR) {
2373*38e8c45fSAndroid Build Coastguard Worker return ret;
2374*38e8c45fSAndroid Build Coastguard Worker }
2375*38e8c45fSAndroid Build Coastguard Worker ret = reply->writeFileDescriptor(STDERR_FILENO, false);
2376*38e8c45fSAndroid Build Coastguard Worker if (ret != NO_ERROR) {
2377*38e8c45fSAndroid Build Coastguard Worker return ret;
2378*38e8c45fSAndroid Build Coastguard Worker }
2379*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2380*38e8c45fSAndroid Build Coastguard Worker }
2381*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_DELAYED_EXIT_TRANSACTION:
2382*38e8c45fSAndroid Build Coastguard Worker alarm(10);
2383*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2384*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_EXIT_TRANSACTION:
2385*38e8c45fSAndroid Build Coastguard Worker while (wait(nullptr) != -1 || errno != ECHILD)
2386*38e8c45fSAndroid Build Coastguard Worker ;
2387*38e8c45fSAndroid Build Coastguard Worker exit(EXIT_SUCCESS);
2388*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_CREATE_BINDER_TRANSACTION: {
2389*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder = new BBinder();
2390*38e8c45fSAndroid Build Coastguard Worker reply->writeStrongBinder(binder);
2391*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2392*38e8c45fSAndroid Build Coastguard Worker }
2393*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION: {
2394*38e8c45fSAndroid Build Coastguard Worker data.enforceInterface(binderLibTestServiceName);
2395*38e8c45fSAndroid Build Coastguard Worker reply->writeInt32(IPCThreadState::self()->getCallingWorkSourceUid());
2396*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2397*38e8c45fSAndroid Build Coastguard Worker }
2398*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_GET_SCHEDULING_POLICY: {
2399*38e8c45fSAndroid Build Coastguard Worker int policy = 0;
2400*38e8c45fSAndroid Build Coastguard Worker sched_param param;
2401*38e8c45fSAndroid Build Coastguard Worker if (0 != pthread_getschedparam(pthread_self(), &policy, ¶m)) {
2402*38e8c45fSAndroid Build Coastguard Worker return UNKNOWN_ERROR;
2403*38e8c45fSAndroid Build Coastguard Worker }
2404*38e8c45fSAndroid Build Coastguard Worker reply->writeInt32(policy);
2405*38e8c45fSAndroid Build Coastguard Worker reply->writeInt32(param.sched_priority);
2406*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2407*38e8c45fSAndroid Build Coastguard Worker }
2408*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_LISTEN_FOR_FROZEN_STATE_CHANGE: {
2409*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder = data.readStrongBinder();
2410*38e8c45fSAndroid Build Coastguard Worker frozenStateChangeCallback = sp<TestFrozenStateChangeCallback>::make();
2411*38e8c45fSAndroid Build Coastguard Worker // Hold an strong pointer to the binder object so it doesn't go
2412*38e8c45fSAndroid Build Coastguard Worker // away.
2413*38e8c45fSAndroid Build Coastguard Worker frozenStateChangeCallback->binder = binder;
2414*38e8c45fSAndroid Build Coastguard Worker int ret = binder->addFrozenStateChangeCallback(frozenStateChangeCallback);
2415*38e8c45fSAndroid Build Coastguard Worker if (ret != NO_ERROR) {
2416*38e8c45fSAndroid Build Coastguard Worker return ret;
2417*38e8c45fSAndroid Build Coastguard Worker }
2418*38e8c45fSAndroid Build Coastguard Worker auto event = frozenStateChangeCallback->events.popWithTimeout(1000ms);
2419*38e8c45fSAndroid Build Coastguard Worker if (!event.has_value()) {
2420*38e8c45fSAndroid Build Coastguard Worker return NOT_ENOUGH_DATA;
2421*38e8c45fSAndroid Build Coastguard Worker }
2422*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2423*38e8c45fSAndroid Build Coastguard Worker }
2424*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_CONSUME_STATE_CHANGE_EVENTS: {
2425*38e8c45fSAndroid Build Coastguard Worker reply->writeBoolVector(frozenStateChangeCallback->getAllAndClear());
2426*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2427*38e8c45fSAndroid Build Coastguard Worker }
2428*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_ECHO_VECTOR: {
2429*38e8c45fSAndroid Build Coastguard Worker std::vector<uint64_t> vector;
2430*38e8c45fSAndroid Build Coastguard Worker auto err = data.readUint64Vector(&vector);
2431*38e8c45fSAndroid Build Coastguard Worker if (err != NO_ERROR) return err;
2432*38e8c45fSAndroid Build Coastguard Worker reply->writeUint64Vector(vector);
2433*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2434*38e8c45fSAndroid Build Coastguard Worker }
2435*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_GET_NON_BLOCKING_FD: {
2436*38e8c45fSAndroid Build Coastguard Worker std::array<int, 2> sockets;
2437*38e8c45fSAndroid Build Coastguard Worker const bool created = socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets.data()) == 0;
2438*38e8c45fSAndroid Build Coastguard Worker if (!created) {
2439*38e8c45fSAndroid Build Coastguard Worker ALOGE("Could not create socket pair");
2440*38e8c45fSAndroid Build Coastguard Worker return UNKNOWN_ERROR;
2441*38e8c45fSAndroid Build Coastguard Worker }
2442*38e8c45fSAndroid Build Coastguard Worker
2443*38e8c45fSAndroid Build Coastguard Worker const int result = fcntl(sockets[0], F_SETFL, O_NONBLOCK);
2444*38e8c45fSAndroid Build Coastguard Worker if (result != 0) {
2445*38e8c45fSAndroid Build Coastguard Worker ALOGE("Could not make socket non-blocking: %s", strerror(errno));
2446*38e8c45fSAndroid Build Coastguard Worker return UNKNOWN_ERROR;
2447*38e8c45fSAndroid Build Coastguard Worker }
2448*38e8c45fSAndroid Build Coastguard Worker unique_fd out(sockets[0]);
2449*38e8c45fSAndroid Build Coastguard Worker status_t writeResult = reply->writeUniqueFileDescriptor(out);
2450*38e8c45fSAndroid Build Coastguard Worker if (writeResult != NO_ERROR) {
2451*38e8c45fSAndroid Build Coastguard Worker ALOGE("Could not write unique_fd");
2452*38e8c45fSAndroid Build Coastguard Worker return writeResult;
2453*38e8c45fSAndroid Build Coastguard Worker }
2454*38e8c45fSAndroid Build Coastguard Worker close(sockets[1]); // we don't need the other side of the fd
2455*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2456*38e8c45fSAndroid Build Coastguard Worker }
2457*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_REJECT_OBJECTS: {
2458*38e8c45fSAndroid Build Coastguard Worker return data.objectsCount() == 0 ? BAD_VALUE : NO_ERROR;
2459*38e8c45fSAndroid Build Coastguard Worker }
2460*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_CAN_GET_SID: {
2461*38e8c45fSAndroid Build Coastguard Worker return IPCThreadState::self()->getCallingSid() == nullptr ? BAD_VALUE : NO_ERROR;
2462*38e8c45fSAndroid Build Coastguard Worker }
2463*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_GET_MAX_THREAD_COUNT: {
2464*38e8c45fSAndroid Build Coastguard Worker reply->writeInt32(ProcessState::self()->getThreadPoolMaxTotalThreadCount());
2465*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2466*38e8c45fSAndroid Build Coastguard Worker }
2467*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_IS_THREADPOOL_STARTED: {
2468*38e8c45fSAndroid Build Coastguard Worker reply->writeBool(ProcessState::self()->isThreadPoolStarted());
2469*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2470*38e8c45fSAndroid Build Coastguard Worker }
2471*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_PROCESS_LOCK: {
2472*38e8c45fSAndroid Build Coastguard Worker m_blockMutex.lock();
2473*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2474*38e8c45fSAndroid Build Coastguard Worker }
2475*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_LOCK_UNLOCK: {
2476*38e8c45fSAndroid Build Coastguard Worker std::lock_guard<std::mutex> _l(m_blockMutex);
2477*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2478*38e8c45fSAndroid Build Coastguard Worker }
2479*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_UNLOCK_AFTER_MS: {
2480*38e8c45fSAndroid Build Coastguard Worker int32_t ms = data.readInt32();
2481*38e8c45fSAndroid Build Coastguard Worker return unlockInMs(ms);
2482*38e8c45fSAndroid Build Coastguard Worker }
2483*38e8c45fSAndroid Build Coastguard Worker case BINDER_LIB_TEST_PROCESS_TEMPORARY_LOCK: {
2484*38e8c45fSAndroid Build Coastguard Worker m_blockMutex.lock();
2485*38e8c45fSAndroid Build Coastguard Worker sp<BinderLibTestService> thisService = this;
2486*38e8c45fSAndroid Build Coastguard Worker int32_t value = data.readInt32();
2487*38e8c45fSAndroid Build Coastguard Worker // start local thread to unlock in 1s
2488*38e8c45fSAndroid Build Coastguard Worker std::thread t([=] { thisService->unlockInMs(value); });
2489*38e8c45fSAndroid Build Coastguard Worker t.detach();
2490*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2491*38e8c45fSAndroid Build Coastguard Worker }
2492*38e8c45fSAndroid Build Coastguard Worker default:
2493*38e8c45fSAndroid Build Coastguard Worker return UNKNOWN_TRANSACTION;
2494*38e8c45fSAndroid Build Coastguard Worker };
2495*38e8c45fSAndroid Build Coastguard Worker }
2496*38e8c45fSAndroid Build Coastguard Worker
unlockInMs(int32_t ms)2497*38e8c45fSAndroid Build Coastguard Worker status_t unlockInMs(int32_t ms) {
2498*38e8c45fSAndroid Build Coastguard Worker usleep(ms * 1000);
2499*38e8c45fSAndroid Build Coastguard Worker m_blockMutex.unlock();
2500*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
2501*38e8c45fSAndroid Build Coastguard Worker }
2502*38e8c45fSAndroid Build Coastguard Worker
2503*38e8c45fSAndroid Build Coastguard Worker private:
2504*38e8c45fSAndroid Build Coastguard Worker int32_t m_id;
2505*38e8c45fSAndroid Build Coastguard Worker int32_t m_nextServerId;
2506*38e8c45fSAndroid Build Coastguard Worker pthread_mutex_t m_serverWaitMutex;
2507*38e8c45fSAndroid Build Coastguard Worker pthread_cond_t m_serverWaitCond;
2508*38e8c45fSAndroid Build Coastguard Worker bool m_serverStartRequested;
2509*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> m_serverStarted;
2510*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> m_strongRef;
2511*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> m_callback;
2512*38e8c45fSAndroid Build Coastguard Worker bool m_exitOnDestroy;
2513*38e8c45fSAndroid Build Coastguard Worker std::mutex m_blockMutex;
2514*38e8c45fSAndroid Build Coastguard Worker sp<TestFrozenStateChangeCallback> frozenStateChangeCallback;
2515*38e8c45fSAndroid Build Coastguard Worker };
2516*38e8c45fSAndroid Build Coastguard Worker
run_server(int index,int readypipefd,bool usePoll)2517*38e8c45fSAndroid Build Coastguard Worker int run_server(int index, int readypipefd, bool usePoll)
2518*38e8c45fSAndroid Build Coastguard Worker {
2519*38e8c45fSAndroid Build Coastguard Worker binderLibTestServiceName += String16(binderserversuffix);
2520*38e8c45fSAndroid Build Coastguard Worker
2521*38e8c45fSAndroid Build Coastguard Worker // Testing to make sure that calls that we are serving can use getCallin*
2522*38e8c45fSAndroid Build Coastguard Worker // even though we don't here.
2523*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::SpGuard spGuard{
2524*38e8c45fSAndroid Build Coastguard Worker .address = __builtin_frame_address(0),
2525*38e8c45fSAndroid Build Coastguard Worker .context = "main server thread",
2526*38e8c45fSAndroid Build Coastguard Worker };
2527*38e8c45fSAndroid Build Coastguard Worker (void)IPCThreadState::self()->pushGetCallingSpGuard(&spGuard);
2528*38e8c45fSAndroid Build Coastguard Worker
2529*38e8c45fSAndroid Build Coastguard Worker status_t ret;
2530*38e8c45fSAndroid Build Coastguard Worker sp<IServiceManager> sm = defaultServiceManager();
2531*38e8c45fSAndroid Build Coastguard Worker sm->enableAddServiceCache(false);
2532*38e8c45fSAndroid Build Coastguard Worker
2533*38e8c45fSAndroid Build Coastguard Worker BinderLibTestService* testServicePtr;
2534*38e8c45fSAndroid Build Coastguard Worker {
2535*38e8c45fSAndroid Build Coastguard Worker sp<BinderLibTestService> testService = new BinderLibTestService(index);
2536*38e8c45fSAndroid Build Coastguard Worker
2537*38e8c45fSAndroid Build Coastguard Worker testService->setMinSchedulerPolicy(kSchedPolicy, kSchedPriority);
2538*38e8c45fSAndroid Build Coastguard Worker
2539*38e8c45fSAndroid Build Coastguard Worker testService->setInheritRt(true);
2540*38e8c45fSAndroid Build Coastguard Worker
2541*38e8c45fSAndroid Build Coastguard Worker /*
2542*38e8c45fSAndroid Build Coastguard Worker * Normally would also contain functionality as well, but we are only
2543*38e8c45fSAndroid Build Coastguard Worker * testing the extension mechanism.
2544*38e8c45fSAndroid Build Coastguard Worker */
2545*38e8c45fSAndroid Build Coastguard Worker testService->setExtension(new BBinder());
2546*38e8c45fSAndroid Build Coastguard Worker
2547*38e8c45fSAndroid Build Coastguard Worker // Required for test "BufRejected'
2548*38e8c45fSAndroid Build Coastguard Worker testService->setRequestingSid(true);
2549*38e8c45fSAndroid Build Coastguard Worker
2550*38e8c45fSAndroid Build Coastguard Worker /*
2551*38e8c45fSAndroid Build Coastguard Worker * We need this below, but can't hold a sp<> because it prevents the
2552*38e8c45fSAndroid Build Coastguard Worker * node from being cleaned up automatically. It's safe in this case
2553*38e8c45fSAndroid Build Coastguard Worker * because of how the tests are written.
2554*38e8c45fSAndroid Build Coastguard Worker */
2555*38e8c45fSAndroid Build Coastguard Worker testServicePtr = testService.get();
2556*38e8c45fSAndroid Build Coastguard Worker
2557*38e8c45fSAndroid Build Coastguard Worker if (index == 0) {
2558*38e8c45fSAndroid Build Coastguard Worker ret = sm->addService(binderLibTestServiceName, testService);
2559*38e8c45fSAndroid Build Coastguard Worker } else {
2560*38e8c45fSAndroid Build Coastguard Worker LIBBINDER_IGNORE("-Wdeprecated-declarations")
2561*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> server = sm->getService(binderLibTestServiceName);
2562*38e8c45fSAndroid Build Coastguard Worker LIBBINDER_IGNORE_END()
2563*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
2564*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(index);
2565*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(testService);
2566*38e8c45fSAndroid Build Coastguard Worker
2567*38e8c45fSAndroid Build Coastguard Worker ret = server->transact(BINDER_LIB_TEST_REGISTER_SERVER, data, &reply);
2568*38e8c45fSAndroid Build Coastguard Worker }
2569*38e8c45fSAndroid Build Coastguard Worker }
2570*38e8c45fSAndroid Build Coastguard Worker write(readypipefd, &ret, sizeof(ret));
2571*38e8c45fSAndroid Build Coastguard Worker close(readypipefd);
2572*38e8c45fSAndroid Build Coastguard Worker //printf("%s: ret %d\n", __func__, ret);
2573*38e8c45fSAndroid Build Coastguard Worker if (ret)
2574*38e8c45fSAndroid Build Coastguard Worker return 1;
2575*38e8c45fSAndroid Build Coastguard Worker //printf("%s: joinThreadPool\n", __func__);
2576*38e8c45fSAndroid Build Coastguard Worker if (usePoll) {
2577*38e8c45fSAndroid Build Coastguard Worker int fd;
2578*38e8c45fSAndroid Build Coastguard Worker struct epoll_event ev;
2579*38e8c45fSAndroid Build Coastguard Worker int epoll_fd;
2580*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->setupPolling(&fd);
2581*38e8c45fSAndroid Build Coastguard Worker if (fd < 0) {
2582*38e8c45fSAndroid Build Coastguard Worker return 1;
2583*38e8c45fSAndroid Build Coastguard Worker }
2584*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->flushCommands(); // flush BC_ENTER_LOOPER
2585*38e8c45fSAndroid Build Coastguard Worker
2586*38e8c45fSAndroid Build Coastguard Worker epoll_fd = epoll_create1(EPOLL_CLOEXEC);
2587*38e8c45fSAndroid Build Coastguard Worker if (epoll_fd == -1) {
2588*38e8c45fSAndroid Build Coastguard Worker return 1;
2589*38e8c45fSAndroid Build Coastguard Worker }
2590*38e8c45fSAndroid Build Coastguard Worker
2591*38e8c45fSAndroid Build Coastguard Worker ev.events = EPOLLIN;
2592*38e8c45fSAndroid Build Coastguard Worker if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev) == -1) {
2593*38e8c45fSAndroid Build Coastguard Worker return 1;
2594*38e8c45fSAndroid Build Coastguard Worker }
2595*38e8c45fSAndroid Build Coastguard Worker
2596*38e8c45fSAndroid Build Coastguard Worker while (1) {
2597*38e8c45fSAndroid Build Coastguard Worker /*
2598*38e8c45fSAndroid Build Coastguard Worker * We simulate a single-threaded process using the binder poll
2599*38e8c45fSAndroid Build Coastguard Worker * interface; besides handling binder commands, it can also
2600*38e8c45fSAndroid Build Coastguard Worker * issue outgoing transactions, by storing a callback in
2601*38e8c45fSAndroid Build Coastguard Worker * m_callback.
2602*38e8c45fSAndroid Build Coastguard Worker *
2603*38e8c45fSAndroid Build Coastguard Worker * processPendingCall() will then issue that transaction.
2604*38e8c45fSAndroid Build Coastguard Worker */
2605*38e8c45fSAndroid Build Coastguard Worker struct epoll_event events[1];
2606*38e8c45fSAndroid Build Coastguard Worker int numEvents = epoll_wait(epoll_fd, events, 1, 1000);
2607*38e8c45fSAndroid Build Coastguard Worker if (numEvents < 0) {
2608*38e8c45fSAndroid Build Coastguard Worker if (errno == EINTR) {
2609*38e8c45fSAndroid Build Coastguard Worker continue;
2610*38e8c45fSAndroid Build Coastguard Worker }
2611*38e8c45fSAndroid Build Coastguard Worker return 1;
2612*38e8c45fSAndroid Build Coastguard Worker }
2613*38e8c45fSAndroid Build Coastguard Worker if (numEvents > 0) {
2614*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->handlePolledCommands();
2615*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->flushCommands(); // flush BC_FREE_BUFFER
2616*38e8c45fSAndroid Build Coastguard Worker testServicePtr->processPendingCall();
2617*38e8c45fSAndroid Build Coastguard Worker }
2618*38e8c45fSAndroid Build Coastguard Worker }
2619*38e8c45fSAndroid Build Coastguard Worker } else {
2620*38e8c45fSAndroid Build Coastguard Worker ProcessState::self()->setThreadPoolMaxThreadCount(kKernelThreads);
2621*38e8c45fSAndroid Build Coastguard Worker ProcessState::self()->startThreadPool();
2622*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->joinThreadPool();
2623*38e8c45fSAndroid Build Coastguard Worker }
2624*38e8c45fSAndroid Build Coastguard Worker //printf("%s: joinThreadPool returned\n", __func__);
2625*38e8c45fSAndroid Build Coastguard Worker return 1; /* joinThreadPool should not return */
2626*38e8c45fSAndroid Build Coastguard Worker }
2627*38e8c45fSAndroid Build Coastguard Worker
main(int argc,char ** argv)2628*38e8c45fSAndroid Build Coastguard Worker int main(int argc, char** argv) {
2629*38e8c45fSAndroid Build Coastguard Worker if (argc == 4 && !strcmp(argv[1], "--servername")) {
2630*38e8c45fSAndroid Build Coastguard Worker binderservername = argv[2];
2631*38e8c45fSAndroid Build Coastguard Worker } else {
2632*38e8c45fSAndroid Build Coastguard Worker binderservername = argv[0];
2633*38e8c45fSAndroid Build Coastguard Worker }
2634*38e8c45fSAndroid Build Coastguard Worker
2635*38e8c45fSAndroid Build Coastguard Worker if (argc == 6 && !strcmp(argv[1], binderserverarg)) {
2636*38e8c45fSAndroid Build Coastguard Worker binderserversuffix = argv[5];
2637*38e8c45fSAndroid Build Coastguard Worker return run_server(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]) == 1);
2638*38e8c45fSAndroid Build Coastguard Worker }
2639*38e8c45fSAndroid Build Coastguard Worker binderserversuffix = new char[16];
2640*38e8c45fSAndroid Build Coastguard Worker snprintf(binderserversuffix, 16, "%d", getpid());
2641*38e8c45fSAndroid Build Coastguard Worker binderLibTestServiceName += String16(binderserversuffix);
2642*38e8c45fSAndroid Build Coastguard Worker
2643*38e8c45fSAndroid Build Coastguard Worker ::testing::InitGoogleTest(&argc, argv);
2644*38e8c45fSAndroid Build Coastguard Worker binder_env = AddGlobalTestEnvironment(new BinderLibTestEnv());
2645*38e8c45fSAndroid Build Coastguard Worker ProcessState::self()->startThreadPool();
2646*38e8c45fSAndroid Build Coastguard Worker return RUN_ALL_TESTS();
2647*38e8c45fSAndroid Build Coastguard Worker }
2648