blob: 1ecb0b7b587722ec0268015109e27a538bac8431 [file] [log] [blame]
Riley Andrews06b01ad2014-12-18 12:10:08 -08001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <errno.h>
Riley Andrews06b01ad2014-12-18 12:10:08 -080018#include <poll.h>
19#include <pthread.h>
20#include <stdio.h>
21#include <stdlib.h>
Yifan Hong84bedeb2021-04-21 21:37:17 -070022
23#include <chrono>
Yifan Hong8b890852021-06-10 13:44:09 -070024#include <fstream>
Steven Morelandd7088702021-01-13 00:27:00 +000025#include <thread>
Riley Andrews06b01ad2014-12-18 12:10:08 -080026
Yifan Hongbbd2a0d2021-05-07 22:12:23 -070027#include <gmock/gmock.h>
Riley Andrews06b01ad2014-12-18 12:10:08 -080028#include <gtest/gtest.h>
29
Yifan Hong84bedeb2021-04-21 21:37:17 -070030#include <android-base/properties.h>
Yifan Hong28d6c352021-06-04 17:27:35 -070031#include <android-base/result-gmock.h>
Yifan Hong84bedeb2021-04-21 21:37:17 -070032#include <android-base/result.h>
Yifan Hong8b890852021-06-10 13:44:09 -070033#include <android-base/strings.h>
Yifan Hong84bedeb2021-04-21 21:37:17 -070034#include <android-base/unique_fd.h>
Riley Andrews06b01ad2014-12-18 12:10:08 -080035#include <binder/Binder.h>
Yifan Hong34823232021-06-07 17:23:00 -070036#include <binder/BpBinder.h>
Riley Andrews06b01ad2014-12-18 12:10:08 -080037#include <binder/IBinder.h>
38#include <binder/IPCThreadState.h>
39#include <binder/IServiceManager.h>
Yifan Hong84bedeb2021-04-21 21:37:17 -070040#include <binder/RpcServer.h>
41#include <binder/RpcSession.h>
Riley Andrews06b01ad2014-12-18 12:10:08 -080042
Steven Morelandcf03cf12020-12-04 02:58:40 +000043#include <linux/sched.h>
Martijn Coenen45b07b42017-08-09 12:07:45 +020044#include <sys/epoll.h>
Steven Morelandda048352020-02-19 13:25:53 -080045#include <sys/prctl.h>
Yifan Hong84bedeb2021-04-21 21:37:17 -070046#include <sys/socket.h>
47#include <sys/un.h>
Martijn Coenen45b07b42017-08-09 12:07:45 +020048
Steven Moreland6ba5a252021-05-04 22:49:00 +000049#include "../binder_module.h"
Steven Morelandf9f3de22020-05-06 17:14:39 -070050#include "binderAbiHelper.h"
51
Riley Andrews06b01ad2014-12-18 12:10:08 -080052#define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
53
54using namespace android;
Yifan Hong84bedeb2021-04-21 21:37:17 -070055using namespace std::string_literals;
56using namespace std::chrono_literals;
Yifan Hong28d6c352021-06-04 17:27:35 -070057using android::base::testing::HasValue;
Yifan Hong8b890852021-06-10 13:44:09 -070058using android::base::testing::Ok;
Yifan Hong84bedeb2021-04-21 21:37:17 -070059using testing::ExplainMatchResult;
Yifan Hongbbd2a0d2021-05-07 22:12:23 -070060using testing::Not;
Yifan Hong84bedeb2021-04-21 21:37:17 -070061using testing::WithParamInterface;
Yifan Hongbbd2a0d2021-05-07 22:12:23 -070062
63// e.g. EXPECT_THAT(expr, StatusEq(OK)) << "additional message";
64MATCHER_P(StatusEq, expected, (negation ? "not " : "") + statusToString(expected)) {
65 *result_listener << statusToString(arg);
66 return expected == arg;
67}
Riley Andrews06b01ad2014-12-18 12:10:08 -080068
Sherry Yang336cdd32017-07-24 14:12:27 -070069static ::testing::AssertionResult IsPageAligned(void *buf) {
70 if (((unsigned long)buf & ((unsigned long)PAGE_SIZE - 1)) == 0)
71 return ::testing::AssertionSuccess();
72 else
73 return ::testing::AssertionFailure() << buf << " is not page aligned";
74}
75
Riley Andrews06b01ad2014-12-18 12:10:08 -080076static testing::Environment* binder_env;
77static char *binderservername;
Connor O'Brien87c03cf2016-10-26 17:58:51 -070078static char *binderserversuffix;
Riley Andrews06b01ad2014-12-18 12:10:08 -080079static char binderserverarg[] = "--binderserver";
80
Steven Morelandbf1915b2020-07-16 22:43:02 +000081static constexpr int kSchedPolicy = SCHED_RR;
82static constexpr int kSchedPriority = 7;
Steven Morelandcf03cf12020-12-04 02:58:40 +000083static constexpr int kSchedPriorityMore = 8;
Steven Morelandbf1915b2020-07-16 22:43:02 +000084
Riley Andrews06b01ad2014-12-18 12:10:08 -080085static String16 binderLibTestServiceName = String16("test.binderLib");
86
87enum BinderLibTestTranscationCode {
88 BINDER_LIB_TEST_NOP_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION,
89 BINDER_LIB_TEST_REGISTER_SERVER,
90 BINDER_LIB_TEST_ADD_SERVER,
Martijn Coenen45b07b42017-08-09 12:07:45 +020091 BINDER_LIB_TEST_ADD_POLL_SERVER,
Steven Moreland35626652021-05-15 01:32:04 +000092 BINDER_LIB_TEST_USE_CALLING_GUARD_TRANSACTION,
Riley Andrews06b01ad2014-12-18 12:10:08 -080093 BINDER_LIB_TEST_CALL_BACK,
Sherry Yang336cdd32017-07-24 14:12:27 -070094 BINDER_LIB_TEST_CALL_BACK_VERIFY_BUF,
Martijn Coenen45b07b42017-08-09 12:07:45 +020095 BINDER_LIB_TEST_DELAYED_CALL_BACK,
Riley Andrews06b01ad2014-12-18 12:10:08 -080096 BINDER_LIB_TEST_NOP_CALL_BACK,
Arve Hjønnevåg70604312016-08-12 15:34:51 -070097 BINDER_LIB_TEST_GET_SELF_TRANSACTION,
Riley Andrews06b01ad2014-12-18 12:10:08 -080098 BINDER_LIB_TEST_GET_ID_TRANSACTION,
99 BINDER_LIB_TEST_INDIRECT_TRANSACTION,
100 BINDER_LIB_TEST_SET_ERROR_TRANSACTION,
101 BINDER_LIB_TEST_GET_STATUS_TRANSACTION,
102 BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION,
103 BINDER_LIB_TEST_LINK_DEATH_TRANSACTION,
104 BINDER_LIB_TEST_WRITE_FILE_TRANSACTION,
Ryo Hashimotobf551892018-05-31 16:58:35 +0900105 BINDER_LIB_TEST_WRITE_PARCEL_FILE_DESCRIPTOR_TRANSACTION,
Riley Andrews06b01ad2014-12-18 12:10:08 -0800106 BINDER_LIB_TEST_EXIT_TRANSACTION,
107 BINDER_LIB_TEST_DELAYED_EXIT_TRANSACTION,
108 BINDER_LIB_TEST_GET_PTR_SIZE_TRANSACTION,
Connor O'Brien52be2c92016-09-20 14:18:08 -0700109 BINDER_LIB_TEST_CREATE_BINDER_TRANSACTION,
Olivier Gaillard0e0f1de2018-08-16 14:04:09 +0100110 BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION,
Steven Morelandbf1915b2020-07-16 22:43:02 +0000111 BINDER_LIB_TEST_GET_SCHEDULING_POLICY,
Marco Ballesio7ee17572020-09-08 10:30:03 -0700112 BINDER_LIB_TEST_NOP_TRANSACTION_WAIT,
113 BINDER_LIB_TEST_GETPID,
Kevin DuBois2f82d5b2018-12-05 12:56:10 -0800114 BINDER_LIB_TEST_ECHO_VECTOR,
Martijn Coenen82c75312019-07-24 15:18:30 +0200115 BINDER_LIB_TEST_REJECT_BUF,
Steven Moreland254e8ef2021-04-19 22:28:50 +0000116 BINDER_LIB_TEST_CAN_GET_SID,
Yifan Hong84bedeb2021-04-21 21:37:17 -0700117 BINDER_LIB_TEST_CREATE_TEST_SERVICE,
Riley Andrews06b01ad2014-12-18 12:10:08 -0800118};
119
Martijn Coenen45b07b42017-08-09 12:07:45 +0200120pid_t start_server_process(int arg2, bool usePoll = false)
Riley Andrews06b01ad2014-12-18 12:10:08 -0800121{
122 int ret;
123 pid_t pid;
124 status_t status;
125 int pipefd[2];
126 char stri[16];
127 char strpipefd1[16];
Martijn Coenen45b07b42017-08-09 12:07:45 +0200128 char usepoll[2];
Riley Andrews06b01ad2014-12-18 12:10:08 -0800129 char *childargv[] = {
130 binderservername,
131 binderserverarg,
132 stri,
133 strpipefd1,
Martijn Coenen45b07b42017-08-09 12:07:45 +0200134 usepoll,
Connor O'Brien87c03cf2016-10-26 17:58:51 -0700135 binderserversuffix,
Yi Kong91635562018-06-07 14:38:36 -0700136 nullptr
Riley Andrews06b01ad2014-12-18 12:10:08 -0800137 };
138
139 ret = pipe(pipefd);
140 if (ret < 0)
141 return ret;
142
143 snprintf(stri, sizeof(stri), "%d", arg2);
144 snprintf(strpipefd1, sizeof(strpipefd1), "%d", pipefd[1]);
Martijn Coenen45b07b42017-08-09 12:07:45 +0200145 snprintf(usepoll, sizeof(usepoll), "%d", usePoll ? 1 : 0);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800146
147 pid = fork();
148 if (pid == -1)
149 return pid;
150 if (pid == 0) {
Steven Morelandda048352020-02-19 13:25:53 -0800151 prctl(PR_SET_PDEATHSIG, SIGHUP);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800152 close(pipefd[0]);
153 execv(binderservername, childargv);
154 status = -errno;
155 write(pipefd[1], &status, sizeof(status));
156 fprintf(stderr, "execv failed, %s\n", strerror(errno));
157 _exit(EXIT_FAILURE);
158 }
159 close(pipefd[1]);
160 ret = read(pipefd[0], &status, sizeof(status));
161 //printf("pipe read returned %d, status %d\n", ret, status);
162 close(pipefd[0]);
163 if (ret == sizeof(status)) {
164 ret = status;
165 } else {
166 kill(pid, SIGKILL);
167 if (ret >= 0) {
168 ret = NO_INIT;
169 }
170 }
171 if (ret < 0) {
Yi Kong91635562018-06-07 14:38:36 -0700172 wait(nullptr);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800173 return ret;
174 }
175 return pid;
176}
177
Yifan Hong84bedeb2021-04-21 21:37:17 -0700178android::base::Result<int32_t> GetId(sp<IBinder> service) {
179 using android::base::Error;
180 Parcel data, reply;
181 data.markForBinder(service);
182 const char *prefix = data.isForRpc() ? "On RPC server, " : "On binder server, ";
183 status_t status = service->transact(BINDER_LIB_TEST_GET_ID_TRANSACTION, data, &reply);
184 if (status != OK)
185 return Error(status) << prefix << "transact(GET_ID): " << statusToString(status);
186 int32_t result = 0;
187 status = reply.readInt32(&result);
188 if (status != OK) return Error(status) << prefix << "readInt32: " << statusToString(status);
189 return result;
190}
191
Riley Andrews06b01ad2014-12-18 12:10:08 -0800192class BinderLibTestEnv : public ::testing::Environment {
193 public:
194 BinderLibTestEnv() {}
195 sp<IBinder> getServer(void) {
196 return m_server;
197 }
198
199 private:
200 virtual void SetUp() {
201 m_serverpid = start_server_process(0);
202 //printf("m_serverpid %d\n", m_serverpid);
203 ASSERT_GT(m_serverpid, 0);
204
205 sp<IServiceManager> sm = defaultServiceManager();
206 //printf("%s: pid %d, get service\n", __func__, m_pid);
207 m_server = sm->getService(binderLibTestServiceName);
Yi Kong91635562018-06-07 14:38:36 -0700208 ASSERT_TRUE(m_server != nullptr);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800209 //printf("%s: pid %d, get service done\n", __func__, m_pid);
210 }
211 virtual void TearDown() {
212 status_t ret;
213 Parcel data, reply;
214 int exitStatus;
215 pid_t pid;
216
217 //printf("%s: pid %d\n", __func__, m_pid);
Yi Kong91635562018-06-07 14:38:36 -0700218 if (m_server != nullptr) {
Riley Andrews06b01ad2014-12-18 12:10:08 -0800219 ret = m_server->transact(BINDER_LIB_TEST_GET_STATUS_TRANSACTION, data, &reply);
220 EXPECT_EQ(0, ret);
221 ret = m_server->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY);
222 EXPECT_EQ(0, ret);
223 }
224 if (m_serverpid > 0) {
225 //printf("wait for %d\n", m_pids[i]);
226 pid = wait(&exitStatus);
227 EXPECT_EQ(m_serverpid, pid);
228 EXPECT_TRUE(WIFEXITED(exitStatus));
229 EXPECT_EQ(0, WEXITSTATUS(exitStatus));
230 }
231 }
232
233 pid_t m_serverpid;
234 sp<IBinder> m_server;
235};
236
237class BinderLibTest : public ::testing::Test {
238 public:
239 virtual void SetUp() {
240 m_server = static_cast<BinderLibTestEnv *>(binder_env)->getServer();
Olivier Gaillard91a04802018-11-14 17:32:41 +0000241 IPCThreadState::self()->restoreCallingWorkSource(0);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800242 }
243 virtual void TearDown() {
244 }
245 protected:
Martijn Coenen45b07b42017-08-09 12:07:45 +0200246 sp<IBinder> addServerEtc(int32_t *idPtr, int code)
Riley Andrews06b01ad2014-12-18 12:10:08 -0800247 {
Riley Andrews06b01ad2014-12-18 12:10:08 -0800248 int32_t id;
249 Parcel data, reply;
250 sp<IBinder> binder;
251
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700252 EXPECT_THAT(m_server->transact(code, data, &reply), StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800253
Yi Kong91635562018-06-07 14:38:36 -0700254 EXPECT_FALSE(binder != nullptr);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800255 binder = reply.readStrongBinder();
Yi Kong91635562018-06-07 14:38:36 -0700256 EXPECT_TRUE(binder != nullptr);
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700257 EXPECT_THAT(reply.readInt32(&id), StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800258 if (idPtr)
259 *idPtr = id;
260 return binder;
261 }
Martijn Coenen45b07b42017-08-09 12:07:45 +0200262
Yi Kong91635562018-06-07 14:38:36 -0700263 sp<IBinder> addServer(int32_t *idPtr = nullptr)
Martijn Coenen45b07b42017-08-09 12:07:45 +0200264 {
265 return addServerEtc(idPtr, BINDER_LIB_TEST_ADD_SERVER);
266 }
267
Yi Kong91635562018-06-07 14:38:36 -0700268 sp<IBinder> addPollServer(int32_t *idPtr = nullptr)
Martijn Coenen45b07b42017-08-09 12:07:45 +0200269 {
270 return addServerEtc(idPtr, BINDER_LIB_TEST_ADD_POLL_SERVER);
271 }
272
Riley Andrews06b01ad2014-12-18 12:10:08 -0800273 void waitForReadData(int fd, int timeout_ms) {
274 int ret;
275 pollfd pfd = pollfd();
276
277 pfd.fd = fd;
278 pfd.events = POLLIN;
279 ret = poll(&pfd, 1, timeout_ms);
280 EXPECT_EQ(1, ret);
281 }
282
283 sp<IBinder> m_server;
284};
285
286class BinderLibTestBundle : public Parcel
287{
288 public:
289 BinderLibTestBundle(void) {}
Chih-Hung Hsieh5ca1ea42018-12-20 15:42:22 -0800290 explicit BinderLibTestBundle(const Parcel *source) : m_isValid(false) {
Riley Andrews06b01ad2014-12-18 12:10:08 -0800291 int32_t mark;
292 int32_t bundleLen;
293 size_t pos;
294
295 if (source->readInt32(&mark))
296 return;
297 if (mark != MARK_START)
298 return;
299 if (source->readInt32(&bundleLen))
300 return;
301 pos = source->dataPosition();
302 if (Parcel::appendFrom(source, pos, bundleLen))
303 return;
304 source->setDataPosition(pos + bundleLen);
305 if (source->readInt32(&mark))
306 return;
307 if (mark != MARK_END)
308 return;
309 m_isValid = true;
310 setDataPosition(0);
311 }
312 void appendTo(Parcel *dest) {
313 dest->writeInt32(MARK_START);
314 dest->writeInt32(dataSize());
315 dest->appendFrom(this, 0, dataSize());
316 dest->writeInt32(MARK_END);
317 };
318 bool isValid(void) {
319 return m_isValid;
320 }
321 private:
322 enum {
323 MARK_START = B_PACK_CHARS('B','T','B','S'),
324 MARK_END = B_PACK_CHARS('B','T','B','E'),
325 };
326 bool m_isValid;
327};
328
329class BinderLibTestEvent
330{
331 public:
332 BinderLibTestEvent(void)
333 : m_eventTriggered(false)
334 {
Yi Kong91635562018-06-07 14:38:36 -0700335 pthread_mutex_init(&m_waitMutex, nullptr);
336 pthread_cond_init(&m_waitCond, nullptr);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800337 }
338 int waitEvent(int timeout_s)
339 {
340 int ret;
341 pthread_mutex_lock(&m_waitMutex);
342 if (!m_eventTriggered) {
Riley Andrews06b01ad2014-12-18 12:10:08 -0800343 struct timespec ts;
344 clock_gettime(CLOCK_REALTIME, &ts);
345 ts.tv_sec += timeout_s;
346 pthread_cond_timedwait(&m_waitCond, &m_waitMutex, &ts);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800347 }
348 ret = m_eventTriggered ? NO_ERROR : TIMED_OUT;
349 pthread_mutex_unlock(&m_waitMutex);
350 return ret;
351 }
Martijn Coenenf7100e42017-07-31 12:14:09 +0200352 pthread_t getTriggeringThread()
353 {
354 return m_triggeringThread;
355 }
Riley Andrews06b01ad2014-12-18 12:10:08 -0800356 protected:
357 void triggerEvent(void) {
358 pthread_mutex_lock(&m_waitMutex);
359 pthread_cond_signal(&m_waitCond);
360 m_eventTriggered = true;
Martijn Coenenf7100e42017-07-31 12:14:09 +0200361 m_triggeringThread = pthread_self();
Riley Andrews06b01ad2014-12-18 12:10:08 -0800362 pthread_mutex_unlock(&m_waitMutex);
363 };
364 private:
365 pthread_mutex_t m_waitMutex;
366 pthread_cond_t m_waitCond;
367 bool m_eventTriggered;
Martijn Coenenf7100e42017-07-31 12:14:09 +0200368 pthread_t m_triggeringThread;
Riley Andrews06b01ad2014-12-18 12:10:08 -0800369};
370
371class BinderLibTestCallBack : public BBinder, public BinderLibTestEvent
372{
373 public:
374 BinderLibTestCallBack()
375 : m_result(NOT_ENOUGH_DATA)
Yi Kong91635562018-06-07 14:38:36 -0700376 , m_prev_end(nullptr)
Riley Andrews06b01ad2014-12-18 12:10:08 -0800377 {
378 }
379 status_t getResult(void)
380 {
381 return m_result;
382 }
383
384 private:
385 virtual status_t onTransact(uint32_t code,
386 const Parcel& data, Parcel* reply,
387 uint32_t flags = 0)
388 {
389 (void)reply;
390 (void)flags;
391 switch(code) {
Martijn Coenenfb368f72017-08-10 15:03:18 +0200392 case BINDER_LIB_TEST_CALL_BACK: {
393 status_t status = data.readInt32(&m_result);
394 if (status != NO_ERROR) {
395 m_result = status;
396 }
Riley Andrews06b01ad2014-12-18 12:10:08 -0800397 triggerEvent();
398 return NO_ERROR;
Martijn Coenenfb368f72017-08-10 15:03:18 +0200399 }
Sherry Yang336cdd32017-07-24 14:12:27 -0700400 case BINDER_LIB_TEST_CALL_BACK_VERIFY_BUF: {
401 sp<IBinder> server;
402 int ret;
403 const uint8_t *buf = data.data();
404 size_t size = data.dataSize();
405 if (m_prev_end) {
406 /* 64-bit kernel needs at most 8 bytes to align buffer end */
407 EXPECT_LE((size_t)(buf - m_prev_end), (size_t)8);
408 } else {
409 EXPECT_TRUE(IsPageAligned((void *)buf));
410 }
411
412 m_prev_end = buf + size + data.objectsCount() * sizeof(binder_size_t);
413
414 if (size > 0) {
415 server = static_cast<BinderLibTestEnv *>(binder_env)->getServer();
416 ret = server->transact(BINDER_LIB_TEST_INDIRECT_TRANSACTION,
417 data, reply);
418 EXPECT_EQ(NO_ERROR, ret);
419 }
420 return NO_ERROR;
421 }
Riley Andrews06b01ad2014-12-18 12:10:08 -0800422 default:
423 return UNKNOWN_TRANSACTION;
424 }
425 }
426
427 status_t m_result;
Sherry Yang336cdd32017-07-24 14:12:27 -0700428 const uint8_t *m_prev_end;
Riley Andrews06b01ad2014-12-18 12:10:08 -0800429};
430
431class TestDeathRecipient : public IBinder::DeathRecipient, public BinderLibTestEvent
432{
433 private:
434 virtual void binderDied(const wp<IBinder>& who) {
435 (void)who;
436 triggerEvent();
437 };
438};
439
Kalesh Singhd67c8e82020-12-29 15:46:25 -0500440TEST_F(BinderLibTest, WasParceled) {
441 auto binder = sp<BBinder>::make();
442 EXPECT_FALSE(binder->wasParceled());
443 Parcel data;
444 data.writeStrongBinder(binder);
445 EXPECT_TRUE(binder->wasParceled());
446}
447
Riley Andrews06b01ad2014-12-18 12:10:08 -0800448TEST_F(BinderLibTest, NopTransaction) {
Riley Andrews06b01ad2014-12-18 12:10:08 -0800449 Parcel data, reply;
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700450 EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply),
451 StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800452}
453
Steven Moreland80844f72020-12-12 02:06:08 +0000454TEST_F(BinderLibTest, NopTransactionOneway) {
Steven Moreland80844f72020-12-12 02:06:08 +0000455 Parcel data, reply;
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700456 EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply, TF_ONE_WAY),
457 StatusEq(NO_ERROR));
Steven Moreland80844f72020-12-12 02:06:08 +0000458}
459
Steven Morelandf183fdd2020-10-27 00:12:12 +0000460TEST_F(BinderLibTest, NopTransactionClear) {
Steven Morelandf183fdd2020-10-27 00:12:12 +0000461 Parcel data, reply;
462 // make sure it accepts the transaction flag
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700463 EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply, TF_CLEAR_BUF),
464 StatusEq(NO_ERROR));
Steven Morelandf183fdd2020-10-27 00:12:12 +0000465}
466
Marco Ballesio7ee17572020-09-08 10:30:03 -0700467TEST_F(BinderLibTest, Freeze) {
Marco Ballesio7ee17572020-09-08 10:30:03 -0700468 Parcel data, reply, replypid;
469 std::ifstream freezer_file("/sys/fs/cgroup/freezer/cgroup.freeze");
470
471 //Pass test on devices where the freezer is not supported
472 if (freezer_file.fail()) {
473 GTEST_SKIP();
474 return;
475 }
476
477 std::string freezer_enabled;
478 std::getline(freezer_file, freezer_enabled);
479
480 //Pass test on devices where the freezer is disabled
481 if (freezer_enabled != "1") {
482 GTEST_SKIP();
483 return;
484 }
485
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700486 EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_GETPID, data, &replypid), StatusEq(NO_ERROR));
Marco Ballesio7ee17572020-09-08 10:30:03 -0700487 int32_t pid = replypid.readInt32();
Marco Ballesio7ee17572020-09-08 10:30:03 -0700488 for (int i = 0; i < 10; i++) {
489 EXPECT_EQ(NO_ERROR, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION_WAIT, data, &reply, TF_ONE_WAY));
490 }
491 EXPECT_EQ(-EAGAIN, IPCThreadState::self()->freeze(pid, 1, 0));
492 EXPECT_EQ(-EAGAIN, IPCThreadState::self()->freeze(pid, 1, 0));
493 EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, 1, 1000));
494 EXPECT_EQ(FAILED_TRANSACTION, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply));
Marco Ballesiob09fc4a2020-09-11 16:17:21 -0700495
496 bool sync_received, async_received;
497
498 EXPECT_EQ(NO_ERROR, IPCThreadState::self()->getProcessFreezeInfo(pid, &sync_received,
499 &async_received));
500
501 EXPECT_EQ(sync_received, 1);
502 EXPECT_EQ(async_received, 0);
503
Marco Ballesio7ee17572020-09-08 10:30:03 -0700504 EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, 0, 0));
505 EXPECT_EQ(NO_ERROR, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply));
506}
507
Riley Andrews06b01ad2014-12-18 12:10:08 -0800508TEST_F(BinderLibTest, SetError) {
509 int32_t testValue[] = { 0, -123, 123 };
510 for (size_t i = 0; i < ARRAY_SIZE(testValue); i++) {
Riley Andrews06b01ad2014-12-18 12:10:08 -0800511 Parcel data, reply;
512 data.writeInt32(testValue[i]);
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700513 EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_SET_ERROR_TRANSACTION, data, &reply),
514 StatusEq(testValue[i]));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800515 }
516}
517
518TEST_F(BinderLibTest, GetId) {
Yifan Hong28d6c352021-06-04 17:27:35 -0700519 EXPECT_THAT(GetId(m_server), HasValue(0));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800520}
521
522TEST_F(BinderLibTest, PtrSize) {
Riley Andrews06b01ad2014-12-18 12:10:08 -0800523 int32_t ptrsize;
524 Parcel data, reply;
525 sp<IBinder> server = addServer();
Yi Kong91635562018-06-07 14:38:36 -0700526 ASSERT_TRUE(server != nullptr);
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700527 EXPECT_THAT(server->transact(BINDER_LIB_TEST_GET_PTR_SIZE_TRANSACTION, data, &reply),
528 StatusEq(NO_ERROR));
529 EXPECT_THAT(reply.readInt32(&ptrsize), StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800530 RecordProperty("TestPtrSize", sizeof(void *));
531 RecordProperty("ServerPtrSize", sizeof(void *));
532}
533
534TEST_F(BinderLibTest, IndirectGetId2)
535{
Riley Andrews06b01ad2014-12-18 12:10:08 -0800536 int32_t id;
537 int32_t count;
538 Parcel data, reply;
539 int32_t serverId[3];
540
541 data.writeInt32(ARRAY_SIZE(serverId));
542 for (size_t i = 0; i < ARRAY_SIZE(serverId); i++) {
543 sp<IBinder> server;
544 BinderLibTestBundle datai;
545
546 server = addServer(&serverId[i]);
Yi Kong91635562018-06-07 14:38:36 -0700547 ASSERT_TRUE(server != nullptr);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800548 data.writeStrongBinder(server);
549 data.writeInt32(BINDER_LIB_TEST_GET_ID_TRANSACTION);
550 datai.appendTo(&data);
551 }
552
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700553 ASSERT_THAT(m_server->transact(BINDER_LIB_TEST_INDIRECT_TRANSACTION, data, &reply),
554 StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800555
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700556 ASSERT_THAT(reply.readInt32(&id), StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800557 EXPECT_EQ(0, id);
558
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700559 ASSERT_THAT(reply.readInt32(&count), StatusEq(NO_ERROR));
Arve Hjønnevåg6d5fa942016-08-12 15:32:48 -0700560 EXPECT_EQ(ARRAY_SIZE(serverId), (size_t)count);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800561
562 for (size_t i = 0; i < (size_t)count; i++) {
563 BinderLibTestBundle replyi(&reply);
564 EXPECT_TRUE(replyi.isValid());
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700565 EXPECT_THAT(replyi.readInt32(&id), StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800566 EXPECT_EQ(serverId[i], id);
567 EXPECT_EQ(replyi.dataSize(), replyi.dataPosition());
568 }
569
570 EXPECT_EQ(reply.dataSize(), reply.dataPosition());
571}
572
573TEST_F(BinderLibTest, IndirectGetId3)
574{
Riley Andrews06b01ad2014-12-18 12:10:08 -0800575 int32_t id;
576 int32_t count;
577 Parcel data, reply;
578 int32_t serverId[3];
579
580 data.writeInt32(ARRAY_SIZE(serverId));
581 for (size_t i = 0; i < ARRAY_SIZE(serverId); i++) {
582 sp<IBinder> server;
583 BinderLibTestBundle datai;
584 BinderLibTestBundle datai2;
585
586 server = addServer(&serverId[i]);
Yi Kong91635562018-06-07 14:38:36 -0700587 ASSERT_TRUE(server != nullptr);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800588 data.writeStrongBinder(server);
589 data.writeInt32(BINDER_LIB_TEST_INDIRECT_TRANSACTION);
590
591 datai.writeInt32(1);
592 datai.writeStrongBinder(m_server);
593 datai.writeInt32(BINDER_LIB_TEST_GET_ID_TRANSACTION);
594 datai2.appendTo(&datai);
595
596 datai.appendTo(&data);
597 }
598
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700599 ASSERT_THAT(m_server->transact(BINDER_LIB_TEST_INDIRECT_TRANSACTION, data, &reply),
600 StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800601
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700602 ASSERT_THAT(reply.readInt32(&id), StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800603 EXPECT_EQ(0, id);
604
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700605 ASSERT_THAT(reply.readInt32(&count), StatusEq(NO_ERROR));
Arve Hjønnevåg6d5fa942016-08-12 15:32:48 -0700606 EXPECT_EQ(ARRAY_SIZE(serverId), (size_t)count);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800607
608 for (size_t i = 0; i < (size_t)count; i++) {
609 int32_t counti;
610
611 BinderLibTestBundle replyi(&reply);
612 EXPECT_TRUE(replyi.isValid());
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700613 EXPECT_THAT(replyi.readInt32(&id), StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800614 EXPECT_EQ(serverId[i], id);
615
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700616 ASSERT_THAT(replyi.readInt32(&counti), StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800617 EXPECT_EQ(1, counti);
618
619 BinderLibTestBundle replyi2(&replyi);
620 EXPECT_TRUE(replyi2.isValid());
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700621 EXPECT_THAT(replyi2.readInt32(&id), StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800622 EXPECT_EQ(0, id);
623 EXPECT_EQ(replyi2.dataSize(), replyi2.dataPosition());
624
625 EXPECT_EQ(replyi.dataSize(), replyi.dataPosition());
626 }
627
628 EXPECT_EQ(reply.dataSize(), reply.dataPosition());
629}
630
631TEST_F(BinderLibTest, CallBack)
632{
Riley Andrews06b01ad2014-12-18 12:10:08 -0800633 Parcel data, reply;
634 sp<BinderLibTestCallBack> callBack = new BinderLibTestCallBack();
635 data.writeStrongBinder(callBack);
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700636 EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_NOP_CALL_BACK, data, &reply, TF_ONE_WAY),
637 StatusEq(NO_ERROR));
638 EXPECT_THAT(callBack->waitEvent(5), StatusEq(NO_ERROR));
639 EXPECT_THAT(callBack->getResult(), StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800640}
641
Steven Moreland35626652021-05-15 01:32:04 +0000642TEST_F(BinderLibTest, BinderCallContextGuard) {
643 sp<IBinder> binder = addServer();
644 Parcel data, reply;
645 EXPECT_THAT(binder->transact(BINDER_LIB_TEST_USE_CALLING_GUARD_TRANSACTION, data, &reply),
646 StatusEq(DEAD_OBJECT));
647}
648
Riley Andrews06b01ad2014-12-18 12:10:08 -0800649TEST_F(BinderLibTest, AddServer)
650{
651 sp<IBinder> server = addServer();
Yi Kong91635562018-06-07 14:38:36 -0700652 ASSERT_TRUE(server != nullptr);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800653}
654
Riley Andrews06b01ad2014-12-18 12:10:08 -0800655TEST_F(BinderLibTest, DeathNotificationStrongRef)
656{
Riley Andrews06b01ad2014-12-18 12:10:08 -0800657 sp<IBinder> sbinder;
658
659 sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient();
660
661 {
662 sp<IBinder> binder = addServer();
Yi Kong91635562018-06-07 14:38:36 -0700663 ASSERT_TRUE(binder != nullptr);
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700664 EXPECT_THAT(binder->linkToDeath(testDeathRecipient), StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800665 sbinder = binder;
666 }
667 {
668 Parcel data, reply;
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700669 EXPECT_THAT(sbinder->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY),
670 StatusEq(OK));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800671 }
672 IPCThreadState::self()->flushCommands();
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700673 EXPECT_THAT(testDeathRecipient->waitEvent(5), StatusEq(NO_ERROR));
674 EXPECT_THAT(sbinder->unlinkToDeath(testDeathRecipient), StatusEq(DEAD_OBJECT));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800675}
676
677TEST_F(BinderLibTest, DeathNotificationMultiple)
678{
679 status_t ret;
680 const int clientcount = 2;
681 sp<IBinder> target;
682 sp<IBinder> linkedclient[clientcount];
683 sp<BinderLibTestCallBack> callBack[clientcount];
684 sp<IBinder> passiveclient[clientcount];
685
686 target = addServer();
Yi Kong91635562018-06-07 14:38:36 -0700687 ASSERT_TRUE(target != nullptr);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800688 for (int i = 0; i < clientcount; i++) {
689 {
690 Parcel data, reply;
691
692 linkedclient[i] = addServer();
Yi Kong91635562018-06-07 14:38:36 -0700693 ASSERT_TRUE(linkedclient[i] != nullptr);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800694 callBack[i] = new BinderLibTestCallBack();
695 data.writeStrongBinder(target);
696 data.writeStrongBinder(callBack[i]);
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700697 EXPECT_THAT(linkedclient[i]->transact(BINDER_LIB_TEST_LINK_DEATH_TRANSACTION, data,
698 &reply, TF_ONE_WAY),
699 StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800700 }
701 {
702 Parcel data, reply;
703
704 passiveclient[i] = addServer();
Yi Kong91635562018-06-07 14:38:36 -0700705 ASSERT_TRUE(passiveclient[i] != nullptr);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800706 data.writeStrongBinder(target);
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700707 EXPECT_THAT(passiveclient[i]->transact(BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION, data,
708 &reply, TF_ONE_WAY),
709 StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800710 }
711 }
712 {
713 Parcel data, reply;
714 ret = target->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY);
715 EXPECT_EQ(0, ret);
716 }
717
718 for (int i = 0; i < clientcount; i++) {
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700719 EXPECT_THAT(callBack[i]->waitEvent(5), StatusEq(NO_ERROR));
720 EXPECT_THAT(callBack[i]->getResult(), StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800721 }
722}
723
Martijn Coenenf7100e42017-07-31 12:14:09 +0200724TEST_F(BinderLibTest, DeathNotificationThread)
725{
726 status_t ret;
727 sp<BinderLibTestCallBack> callback;
728 sp<IBinder> target = addServer();
Yi Kong91635562018-06-07 14:38:36 -0700729 ASSERT_TRUE(target != nullptr);
Martijn Coenenf7100e42017-07-31 12:14:09 +0200730 sp<IBinder> client = addServer();
Yi Kong91635562018-06-07 14:38:36 -0700731 ASSERT_TRUE(client != nullptr);
Martijn Coenenf7100e42017-07-31 12:14:09 +0200732
733 sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient();
734
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700735 EXPECT_THAT(target->linkToDeath(testDeathRecipient), StatusEq(NO_ERROR));
Martijn Coenenf7100e42017-07-31 12:14:09 +0200736
737 {
738 Parcel data, reply;
739 ret = target->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY);
740 EXPECT_EQ(0, ret);
741 }
742
743 /* Make sure it's dead */
744 testDeathRecipient->waitEvent(5);
745
746 /* Now, pass the ref to another process and ask that process to
747 * call linkToDeath() on it, and wait for a response. This tests
748 * two things:
749 * 1) You still get death notifications when calling linkToDeath()
750 * on a ref that is already dead when it was passed to you.
751 * 2) That death notifications are not directly pushed to the thread
752 * registering them, but to the threadpool (proc workqueue) instead.
753 *
754 * 2) is tested because the thread handling BINDER_LIB_TEST_DEATH_TRANSACTION
755 * is blocked on a condition variable waiting for the death notification to be
756 * called; therefore, that thread is not available for handling proc work.
757 * So, if the death notification was pushed to the thread workqueue, the callback
758 * would never be called, and the test would timeout and fail.
759 *
760 * Note that we can't do this part of the test from this thread itself, because
761 * the binder driver would only push death notifications to the thread if
762 * it is a looper thread, which this thread is not.
763 *
764 * See b/23525545 for details.
765 */
766 {
767 Parcel data, reply;
768
769 callback = new BinderLibTestCallBack();
770 data.writeStrongBinder(target);
771 data.writeStrongBinder(callback);
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700772 EXPECT_THAT(client->transact(BINDER_LIB_TEST_LINK_DEATH_TRANSACTION, data, &reply,
773 TF_ONE_WAY),
774 StatusEq(NO_ERROR));
Martijn Coenenf7100e42017-07-31 12:14:09 +0200775 }
776
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700777 EXPECT_THAT(callback->waitEvent(5), StatusEq(NO_ERROR));
778 EXPECT_THAT(callback->getResult(), StatusEq(NO_ERROR));
Martijn Coenenf7100e42017-07-31 12:14:09 +0200779}
780
Riley Andrews06b01ad2014-12-18 12:10:08 -0800781TEST_F(BinderLibTest, PassFile) {
782 int ret;
783 int pipefd[2];
784 uint8_t buf[1] = { 0 };
785 uint8_t write_value = 123;
786
787 ret = pipe2(pipefd, O_NONBLOCK);
788 ASSERT_EQ(0, ret);
789
790 {
791 Parcel data, reply;
792 uint8_t writebuf[1] = { write_value };
793
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700794 EXPECT_THAT(data.writeFileDescriptor(pipefd[1], true), StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800795
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700796 EXPECT_THAT(data.writeInt32(sizeof(writebuf)), StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800797
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700798 EXPECT_THAT(data.write(writebuf, sizeof(writebuf)), StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800799
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700800 EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_WRITE_FILE_TRANSACTION, data, &reply),
801 StatusEq(NO_ERROR));
Riley Andrews06b01ad2014-12-18 12:10:08 -0800802 }
803
804 ret = read(pipefd[0], buf, sizeof(buf));
Arve Hjønnevåg6d5fa942016-08-12 15:32:48 -0700805 EXPECT_EQ(sizeof(buf), (size_t)ret);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800806 EXPECT_EQ(write_value, buf[0]);
807
808 waitForReadData(pipefd[0], 5000); /* wait for other proccess to close pipe */
809
810 ret = read(pipefd[0], buf, sizeof(buf));
811 EXPECT_EQ(0, ret);
812
813 close(pipefd[0]);
814}
815
Ryo Hashimotobf551892018-05-31 16:58:35 +0900816TEST_F(BinderLibTest, PassParcelFileDescriptor) {
817 const int datasize = 123;
818 std::vector<uint8_t> writebuf(datasize);
819 for (size_t i = 0; i < writebuf.size(); ++i) {
820 writebuf[i] = i;
821 }
822
823 android::base::unique_fd read_end, write_end;
824 {
825 int pipefd[2];
826 ASSERT_EQ(0, pipe2(pipefd, O_NONBLOCK));
827 read_end.reset(pipefd[0]);
828 write_end.reset(pipefd[1]);
829 }
830 {
831 Parcel data;
832 EXPECT_EQ(NO_ERROR, data.writeDupParcelFileDescriptor(write_end.get()));
833 write_end.reset();
834 EXPECT_EQ(NO_ERROR, data.writeInt32(datasize));
835 EXPECT_EQ(NO_ERROR, data.write(writebuf.data(), datasize));
836
837 Parcel reply;
838 EXPECT_EQ(NO_ERROR,
839 m_server->transact(BINDER_LIB_TEST_WRITE_PARCEL_FILE_DESCRIPTOR_TRANSACTION, data,
840 &reply));
841 }
842 std::vector<uint8_t> readbuf(datasize);
843 EXPECT_EQ(datasize, read(read_end.get(), readbuf.data(), datasize));
844 EXPECT_EQ(writebuf, readbuf);
845
846 waitForReadData(read_end.get(), 5000); /* wait for other proccess to close pipe */
847
848 EXPECT_EQ(0, read(read_end.get(), readbuf.data(), datasize));
849}
850
Riley Andrews06b01ad2014-12-18 12:10:08 -0800851TEST_F(BinderLibTest, PromoteLocal) {
852 sp<IBinder> strong = new BBinder();
853 wp<IBinder> weak = strong;
854 sp<IBinder> strong_from_weak = weak.promote();
Yi Kong91635562018-06-07 14:38:36 -0700855 EXPECT_TRUE(strong != nullptr);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800856 EXPECT_EQ(strong, strong_from_weak);
Yi Kong91635562018-06-07 14:38:36 -0700857 strong = nullptr;
858 strong_from_weak = nullptr;
Riley Andrews06b01ad2014-12-18 12:10:08 -0800859 strong_from_weak = weak.promote();
Yi Kong91635562018-06-07 14:38:36 -0700860 EXPECT_TRUE(strong_from_weak == nullptr);
Riley Andrews06b01ad2014-12-18 12:10:08 -0800861}
862
Steven Morelandb8ad08d2019-08-09 14:42:56 -0700863TEST_F(BinderLibTest, LocalGetExtension) {
864 sp<BBinder> binder = new BBinder();
865 sp<IBinder> ext = new BBinder();
866 binder->setExtension(ext);
867 EXPECT_EQ(ext, binder->getExtension());
868}
869
870TEST_F(BinderLibTest, RemoteGetExtension) {
871 sp<IBinder> server = addServer();
872 ASSERT_TRUE(server != nullptr);
873
874 sp<IBinder> extension;
875 EXPECT_EQ(NO_ERROR, server->getExtension(&extension));
876 ASSERT_NE(nullptr, extension.get());
877
878 EXPECT_EQ(NO_ERROR, extension->pingBinder());
879}
880
Arve Hjønnevåg70604312016-08-12 15:34:51 -0700881TEST_F(BinderLibTest, CheckHandleZeroBinderHighBitsZeroCookie) {
Arve Hjønnevåg70604312016-08-12 15:34:51 -0700882 Parcel data, reply;
883
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700884 EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_GET_SELF_TRANSACTION, data, &reply),
885 StatusEq(NO_ERROR));
Arve Hjønnevåg70604312016-08-12 15:34:51 -0700886
887 const flat_binder_object *fb = reply.readObject(false);
Yi Kong91635562018-06-07 14:38:36 -0700888 ASSERT_TRUE(fb != nullptr);
Hsin-Yi Chenad6503c2017-07-28 11:28:52 +0800889 EXPECT_EQ(BINDER_TYPE_HANDLE, fb->hdr.type);
890 EXPECT_EQ(m_server, ProcessState::self()->getStrongProxyForHandle(fb->handle));
891 EXPECT_EQ((binder_uintptr_t)0, fb->cookie);
892 EXPECT_EQ((uint64_t)0, (uint64_t)fb->binder >> 32);
Arve Hjønnevåg70604312016-08-12 15:34:51 -0700893}
894
Connor O'Brien52be2c92016-09-20 14:18:08 -0700895TEST_F(BinderLibTest, FreedBinder) {
896 status_t ret;
897
898 sp<IBinder> server = addServer();
Yi Kong91635562018-06-07 14:38:36 -0700899 ASSERT_TRUE(server != nullptr);
Connor O'Brien52be2c92016-09-20 14:18:08 -0700900
901 __u32 freedHandle;
902 wp<IBinder> keepFreedBinder;
903 {
904 Parcel data, reply;
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700905 ASSERT_THAT(server->transact(BINDER_LIB_TEST_CREATE_BINDER_TRANSACTION, data, &reply),
906 StatusEq(NO_ERROR));
Connor O'Brien52be2c92016-09-20 14:18:08 -0700907 struct flat_binder_object *freed = (struct flat_binder_object *)(reply.data());
908 freedHandle = freed->handle;
909 /* Add a weak ref to the freed binder so the driver does not
910 * delete its reference to it - otherwise the transaction
911 * fails regardless of whether the driver is fixed.
912 */
Steven Morelande171d622019-07-17 16:06:01 -0700913 keepFreedBinder = reply.readStrongBinder();
Connor O'Brien52be2c92016-09-20 14:18:08 -0700914 }
Steven Morelande171d622019-07-17 16:06:01 -0700915 IPCThreadState::self()->flushCommands();
Connor O'Brien52be2c92016-09-20 14:18:08 -0700916 {
917 Parcel data, reply;
918 data.writeStrongBinder(server);
919 /* Replace original handle with handle to the freed binder */
920 struct flat_binder_object *strong = (struct flat_binder_object *)(data.data());
921 __u32 oldHandle = strong->handle;
922 strong->handle = freedHandle;
923 ret = server->transact(BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION, data, &reply);
924 /* Returns DEAD_OBJECT (-32) if target crashes and
925 * FAILED_TRANSACTION if the driver rejects the invalid
926 * object.
927 */
928 EXPECT_EQ((status_t)FAILED_TRANSACTION, ret);
929 /* Restore original handle so parcel destructor does not use
930 * the wrong handle.
931 */
932 strong->handle = oldHandle;
933 }
934}
935
Sherry Yang336cdd32017-07-24 14:12:27 -0700936TEST_F(BinderLibTest, CheckNoHeaderMappedInUser) {
Sherry Yang336cdd32017-07-24 14:12:27 -0700937 Parcel data, reply;
938 sp<BinderLibTestCallBack> callBack = new BinderLibTestCallBack();
939 for (int i = 0; i < 2; i++) {
940 BinderLibTestBundle datai;
941 datai.appendFrom(&data, 0, data.dataSize());
942
943 data.freeData();
944 data.writeInt32(1);
945 data.writeStrongBinder(callBack);
946 data.writeInt32(BINDER_LIB_TEST_CALL_BACK_VERIFY_BUF);
947
948 datai.appendTo(&data);
949 }
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700950 EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_INDIRECT_TRANSACTION, data, &reply),
951 StatusEq(NO_ERROR));
Sherry Yang336cdd32017-07-24 14:12:27 -0700952}
953
Martijn Coenen45b07b42017-08-09 12:07:45 +0200954TEST_F(BinderLibTest, OnewayQueueing)
955{
Martijn Coenen45b07b42017-08-09 12:07:45 +0200956 Parcel data, data2;
957
958 sp<IBinder> pollServer = addPollServer();
959
960 sp<BinderLibTestCallBack> callBack = new BinderLibTestCallBack();
961 data.writeStrongBinder(callBack);
962 data.writeInt32(500000); // delay in us before calling back
963
964 sp<BinderLibTestCallBack> callBack2 = new BinderLibTestCallBack();
965 data2.writeStrongBinder(callBack2);
966 data2.writeInt32(0); // delay in us
967
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700968 EXPECT_THAT(pollServer->transact(BINDER_LIB_TEST_DELAYED_CALL_BACK, data, nullptr, TF_ONE_WAY),
969 StatusEq(NO_ERROR));
Martijn Coenen45b07b42017-08-09 12:07:45 +0200970
971 // The delay ensures that this second transaction will end up on the async_todo list
972 // (for a single-threaded server)
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700973 EXPECT_THAT(pollServer->transact(BINDER_LIB_TEST_DELAYED_CALL_BACK, data2, nullptr, TF_ONE_WAY),
974 StatusEq(NO_ERROR));
Martijn Coenen45b07b42017-08-09 12:07:45 +0200975
976 // The server will ensure that the two transactions are handled in the expected order;
977 // If the ordering is not as expected, an error will be returned through the callbacks.
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700978 EXPECT_THAT(callBack->waitEvent(2), StatusEq(NO_ERROR));
979 EXPECT_THAT(callBack->getResult(), StatusEq(NO_ERROR));
Martijn Coenen45b07b42017-08-09 12:07:45 +0200980
Yifan Hongbbd2a0d2021-05-07 22:12:23 -0700981 EXPECT_THAT(callBack2->waitEvent(2), StatusEq(NO_ERROR));
982 EXPECT_THAT(callBack2->getResult(), StatusEq(NO_ERROR));
Martijn Coenen45b07b42017-08-09 12:07:45 +0200983}
984
Olivier Gaillard0e0f1de2018-08-16 14:04:09 +0100985TEST_F(BinderLibTest, WorkSourceUnsetByDefault)
986{
987 status_t ret;
988 Parcel data, reply;
989 data.writeInterfaceToken(binderLibTestServiceName);
990 ret = m_server->transact(BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION, data, &reply);
991 EXPECT_EQ(-1, reply.readInt32());
992 EXPECT_EQ(NO_ERROR, ret);
993}
994
995TEST_F(BinderLibTest, WorkSourceSet)
996{
997 status_t ret;
998 Parcel data, reply;
Olivier Gaillard91a04802018-11-14 17:32:41 +0000999 IPCThreadState::self()->clearCallingWorkSource();
Olivier Gaillarda8e7bf22018-11-14 15:35:50 +00001000 int64_t previousWorkSource = IPCThreadState::self()->setCallingWorkSourceUid(100);
Olivier Gaillard0e0f1de2018-08-16 14:04:09 +01001001 data.writeInterfaceToken(binderLibTestServiceName);
1002 ret = m_server->transact(BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION, data, &reply);
1003 EXPECT_EQ(100, reply.readInt32());
1004 EXPECT_EQ(-1, previousWorkSource);
Olivier Gaillard91a04802018-11-14 17:32:41 +00001005 EXPECT_EQ(true, IPCThreadState::self()->shouldPropagateWorkSource());
1006 EXPECT_EQ(NO_ERROR, ret);
1007}
1008
1009TEST_F(BinderLibTest, WorkSourceSetWithoutPropagation)
1010{
1011 status_t ret;
1012 Parcel data, reply;
1013
1014 IPCThreadState::self()->setCallingWorkSourceUidWithoutPropagation(100);
1015 EXPECT_EQ(false, IPCThreadState::self()->shouldPropagateWorkSource());
1016
1017 data.writeInterfaceToken(binderLibTestServiceName);
1018 ret = m_server->transact(BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION, data, &reply);
1019 EXPECT_EQ(-1, reply.readInt32());
1020 EXPECT_EQ(false, IPCThreadState::self()->shouldPropagateWorkSource());
Olivier Gaillard0e0f1de2018-08-16 14:04:09 +01001021 EXPECT_EQ(NO_ERROR, ret);
1022}
1023
1024TEST_F(BinderLibTest, WorkSourceCleared)
1025{
1026 status_t ret;
1027 Parcel data, reply;
1028
Olivier Gaillarda8e7bf22018-11-14 15:35:50 +00001029 IPCThreadState::self()->setCallingWorkSourceUid(100);
Olivier Gaillard91a04802018-11-14 17:32:41 +00001030 int64_t token = IPCThreadState::self()->clearCallingWorkSource();
1031 int32_t previousWorkSource = (int32_t)token;
Olivier Gaillard0e0f1de2018-08-16 14:04:09 +01001032 data.writeInterfaceToken(binderLibTestServiceName);
1033 ret = m_server->transact(BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION, data, &reply);
1034
1035 EXPECT_EQ(-1, reply.readInt32());
1036 EXPECT_EQ(100, previousWorkSource);
1037 EXPECT_EQ(NO_ERROR, ret);
1038}
1039
Olivier Gaillarda8e7bf22018-11-14 15:35:50 +00001040TEST_F(BinderLibTest, WorkSourceRestored)
1041{
1042 status_t ret;
1043 Parcel data, reply;
1044
1045 IPCThreadState::self()->setCallingWorkSourceUid(100);
1046 int64_t token = IPCThreadState::self()->clearCallingWorkSource();
1047 IPCThreadState::self()->restoreCallingWorkSource(token);
1048
1049 data.writeInterfaceToken(binderLibTestServiceName);
1050 ret = m_server->transact(BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION, data, &reply);
1051
1052 EXPECT_EQ(100, reply.readInt32());
Olivier Gaillard91a04802018-11-14 17:32:41 +00001053 EXPECT_EQ(true, IPCThreadState::self()->shouldPropagateWorkSource());
Olivier Gaillarda8e7bf22018-11-14 15:35:50 +00001054 EXPECT_EQ(NO_ERROR, ret);
1055}
1056
Olivier Gaillard91a04802018-11-14 17:32:41 +00001057TEST_F(BinderLibTest, PropagateFlagSet)
1058{
Olivier Gaillard91a04802018-11-14 17:32:41 +00001059 IPCThreadState::self()->clearPropagateWorkSource();
1060 IPCThreadState::self()->setCallingWorkSourceUid(100);
1061 EXPECT_EQ(true, IPCThreadState::self()->shouldPropagateWorkSource());
1062}
1063
1064TEST_F(BinderLibTest, PropagateFlagCleared)
1065{
Olivier Gaillard91a04802018-11-14 17:32:41 +00001066 IPCThreadState::self()->setCallingWorkSourceUid(100);
1067 IPCThreadState::self()->clearPropagateWorkSource();
1068 EXPECT_EQ(false, IPCThreadState::self()->shouldPropagateWorkSource());
1069}
1070
1071TEST_F(BinderLibTest, PropagateFlagRestored)
1072{
Olivier Gaillard91a04802018-11-14 17:32:41 +00001073 int token = IPCThreadState::self()->setCallingWorkSourceUid(100);
1074 IPCThreadState::self()->restoreCallingWorkSource(token);
1075
1076 EXPECT_EQ(false, IPCThreadState::self()->shouldPropagateWorkSource());
1077}
1078
1079TEST_F(BinderLibTest, WorkSourcePropagatedForAllFollowingBinderCalls)
1080{
1081 IPCThreadState::self()->setCallingWorkSourceUid(100);
1082
1083 Parcel data, reply;
1084 status_t ret;
1085 data.writeInterfaceToken(binderLibTestServiceName);
1086 ret = m_server->transact(BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION, data, &reply);
1087
1088 Parcel data2, reply2;
1089 status_t ret2;
1090 data2.writeInterfaceToken(binderLibTestServiceName);
1091 ret2 = m_server->transact(BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION, data2, &reply2);
1092 EXPECT_EQ(100, reply2.readInt32());
1093 EXPECT_EQ(NO_ERROR, ret2);
1094}
1095
Steven Morelandbf1915b2020-07-16 22:43:02 +00001096TEST_F(BinderLibTest, SchedPolicySet) {
1097 sp<IBinder> server = addServer();
1098 ASSERT_TRUE(server != nullptr);
1099
1100 Parcel data, reply;
Yifan Hongbbd2a0d2021-05-07 22:12:23 -07001101 EXPECT_THAT(server->transact(BINDER_LIB_TEST_GET_SCHEDULING_POLICY, data, &reply),
1102 StatusEq(NO_ERROR));
Steven Morelandbf1915b2020-07-16 22:43:02 +00001103
1104 int policy = reply.readInt32();
1105 int priority = reply.readInt32();
1106
1107 EXPECT_EQ(kSchedPolicy, policy & (~SCHED_RESET_ON_FORK));
1108 EXPECT_EQ(kSchedPriority, priority);
1109}
1110
Steven Morelandcf03cf12020-12-04 02:58:40 +00001111TEST_F(BinderLibTest, InheritRt) {
1112 sp<IBinder> server = addServer();
1113 ASSERT_TRUE(server != nullptr);
1114
1115 const struct sched_param param {
1116 .sched_priority = kSchedPriorityMore,
1117 };
1118 EXPECT_EQ(0, sched_setscheduler(getpid(), SCHED_RR, &param));
1119
1120 Parcel data, reply;
Yifan Hongbbd2a0d2021-05-07 22:12:23 -07001121 EXPECT_THAT(server->transact(BINDER_LIB_TEST_GET_SCHEDULING_POLICY, data, &reply),
1122 StatusEq(NO_ERROR));
Steven Morelandcf03cf12020-12-04 02:58:40 +00001123
1124 int policy = reply.readInt32();
1125 int priority = reply.readInt32();
1126
1127 EXPECT_EQ(kSchedPolicy, policy & (~SCHED_RESET_ON_FORK));
1128 EXPECT_EQ(kSchedPriorityMore, priority);
1129}
Steven Morelandbf1915b2020-07-16 22:43:02 +00001130
Kevin DuBois2f82d5b2018-12-05 12:56:10 -08001131TEST_F(BinderLibTest, VectorSent) {
1132 Parcel data, reply;
1133 sp<IBinder> server = addServer();
1134 ASSERT_TRUE(server != nullptr);
1135
1136 std::vector<uint64_t> const testValue = { std::numeric_limits<uint64_t>::max(), 0, 200 };
1137 data.writeUint64Vector(testValue);
1138
Yifan Hongbbd2a0d2021-05-07 22:12:23 -07001139 EXPECT_THAT(server->transact(BINDER_LIB_TEST_ECHO_VECTOR, data, &reply), StatusEq(NO_ERROR));
Kevin DuBois2f82d5b2018-12-05 12:56:10 -08001140 std::vector<uint64_t> readValue;
Yifan Hongbbd2a0d2021-05-07 22:12:23 -07001141 EXPECT_THAT(reply.readUint64Vector(&readValue), StatusEq(OK));
Kevin DuBois2f82d5b2018-12-05 12:56:10 -08001142 EXPECT_EQ(readValue, testValue);
1143}
1144
Martijn Coenen82c75312019-07-24 15:18:30 +02001145TEST_F(BinderLibTest, BufRejected) {
1146 Parcel data, reply;
1147 uint32_t buf;
1148 sp<IBinder> server = addServer();
1149 ASSERT_TRUE(server != nullptr);
1150
1151 binder_buffer_object obj {
1152 .hdr = { .type = BINDER_TYPE_PTR },
Nick Desaulniers54891cd2019-11-19 09:31:05 -08001153 .flags = 0,
Martijn Coenen82c75312019-07-24 15:18:30 +02001154 .buffer = reinterpret_cast<binder_uintptr_t>((void*)&buf),
1155 .length = 4,
Martijn Coenen82c75312019-07-24 15:18:30 +02001156 };
1157 data.setDataCapacity(1024);
1158 // Write a bogus object at offset 0 to get an entry in the offset table
1159 data.writeFileDescriptor(0);
1160 EXPECT_EQ(data.objectsCount(), 1);
1161 uint8_t *parcelData = const_cast<uint8_t*>(data.data());
1162 // And now, overwrite it with the buffer object
1163 memcpy(parcelData, &obj, sizeof(obj));
1164 data.setDataSize(sizeof(obj));
1165
Martijn Coenen82c75312019-07-24 15:18:30 +02001166 // Either the kernel should reject this transaction (if it's correct), but
1167 // if it's not, the server implementation should return an error if it
1168 // finds an object in the received Parcel.
Yifan Hongbbd2a0d2021-05-07 22:12:23 -07001169 EXPECT_THAT(server->transact(BINDER_LIB_TEST_REJECT_BUF, data, &reply),
1170 Not(StatusEq(NO_ERROR)));
Martijn Coenen82c75312019-07-24 15:18:30 +02001171}
1172
Steven Moreland254e8ef2021-04-19 22:28:50 +00001173TEST_F(BinderLibTest, GotSid) {
1174 sp<IBinder> server = addServer();
1175
1176 Parcel data;
Yifan Hongbbd2a0d2021-05-07 22:12:23 -07001177 EXPECT_THAT(server->transact(BINDER_LIB_TEST_CAN_GET_SID, data, nullptr), StatusEq(OK));
Steven Moreland254e8ef2021-04-19 22:28:50 +00001178}
1179
Yifan Hong84bedeb2021-04-21 21:37:17 -07001180class BinderLibRpcTestBase : public BinderLibTest {
1181public:
1182 void SetUp() override {
1183 if (!base::GetBoolProperty("ro.debuggable", false)) {
1184 GTEST_SKIP() << "Binder RPC is only enabled on debuggable builds, skipping test on "
1185 "non-debuggable builds.";
1186 }
1187 BinderLibTest::SetUp();
1188 }
1189
1190 std::tuple<android::base::unique_fd, unsigned int> CreateSocket() {
1191 auto rpcServer = RpcServer::make();
1192 EXPECT_NE(nullptr, rpcServer);
1193 if (rpcServer == nullptr) return {};
1194 rpcServer->iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProduction();
1195 unsigned int port;
1196 if (!rpcServer->setupInetServer(0, &port)) {
1197 ADD_FAILURE() << "setupInetServer failed";
1198 return {};
1199 }
1200 return {rpcServer->releaseServer(), port};
1201 }
1202};
1203
Yifan Hong8b890852021-06-10 13:44:09 -07001204class BinderLibRpcTest : public BinderLibRpcTestBase {};
Yifan Hong84bedeb2021-04-21 21:37:17 -07001205
Yifan Hong8b890852021-06-10 13:44:09 -07001206TEST_F(BinderLibRpcTest, SetRpcClientDebug) {
1207 auto binder = addServer();
Yifan Hong84bedeb2021-04-21 21:37:17 -07001208 ASSERT_TRUE(binder != nullptr);
1209 auto [socket, port] = CreateSocket();
1210 ASSERT_TRUE(socket.ok());
Yifan Hong02530ec2021-06-10 13:38:38 -07001211 EXPECT_THAT(binder->setRpcClientDebug(std::move(socket), sp<BBinder>::make()), StatusEq(OK));
Yifan Hong84bedeb2021-04-21 21:37:17 -07001212}
1213
Yifan Hong8b890852021-06-10 13:44:09 -07001214// Tests for multiple RpcServer's on the same binder object.
1215TEST_F(BinderLibRpcTest, SetRpcClientDebugTwice) {
1216 auto binder = addServer();
Yifan Hong84bedeb2021-04-21 21:37:17 -07001217 ASSERT_TRUE(binder != nullptr);
1218
1219 auto [socket1, port1] = CreateSocket();
1220 ASSERT_TRUE(socket1.ok());
Yifan Hong02530ec2021-06-10 13:38:38 -07001221 auto keepAliveBinder1 = sp<BBinder>::make();
1222 EXPECT_THAT(binder->setRpcClientDebug(std::move(socket1), keepAliveBinder1), StatusEq(OK));
Yifan Hong84bedeb2021-04-21 21:37:17 -07001223
1224 auto [socket2, port2] = CreateSocket();
1225 ASSERT_TRUE(socket2.ok());
Yifan Hong02530ec2021-06-10 13:38:38 -07001226 auto keepAliveBinder2 = sp<BBinder>::make();
Yifan Hong8b890852021-06-10 13:44:09 -07001227 EXPECT_THAT(binder->setRpcClientDebug(std::move(socket2), keepAliveBinder2), StatusEq(OK));
Yifan Hong84bedeb2021-04-21 21:37:17 -07001228}
1229
Yifan Hong8b890852021-06-10 13:44:09 -07001230// Negative tests for RPC APIs on IBinder. Call should fail in the same way on both remote and
1231// local binders.
1232class BinderLibRpcTestP : public BinderLibRpcTestBase, public WithParamInterface<bool> {
1233public:
1234 sp<IBinder> GetService() {
1235 return GetParam() ? sp<IBinder>(addServer()) : sp<IBinder>(sp<BBinder>::make());
1236 }
1237 static std::string ParamToString(const testing::TestParamInfo<ParamType> &info) {
1238 return info.param ? "remote" : "local";
1239 }
1240};
1241
1242TEST_P(BinderLibRpcTestP, SetRpcClientDebugNoFd) {
1243 auto binder = GetService();
1244 ASSERT_TRUE(binder != nullptr);
1245 EXPECT_THAT(binder->setRpcClientDebug(android::base::unique_fd(), sp<BBinder>::make()),
1246 StatusEq(BAD_VALUE));
1247}
1248
1249TEST_P(BinderLibRpcTestP, SetRpcClientDebugNoKeepAliveBinder) {
1250 auto binder = GetService();
1251 ASSERT_TRUE(binder != nullptr);
1252 auto [socket, port] = CreateSocket();
1253 ASSERT_TRUE(socket.ok());
1254 EXPECT_THAT(binder->setRpcClientDebug(std::move(socket), nullptr), StatusEq(UNEXPECTED_NULL));
1255}
1256INSTANTIATE_TEST_CASE_P(BinderLibTest, BinderLibRpcTestP, testing::Bool(),
1257 BinderLibRpcTestP::ParamToString);
Yifan Hong84bedeb2021-04-21 21:37:17 -07001258
1259class BinderLibTestService;
1260class BinderLibRpcClientTest : public BinderLibRpcTestBase,
1261 public WithParamInterface<std::tuple<bool, uint32_t>> {
1262public:
1263 static std::string ParamToString(const testing::TestParamInfo<ParamType> &info) {
1264 auto [isRemote, numThreads] = info.param;
1265 return (isRemote ? "remote" : "local") + "_server_with_"s + std::to_string(numThreads) +
1266 "_threads";
1267 }
1268 sp<IBinder> CreateRemoteService(int32_t id) {
1269 Parcel data, reply;
1270 status_t status = data.writeInt32(id);
1271 EXPECT_THAT(status, StatusEq(OK));
1272 if (status != OK) return nullptr;
1273 status = m_server->transact(BINDER_LIB_TEST_CREATE_TEST_SERVICE, data, &reply);
1274 EXPECT_THAT(status, StatusEq(OK));
1275 if (status != OK) return nullptr;
1276 sp<IBinder> ret;
1277 status = reply.readStrongBinder(&ret);
1278 EXPECT_THAT(status, StatusEq(OK));
1279 if (status != OK) return nullptr;
1280 return ret;
1281 }
1282};
1283
1284TEST_P(BinderLibRpcClientTest, Test) {
1285 auto [isRemote, numThreadsParam] = GetParam();
1286 uint32_t numThreads = numThreadsParam; // ... to be captured in lambda
1287 int32_t id = 0xC0FFEE00 + numThreads;
1288 sp<IBinder> server = isRemote ? sp<IBinder>(CreateRemoteService(id))
1289 : sp<IBinder>(sp<BinderLibTestService>::make(id, false));
1290 ASSERT_EQ(isRemote, !!server->remoteBinder());
Yifan Hong28d6c352021-06-04 17:27:35 -07001291 ASSERT_THAT(GetId(server), HasValue(id));
Yifan Hong84bedeb2021-04-21 21:37:17 -07001292
1293 unsigned int port = 0;
1294 // Fake servicedispatcher.
1295 {
1296 auto [socket, socketPort] = CreateSocket();
1297 ASSERT_TRUE(socket.ok());
1298 port = socketPort;
Yifan Hong34823232021-06-07 17:23:00 -07001299 ASSERT_THAT(server->setRpcClientDebug(std::move(socket)), StatusEq(OK));
Yifan Hong84bedeb2021-04-21 21:37:17 -07001300 }
1301
Yifan Hong34823232021-06-07 17:23:00 -07001302 std::mutex mutex;
1303 std::condition_variable cv;
1304 bool start = false;
Yifan Hong84bedeb2021-04-21 21:37:17 -07001305
1306 auto threadFn = [&](size_t threadNum) {
Yifan Hong34823232021-06-07 17:23:00 -07001307 usleep(threadNum * 10 * 1000); // threadNum * 10ms. Need this to avoid SYN flooding.
Yifan Hong84bedeb2021-04-21 21:37:17 -07001308 auto rpcSession = RpcSession::make();
1309 ASSERT_TRUE(rpcSession->setupInetClient("127.0.0.1", port));
1310 auto rpcServerBinder = rpcSession->getRootObject();
1311 ASSERT_NE(nullptr, rpcServerBinder);
Yifan Hong84bedeb2021-04-21 21:37:17 -07001312 // Check that |rpcServerBinder| and |server| points to the same service.
Yifan Hong34823232021-06-07 17:23:00 -07001313 EXPECT_THAT(GetId(rpcServerBinder), HasValue(id)) << "For thread #" << threadNum;
Yifan Hong84bedeb2021-04-21 21:37:17 -07001314
Yifan Hong34823232021-06-07 17:23:00 -07001315 {
1316 std::unique_lock<std::mutex> lock(mutex);
1317 ASSERT_TRUE(cv.wait_for(lock, 1s, [&] { return start; }));
1318 }
1319 // Let all threads almost simultaneously ping the service.
1320 for (size_t i = 0; i < 100; ++i) {
1321 EXPECT_THAT(rpcServerBinder->pingBinder(), StatusEq(OK))
1322 << "For thread #" << threadNum << ", iteration " << i;
1323 }
Yifan Hong84bedeb2021-04-21 21:37:17 -07001324 };
Yifan Hong34823232021-06-07 17:23:00 -07001325
Yifan Hong84bedeb2021-04-21 21:37:17 -07001326 std::vector<std::thread> threads;
1327 for (size_t i = 0; i < numThreads; ++i) threads.emplace_back(std::bind(threadFn, i));
Yifan Hong34823232021-06-07 17:23:00 -07001328
1329 {
1330 std::lock_guard<std::mutex> lock(mutex);
1331 start = true;
1332 }
1333 cv.notify_all();
1334
Yifan Hong84bedeb2021-04-21 21:37:17 -07001335 for (auto &t : threads) t.join();
1336}
1337
1338INSTANTIATE_TEST_CASE_P(BinderLibTest, BinderLibRpcClientTest,
Yifan Hong34823232021-06-07 17:23:00 -07001339 testing::Combine(testing::Bool(), testing::Values(1u, 10u)),
Yifan Hong84bedeb2021-04-21 21:37:17 -07001340 BinderLibRpcClientTest::ParamToString);
1341
Yifan Hong543edcd2021-05-18 19:47:30 -07001342class BinderLibTestService : public BBinder {
1343public:
Yifan Hong84bedeb2021-04-21 21:37:17 -07001344 explicit BinderLibTestService(int32_t id, bool exitOnDestroy = true)
1345 : m_id(id),
1346 m_nextServerId(id + 1),
1347 m_serverStartRequested(false),
1348 m_callback(nullptr),
1349 m_exitOnDestroy(exitOnDestroy) {
Yifan Hong543edcd2021-05-18 19:47:30 -07001350 pthread_mutex_init(&m_serverWaitMutex, nullptr);
1351 pthread_cond_init(&m_serverWaitCond, nullptr);
1352 }
Yifan Hong84bedeb2021-04-21 21:37:17 -07001353 ~BinderLibTestService() {
1354 if (m_exitOnDestroy) exit(EXIT_SUCCESS);
1355 }
Martijn Coenen45b07b42017-08-09 12:07:45 +02001356
Yifan Hong543edcd2021-05-18 19:47:30 -07001357 void processPendingCall() {
1358 if (m_callback != nullptr) {
1359 Parcel data;
1360 data.writeInt32(NO_ERROR);
1361 m_callback->transact(BINDER_LIB_TEST_CALL_BACK, data, nullptr, TF_ONE_WAY);
1362 m_callback = nullptr;
Martijn Coenen45b07b42017-08-09 12:07:45 +02001363 }
Yifan Hong543edcd2021-05-18 19:47:30 -07001364 }
Martijn Coenen45b07b42017-08-09 12:07:45 +02001365
Yifan Hong543edcd2021-05-18 19:47:30 -07001366 virtual status_t onTransact(uint32_t code, const Parcel &data, Parcel *reply,
1367 uint32_t flags = 0) {
Yifan Hong84bedeb2021-04-21 21:37:17 -07001368 // TODO(b/182914638): also checks getCallingUid() for RPC
1369 if (!data.isForRpc() && getuid() != (uid_t)IPCThreadState::self()->getCallingUid()) {
Yifan Hong543edcd2021-05-18 19:47:30 -07001370 return PERMISSION_DENIED;
1371 }
1372 switch (code) {
Riley Andrews06b01ad2014-12-18 12:10:08 -08001373 case BINDER_LIB_TEST_REGISTER_SERVER: {
1374 int32_t id;
1375 sp<IBinder> binder;
1376 id = data.readInt32();
1377 binder = data.readStrongBinder();
Yi Kong91635562018-06-07 14:38:36 -07001378 if (binder == nullptr) {
Riley Andrews06b01ad2014-12-18 12:10:08 -08001379 return BAD_VALUE;
1380 }
1381
Yifan Hong543edcd2021-05-18 19:47:30 -07001382 if (m_id != 0) return INVALID_OPERATION;
Riley Andrews06b01ad2014-12-18 12:10:08 -08001383
1384 pthread_mutex_lock(&m_serverWaitMutex);
1385 if (m_serverStartRequested) {
1386 m_serverStartRequested = false;
1387 m_serverStarted = binder;
1388 pthread_cond_signal(&m_serverWaitCond);
1389 }
1390 pthread_mutex_unlock(&m_serverWaitMutex);
1391 return NO_ERROR;
1392 }
Martijn Coenen45b07b42017-08-09 12:07:45 +02001393 case BINDER_LIB_TEST_ADD_POLL_SERVER:
Riley Andrews06b01ad2014-12-18 12:10:08 -08001394 case BINDER_LIB_TEST_ADD_SERVER: {
1395 int ret;
Riley Andrews06b01ad2014-12-18 12:10:08 -08001396 int serverid;
1397
1398 if (m_id != 0) {
1399 return INVALID_OPERATION;
1400 }
1401 pthread_mutex_lock(&m_serverWaitMutex);
1402 if (m_serverStartRequested) {
1403 ret = -EBUSY;
1404 } else {
1405 serverid = m_nextServerId++;
1406 m_serverStartRequested = true;
Martijn Coenen45b07b42017-08-09 12:07:45 +02001407 bool usePoll = code == BINDER_LIB_TEST_ADD_POLL_SERVER;
Riley Andrews06b01ad2014-12-18 12:10:08 -08001408
1409 pthread_mutex_unlock(&m_serverWaitMutex);
Martijn Coenen45b07b42017-08-09 12:07:45 +02001410 ret = start_server_process(serverid, usePoll);
Riley Andrews06b01ad2014-12-18 12:10:08 -08001411 pthread_mutex_lock(&m_serverWaitMutex);
1412 }
1413 if (ret > 0) {
1414 if (m_serverStartRequested) {
Riley Andrews06b01ad2014-12-18 12:10:08 -08001415 struct timespec ts;
1416 clock_gettime(CLOCK_REALTIME, &ts);
1417 ts.tv_sec += 5;
1418 ret = pthread_cond_timedwait(&m_serverWaitCond, &m_serverWaitMutex, &ts);
Riley Andrews06b01ad2014-12-18 12:10:08 -08001419 }
1420 if (m_serverStartRequested) {
1421 m_serverStartRequested = false;
1422 ret = -ETIMEDOUT;
1423 } else {
1424 reply->writeStrongBinder(m_serverStarted);
1425 reply->writeInt32(serverid);
Yi Kong91635562018-06-07 14:38:36 -07001426 m_serverStarted = nullptr;
Riley Andrews06b01ad2014-12-18 12:10:08 -08001427 ret = NO_ERROR;
1428 }
1429 } else if (ret >= 0) {
1430 m_serverStartRequested = false;
1431 ret = UNKNOWN_ERROR;
1432 }
1433 pthread_mutex_unlock(&m_serverWaitMutex);
1434 return ret;
1435 }
Steven Moreland35626652021-05-15 01:32:04 +00001436 case BINDER_LIB_TEST_USE_CALLING_GUARD_TRANSACTION: {
1437 IPCThreadState::SpGuard spGuard{
1438 .address = __builtin_frame_address(0),
1439 .context = "GuardInBinderTransaction",
1440 };
1441 const IPCThreadState::SpGuard *origGuard =
1442 IPCThreadState::self()->pushGetCallingSpGuard(&spGuard);
1443
1444 // if the guard works, this should abort
1445 (void)IPCThreadState::self()->getCallingPid();
1446
1447 IPCThreadState::self()->restoreGetCallingSpGuard(origGuard);
1448 return NO_ERROR;
1449 }
1450
Marco Ballesio7ee17572020-09-08 10:30:03 -07001451 case BINDER_LIB_TEST_GETPID:
1452 reply->writeInt32(getpid());
1453 return NO_ERROR;
1454 case BINDER_LIB_TEST_NOP_TRANSACTION_WAIT:
1455 usleep(5000);
Steven Moreland80844f72020-12-12 02:06:08 +00001456 [[fallthrough]];
Riley Andrews06b01ad2014-12-18 12:10:08 -08001457 case BINDER_LIB_TEST_NOP_TRANSACTION:
Steven Moreland80844f72020-12-12 02:06:08 +00001458 // oneway error codes should be ignored
1459 if (flags & TF_ONE_WAY) {
1460 return UNKNOWN_ERROR;
1461 }
Riley Andrews06b01ad2014-12-18 12:10:08 -08001462 return NO_ERROR;
Martijn Coenen45b07b42017-08-09 12:07:45 +02001463 case BINDER_LIB_TEST_DELAYED_CALL_BACK: {
1464 // Note: this transaction is only designed for use with a
1465 // poll() server. See comments around epoll_wait().
Yi Kong91635562018-06-07 14:38:36 -07001466 if (m_callback != nullptr) {
Martijn Coenen45b07b42017-08-09 12:07:45 +02001467 // A callback was already pending; this means that
1468 // we received a second call while still processing
1469 // the first one. Fail the test.
1470 sp<IBinder> callback = data.readStrongBinder();
1471 Parcel data2;
1472 data2.writeInt32(UNKNOWN_ERROR);
1473
Yi Kong91635562018-06-07 14:38:36 -07001474 callback->transact(BINDER_LIB_TEST_CALL_BACK, data2, nullptr, TF_ONE_WAY);
Martijn Coenen45b07b42017-08-09 12:07:45 +02001475 } else {
1476 m_callback = data.readStrongBinder();
1477 int32_t delayUs = data.readInt32();
1478 /*
1479 * It's necessary that we sleep here, so the next
1480 * transaction the caller makes will be queued to
1481 * the async queue.
1482 */
1483 usleep(delayUs);
1484
1485 /*
1486 * Now when we return, libbinder will tell the kernel
1487 * we are done with this transaction, and the kernel
1488 * can move the queued transaction to either the
1489 * thread todo worklist (for kernels without the fix),
1490 * or the proc todo worklist. In case of the former,
1491 * the next outbound call will pick up the pending
1492 * transaction, which leads to undesired reentrant
1493 * behavior. This is caught in the if() branch above.
1494 */
1495 }
1496
1497 return NO_ERROR;
1498 }
Riley Andrews06b01ad2014-12-18 12:10:08 -08001499 case BINDER_LIB_TEST_NOP_CALL_BACK: {
1500 Parcel data2, reply2;
1501 sp<IBinder> binder;
1502 binder = data.readStrongBinder();
Yi Kong91635562018-06-07 14:38:36 -07001503 if (binder == nullptr) {
Riley Andrews06b01ad2014-12-18 12:10:08 -08001504 return BAD_VALUE;
1505 }
Martijn Coenenfb368f72017-08-10 15:03:18 +02001506 data2.writeInt32(NO_ERROR);
Riley Andrews06b01ad2014-12-18 12:10:08 -08001507 binder->transact(BINDER_LIB_TEST_CALL_BACK, data2, &reply2);
1508 return NO_ERROR;
1509 }
Arve Hjønnevåg70604312016-08-12 15:34:51 -07001510 case BINDER_LIB_TEST_GET_SELF_TRANSACTION:
1511 reply->writeStrongBinder(this);
1512 return NO_ERROR;
Riley Andrews06b01ad2014-12-18 12:10:08 -08001513 case BINDER_LIB_TEST_GET_ID_TRANSACTION:
1514 reply->writeInt32(m_id);
1515 return NO_ERROR;
1516 case BINDER_LIB_TEST_INDIRECT_TRANSACTION: {
1517 int32_t count;
1518 uint32_t indirect_code;
1519 sp<IBinder> binder;
1520
1521 count = data.readInt32();
1522 reply->writeInt32(m_id);
1523 reply->writeInt32(count);
1524 for (int i = 0; i < count; i++) {
1525 binder = data.readStrongBinder();
Yi Kong91635562018-06-07 14:38:36 -07001526 if (binder == nullptr) {
Riley Andrews06b01ad2014-12-18 12:10:08 -08001527 return BAD_VALUE;
1528 }
1529 indirect_code = data.readInt32();
1530 BinderLibTestBundle data2(&data);
1531 if (!data2.isValid()) {
1532 return BAD_VALUE;
1533 }
1534 BinderLibTestBundle reply2;
1535 binder->transact(indirect_code, data2, &reply2);
1536 reply2.appendTo(reply);
1537 }
1538 return NO_ERROR;
1539 }
1540 case BINDER_LIB_TEST_SET_ERROR_TRANSACTION:
1541 reply->setError(data.readInt32());
1542 return NO_ERROR;
1543 case BINDER_LIB_TEST_GET_PTR_SIZE_TRANSACTION:
1544 reply->writeInt32(sizeof(void *));
1545 return NO_ERROR;
1546 case BINDER_LIB_TEST_GET_STATUS_TRANSACTION:
1547 return NO_ERROR;
1548 case BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION:
1549 m_strongRef = data.readStrongBinder();
1550 return NO_ERROR;
1551 case BINDER_LIB_TEST_LINK_DEATH_TRANSACTION: {
1552 int ret;
1553 Parcel data2, reply2;
1554 sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient();
1555 sp<IBinder> target;
1556 sp<IBinder> callback;
1557
1558 target = data.readStrongBinder();
Yi Kong91635562018-06-07 14:38:36 -07001559 if (target == nullptr) {
Riley Andrews06b01ad2014-12-18 12:10:08 -08001560 return BAD_VALUE;
1561 }
1562 callback = data.readStrongBinder();
Yi Kong91635562018-06-07 14:38:36 -07001563 if (callback == nullptr) {
Riley Andrews06b01ad2014-12-18 12:10:08 -08001564 return BAD_VALUE;
1565 }
1566 ret = target->linkToDeath(testDeathRecipient);
Yifan Hong543edcd2021-05-18 19:47:30 -07001567 if (ret == NO_ERROR) ret = testDeathRecipient->waitEvent(5);
Riley Andrews06b01ad2014-12-18 12:10:08 -08001568 data2.writeInt32(ret);
1569 callback->transact(BINDER_LIB_TEST_CALL_BACK, data2, &reply2);
1570 return NO_ERROR;
1571 }
1572 case BINDER_LIB_TEST_WRITE_FILE_TRANSACTION: {
1573 int ret;
1574 int32_t size;
1575 const void *buf;
1576 int fd;
1577
1578 fd = data.readFileDescriptor();
1579 if (fd < 0) {
1580 return BAD_VALUE;
1581 }
1582 ret = data.readInt32(&size);
1583 if (ret != NO_ERROR) {
1584 return ret;
1585 }
1586 buf = data.readInplace(size);
Yi Kong91635562018-06-07 14:38:36 -07001587 if (buf == nullptr) {
Riley Andrews06b01ad2014-12-18 12:10:08 -08001588 return BAD_VALUE;
1589 }
1590 ret = write(fd, buf, size);
Yifan Hong543edcd2021-05-18 19:47:30 -07001591 if (ret != size) return UNKNOWN_ERROR;
Riley Andrews06b01ad2014-12-18 12:10:08 -08001592 return NO_ERROR;
1593 }
Ryo Hashimotobf551892018-05-31 16:58:35 +09001594 case BINDER_LIB_TEST_WRITE_PARCEL_FILE_DESCRIPTOR_TRANSACTION: {
1595 int ret;
1596 int32_t size;
1597 const void *buf;
1598 android::base::unique_fd fd;
1599
1600 ret = data.readUniqueParcelFileDescriptor(&fd);
1601 if (ret != NO_ERROR) {
1602 return ret;
1603 }
1604 ret = data.readInt32(&size);
1605 if (ret != NO_ERROR) {
1606 return ret;
1607 }
1608 buf = data.readInplace(size);
Yi Kong0cf75842018-07-10 11:44:36 -07001609 if (buf == nullptr) {
Ryo Hashimotobf551892018-05-31 16:58:35 +09001610 return BAD_VALUE;
1611 }
1612 ret = write(fd.get(), buf, size);
1613 if (ret != size) return UNKNOWN_ERROR;
1614 return NO_ERROR;
1615 }
Riley Andrews06b01ad2014-12-18 12:10:08 -08001616 case BINDER_LIB_TEST_DELAYED_EXIT_TRANSACTION:
1617 alarm(10);
1618 return NO_ERROR;
1619 case BINDER_LIB_TEST_EXIT_TRANSACTION:
Yi Kong91635562018-06-07 14:38:36 -07001620 while (wait(nullptr) != -1 || errno != ECHILD)
Riley Andrews06b01ad2014-12-18 12:10:08 -08001621 ;
1622 exit(EXIT_SUCCESS);
Connor O'Brien52be2c92016-09-20 14:18:08 -07001623 case BINDER_LIB_TEST_CREATE_BINDER_TRANSACTION: {
Connor O'Brien52be2c92016-09-20 14:18:08 -07001624 sp<IBinder> binder = new BBinder();
Steven Morelande171d622019-07-17 16:06:01 -07001625 reply->writeStrongBinder(binder);
Connor O'Brien52be2c92016-09-20 14:18:08 -07001626 return NO_ERROR;
1627 }
Olivier Gaillard0e0f1de2018-08-16 14:04:09 +01001628 case BINDER_LIB_TEST_GET_WORK_SOURCE_TRANSACTION: {
1629 data.enforceInterface(binderLibTestServiceName);
Olivier Gaillarda8e7bf22018-11-14 15:35:50 +00001630 reply->writeInt32(IPCThreadState::self()->getCallingWorkSourceUid());
Olivier Gaillard0e0f1de2018-08-16 14:04:09 +01001631 return NO_ERROR;
1632 }
Steven Morelandbf1915b2020-07-16 22:43:02 +00001633 case BINDER_LIB_TEST_GET_SCHEDULING_POLICY: {
1634 int policy = 0;
1635 sched_param param;
1636 if (0 != pthread_getschedparam(pthread_self(), &policy, &param)) {
1637 return UNKNOWN_ERROR;
1638 }
1639 reply->writeInt32(policy);
1640 reply->writeInt32(param.sched_priority);
1641 return NO_ERROR;
1642 }
Kevin DuBois2f82d5b2018-12-05 12:56:10 -08001643 case BINDER_LIB_TEST_ECHO_VECTOR: {
1644 std::vector<uint64_t> vector;
1645 auto err = data.readUint64Vector(&vector);
Yifan Hong543edcd2021-05-18 19:47:30 -07001646 if (err != NO_ERROR) return err;
Kevin DuBois2f82d5b2018-12-05 12:56:10 -08001647 reply->writeUint64Vector(vector);
1648 return NO_ERROR;
1649 }
Martijn Coenen82c75312019-07-24 15:18:30 +02001650 case BINDER_LIB_TEST_REJECT_BUF: {
1651 return data.objectsCount() == 0 ? BAD_VALUE : NO_ERROR;
1652 }
Steven Moreland254e8ef2021-04-19 22:28:50 +00001653 case BINDER_LIB_TEST_CAN_GET_SID: {
1654 return IPCThreadState::self()->getCallingSid() == nullptr ? BAD_VALUE : NO_ERROR;
1655 }
Yifan Hong84bedeb2021-04-21 21:37:17 -07001656 case BINDER_LIB_TEST_CREATE_TEST_SERVICE: {
1657 int32_t id;
1658 if (status_t status = data.readInt32(&id); status != NO_ERROR) return status;
1659 reply->writeStrongBinder(sp<BinderLibTestService>::make(id, false));
1660 return NO_ERROR;
1661 }
Riley Andrews06b01ad2014-12-18 12:10:08 -08001662 default:
1663 return UNKNOWN_TRANSACTION;
Yifan Hong543edcd2021-05-18 19:47:30 -07001664 };
1665 }
1666
1667private:
1668 int32_t m_id;
1669 int32_t m_nextServerId;
1670 pthread_mutex_t m_serverWaitMutex;
1671 pthread_cond_t m_serverWaitCond;
1672 bool m_serverStartRequested;
1673 sp<IBinder> m_serverStarted;
1674 sp<IBinder> m_strongRef;
1675 sp<IBinder> m_callback;
Yifan Hong84bedeb2021-04-21 21:37:17 -07001676 bool m_exitOnDestroy;
Riley Andrews06b01ad2014-12-18 12:10:08 -08001677};
1678
Martijn Coenen45b07b42017-08-09 12:07:45 +02001679int run_server(int index, int readypipefd, bool usePoll)
Riley Andrews06b01ad2014-12-18 12:10:08 -08001680{
Connor O'Brien87c03cf2016-10-26 17:58:51 -07001681 binderLibTestServiceName += String16(binderserversuffix);
1682
Steven Moreland35626652021-05-15 01:32:04 +00001683 // Testing to make sure that calls that we are serving can use getCallin*
1684 // even though we don't here.
1685 IPCThreadState::SpGuard spGuard{
1686 .address = __builtin_frame_address(0),
1687 .context = "main server thread",
1688 };
1689 (void)IPCThreadState::self()->pushGetCallingSpGuard(&spGuard);
1690
Riley Andrews06b01ad2014-12-18 12:10:08 -08001691 status_t ret;
1692 sp<IServiceManager> sm = defaultServiceManager();
Martijn Coenen45b07b42017-08-09 12:07:45 +02001693 BinderLibTestService* testServicePtr;
Riley Andrews06b01ad2014-12-18 12:10:08 -08001694 {
1695 sp<BinderLibTestService> testService = new BinderLibTestService(index);
Steven Morelandb8ad08d2019-08-09 14:42:56 -07001696
Steven Morelandbf1915b2020-07-16 22:43:02 +00001697 testService->setMinSchedulerPolicy(kSchedPolicy, kSchedPriority);
1698
Steven Morelandcf03cf12020-12-04 02:58:40 +00001699 testService->setInheritRt(true);
1700
Steven Morelandb8ad08d2019-08-09 14:42:56 -07001701 /*
1702 * Normally would also contain functionality as well, but we are only
1703 * testing the extension mechanism.
1704 */
1705 testService->setExtension(new BBinder());
1706
Martijn Coenen82c75312019-07-24 15:18:30 +02001707 // Required for test "BufRejected'
1708 testService->setRequestingSid(true);
1709
Martijn Coenen45b07b42017-08-09 12:07:45 +02001710 /*
1711 * We need this below, but can't hold a sp<> because it prevents the
1712 * node from being cleaned up automatically. It's safe in this case
1713 * because of how the tests are written.
1714 */
1715 testServicePtr = testService.get();
1716
Riley Andrews06b01ad2014-12-18 12:10:08 -08001717 if (index == 0) {
1718 ret = sm->addService(binderLibTestServiceName, testService);
1719 } else {
1720 sp<IBinder> server = sm->getService(binderLibTestServiceName);
1721 Parcel data, reply;
1722 data.writeInt32(index);
1723 data.writeStrongBinder(testService);
1724
1725 ret = server->transact(BINDER_LIB_TEST_REGISTER_SERVER, data, &reply);
1726 }
1727 }
1728 write(readypipefd, &ret, sizeof(ret));
1729 close(readypipefd);
1730 //printf("%s: ret %d\n", __func__, ret);
1731 if (ret)
1732 return 1;
1733 //printf("%s: joinThreadPool\n", __func__);
Martijn Coenen45b07b42017-08-09 12:07:45 +02001734 if (usePoll) {
1735 int fd;
1736 struct epoll_event ev;
1737 int epoll_fd;
1738 IPCThreadState::self()->setupPolling(&fd);
1739 if (fd < 0) {
1740 return 1;
1741 }
1742 IPCThreadState::self()->flushCommands(); // flush BC_ENTER_LOOPER
1743
Nick Kralevichfcf1b2b2018-12-15 11:59:30 -08001744 epoll_fd = epoll_create1(EPOLL_CLOEXEC);
Martijn Coenen45b07b42017-08-09 12:07:45 +02001745 if (epoll_fd == -1) {
1746 return 1;
1747 }
1748
1749 ev.events = EPOLLIN;
1750 if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev) == -1) {
1751 return 1;
1752 }
1753
1754 while (1) {
1755 /*
1756 * We simulate a single-threaded process using the binder poll
1757 * interface; besides handling binder commands, it can also
1758 * issue outgoing transactions, by storing a callback in
Steven Moreland573adc12019-07-17 13:29:06 -07001759 * m_callback.
Martijn Coenen45b07b42017-08-09 12:07:45 +02001760 *
1761 * processPendingCall() will then issue that transaction.
1762 */
1763 struct epoll_event events[1];
1764 int numEvents = epoll_wait(epoll_fd, events, 1, 1000);
1765 if (numEvents < 0) {
1766 if (errno == EINTR) {
1767 continue;
1768 }
1769 return 1;
1770 }
1771 if (numEvents > 0) {
1772 IPCThreadState::self()->handlePolledCommands();
1773 IPCThreadState::self()->flushCommands(); // flush BC_FREE_BUFFER
1774 testServicePtr->processPendingCall();
1775 }
1776 }
1777 } else {
1778 ProcessState::self()->startThreadPool();
1779 IPCThreadState::self()->joinThreadPool();
1780 }
Riley Andrews06b01ad2014-12-18 12:10:08 -08001781 //printf("%s: joinThreadPool returned\n", __func__);
1782 return 1; /* joinThreadPool should not return */
1783}
1784
1785int main(int argc, char **argv) {
Steven Morelandf9f3de22020-05-06 17:14:39 -07001786 ExitIfWrongAbi();
1787
Connor O'Brien87c03cf2016-10-26 17:58:51 -07001788 if (argc == 4 && !strcmp(argv[1], "--servername")) {
Riley Andrews06b01ad2014-12-18 12:10:08 -08001789 binderservername = argv[2];
1790 } else {
1791 binderservername = argv[0];
1792 }
1793
Martijn Coenen45b07b42017-08-09 12:07:45 +02001794 if (argc == 6 && !strcmp(argv[1], binderserverarg)) {
1795 binderserversuffix = argv[5];
1796 return run_server(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]) == 1);
Riley Andrews06b01ad2014-12-18 12:10:08 -08001797 }
Connor O'Brien87c03cf2016-10-26 17:58:51 -07001798 binderserversuffix = new char[16];
1799 snprintf(binderserversuffix, 16, "%d", getpid());
1800 binderLibTestServiceName += String16(binderserversuffix);
Riley Andrews06b01ad2014-12-18 12:10:08 -08001801
1802 ::testing::InitGoogleTest(&argc, argv);
1803 binder_env = AddGlobalTestEnvironment(new BinderLibTestEnv());
1804 ProcessState::self()->startThreadPool();
1805 return RUN_ALL_TESTS();
1806}