binderLibTest.cpp revision f7100e492ff6301dc5f0250e90715e646c96774e
106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews/* 206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews * Copyright (C) 2014 The Android Open Source Project 306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews * 406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews * Licensed under the Apache License, Version 2.0 (the "License"); 506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews * you may not use this file except in compliance with the License. 606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews * You may obtain a copy of the License at 706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews * 806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews * http://www.apache.org/licenses/LICENSE-2.0 906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews * 1006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews * Unless required by applicable law or agreed to in writing, software 1106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews * distributed under the License is distributed on an "AS IS" BASIS, 1206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews * See the License for the specific language governing permissions and 1406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews * limitations under the License. 1506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews */ 1606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 1706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#include <errno.h> 1806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#include <fcntl.h> 1906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#include <poll.h> 2006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#include <pthread.h> 2106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#include <stdio.h> 2206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#include <stdlib.h> 2306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 2406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#include <gtest/gtest.h> 2506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 2606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#include <binder/Binder.h> 2706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#include <binder/IBinder.h> 2806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#include <binder/IPCThreadState.h> 2906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#include <binder/IServiceManager.h> 3006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 3106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#define ARRAY_SIZE(array) (sizeof array / sizeof array[0]) 3206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 3306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsusing namespace android; 3406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 3506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsstatic testing::Environment* binder_env; 3606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsstatic char *binderservername; 3787c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brienstatic char *binderserversuffix; 3806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsstatic char binderserverarg[] = "--binderserver"; 3906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 4006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsstatic String16 binderLibTestServiceName = String16("test.binderLib"); 4106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 4206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsenum BinderLibTestTranscationCode { 4306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_NOP_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION, 4406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_REGISTER_SERVER, 4506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_ADD_SERVER, 4606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_CALL_BACK, 4706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_NOP_CALL_BACK, 487060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg BINDER_LIB_TEST_GET_SELF_TRANSACTION, 4906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_GET_ID_TRANSACTION, 5006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_INDIRECT_TRANSACTION, 5106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_SET_ERROR_TRANSACTION, 5206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_GET_STATUS_TRANSACTION, 5306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION, 5406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_LINK_DEATH_TRANSACTION, 5506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_WRITE_FILE_TRANSACTION, 5606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_PROMOTE_WEAK_REF_TRANSACTION, 5706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_EXIT_TRANSACTION, 5806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_DELAYED_EXIT_TRANSACTION, 5906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_GET_PTR_SIZE_TRANSACTION, 6052be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien BINDER_LIB_TEST_CREATE_BINDER_TRANSACTION, 6106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 6206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 6306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewspid_t start_server_process(int arg2) 6406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 6506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 6606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pid_t pid; 6706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t status; 6806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int pipefd[2]; 6906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews char stri[16]; 7006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews char strpipefd1[16]; 7106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews char *childargv[] = { 7206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binderservername, 7306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binderserverarg, 7406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews stri, 7506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews strpipefd1, 7687c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien binderserversuffix, 7706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews NULL 7806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 7906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 8006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = pipe(pipefd); 8106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret < 0) 8206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return ret; 8306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 8406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews snprintf(stri, sizeof(stri), "%d", arg2); 8506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews snprintf(strpipefd1, sizeof(strpipefd1), "%d", pipefd[1]); 8606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 8706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pid = fork(); 8806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (pid == -1) 8906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return pid; 9006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (pid == 0) { 9106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews close(pipefd[0]); 9206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews execv(binderservername, childargv); 9306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status = -errno; 9406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews write(pipefd[1], &status, sizeof(status)); 9506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews fprintf(stderr, "execv failed, %s\n", strerror(errno)); 9606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews _exit(EXIT_FAILURE); 9706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 9806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews close(pipefd[1]); 9906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = read(pipefd[0], &status, sizeof(status)); 10006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("pipe read returned %d, status %d\n", ret, status); 10106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews close(pipefd[0]); 10206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret == sizeof(status)) { 10306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = status; 10406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else { 10506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews kill(pid, SIGKILL); 10606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret >= 0) { 10706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = NO_INIT; 10806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 10906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 11006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret < 0) { 11106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews wait(NULL); 11206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return ret; 11306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 11406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return pid; 11506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 11606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 11706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTestEnv : public ::testing::Environment { 11806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 11906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestEnv() {} 12006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> getServer(void) { 12106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return m_server; 12206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 12306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 12406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 12506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual void SetUp() { 12606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverpid = start_server_process(0); 12706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("m_serverpid %d\n", m_serverpid); 12806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_GT(m_serverpid, 0); 12906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 13006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IServiceManager> sm = defaultServiceManager(); 13106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: pid %d, get service\n", __func__, m_pid); 13206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_server = sm->getService(binderLibTestServiceName); 13306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(m_server != NULL); 13406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: pid %d, get service done\n", __func__, m_pid); 13506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 13606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual void TearDown() { 13706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 13806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 13906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int exitStatus; 14006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pid_t pid; 14106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 14206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: pid %d\n", __func__, m_pid); 14306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_server != NULL) { 14406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_GET_STATUS_TRANSACTION, data, &reply); 14506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, ret); 14606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY); 14706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, ret); 14806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 14906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_serverpid > 0) { 15006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("wait for %d\n", m_pids[i]); 15106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pid = wait(&exitStatus); 15206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(m_serverpid, pid); 15306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(WIFEXITED(exitStatus)); 15406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, WEXITSTATUS(exitStatus)); 15506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 15606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 15706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 15806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pid_t m_serverpid; 15906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> m_server; 16006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 16106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 16206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTest : public ::testing::Test { 16306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 16406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual void SetUp() { 16506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_server = static_cast<BinderLibTestEnv *>(binder_env)->getServer(); 16606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 16706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual void TearDown() { 16806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 16906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews protected: 17006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> addServer(int32_t *idPtr = NULL) 17106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 17206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 17306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t id; 17406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 17506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder; 17606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 17706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_ADD_SERVER, data, &reply); 17806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 17906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 18006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_FALSE(binder != NULL); 18106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder = reply.readStrongBinder(); 18206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(binder != NULL); 18306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&id); 18406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 18506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (idPtr) 18606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews *idPtr = id; 18706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return binder; 18806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 18906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews void waitForReadData(int fd, int timeout_ms) { 19006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 19106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pollfd pfd = pollfd(); 19206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 19306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pfd.fd = fd; 19406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pfd.events = POLLIN; 19506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = poll(&pfd, 1, timeout_ms); 19606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(1, ret); 19706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 19806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 19906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> m_server; 20006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 20106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 20206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTestBundle : public Parcel 20306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 20406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 20506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle(void) {} 20606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle(const Parcel *source) : m_isValid(false) { 20706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t mark; 20806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t bundleLen; 20906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews size_t pos; 21006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 21106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (source->readInt32(&mark)) 21206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 21306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (mark != MARK_START) 21406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 21506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (source->readInt32(&bundleLen)) 21606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 21706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pos = source->dataPosition(); 21806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (Parcel::appendFrom(source, pos, bundleLen)) 21906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 22006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews source->setDataPosition(pos + bundleLen); 22106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (source->readInt32(&mark)) 22206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 22306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (mark != MARK_END) 22406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 22506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_isValid = true; 22606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews setDataPosition(0); 22706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 22806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews void appendTo(Parcel *dest) { 22906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews dest->writeInt32(MARK_START); 23006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews dest->writeInt32(dataSize()); 23106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews dest->appendFrom(this, 0, dataSize()); 23206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews dest->writeInt32(MARK_END); 23306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 23406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews bool isValid(void) { 23506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return m_isValid; 23606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 23706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 23806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews enum { 23906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews MARK_START = B_PACK_CHARS('B','T','B','S'), 24006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews MARK_END = B_PACK_CHARS('B','T','B','E'), 24106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 24206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews bool m_isValid; 24306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 24406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 24506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTestEvent 24606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 24706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 24806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestEvent(void) 24906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews : m_eventTriggered(false) 25006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 25106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_init(&m_waitMutex, NULL); 25206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_init(&m_waitCond, NULL); 25306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 25406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int waitEvent(int timeout_s) 25506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 25606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 25706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_lock(&m_waitMutex); 25806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (!m_eventTriggered) { 25906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews struct timespec ts; 26006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews clock_gettime(CLOCK_REALTIME, &ts); 26106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ts.tv_sec += timeout_s; 26206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_timedwait(&m_waitCond, &m_waitMutex, &ts); 26306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 26406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_eventTriggered ? NO_ERROR : TIMED_OUT; 26506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_unlock(&m_waitMutex); 26606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return ret; 26706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 268f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen pthread_t getTriggeringThread() 269f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen { 270f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen return m_triggeringThread; 271f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen } 27206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews protected: 27306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews void triggerEvent(void) { 27406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_lock(&m_waitMutex); 27506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_signal(&m_waitCond); 27606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_eventTriggered = true; 277f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen m_triggeringThread = pthread_self(); 27806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_unlock(&m_waitMutex); 27906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 28006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 28106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_t m_waitMutex; 28206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_t m_waitCond; 28306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews bool m_eventTriggered; 284f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen pthread_t m_triggeringThread; 28506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 28606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 28706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTestCallBack : public BBinder, public BinderLibTestEvent 28806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 28906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 29006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestCallBack() 29106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews : m_result(NOT_ENOUGH_DATA) 29206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 29306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 29406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t getResult(void) 29506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 29606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return m_result; 29706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 29806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 29906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 30006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual status_t onTransact(uint32_t code, 30106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews const Parcel& data, Parcel* reply, 30206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint32_t flags = 0) 30306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 30406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews (void)reply; 30506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews (void)flags; 30606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews switch(code) { 30706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_CALL_BACK: 30806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_result = data.readInt32(); 30906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews triggerEvent(); 31006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 31106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews default: 31206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return UNKNOWN_TRANSACTION; 31306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 31406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 31506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 31606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t m_result; 31706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 31806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 31906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass TestDeathRecipient : public IBinder::DeathRecipient, public BinderLibTestEvent 32006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 32106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 32206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual void binderDied(const wp<IBinder>& who) { 32306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews (void)who; 32406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews triggerEvent(); 32506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 32606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 32706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 32806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, NopTransaction) { 32906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 33006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 33106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply); 33206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 33306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 33406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 33506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, SetError) { 33606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t testValue[] = { 0, -123, 123 }; 33706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (size_t i = 0; i < ARRAY_SIZE(testValue); i++) { 33806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 33906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 34006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(testValue[i]); 34106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_SET_ERROR_TRANSACTION, data, &reply); 34206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(testValue[i], ret); 34306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 34406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 34506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 34606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, GetId) { 34706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 34806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t id; 34906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 35006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_GET_ID_TRANSACTION, data, &reply); 35106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 35206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&id); 35306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 35406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, id); 35506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 35606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 35706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, PtrSize) { 35806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 35906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t ptrsize; 36006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 36106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server = addServer(); 36206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(server != NULL); 36306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = server->transact(BINDER_LIB_TEST_GET_PTR_SIZE_TRANSACTION, data, &reply); 36406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 36506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&ptrsize); 36606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 36706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews RecordProperty("TestPtrSize", sizeof(void *)); 36806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews RecordProperty("ServerPtrSize", sizeof(void *)); 36906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 37006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 37106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, IndirectGetId2) 37206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 37306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 37406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t id; 37506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t count; 37606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 37706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t serverId[3]; 37806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 37906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(ARRAY_SIZE(serverId)); 38006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (size_t i = 0; i < ARRAY_SIZE(serverId); i++) { 38106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server; 38206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle datai; 38306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 38406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews server = addServer(&serverId[i]); 38506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(server != NULL); 38606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(server); 38706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(BINDER_LIB_TEST_GET_ID_TRANSACTION); 38806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai.appendTo(&data); 38906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 39006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 39106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_INDIRECT_TRANSACTION, data, &reply); 39206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 39306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 39406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&id); 39506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 39606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, id); 39706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 39806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&count); 39906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 4006d5fa9459f3b084ab802f32bb8a490ac0f25f2a4Arve Hjønnevåg EXPECT_EQ(ARRAY_SIZE(serverId), (size_t)count); 40106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 40206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (size_t i = 0; i < (size_t)count; i++) { 40306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle replyi(&reply); 40406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(replyi.isValid()); 40506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = replyi.readInt32(&id); 40606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 40706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(serverId[i], id); 40806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(replyi.dataSize(), replyi.dataPosition()); 40906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 41006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 41106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(reply.dataSize(), reply.dataPosition()); 41206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 41306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 41406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, IndirectGetId3) 41506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 41606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 41706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t id; 41806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t count; 41906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 42006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t serverId[3]; 42106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 42206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(ARRAY_SIZE(serverId)); 42306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (size_t i = 0; i < ARRAY_SIZE(serverId); i++) { 42406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server; 42506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle datai; 42606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle datai2; 42706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 42806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews server = addServer(&serverId[i]); 42906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(server != NULL); 43006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(server); 43106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(BINDER_LIB_TEST_INDIRECT_TRANSACTION); 43206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 43306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai.writeInt32(1); 43406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai.writeStrongBinder(m_server); 43506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai.writeInt32(BINDER_LIB_TEST_GET_ID_TRANSACTION); 43606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai2.appendTo(&datai); 43706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 43806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai.appendTo(&data); 43906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 44006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 44106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_INDIRECT_TRANSACTION, data, &reply); 44206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 44306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 44406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&id); 44506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 44606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, id); 44706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 44806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&count); 44906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 4506d5fa9459f3b084ab802f32bb8a490ac0f25f2a4Arve Hjønnevåg EXPECT_EQ(ARRAY_SIZE(serverId), (size_t)count); 45106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 45206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (size_t i = 0; i < (size_t)count; i++) { 45306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t counti; 45406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 45506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle replyi(&reply); 45606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(replyi.isValid()); 45706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = replyi.readInt32(&id); 45806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 45906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(serverId[i], id); 46006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 46106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = replyi.readInt32(&counti); 46206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 46306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(1, counti); 46406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 46506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle replyi2(&replyi); 46606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(replyi2.isValid()); 46706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = replyi2.readInt32(&id); 46806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 46906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, id); 47006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(replyi2.dataSize(), replyi2.dataPosition()); 47106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 47206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(replyi.dataSize(), replyi.dataPosition()); 47306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 47406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 47506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(reply.dataSize(), reply.dataPosition()); 47606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 47706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 47806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, CallBack) 47906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 48006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 48106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 48206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<BinderLibTestCallBack> callBack = new BinderLibTestCallBack(); 48306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(callBack); 48406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_NOP_CALL_BACK, data, &reply, TF_ONE_WAY); 48506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 48606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = callBack->waitEvent(5); 48706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 48806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = callBack->getResult(); 48906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 49006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 49106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 49206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, AddServer) 49306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 49406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server = addServer(); 49506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(server != NULL); 49606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 49706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 49806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, DeathNotificationNoRefs) 49906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 50006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 50106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 50206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient(); 50306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 50406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 50506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder = addServer(); 50606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(binder != NULL); 50706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = binder->linkToDeath(testDeathRecipient); 50806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 50906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 51006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews IPCThreadState::self()->flushCommands(); 51106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = testDeathRecipient->waitEvent(5); 51206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 51306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#if 0 /* Is there an unlink api that does not require a strong reference? */ 51406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = binder->unlinkToDeath(testDeathRecipient); 51506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 51606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#endif 51706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 51806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 51906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, DeathNotificationWeakRef) 52006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 52106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 52206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews wp<IBinder> wbinder; 52306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 52406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient(); 52506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 52606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 52706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder = addServer(); 52806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(binder != NULL); 52906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = binder->linkToDeath(testDeathRecipient); 53006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 53106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews wbinder = binder; 53206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 53306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews IPCThreadState::self()->flushCommands(); 53406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = testDeathRecipient->waitEvent(5); 53506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 53606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#if 0 /* Is there an unlink api that does not require a strong reference? */ 53706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = binder->unlinkToDeath(testDeathRecipient); 53806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 53906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#endif 54006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 54106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 54206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, DeathNotificationStrongRef) 54306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 54406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 54506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> sbinder; 54606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 54706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient(); 54806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 54906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 55006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder = addServer(); 55106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(binder != NULL); 55206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = binder->linkToDeath(testDeathRecipient); 55306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 55406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sbinder = binder; 55506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 55606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 55706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 55806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = sbinder->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY); 55906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, ret); 56006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 56106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews IPCThreadState::self()->flushCommands(); 56206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = testDeathRecipient->waitEvent(5); 56306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 56406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = sbinder->unlinkToDeath(testDeathRecipient); 56506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(DEAD_OBJECT, ret); 56606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 56706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 56806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, DeathNotificationMultiple) 56906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 57006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 57106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews const int clientcount = 2; 57206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> target; 57306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> linkedclient[clientcount]; 57406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<BinderLibTestCallBack> callBack[clientcount]; 57506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> passiveclient[clientcount]; 57606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 57706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews target = addServer(); 57806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(target != NULL); 57906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (int i = 0; i < clientcount; i++) { 58006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 58106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 58206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 58306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews linkedclient[i] = addServer(); 58406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(linkedclient[i] != NULL); 58506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews callBack[i] = new BinderLibTestCallBack(); 58606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(target); 58706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(callBack[i]); 58806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = linkedclient[i]->transact(BINDER_LIB_TEST_LINK_DEATH_TRANSACTION, data, &reply, TF_ONE_WAY); 58906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 59006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 59106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 59206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 59306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 59406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews passiveclient[i] = addServer(); 59506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(passiveclient[i] != NULL); 59606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(target); 59706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = passiveclient[i]->transact(BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION, data, &reply, TF_ONE_WAY); 59806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 59906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 60006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 60106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 60206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 60306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = target->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY); 60406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, ret); 60506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 60606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 60706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (int i = 0; i < clientcount; i++) { 60806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = callBack[i]->waitEvent(5); 60906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 61006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = callBack[i]->getResult(); 61106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 61206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 61306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 61406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 615f7100e492ff6301dc5f0250e90715e646c96774eMartijn CoenenTEST_F(BinderLibTest, DeathNotificationThread) 616f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen{ 617f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen status_t ret; 618f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen sp<BinderLibTestCallBack> callback; 619f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen sp<IBinder> target = addServer(); 620f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen ASSERT_TRUE(target != NULL); 621f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen sp<IBinder> client = addServer(); 622f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen ASSERT_TRUE(client != NULL); 623f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen 624f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient(); 625f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen 626f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen ret = target->linkToDeath(testDeathRecipient); 627f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen EXPECT_EQ(NO_ERROR, ret); 628f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen 629f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen { 630f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen Parcel data, reply; 631f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen ret = target->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY); 632f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen EXPECT_EQ(0, ret); 633f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen } 634f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen 635f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen /* Make sure it's dead */ 636f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen testDeathRecipient->waitEvent(5); 637f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen 638f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen /* Now, pass the ref to another process and ask that process to 639f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * call linkToDeath() on it, and wait for a response. This tests 640f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * two things: 641f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * 1) You still get death notifications when calling linkToDeath() 642f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * on a ref that is already dead when it was passed to you. 643f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * 2) That death notifications are not directly pushed to the thread 644f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * registering them, but to the threadpool (proc workqueue) instead. 645f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * 646f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * 2) is tested because the thread handling BINDER_LIB_TEST_DEATH_TRANSACTION 647f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * is blocked on a condition variable waiting for the death notification to be 648f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * called; therefore, that thread is not available for handling proc work. 649f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * So, if the death notification was pushed to the thread workqueue, the callback 650f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * would never be called, and the test would timeout and fail. 651f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * 652f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * Note that we can't do this part of the test from this thread itself, because 653f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * the binder driver would only push death notifications to the thread if 654f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * it is a looper thread, which this thread is not. 655f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * 656f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * See b/23525545 for details. 657f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen */ 658f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen { 659f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen Parcel data, reply; 660f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen 661f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen callback = new BinderLibTestCallBack(); 662f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen data.writeStrongBinder(target); 663f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen data.writeStrongBinder(callback); 664f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen ret = client->transact(BINDER_LIB_TEST_LINK_DEATH_TRANSACTION, data, &reply, TF_ONE_WAY); 665f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen EXPECT_EQ(NO_ERROR, ret); 666f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen } 667f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen 668f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen ret = callback->waitEvent(5); 669f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen EXPECT_EQ(NO_ERROR, ret); 670f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen ret = callback->getResult(); 671f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen EXPECT_EQ(NO_ERROR, ret); 672f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen} 673f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen 67406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, PassFile) { 67506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 67606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int pipefd[2]; 67706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint8_t buf[1] = { 0 }; 67806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint8_t write_value = 123; 67906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 68006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = pipe2(pipefd, O_NONBLOCK); 68106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(0, ret); 68206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 68306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 68406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 68506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint8_t writebuf[1] = { write_value }; 68606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 68706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = data.writeFileDescriptor(pipefd[1], true); 68806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 68906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 69006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = data.writeInt32(sizeof(writebuf)); 69106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 69206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 69306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = data.write(writebuf, sizeof(writebuf)); 69406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 69506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 69606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_WRITE_FILE_TRANSACTION, data, &reply); 69706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 69806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 69906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 70006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = read(pipefd[0], buf, sizeof(buf)); 7016d5fa9459f3b084ab802f32bb8a490ac0f25f2a4Arve Hjønnevåg EXPECT_EQ(sizeof(buf), (size_t)ret); 70206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(write_value, buf[0]); 70306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 70406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews waitForReadData(pipefd[0], 5000); /* wait for other proccess to close pipe */ 70506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 70606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = read(pipefd[0], buf, sizeof(buf)); 70706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, ret); 70806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 70906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews close(pipefd[0]); 71006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 71106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 71206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, PromoteLocal) { 71306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> strong = new BBinder(); 71406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews wp<IBinder> weak = strong; 71506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> strong_from_weak = weak.promote(); 71606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(strong != NULL); 71706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(strong, strong_from_weak); 71806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews strong = NULL; 71906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews strong_from_weak = NULL; 72006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews strong_from_weak = weak.promote(); 72106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(strong_from_weak == NULL); 72206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 72306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 72406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, PromoteRemote) { 72506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 72606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 72706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> strong = new BBinder(); 72806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server = addServer(); 72906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 73006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(server != NULL); 73106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(strong != NULL); 73206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 73306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = data.writeWeakBinder(strong); 73406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 73506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 73606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = server->transact(BINDER_LIB_TEST_PROMOTE_WEAK_REF_TRANSACTION, data, &reply); 73706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_GE(ret, 0); 73806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 73906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 7407060431a6f0eb395bdc32171aecc51c25fbe7dacArve HjønnevågTEST_F(BinderLibTest, CheckHandleZeroBinderHighBitsZeroCookie) { 7417060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg status_t ret; 7427060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg Parcel data, reply; 7437060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg 7447060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg ret = m_server->transact(BINDER_LIB_TEST_GET_SELF_TRANSACTION, data, &reply); 7457060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg EXPECT_EQ(NO_ERROR, ret); 7467060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg 7477060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg const flat_binder_object *fb = reply.readObject(false); 7487060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg ASSERT_TRUE(fb != NULL); 7497060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg EXPECT_EQ(fb->hdr.type, BINDER_TYPE_HANDLE); 7507060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg EXPECT_EQ(ProcessState::self()->getStrongProxyForHandle(fb->handle), m_server); 7517060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg EXPECT_EQ(fb->cookie, (binder_uintptr_t)0); 7527060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg EXPECT_EQ(fb->binder >> 32, (binder_uintptr_t)0); 7537060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg} 7547060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg 75552be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'BrienTEST_F(BinderLibTest, FreedBinder) { 75652be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien status_t ret; 75752be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien 75852be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien sp<IBinder> server = addServer(); 75952be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien ASSERT_TRUE(server != NULL); 76052be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien 76152be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien __u32 freedHandle; 76252be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien wp<IBinder> keepFreedBinder; 76352be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien { 76452be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien Parcel data, reply; 76552be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien data.writeBool(false); /* request weak reference */ 76652be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien ret = server->transact(BINDER_LIB_TEST_CREATE_BINDER_TRANSACTION, data, &reply); 76752be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien ASSERT_EQ(NO_ERROR, ret); 76852be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien struct flat_binder_object *freed = (struct flat_binder_object *)(reply.data()); 76952be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien freedHandle = freed->handle; 77052be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien /* Add a weak ref to the freed binder so the driver does not 77152be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien * delete its reference to it - otherwise the transaction 77252be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien * fails regardless of whether the driver is fixed. 77352be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien */ 77452be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien keepFreedBinder = reply.readWeakBinder(); 77552be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien } 77652be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien { 77752be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien Parcel data, reply; 77852be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien data.writeStrongBinder(server); 77952be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien /* Replace original handle with handle to the freed binder */ 78052be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien struct flat_binder_object *strong = (struct flat_binder_object *)(data.data()); 78152be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien __u32 oldHandle = strong->handle; 78252be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien strong->handle = freedHandle; 78352be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien ret = server->transact(BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION, data, &reply); 78452be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien /* Returns DEAD_OBJECT (-32) if target crashes and 78552be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien * FAILED_TRANSACTION if the driver rejects the invalid 78652be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien * object. 78752be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien */ 78852be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien EXPECT_EQ((status_t)FAILED_TRANSACTION, ret); 78952be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien /* Restore original handle so parcel destructor does not use 79052be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien * the wrong handle. 79152be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien */ 79252be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien strong->handle = oldHandle; 79352be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien } 79452be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien} 79552be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien 79606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTestService : public BBinder 79706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 79806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 79906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestService(int32_t id) 80006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews : m_id(id) 80106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews , m_nextServerId(id + 1) 80206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews , m_serverStartRequested(false) 80306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 80406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_init(&m_serverWaitMutex, NULL); 80506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_init(&m_serverWaitCond, NULL); 80606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 80706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ~BinderLibTestService() 80806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 80906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews exit(EXIT_SUCCESS); 81006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 81106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual status_t onTransact(uint32_t code, 81206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews const Parcel& data, Parcel* reply, 81306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint32_t flags = 0) { 81406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: code %d\n", __func__, code); 81506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews (void)flags; 81606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 81706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (getuid() != (uid_t)IPCThreadState::self()->getCallingUid()) { 81806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return PERMISSION_DENIED; 81906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 82006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews switch (code) { 82106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_REGISTER_SERVER: { 82206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t id; 82306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder; 82406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews id = data.readInt32(); 82506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder = data.readStrongBinder(); 82606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (binder == NULL) { 82706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 82806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 82906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 83006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_id != 0) 83106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return INVALID_OPERATION; 83206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 83306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_lock(&m_serverWaitMutex); 83406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_serverStartRequested) { 83506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStartRequested = false; 83606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStarted = binder; 83706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_signal(&m_serverWaitCond); 83806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 83906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_unlock(&m_serverWaitMutex); 84006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 84106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 84206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_ADD_SERVER: { 84306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 84406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint8_t buf[1] = { 0 }; 84506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int serverid; 84606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 84706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_id != 0) { 84806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return INVALID_OPERATION; 84906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 85006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_lock(&m_serverWaitMutex); 85106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_serverStartRequested) { 85206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = -EBUSY; 85306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else { 85406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews serverid = m_nextServerId++; 85506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStartRequested = true; 85606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 85706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_unlock(&m_serverWaitMutex); 85806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = start_server_process(serverid); 85906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_lock(&m_serverWaitMutex); 86006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 86106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret > 0) { 86206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_serverStartRequested) { 86306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews struct timespec ts; 86406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews clock_gettime(CLOCK_REALTIME, &ts); 86506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ts.tv_sec += 5; 86606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = pthread_cond_timedwait(&m_serverWaitCond, &m_serverWaitMutex, &ts); 86706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 86806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_serverStartRequested) { 86906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStartRequested = false; 87006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = -ETIMEDOUT; 87106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else { 87206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeStrongBinder(m_serverStarted); 87306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeInt32(serverid); 87406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStarted = NULL; 87506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = NO_ERROR; 87606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 87706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else if (ret >= 0) { 87806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStartRequested = false; 87906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = UNKNOWN_ERROR; 88006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 88106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_unlock(&m_serverWaitMutex); 88206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return ret; 88306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 88406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_NOP_TRANSACTION: 88506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 88606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_NOP_CALL_BACK: { 88706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data2, reply2; 88806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder; 88906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder = data.readStrongBinder(); 89006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (binder == NULL) { 89106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 89206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 89306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply2.writeInt32(NO_ERROR); 89406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder->transact(BINDER_LIB_TEST_CALL_BACK, data2, &reply2); 89506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 89606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 8977060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg case BINDER_LIB_TEST_GET_SELF_TRANSACTION: 8987060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg reply->writeStrongBinder(this); 8997060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg return NO_ERROR; 90006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_GET_ID_TRANSACTION: 90106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeInt32(m_id); 90206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 90306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_INDIRECT_TRANSACTION: { 90406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t count; 90506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint32_t indirect_code; 90606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder; 90706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 90806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews count = data.readInt32(); 90906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeInt32(m_id); 91006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeInt32(count); 91106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (int i = 0; i < count; i++) { 91206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder = data.readStrongBinder(); 91306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (binder == NULL) { 91406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 91506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 91606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews indirect_code = data.readInt32(); 91706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle data2(&data); 91806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (!data2.isValid()) { 91906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 92006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 92106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle reply2; 92206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder->transact(indirect_code, data2, &reply2); 92306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply2.appendTo(reply); 92406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 92506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 92606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 92706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_SET_ERROR_TRANSACTION: 92806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->setError(data.readInt32()); 92906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 93006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_GET_PTR_SIZE_TRANSACTION: 93106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeInt32(sizeof(void *)); 93206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 93306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_GET_STATUS_TRANSACTION: 93406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 93506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION: 93606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_strongRef = data.readStrongBinder(); 93706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 93806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_LINK_DEATH_TRANSACTION: { 93906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 94006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data2, reply2; 94106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient(); 94206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> target; 94306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> callback; 94406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 94506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews target = data.readStrongBinder(); 94606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (target == NULL) { 94706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 94806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 94906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews callback = data.readStrongBinder(); 95006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (callback == NULL) { 95106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 95206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 95306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = target->linkToDeath(testDeathRecipient); 95406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret == NO_ERROR) 95506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = testDeathRecipient->waitEvent(5); 95606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data2.writeInt32(ret); 95706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews callback->transact(BINDER_LIB_TEST_CALL_BACK, data2, &reply2); 95806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 95906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 96006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_WRITE_FILE_TRANSACTION: { 96106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 96206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t size; 96306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews const void *buf; 96406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int fd; 96506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 96606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews fd = data.readFileDescriptor(); 96706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (fd < 0) { 96806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 96906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 97006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = data.readInt32(&size); 97106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret != NO_ERROR) { 97206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return ret; 97306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 97406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews buf = data.readInplace(size); 97506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (buf == NULL) { 97606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 97706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 97806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = write(fd, buf, size); 97906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret != size) 98006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return UNKNOWN_ERROR; 98106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 98206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 98306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_PROMOTE_WEAK_REF_TRANSACTION: { 98406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 98506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews wp<IBinder> weak; 98606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> strong; 98706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data2, reply2; 98806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IServiceManager> sm = defaultServiceManager(); 98906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server = sm->getService(binderLibTestServiceName); 99006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 99106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews weak = data.readWeakBinder(); 99206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (weak == NULL) { 99306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 99406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 99506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews strong = weak.promote(); 99606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 99706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data2, &reply2); 99806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret != NO_ERROR) 99906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews exit(EXIT_FAILURE); 100006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 100106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (strong == NULL) { 100206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->setError(1); 100306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 100406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 100506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 100606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_DELAYED_EXIT_TRANSACTION: 100706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews alarm(10); 100806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 100906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_EXIT_TRANSACTION: 101006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews while (wait(NULL) != -1 || errno != ECHILD) 101106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ; 101206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews exit(EXIT_SUCCESS); 101352be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien case BINDER_LIB_TEST_CREATE_BINDER_TRANSACTION: { 101452be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien bool strongRef = data.readBool(); 101552be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien sp<IBinder> binder = new BBinder(); 101652be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien if (strongRef) { 101752be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien reply->writeStrongBinder(binder); 101852be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien } else { 101952be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien reply->writeWeakBinder(binder); 102052be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien } 102152be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien return NO_ERROR; 102252be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien } 102306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews default: 102406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return UNKNOWN_TRANSACTION; 102506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 102606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 102706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 102806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t m_id; 102906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t m_nextServerId; 103006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_t m_serverWaitMutex; 103106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_t m_serverWaitCond; 103206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews bool m_serverStartRequested; 103306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> m_serverStarted; 103406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> m_strongRef; 103506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 103606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 103706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsint run_server(int index, int readypipefd) 103806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 103987c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien binderLibTestServiceName += String16(binderserversuffix); 104087c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien 104106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 104206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IServiceManager> sm = defaultServiceManager(); 104306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 104406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<BinderLibTestService> testService = new BinderLibTestService(index); 104506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (index == 0) { 104606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = sm->addService(binderLibTestServiceName, testService); 104706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else { 104806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server = sm->getService(binderLibTestServiceName); 104906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 105006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(index); 105106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(testService); 105206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 105306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = server->transact(BINDER_LIB_TEST_REGISTER_SERVER, data, &reply); 105406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 105506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 105606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews write(readypipefd, &ret, sizeof(ret)); 105706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews close(readypipefd); 105806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: ret %d\n", __func__, ret); 105906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret) 106006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return 1; 106106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: joinThreadPool\n", __func__); 106206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ProcessState::self()->startThreadPool(); 106306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews IPCThreadState::self()->joinThreadPool(); 106406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: joinThreadPool returned\n", __func__); 106506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return 1; /* joinThreadPool should not return */ 106606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 106706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 106806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsint main(int argc, char **argv) { 106906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 107006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 107187c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien if (argc == 4 && !strcmp(argv[1], "--servername")) { 107206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binderservername = argv[2]; 107306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else { 107406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binderservername = argv[0]; 107506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 107606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 107787c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien if (argc == 5 && !strcmp(argv[1], binderserverarg)) { 107887c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien binderserversuffix = argv[4]; 107906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return run_server(atoi(argv[2]), atoi(argv[3])); 108006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 108187c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien binderserversuffix = new char[16]; 108287c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien snprintf(binderserversuffix, 16, "%d", getpid()); 108387c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien binderLibTestServiceName += String16(binderserversuffix); 108406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 108506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ::testing::InitGoogleTest(&argc, argv); 108606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder_env = AddGlobalTestEnvironment(new BinderLibTestEnv()); 108706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ProcessState::self()->startThreadPool(); 108806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return RUN_ALL_TESTS(); 108906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 109006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 1091