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