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