binderLibTest.cpp revision 87c03cf9e26f066fe7ff0e6a54b88cae6f1f29fd
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, 4806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_GET_ID_TRANSACTION, 4906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_INDIRECT_TRANSACTION, 5006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_SET_ERROR_TRANSACTION, 5106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_GET_STATUS_TRANSACTION, 5206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION, 5306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_LINK_DEATH_TRANSACTION, 5406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_WRITE_FILE_TRANSACTION, 5506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_PROMOTE_WEAK_REF_TRANSACTION, 5606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_EXIT_TRANSACTION, 5706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_DELAYED_EXIT_TRANSACTION, 5806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_GET_PTR_SIZE_TRANSACTION, 5906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 6006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 6106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewspid_t start_server_process(int arg2) 6206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 6306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 6406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pid_t pid; 6506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t status; 6606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int pipefd[2]; 6706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews char stri[16]; 6806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews char strpipefd1[16]; 6906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews char *childargv[] = { 7006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binderservername, 7106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binderserverarg, 7206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews stri, 7306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews strpipefd1, 7487c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien binderserversuffix, 7506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews NULL 7606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 7706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 7806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = pipe(pipefd); 7906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret < 0) 8006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return ret; 8106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 8206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews snprintf(stri, sizeof(stri), "%d", arg2); 8306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews snprintf(strpipefd1, sizeof(strpipefd1), "%d", pipefd[1]); 8406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 8506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pid = fork(); 8606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (pid == -1) 8706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return pid; 8806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (pid == 0) { 8906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews close(pipefd[0]); 9006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews execv(binderservername, childargv); 9106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status = -errno; 9206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews write(pipefd[1], &status, sizeof(status)); 9306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews fprintf(stderr, "execv failed, %s\n", strerror(errno)); 9406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews _exit(EXIT_FAILURE); 9506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 9606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews close(pipefd[1]); 9706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = read(pipefd[0], &status, sizeof(status)); 9806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("pipe read returned %d, status %d\n", ret, status); 9906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews close(pipefd[0]); 10006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret == sizeof(status)) { 10106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = status; 10206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else { 10306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews kill(pid, SIGKILL); 10406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret >= 0) { 10506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = NO_INIT; 10606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 10706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 10806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret < 0) { 10906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews wait(NULL); 11006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return ret; 11106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 11206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return pid; 11306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 11406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 11506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTestEnv : public ::testing::Environment { 11606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 11706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestEnv() {} 11806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> getServer(void) { 11906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return m_server; 12006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 12106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 12206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 12306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual void SetUp() { 12406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverpid = start_server_process(0); 12506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("m_serverpid %d\n", m_serverpid); 12606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_GT(m_serverpid, 0); 12706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 12806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IServiceManager> sm = defaultServiceManager(); 12906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: pid %d, get service\n", __func__, m_pid); 13006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_server = sm->getService(binderLibTestServiceName); 13106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(m_server != NULL); 13206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: pid %d, get service done\n", __func__, m_pid); 13306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 13406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual void TearDown() { 13506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 13606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 13706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int exitStatus; 13806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pid_t pid; 13906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 14006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: pid %d\n", __func__, m_pid); 14106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_server != NULL) { 14206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_GET_STATUS_TRANSACTION, data, &reply); 14306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, ret); 14406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY); 14506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, ret); 14606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 14706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_serverpid > 0) { 14806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("wait for %d\n", m_pids[i]); 14906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pid = wait(&exitStatus); 15006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(m_serverpid, pid); 15106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(WIFEXITED(exitStatus)); 15206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, WEXITSTATUS(exitStatus)); 15306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 15406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 15506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 15606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pid_t m_serverpid; 15706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> m_server; 15806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 15906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 16006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTest : public ::testing::Test { 16106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 16206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual void SetUp() { 16306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_server = static_cast<BinderLibTestEnv *>(binder_env)->getServer(); 16406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 16506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual void TearDown() { 16606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 16706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews protected: 16806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> addServer(int32_t *idPtr = NULL) 16906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 17006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 17106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t id; 17206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 17306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder; 17406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 17506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_ADD_SERVER, data, &reply); 17606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 17706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 17806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_FALSE(binder != NULL); 17906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder = reply.readStrongBinder(); 18006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(binder != NULL); 18106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&id); 18206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 18306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (idPtr) 18406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews *idPtr = id; 18506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return binder; 18606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 18706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews void waitForReadData(int fd, int timeout_ms) { 18806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 18906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pollfd pfd = pollfd(); 19006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 19106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pfd.fd = fd; 19206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pfd.events = POLLIN; 19306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = poll(&pfd, 1, timeout_ms); 19406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(1, ret); 19506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 19606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 19706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> m_server; 19806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 19906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 20006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTestBundle : public Parcel 20106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 20206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 20306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle(void) {} 20406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle(const Parcel *source) : m_isValid(false) { 20506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t mark; 20606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t bundleLen; 20706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews size_t pos; 20806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 20906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (source->readInt32(&mark)) 21006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 21106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (mark != MARK_START) 21206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 21306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (source->readInt32(&bundleLen)) 21406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 21506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pos = source->dataPosition(); 21606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (Parcel::appendFrom(source, pos, bundleLen)) 21706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 21806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews source->setDataPosition(pos + bundleLen); 21906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (source->readInt32(&mark)) 22006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 22106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (mark != MARK_END) 22206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 22306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_isValid = true; 22406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews setDataPosition(0); 22506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 22606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews void appendTo(Parcel *dest) { 22706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews dest->writeInt32(MARK_START); 22806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews dest->writeInt32(dataSize()); 22906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews dest->appendFrom(this, 0, dataSize()); 23006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews dest->writeInt32(MARK_END); 23106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 23206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews bool isValid(void) { 23306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return m_isValid; 23406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 23506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 23606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews enum { 23706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews MARK_START = B_PACK_CHARS('B','T','B','S'), 23806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews MARK_END = B_PACK_CHARS('B','T','B','E'), 23906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 24006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews bool m_isValid; 24106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 24206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 24306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTestEvent 24406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 24506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 24606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestEvent(void) 24706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews : m_eventTriggered(false) 24806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 24906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_init(&m_waitMutex, NULL); 25006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_init(&m_waitCond, NULL); 25106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 25206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int waitEvent(int timeout_s) 25306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 25406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 25506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_lock(&m_waitMutex); 25606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (!m_eventTriggered) { 25706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews struct timespec ts; 25806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews clock_gettime(CLOCK_REALTIME, &ts); 25906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ts.tv_sec += timeout_s; 26006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_timedwait(&m_waitCond, &m_waitMutex, &ts); 26106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 26206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_eventTriggered ? NO_ERROR : TIMED_OUT; 26306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_unlock(&m_waitMutex); 26406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return ret; 26506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 26606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews protected: 26706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews void triggerEvent(void) { 26806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_lock(&m_waitMutex); 26906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_signal(&m_waitCond); 27006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_eventTriggered = true; 27106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_unlock(&m_waitMutex); 27206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 27306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 27406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_t m_waitMutex; 27506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_t m_waitCond; 27606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews bool m_eventTriggered; 27706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 27806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 27906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTestCallBack : public BBinder, public BinderLibTestEvent 28006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 28106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 28206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestCallBack() 28306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews : m_result(NOT_ENOUGH_DATA) 28406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 28506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 28606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t getResult(void) 28706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 28806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return m_result; 28906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 29006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 29106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 29206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual status_t onTransact(uint32_t code, 29306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews const Parcel& data, Parcel* reply, 29406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint32_t flags = 0) 29506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 29606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews (void)reply; 29706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews (void)flags; 29806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews switch(code) { 29906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_CALL_BACK: 30006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_result = data.readInt32(); 30106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews triggerEvent(); 30206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 30306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews default: 30406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return UNKNOWN_TRANSACTION; 30506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 30606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 30706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 30806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t m_result; 30906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 31006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 31106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass TestDeathRecipient : public IBinder::DeathRecipient, public BinderLibTestEvent 31206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 31306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 31406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual void binderDied(const wp<IBinder>& who) { 31506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews (void)who; 31606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews triggerEvent(); 31706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 31806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 31906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 32006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, NopTransaction) { 32106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 32206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 32306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply); 32406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 32506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 32606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 32706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, SetError) { 32806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t testValue[] = { 0, -123, 123 }; 32906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (size_t i = 0; i < ARRAY_SIZE(testValue); i++) { 33006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 33106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 33206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(testValue[i]); 33306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_SET_ERROR_TRANSACTION, data, &reply); 33406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(testValue[i], ret); 33506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 33606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 33706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 33806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, GetId) { 33906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 34006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t id; 34106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 34206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_GET_ID_TRANSACTION, data, &reply); 34306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 34406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&id); 34506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 34606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, id); 34706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 34806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 34906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, PtrSize) { 35006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 35106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t ptrsize; 35206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 35306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server = addServer(); 35406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(server != NULL); 35506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = server->transact(BINDER_LIB_TEST_GET_PTR_SIZE_TRANSACTION, data, &reply); 35606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 35706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&ptrsize); 35806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 35906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews RecordProperty("TestPtrSize", sizeof(void *)); 36006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews RecordProperty("ServerPtrSize", sizeof(void *)); 36106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 36206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 36306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, IndirectGetId2) 36406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 36506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 36606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t id; 36706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t count; 36806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 36906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t serverId[3]; 37006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 37106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(ARRAY_SIZE(serverId)); 37206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (size_t i = 0; i < ARRAY_SIZE(serverId); i++) { 37306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server; 37406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle datai; 37506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 37606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews server = addServer(&serverId[i]); 37706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(server != NULL); 37806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(server); 37906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(BINDER_LIB_TEST_GET_ID_TRANSACTION); 38006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai.appendTo(&data); 38106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 38206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 38306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_INDIRECT_TRANSACTION, data, &reply); 38406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 38506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 38606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&id); 38706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 38806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, id); 38906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 39006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&count); 39106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 39206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(ARRAY_SIZE(serverId), count); 39306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 39406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (size_t i = 0; i < (size_t)count; i++) { 39506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle replyi(&reply); 39606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(replyi.isValid()); 39706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = replyi.readInt32(&id); 39806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 39906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(serverId[i], id); 40006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(replyi.dataSize(), replyi.dataPosition()); 40106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 40206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 40306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(reply.dataSize(), reply.dataPosition()); 40406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 40506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 40606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, IndirectGetId3) 40706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 40806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 40906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t id; 41006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t count; 41106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 41206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t serverId[3]; 41306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 41406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(ARRAY_SIZE(serverId)); 41506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (size_t i = 0; i < ARRAY_SIZE(serverId); i++) { 41606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server; 41706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle datai; 41806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle datai2; 41906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 42006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews server = addServer(&serverId[i]); 42106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(server != NULL); 42206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(server); 42306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(BINDER_LIB_TEST_INDIRECT_TRANSACTION); 42406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 42506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai.writeInt32(1); 42606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai.writeStrongBinder(m_server); 42706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai.writeInt32(BINDER_LIB_TEST_GET_ID_TRANSACTION); 42806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai2.appendTo(&datai); 42906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 43006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai.appendTo(&data); 43106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 43206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 43306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_INDIRECT_TRANSACTION, data, &reply); 43406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 43506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 43606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&id); 43706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 43806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, id); 43906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 44006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&count); 44106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 44206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(ARRAY_SIZE(serverId), count); 44306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 44406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (size_t i = 0; i < (size_t)count; i++) { 44506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t counti; 44606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 44706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle replyi(&reply); 44806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(replyi.isValid()); 44906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = replyi.readInt32(&id); 45006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 45106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(serverId[i], id); 45206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 45306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = replyi.readInt32(&counti); 45406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 45506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(1, counti); 45606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 45706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle replyi2(&replyi); 45806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(replyi2.isValid()); 45906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = replyi2.readInt32(&id); 46006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 46106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, id); 46206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(replyi2.dataSize(), replyi2.dataPosition()); 46306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 46406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(replyi.dataSize(), replyi.dataPosition()); 46506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 46606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 46706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(reply.dataSize(), reply.dataPosition()); 46806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 46906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 47006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, CallBack) 47106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 47206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 47306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 47406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<BinderLibTestCallBack> callBack = new BinderLibTestCallBack(); 47506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(callBack); 47606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_NOP_CALL_BACK, data, &reply, TF_ONE_WAY); 47706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 47806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = callBack->waitEvent(5); 47906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 48006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = callBack->getResult(); 48106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 48206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 48306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 48406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, AddServer) 48506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 48606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server = addServer(); 48706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(server != NULL); 48806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 48906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 49006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, DeathNotificationNoRefs) 49106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 49206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 49306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 49406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient(); 49506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 49606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 49706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder = addServer(); 49806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(binder != NULL); 49906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = binder->linkToDeath(testDeathRecipient); 50006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 50106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 50206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews IPCThreadState::self()->flushCommands(); 50306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = testDeathRecipient->waitEvent(5); 50406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 50506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#if 0 /* Is there an unlink api that does not require a strong reference? */ 50606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = binder->unlinkToDeath(testDeathRecipient); 50706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 50806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#endif 50906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 51006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 51106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, DeathNotificationWeakRef) 51206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 51306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 51406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews wp<IBinder> wbinder; 51506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 51606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient(); 51706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 51806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 51906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder = addServer(); 52006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(binder != NULL); 52106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = binder->linkToDeath(testDeathRecipient); 52206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 52306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews wbinder = binder; 52406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 52506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews IPCThreadState::self()->flushCommands(); 52606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = testDeathRecipient->waitEvent(5); 52706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 52806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#if 0 /* Is there an unlink api that does not require a strong reference? */ 52906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = binder->unlinkToDeath(testDeathRecipient); 53006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 53106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#endif 53206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 53306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 53406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, DeathNotificationStrongRef) 53506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 53606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 53706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> sbinder; 53806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 53906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient(); 54006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 54106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 54206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder = addServer(); 54306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(binder != NULL); 54406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = binder->linkToDeath(testDeathRecipient); 54506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 54606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sbinder = binder; 54706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 54806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 54906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 55006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = sbinder->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY); 55106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, ret); 55206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 55306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews IPCThreadState::self()->flushCommands(); 55406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = testDeathRecipient->waitEvent(5); 55506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 55606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = sbinder->unlinkToDeath(testDeathRecipient); 55706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(DEAD_OBJECT, ret); 55806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 55906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 56006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, DeathNotificationMultiple) 56106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 56206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 56306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews const int clientcount = 2; 56406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> target; 56506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> linkedclient[clientcount]; 56606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<BinderLibTestCallBack> callBack[clientcount]; 56706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> passiveclient[clientcount]; 56806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 56906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews target = addServer(); 57006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(target != NULL); 57106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (int i = 0; i < clientcount; i++) { 57206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 57306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 57406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 57506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews linkedclient[i] = addServer(); 57606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(linkedclient[i] != NULL); 57706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews callBack[i] = new BinderLibTestCallBack(); 57806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(target); 57906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(callBack[i]); 58006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = linkedclient[i]->transact(BINDER_LIB_TEST_LINK_DEATH_TRANSACTION, data, &reply, TF_ONE_WAY); 58106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 58206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 58306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 58406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 58506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 58606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews passiveclient[i] = addServer(); 58706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(passiveclient[i] != NULL); 58806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(target); 58906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = passiveclient[i]->transact(BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION, data, &reply, TF_ONE_WAY); 59006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 59106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 59206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 59306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 59406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 59506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = target->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY); 59606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, ret); 59706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 59806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 59906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (int i = 0; i < clientcount; i++) { 60006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = callBack[i]->waitEvent(5); 60106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 60206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = callBack[i]->getResult(); 60306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 60406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 60506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 60606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 60706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, PassFile) { 60806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 60906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int pipefd[2]; 61006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint8_t buf[1] = { 0 }; 61106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint8_t write_value = 123; 61206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 61306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = pipe2(pipefd, O_NONBLOCK); 61406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(0, ret); 61506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 61606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 61706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 61806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint8_t writebuf[1] = { write_value }; 61906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 62006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = data.writeFileDescriptor(pipefd[1], true); 62106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 62206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 62306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = data.writeInt32(sizeof(writebuf)); 62406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 62506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 62606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = data.write(writebuf, sizeof(writebuf)); 62706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 62806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 62906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_WRITE_FILE_TRANSACTION, data, &reply); 63006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 63106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 63206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 63306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = read(pipefd[0], buf, sizeof(buf)); 63406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(sizeof(buf), ret); 63506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(write_value, buf[0]); 63606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 63706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews waitForReadData(pipefd[0], 5000); /* wait for other proccess to close pipe */ 63806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 63906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = read(pipefd[0], buf, sizeof(buf)); 64006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, ret); 64106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 64206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews close(pipefd[0]); 64306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 64406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 64506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, PromoteLocal) { 64606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> strong = new BBinder(); 64706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews wp<IBinder> weak = strong; 64806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> strong_from_weak = weak.promote(); 64906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(strong != NULL); 65006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(strong, strong_from_weak); 65106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews strong = NULL; 65206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews strong_from_weak = NULL; 65306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews strong_from_weak = weak.promote(); 65406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(strong_from_weak == NULL); 65506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 65606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 65706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, PromoteRemote) { 65806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 65906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 66006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> strong = new BBinder(); 66106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server = addServer(); 66206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 66306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(server != NULL); 66406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(strong != NULL); 66506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 66606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = data.writeWeakBinder(strong); 66706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 66806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 66906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = server->transact(BINDER_LIB_TEST_PROMOTE_WEAK_REF_TRANSACTION, data, &reply); 67006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_GE(ret, 0); 67106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 67206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 67306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTestService : public BBinder 67406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 67506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 67606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestService(int32_t id) 67706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews : m_id(id) 67806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews , m_nextServerId(id + 1) 67906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews , m_serverStartRequested(false) 68006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 68106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_init(&m_serverWaitMutex, NULL); 68206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_init(&m_serverWaitCond, NULL); 68306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 68406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ~BinderLibTestService() 68506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 68606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews exit(EXIT_SUCCESS); 68706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 68806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual status_t onTransact(uint32_t code, 68906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews const Parcel& data, Parcel* reply, 69006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint32_t flags = 0) { 69106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: code %d\n", __func__, code); 69206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews (void)flags; 69306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 69406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (getuid() != (uid_t)IPCThreadState::self()->getCallingUid()) { 69506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return PERMISSION_DENIED; 69606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 69706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews switch (code) { 69806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_REGISTER_SERVER: { 69906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t id; 70006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder; 70106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews id = data.readInt32(); 70206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder = data.readStrongBinder(); 70306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (binder == NULL) { 70406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 70506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 70606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 70706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_id != 0) 70806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return INVALID_OPERATION; 70906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 71006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_lock(&m_serverWaitMutex); 71106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_serverStartRequested) { 71206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStartRequested = false; 71306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStarted = binder; 71406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_signal(&m_serverWaitCond); 71506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 71606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_unlock(&m_serverWaitMutex); 71706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 71806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 71906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_ADD_SERVER: { 72006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 72106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint8_t buf[1] = { 0 }; 72206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int serverid; 72306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 72406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_id != 0) { 72506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return INVALID_OPERATION; 72606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 72706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_lock(&m_serverWaitMutex); 72806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_serverStartRequested) { 72906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = -EBUSY; 73006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else { 73106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews serverid = m_nextServerId++; 73206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStartRequested = true; 73306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 73406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_unlock(&m_serverWaitMutex); 73506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = start_server_process(serverid); 73606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_lock(&m_serverWaitMutex); 73706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 73806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret > 0) { 73906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_serverStartRequested) { 74006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews struct timespec ts; 74106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews clock_gettime(CLOCK_REALTIME, &ts); 74206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ts.tv_sec += 5; 74306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = pthread_cond_timedwait(&m_serverWaitCond, &m_serverWaitMutex, &ts); 74406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 74506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_serverStartRequested) { 74606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStartRequested = false; 74706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = -ETIMEDOUT; 74806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else { 74906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeStrongBinder(m_serverStarted); 75006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeInt32(serverid); 75106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStarted = NULL; 75206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = NO_ERROR; 75306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 75406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else if (ret >= 0) { 75506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStartRequested = false; 75606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = UNKNOWN_ERROR; 75706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 75806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_unlock(&m_serverWaitMutex); 75906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return ret; 76006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 76106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_NOP_TRANSACTION: 76206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 76306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_NOP_CALL_BACK: { 76406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data2, reply2; 76506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder; 76606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder = data.readStrongBinder(); 76706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (binder == NULL) { 76806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 76906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 77006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply2.writeInt32(NO_ERROR); 77106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder->transact(BINDER_LIB_TEST_CALL_BACK, data2, &reply2); 77206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 77306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 77406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_GET_ID_TRANSACTION: 77506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeInt32(m_id); 77606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 77706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_INDIRECT_TRANSACTION: { 77806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t count; 77906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint32_t indirect_code; 78006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder; 78106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 78206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews count = data.readInt32(); 78306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeInt32(m_id); 78406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeInt32(count); 78506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (int i = 0; i < count; i++) { 78606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder = data.readStrongBinder(); 78706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (binder == NULL) { 78806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 78906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 79006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews indirect_code = data.readInt32(); 79106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle data2(&data); 79206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (!data2.isValid()) { 79306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 79406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 79506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle reply2; 79606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder->transact(indirect_code, data2, &reply2); 79706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply2.appendTo(reply); 79806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 79906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 80006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 80106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_SET_ERROR_TRANSACTION: 80206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->setError(data.readInt32()); 80306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 80406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_GET_PTR_SIZE_TRANSACTION: 80506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeInt32(sizeof(void *)); 80606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 80706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_GET_STATUS_TRANSACTION: 80806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 80906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION: 81006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_strongRef = data.readStrongBinder(); 81106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 81206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_LINK_DEATH_TRANSACTION: { 81306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 81406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data2, reply2; 81506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient(); 81606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> target; 81706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> callback; 81806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 81906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews target = data.readStrongBinder(); 82006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (target == NULL) { 82106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 82206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 82306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews callback = data.readStrongBinder(); 82406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (callback == NULL) { 82506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 82606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 82706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = target->linkToDeath(testDeathRecipient); 82806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret == NO_ERROR) 82906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = testDeathRecipient->waitEvent(5); 83006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data2.writeInt32(ret); 83106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews callback->transact(BINDER_LIB_TEST_CALL_BACK, data2, &reply2); 83206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 83306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 83406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_WRITE_FILE_TRANSACTION: { 83506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 83606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t size; 83706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews const void *buf; 83806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int fd; 83906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 84006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews fd = data.readFileDescriptor(); 84106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (fd < 0) { 84206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 84306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 84406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = data.readInt32(&size); 84506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret != NO_ERROR) { 84606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return ret; 84706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 84806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews buf = data.readInplace(size); 84906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (buf == NULL) { 85006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 85106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 85206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = write(fd, buf, size); 85306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret != size) 85406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return UNKNOWN_ERROR; 85506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 85606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 85706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_PROMOTE_WEAK_REF_TRANSACTION: { 85806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 85906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews wp<IBinder> weak; 86006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> strong; 86106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data2, reply2; 86206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IServiceManager> sm = defaultServiceManager(); 86306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server = sm->getService(binderLibTestServiceName); 86406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 86506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews weak = data.readWeakBinder(); 86606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (weak == NULL) { 86706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 86806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 86906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews strong = weak.promote(); 87006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 87106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data2, &reply2); 87206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret != NO_ERROR) 87306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews exit(EXIT_FAILURE); 87406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 87506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (strong == NULL) { 87606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->setError(1); 87706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 87806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 87906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 88006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_DELAYED_EXIT_TRANSACTION: 88106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews alarm(10); 88206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 88306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_EXIT_TRANSACTION: 88406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews while (wait(NULL) != -1 || errno != ECHILD) 88506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ; 88606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews exit(EXIT_SUCCESS); 88706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews default: 88806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return UNKNOWN_TRANSACTION; 88906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 89006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 89106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 89206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t m_id; 89306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t m_nextServerId; 89406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_t m_serverWaitMutex; 89506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_t m_serverWaitCond; 89606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews bool m_serverStartRequested; 89706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> m_serverStarted; 89806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> m_strongRef; 89906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 90006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 90106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsint run_server(int index, int readypipefd) 90206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 90387c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien binderLibTestServiceName += String16(binderserversuffix); 90487c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien 90506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 90606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IServiceManager> sm = defaultServiceManager(); 90706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 90806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<BinderLibTestService> testService = new BinderLibTestService(index); 90906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (index == 0) { 91006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = sm->addService(binderLibTestServiceName, testService); 91106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else { 91206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server = sm->getService(binderLibTestServiceName); 91306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 91406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(index); 91506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(testService); 91606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 91706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = server->transact(BINDER_LIB_TEST_REGISTER_SERVER, data, &reply); 91806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 91906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 92006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews write(readypipefd, &ret, sizeof(ret)); 92106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews close(readypipefd); 92206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: ret %d\n", __func__, ret); 92306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret) 92406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return 1; 92506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: joinThreadPool\n", __func__); 92606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ProcessState::self()->startThreadPool(); 92706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews IPCThreadState::self()->joinThreadPool(); 92806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: joinThreadPool returned\n", __func__); 92906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return 1; /* joinThreadPool should not return */ 93006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 93106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 93206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsint main(int argc, char **argv) { 93306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 93406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 93587c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien if (argc == 4 && !strcmp(argv[1], "--servername")) { 93606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binderservername = argv[2]; 93706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else { 93806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binderservername = argv[0]; 93906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 94006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 94187c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien if (argc == 5 && !strcmp(argv[1], binderserverarg)) { 94287c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien binderserversuffix = argv[4]; 94306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return run_server(atoi(argv[2]), atoi(argv[3])); 94406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 94587c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien binderserversuffix = new char[16]; 94687c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien snprintf(binderserversuffix, 16, "%d", getpid()); 94787c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien binderLibTestServiceName += String16(binderserversuffix); 94806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 94906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ::testing::InitGoogleTest(&argc, argv); 95006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder_env = AddGlobalTestEnvironment(new BinderLibTestEnv()); 95106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ProcessState::self()->startThreadPool(); 95206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return RUN_ALL_TESTS(); 95306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 95406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 955