binderLibTest.cpp revision ad6503cf91e1ef0e3c1595e143ab9e11f0da5530
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 35336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yangstatic ::testing::AssertionResult IsPageAligned(void *buf) { 36336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang if (((unsigned long)buf & ((unsigned long)PAGE_SIZE - 1)) == 0) 37336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang return ::testing::AssertionSuccess(); 38336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang else 39336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang return ::testing::AssertionFailure() << buf << " is not page aligned"; 40336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang} 41336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang 4206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsstatic testing::Environment* binder_env; 4306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsstatic char *binderservername; 4487c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brienstatic char *binderserversuffix; 4506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsstatic char binderserverarg[] = "--binderserver"; 4606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 4706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsstatic String16 binderLibTestServiceName = String16("test.binderLib"); 4806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 4906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsenum BinderLibTestTranscationCode { 5006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_NOP_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION, 5106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_REGISTER_SERVER, 5206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_ADD_SERVER, 5306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_CALL_BACK, 54336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang BINDER_LIB_TEST_CALL_BACK_VERIFY_BUF, 5506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_NOP_CALL_BACK, 567060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg BINDER_LIB_TEST_GET_SELF_TRANSACTION, 5706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_GET_ID_TRANSACTION, 5806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_INDIRECT_TRANSACTION, 5906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_SET_ERROR_TRANSACTION, 6006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_GET_STATUS_TRANSACTION, 6106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION, 6206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_LINK_DEATH_TRANSACTION, 6306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_WRITE_FILE_TRANSACTION, 6406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_PROMOTE_WEAK_REF_TRANSACTION, 6506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_EXIT_TRANSACTION, 6606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_DELAYED_EXIT_TRANSACTION, 6706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BINDER_LIB_TEST_GET_PTR_SIZE_TRANSACTION, 6852be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien BINDER_LIB_TEST_CREATE_BINDER_TRANSACTION, 6906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 7006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 7106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewspid_t start_server_process(int arg2) 7206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 7306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 7406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pid_t pid; 7506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t status; 7606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int pipefd[2]; 7706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews char stri[16]; 7806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews char strpipefd1[16]; 7906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews char *childargv[] = { 8006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binderservername, 8106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binderserverarg, 8206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews stri, 8306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews strpipefd1, 8487c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien binderserversuffix, 8506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews NULL 8606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 8706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 8806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = pipe(pipefd); 8906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret < 0) 9006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return ret; 9106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 9206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews snprintf(stri, sizeof(stri), "%d", arg2); 9306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews snprintf(strpipefd1, sizeof(strpipefd1), "%d", pipefd[1]); 9406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 9506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pid = fork(); 9606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (pid == -1) 9706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return pid; 9806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (pid == 0) { 9906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews close(pipefd[0]); 10006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews execv(binderservername, childargv); 10106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status = -errno; 10206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews write(pipefd[1], &status, sizeof(status)); 10306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews fprintf(stderr, "execv failed, %s\n", strerror(errno)); 10406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews _exit(EXIT_FAILURE); 10506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 10606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews close(pipefd[1]); 10706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = read(pipefd[0], &status, sizeof(status)); 10806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("pipe read returned %d, status %d\n", ret, status); 10906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews close(pipefd[0]); 11006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret == sizeof(status)) { 11106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = status; 11206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else { 11306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews kill(pid, SIGKILL); 11406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret >= 0) { 11506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = NO_INIT; 11606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 11706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 11806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret < 0) { 11906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews wait(NULL); 12006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return ret; 12106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 12206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return pid; 12306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 12406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 12506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTestEnv : public ::testing::Environment { 12606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 12706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestEnv() {} 12806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> getServer(void) { 12906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return m_server; 13006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 13106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 13206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 13306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual void SetUp() { 13406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverpid = start_server_process(0); 13506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("m_serverpid %d\n", m_serverpid); 13606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_GT(m_serverpid, 0); 13706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 13806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IServiceManager> sm = defaultServiceManager(); 13906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: pid %d, get service\n", __func__, m_pid); 14006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_server = sm->getService(binderLibTestServiceName); 14106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(m_server != NULL); 14206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: pid %d, get service done\n", __func__, m_pid); 14306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 14406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual void TearDown() { 14506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 14606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 14706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int exitStatus; 14806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pid_t pid; 14906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 15006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: pid %d\n", __func__, m_pid); 15106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_server != NULL) { 15206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_GET_STATUS_TRANSACTION, data, &reply); 15306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, ret); 15406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY); 15506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, ret); 15606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 15706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_serverpid > 0) { 15806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("wait for %d\n", m_pids[i]); 15906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pid = wait(&exitStatus); 16006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(m_serverpid, pid); 16106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(WIFEXITED(exitStatus)); 16206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, WEXITSTATUS(exitStatus)); 16306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 16406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 16506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 16606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pid_t m_serverpid; 16706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> m_server; 16806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 16906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 17006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTest : public ::testing::Test { 17106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 17206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual void SetUp() { 17306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_server = static_cast<BinderLibTestEnv *>(binder_env)->getServer(); 17406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 17506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual void TearDown() { 17606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 17706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews protected: 17806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> addServer(int32_t *idPtr = NULL) 17906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 18006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 18106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t id; 18206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 18306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder; 18406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 18506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_ADD_SERVER, data, &reply); 18606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 18706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 18806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_FALSE(binder != NULL); 18906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder = reply.readStrongBinder(); 19006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(binder != NULL); 19106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&id); 19206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 19306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (idPtr) 19406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews *idPtr = id; 19506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return binder; 19606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 19706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews void waitForReadData(int fd, int timeout_ms) { 19806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 19906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pollfd pfd = pollfd(); 20006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 20106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pfd.fd = fd; 20206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pfd.events = POLLIN; 20306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = poll(&pfd, 1, timeout_ms); 20406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(1, ret); 20506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 20606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 20706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> m_server; 20806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 20906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 21006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTestBundle : public Parcel 21106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 21206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 21306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle(void) {} 21406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle(const Parcel *source) : m_isValid(false) { 21506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t mark; 21606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t bundleLen; 21706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews size_t pos; 21806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 21906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (source->readInt32(&mark)) 22006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 22106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (mark != MARK_START) 22206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 22306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (source->readInt32(&bundleLen)) 22406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 22506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pos = source->dataPosition(); 22606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (Parcel::appendFrom(source, pos, bundleLen)) 22706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 22806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews source->setDataPosition(pos + bundleLen); 22906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (source->readInt32(&mark)) 23006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 23106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (mark != MARK_END) 23206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return; 23306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_isValid = true; 23406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews setDataPosition(0); 23506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 23606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews void appendTo(Parcel *dest) { 23706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews dest->writeInt32(MARK_START); 23806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews dest->writeInt32(dataSize()); 23906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews dest->appendFrom(this, 0, dataSize()); 24006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews dest->writeInt32(MARK_END); 24106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 24206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews bool isValid(void) { 24306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return m_isValid; 24406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 24506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 24606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews enum { 24706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews MARK_START = B_PACK_CHARS('B','T','B','S'), 24806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews MARK_END = B_PACK_CHARS('B','T','B','E'), 24906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 25006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews bool m_isValid; 25106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 25206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 25306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTestEvent 25406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 25506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 25606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestEvent(void) 25706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews : m_eventTriggered(false) 25806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 25906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_init(&m_waitMutex, NULL); 26006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_init(&m_waitCond, NULL); 26106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 26206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int waitEvent(int timeout_s) 26306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 26406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 26506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_lock(&m_waitMutex); 26606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (!m_eventTriggered) { 26706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews struct timespec ts; 26806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews clock_gettime(CLOCK_REALTIME, &ts); 26906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ts.tv_sec += timeout_s; 27006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_timedwait(&m_waitCond, &m_waitMutex, &ts); 27106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 27206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_eventTriggered ? NO_ERROR : TIMED_OUT; 27306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_unlock(&m_waitMutex); 27406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return ret; 27506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 276f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen pthread_t getTriggeringThread() 277f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen { 278f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen return m_triggeringThread; 279f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen } 28006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews protected: 28106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews void triggerEvent(void) { 28206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_lock(&m_waitMutex); 28306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_signal(&m_waitCond); 28406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_eventTriggered = true; 285f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen m_triggeringThread = pthread_self(); 28606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_unlock(&m_waitMutex); 28706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 28806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 28906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_t m_waitMutex; 29006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_t m_waitCond; 29106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews bool m_eventTriggered; 292f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen pthread_t m_triggeringThread; 29306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 29406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 29506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTestCallBack : public BBinder, public BinderLibTestEvent 29606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 29706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 29806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestCallBack() 29906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews : m_result(NOT_ENOUGH_DATA) 300336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang , m_prev_end(NULL) 30106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 30206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 30306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t getResult(void) 30406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 30506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return m_result; 30606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 30706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 30806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 30906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual status_t onTransact(uint32_t code, 31006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews const Parcel& data, Parcel* reply, 31106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint32_t flags = 0) 31206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 31306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews (void)reply; 31406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews (void)flags; 31506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews switch(code) { 31606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_CALL_BACK: 31706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_result = data.readInt32(); 31806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews triggerEvent(); 31906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 320336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang case BINDER_LIB_TEST_CALL_BACK_VERIFY_BUF: { 321336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang sp<IBinder> server; 322336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang int ret; 323336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang const uint8_t *buf = data.data(); 324336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang size_t size = data.dataSize(); 325336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang if (m_prev_end) { 326336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang /* 64-bit kernel needs at most 8 bytes to align buffer end */ 327336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang EXPECT_LE((size_t)(buf - m_prev_end), (size_t)8); 328336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang } else { 329336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang EXPECT_TRUE(IsPageAligned((void *)buf)); 330336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang } 331336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang 332336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang m_prev_end = buf + size + data.objectsCount() * sizeof(binder_size_t); 333336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang 334336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang if (size > 0) { 335336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang server = static_cast<BinderLibTestEnv *>(binder_env)->getServer(); 336336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang ret = server->transact(BINDER_LIB_TEST_INDIRECT_TRANSACTION, 337336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang data, reply); 338336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang EXPECT_EQ(NO_ERROR, ret); 339336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang } 340336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang return NO_ERROR; 341336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang } 34206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews default: 34306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return UNKNOWN_TRANSACTION; 34406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 34506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 34606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 34706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t m_result; 348336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang const uint8_t *m_prev_end; 34906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 35006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 35106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass TestDeathRecipient : public IBinder::DeathRecipient, public BinderLibTestEvent 35206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 35306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 35406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual void binderDied(const wp<IBinder>& who) { 35506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews (void)who; 35606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews triggerEvent(); 35706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 35806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 35906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 36006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, NopTransaction) { 36106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 36206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 36306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply); 36406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 36506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 36606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 36706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, SetError) { 36806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t testValue[] = { 0, -123, 123 }; 36906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (size_t i = 0; i < ARRAY_SIZE(testValue); i++) { 37006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 37106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 37206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(testValue[i]); 37306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_SET_ERROR_TRANSACTION, data, &reply); 37406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(testValue[i], ret); 37506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 37606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 37706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 37806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, GetId) { 37906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 38006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t id; 38106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 38206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_GET_ID_TRANSACTION, data, &reply); 38306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 38406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&id); 38506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 38606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, id); 38706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 38806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 38906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, PtrSize) { 39006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 39106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t ptrsize; 39206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 39306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server = addServer(); 39406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(server != NULL); 39506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = server->transact(BINDER_LIB_TEST_GET_PTR_SIZE_TRANSACTION, data, &reply); 39606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 39706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&ptrsize); 39806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 39906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews RecordProperty("TestPtrSize", sizeof(void *)); 40006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews RecordProperty("ServerPtrSize", sizeof(void *)); 40106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 40206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 40306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, IndirectGetId2) 40406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 40506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 40606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t id; 40706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t count; 40806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 40906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t serverId[3]; 41006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 41106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(ARRAY_SIZE(serverId)); 41206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (size_t i = 0; i < ARRAY_SIZE(serverId); i++) { 41306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server; 41406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle datai; 41506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 41606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews server = addServer(&serverId[i]); 41706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(server != NULL); 41806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(server); 41906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(BINDER_LIB_TEST_GET_ID_TRANSACTION); 42006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai.appendTo(&data); 42106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 42206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 42306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_INDIRECT_TRANSACTION, data, &reply); 42406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 42506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 42606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&id); 42706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 42806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, id); 42906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 43006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&count); 43106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 4326d5fa9459f3b084ab802f32bb8a490ac0f25f2a4Arve Hjønnevåg EXPECT_EQ(ARRAY_SIZE(serverId), (size_t)count); 43306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 43406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (size_t i = 0; i < (size_t)count; i++) { 43506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle replyi(&reply); 43606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(replyi.isValid()); 43706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = replyi.readInt32(&id); 43806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 43906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(serverId[i], id); 44006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(replyi.dataSize(), replyi.dataPosition()); 44106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 44206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 44306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(reply.dataSize(), reply.dataPosition()); 44406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 44506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 44606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, IndirectGetId3) 44706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 44806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 44906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t id; 45006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t count; 45106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 45206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t serverId[3]; 45306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 45406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(ARRAY_SIZE(serverId)); 45506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (size_t i = 0; i < ARRAY_SIZE(serverId); i++) { 45606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server; 45706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle datai; 45806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle datai2; 45906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 46006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews server = addServer(&serverId[i]); 46106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(server != NULL); 46206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(server); 46306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(BINDER_LIB_TEST_INDIRECT_TRANSACTION); 46406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 46506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai.writeInt32(1); 46606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai.writeStrongBinder(m_server); 46706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai.writeInt32(BINDER_LIB_TEST_GET_ID_TRANSACTION); 46806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai2.appendTo(&datai); 46906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 47006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews datai.appendTo(&data); 47106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 47206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 47306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_INDIRECT_TRANSACTION, data, &reply); 47406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 47506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 47606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&id); 47706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 47806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, id); 47906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 48006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = reply.readInt32(&count); 48106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 4826d5fa9459f3b084ab802f32bb8a490ac0f25f2a4Arve Hjønnevåg EXPECT_EQ(ARRAY_SIZE(serverId), (size_t)count); 48306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 48406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (size_t i = 0; i < (size_t)count; i++) { 48506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t counti; 48606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 48706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle replyi(&reply); 48806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(replyi.isValid()); 48906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = replyi.readInt32(&id); 49006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 49106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(serverId[i], id); 49206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 49306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = replyi.readInt32(&counti); 49406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(NO_ERROR, ret); 49506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(1, counti); 49606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 49706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle replyi2(&replyi); 49806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(replyi2.isValid()); 49906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = replyi2.readInt32(&id); 50006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 50106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, id); 50206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(replyi2.dataSize(), replyi2.dataPosition()); 50306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 50406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(replyi.dataSize(), replyi.dataPosition()); 50506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 50606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 50706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(reply.dataSize(), reply.dataPosition()); 50806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 50906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 51006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, CallBack) 51106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 51206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 51306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 51406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<BinderLibTestCallBack> callBack = new BinderLibTestCallBack(); 51506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(callBack); 51606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_NOP_CALL_BACK, data, &reply, TF_ONE_WAY); 51706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 51806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = callBack->waitEvent(5); 51906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 52006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = callBack->getResult(); 52106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 52206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 52306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 52406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, AddServer) 52506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 52606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server = addServer(); 52706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(server != NULL); 52806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 52906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 53006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, DeathNotificationNoRefs) 53106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 53206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 53306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 53406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient(); 53506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 53606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 53706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder = addServer(); 53806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(binder != NULL); 53906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = binder->linkToDeath(testDeathRecipient); 54006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 54106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 54206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews IPCThreadState::self()->flushCommands(); 54306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = testDeathRecipient->waitEvent(5); 54406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 54506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#if 0 /* Is there an unlink api that does not require a strong reference? */ 54606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = binder->unlinkToDeath(testDeathRecipient); 54706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 54806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#endif 54906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 55006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 55106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, DeathNotificationWeakRef) 55206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 55306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 55406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews wp<IBinder> wbinder; 55506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 55606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient(); 55706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 55806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 55906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder = addServer(); 56006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(binder != NULL); 56106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = binder->linkToDeath(testDeathRecipient); 56206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 56306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews wbinder = binder; 56406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 56506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews IPCThreadState::self()->flushCommands(); 56606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = testDeathRecipient->waitEvent(5); 56706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 56806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#if 0 /* Is there an unlink api that does not require a strong reference? */ 56906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = binder->unlinkToDeath(testDeathRecipient); 57006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 57106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews#endif 57206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 57306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 57406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, DeathNotificationStrongRef) 57506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 57606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 57706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> sbinder; 57806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 57906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient(); 58006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 58106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 58206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder = addServer(); 58306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(binder != NULL); 58406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = binder->linkToDeath(testDeathRecipient); 58506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 58606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sbinder = binder; 58706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 58806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 58906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 59006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = sbinder->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY); 59106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, ret); 59206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 59306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews IPCThreadState::self()->flushCommands(); 59406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = testDeathRecipient->waitEvent(5); 59506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 59606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = sbinder->unlinkToDeath(testDeathRecipient); 59706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(DEAD_OBJECT, ret); 59806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 59906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 60006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, DeathNotificationMultiple) 60106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 60206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 60306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews const int clientcount = 2; 60406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> target; 60506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> linkedclient[clientcount]; 60606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<BinderLibTestCallBack> callBack[clientcount]; 60706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> passiveclient[clientcount]; 60806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 60906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews target = addServer(); 61006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(target != NULL); 61106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (int i = 0; i < clientcount; i++) { 61206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 61306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 61406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 61506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews linkedclient[i] = addServer(); 61606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(linkedclient[i] != NULL); 61706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews callBack[i] = new BinderLibTestCallBack(); 61806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(target); 61906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(callBack[i]); 62006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = linkedclient[i]->transact(BINDER_LIB_TEST_LINK_DEATH_TRANSACTION, data, &reply, TF_ONE_WAY); 62106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 62206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 62306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 62406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 62506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 62606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews passiveclient[i] = addServer(); 62706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(passiveclient[i] != NULL); 62806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(target); 62906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = passiveclient[i]->transact(BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION, data, &reply, TF_ONE_WAY); 63006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 63106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 63206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 63306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 63406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 63506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = target->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY); 63606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, ret); 63706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 63806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 63906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (int i = 0; i < clientcount; i++) { 64006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = callBack[i]->waitEvent(5); 64106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 64206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = callBack[i]->getResult(); 64306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 64406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 64506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 64606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 647f7100e492ff6301dc5f0250e90715e646c96774eMartijn CoenenTEST_F(BinderLibTest, DeathNotificationThread) 648f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen{ 649f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen status_t ret; 650f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen sp<BinderLibTestCallBack> callback; 651f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen sp<IBinder> target = addServer(); 652f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen ASSERT_TRUE(target != NULL); 653f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen sp<IBinder> client = addServer(); 654f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen ASSERT_TRUE(client != NULL); 655f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen 656f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient(); 657f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen 658f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen ret = target->linkToDeath(testDeathRecipient); 659f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen EXPECT_EQ(NO_ERROR, ret); 660f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen 661f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen { 662f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen Parcel data, reply; 663f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen ret = target->transact(BINDER_LIB_TEST_EXIT_TRANSACTION, data, &reply, TF_ONE_WAY); 664f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen EXPECT_EQ(0, ret); 665f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen } 666f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen 667f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen /* Make sure it's dead */ 668f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen testDeathRecipient->waitEvent(5); 669f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen 670f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen /* Now, pass the ref to another process and ask that process to 671f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * call linkToDeath() on it, and wait for a response. This tests 672f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * two things: 673f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * 1) You still get death notifications when calling linkToDeath() 674f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * on a ref that is already dead when it was passed to you. 675f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * 2) That death notifications are not directly pushed to the thread 676f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * registering them, but to the threadpool (proc workqueue) instead. 677f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * 678f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * 2) is tested because the thread handling BINDER_LIB_TEST_DEATH_TRANSACTION 679f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * is blocked on a condition variable waiting for the death notification to be 680f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * called; therefore, that thread is not available for handling proc work. 681f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * So, if the death notification was pushed to the thread workqueue, the callback 682f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * would never be called, and the test would timeout and fail. 683f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * 684f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * Note that we can't do this part of the test from this thread itself, because 685f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * the binder driver would only push death notifications to the thread if 686f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * it is a looper thread, which this thread is not. 687f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * 688f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen * See b/23525545 for details. 689f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen */ 690f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen { 691f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen Parcel data, reply; 692f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen 693f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen callback = new BinderLibTestCallBack(); 694f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen data.writeStrongBinder(target); 695f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen data.writeStrongBinder(callback); 696f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen ret = client->transact(BINDER_LIB_TEST_LINK_DEATH_TRANSACTION, data, &reply, TF_ONE_WAY); 697f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen EXPECT_EQ(NO_ERROR, ret); 698f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen } 699f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen 700f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen ret = callback->waitEvent(5); 701f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen EXPECT_EQ(NO_ERROR, ret); 702f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen ret = callback->getResult(); 703f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen EXPECT_EQ(NO_ERROR, ret); 704f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen} 705f7100e492ff6301dc5f0250e90715e646c96774eMartijn Coenen 70606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, PassFile) { 70706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 70806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int pipefd[2]; 70906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint8_t buf[1] = { 0 }; 71006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint8_t write_value = 123; 71106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 71206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = pipe2(pipefd, O_NONBLOCK); 71306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_EQ(0, ret); 71406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 71506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 71606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 71706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint8_t writebuf[1] = { write_value }; 71806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 71906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = data.writeFileDescriptor(pipefd[1], true); 72006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 72106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 72206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = data.writeInt32(sizeof(writebuf)); 72306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 72406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 72506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = data.write(writebuf, sizeof(writebuf)); 72606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 72706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 72806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = m_server->transact(BINDER_LIB_TEST_WRITE_FILE_TRANSACTION, data, &reply); 72906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 73006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 73106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 73206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = read(pipefd[0], buf, sizeof(buf)); 7336d5fa9459f3b084ab802f32bb8a490ac0f25f2a4Arve Hjønnevåg EXPECT_EQ(sizeof(buf), (size_t)ret); 73406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(write_value, buf[0]); 73506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 73606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews waitForReadData(pipefd[0], 5000); /* wait for other proccess to close pipe */ 73706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 73806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = read(pipefd[0], buf, sizeof(buf)); 73906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(0, ret); 74006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 74106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews close(pipefd[0]); 74206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 74306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 74406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, PromoteLocal) { 74506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> strong = new BBinder(); 74606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews wp<IBinder> weak = strong; 74706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> strong_from_weak = weak.promote(); 74806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(strong != NULL); 74906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(strong, strong_from_weak); 75006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews strong = NULL; 75106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews strong_from_weak = NULL; 75206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews strong_from_weak = weak.promote(); 75306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_TRUE(strong_from_weak == NULL); 75406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 75506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 75606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley AndrewsTEST_F(BinderLibTest, PromoteRemote) { 75706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 75806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 75906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> strong = new BBinder(); 76006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server = addServer(); 76106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 76206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(server != NULL); 76306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ASSERT_TRUE(strong != NULL); 76406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 76506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = data.writeWeakBinder(strong); 76606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_EQ(NO_ERROR, ret); 76706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 76806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = server->transact(BINDER_LIB_TEST_PROMOTE_WEAK_REF_TRANSACTION, data, &reply); 76906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews EXPECT_GE(ret, 0); 77006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 77106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 7727060431a6f0eb395bdc32171aecc51c25fbe7dacArve HjønnevågTEST_F(BinderLibTest, CheckHandleZeroBinderHighBitsZeroCookie) { 7737060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg status_t ret; 7747060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg Parcel data, reply; 7757060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg 7767060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg ret = m_server->transact(BINDER_LIB_TEST_GET_SELF_TRANSACTION, data, &reply); 7777060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg EXPECT_EQ(NO_ERROR, ret); 7787060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg 7797060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg const flat_binder_object *fb = reply.readObject(false); 7807060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg ASSERT_TRUE(fb != NULL); 781ad6503cf91e1ef0e3c1595e143ab9e11f0da5530Hsin-Yi Chen EXPECT_EQ(BINDER_TYPE_HANDLE, fb->hdr.type); 782ad6503cf91e1ef0e3c1595e143ab9e11f0da5530Hsin-Yi Chen EXPECT_EQ(m_server, ProcessState::self()->getStrongProxyForHandle(fb->handle)); 783ad6503cf91e1ef0e3c1595e143ab9e11f0da5530Hsin-Yi Chen EXPECT_EQ((binder_uintptr_t)0, fb->cookie); 784ad6503cf91e1ef0e3c1595e143ab9e11f0da5530Hsin-Yi Chen EXPECT_EQ((uint64_t)0, (uint64_t)fb->binder >> 32); 7857060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg} 7867060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg 78752be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'BrienTEST_F(BinderLibTest, FreedBinder) { 78852be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien status_t ret; 78952be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien 79052be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien sp<IBinder> server = addServer(); 79152be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien ASSERT_TRUE(server != NULL); 79252be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien 79352be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien __u32 freedHandle; 79452be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien wp<IBinder> keepFreedBinder; 79552be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien { 79652be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien Parcel data, reply; 79752be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien data.writeBool(false); /* request weak reference */ 79852be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien ret = server->transact(BINDER_LIB_TEST_CREATE_BINDER_TRANSACTION, data, &reply); 79952be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien ASSERT_EQ(NO_ERROR, ret); 80052be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien struct flat_binder_object *freed = (struct flat_binder_object *)(reply.data()); 80152be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien freedHandle = freed->handle; 80252be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien /* Add a weak ref to the freed binder so the driver does not 80352be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien * delete its reference to it - otherwise the transaction 80452be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien * fails regardless of whether the driver is fixed. 80552be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien */ 80652be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien keepFreedBinder = reply.readWeakBinder(); 80752be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien } 80852be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien { 80952be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien Parcel data, reply; 81052be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien data.writeStrongBinder(server); 81152be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien /* Replace original handle with handle to the freed binder */ 81252be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien struct flat_binder_object *strong = (struct flat_binder_object *)(data.data()); 81352be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien __u32 oldHandle = strong->handle; 81452be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien strong->handle = freedHandle; 81552be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien ret = server->transact(BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION, data, &reply); 81652be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien /* Returns DEAD_OBJECT (-32) if target crashes and 81752be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien * FAILED_TRANSACTION if the driver rejects the invalid 81852be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien * object. 81952be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien */ 82052be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien EXPECT_EQ((status_t)FAILED_TRANSACTION, ret); 82152be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien /* Restore original handle so parcel destructor does not use 82252be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien * the wrong handle. 82352be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien */ 82452be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien strong->handle = oldHandle; 82552be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien } 82652be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien} 82752be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien 828336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry YangTEST_F(BinderLibTest, CheckNoHeaderMappedInUser) { 829336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang status_t ret; 830336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang Parcel data, reply; 831336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang sp<BinderLibTestCallBack> callBack = new BinderLibTestCallBack(); 832336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang for (int i = 0; i < 2; i++) { 833336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang BinderLibTestBundle datai; 834336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang datai.appendFrom(&data, 0, data.dataSize()); 835336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang 836336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang data.freeData(); 837336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang data.writeInt32(1); 838336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang data.writeStrongBinder(callBack); 839336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang data.writeInt32(BINDER_LIB_TEST_CALL_BACK_VERIFY_BUF); 840336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang 841336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang datai.appendTo(&data); 842336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang } 843336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang ret = m_server->transact(BINDER_LIB_TEST_INDIRECT_TRANSACTION, data, &reply); 844336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang EXPECT_EQ(NO_ERROR, ret); 845336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang} 846336cdd3437a94e8dfcb897959da5d6eeb6379473Sherry Yang 84706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsclass BinderLibTestService : public BBinder 84806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 84906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews public: 85006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestService(int32_t id) 85106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews : m_id(id) 85206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews , m_nextServerId(id + 1) 85306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews , m_serverStartRequested(false) 85406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 85506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_init(&m_serverWaitMutex, NULL); 85606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_init(&m_serverWaitCond, NULL); 85706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 85806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ~BinderLibTestService() 85906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 86006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews exit(EXIT_SUCCESS); 86106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 86206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews virtual status_t onTransact(uint32_t code, 86306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews const Parcel& data, Parcel* reply, 86406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint32_t flags = 0) { 86506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: code %d\n", __func__, code); 86606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews (void)flags; 86706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 86806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (getuid() != (uid_t)IPCThreadState::self()->getCallingUid()) { 86906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return PERMISSION_DENIED; 87006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 87106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews switch (code) { 87206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_REGISTER_SERVER: { 87306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t id; 87406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder; 87506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews id = data.readInt32(); 87606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder = data.readStrongBinder(); 87706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (binder == NULL) { 87806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 87906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 88006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 88106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_id != 0) 88206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return INVALID_OPERATION; 88306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 88406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_lock(&m_serverWaitMutex); 88506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_serverStartRequested) { 88606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStartRequested = false; 88706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStarted = binder; 88806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_signal(&m_serverWaitCond); 88906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 89006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_unlock(&m_serverWaitMutex); 89106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 89206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 89306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_ADD_SERVER: { 89406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 89506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint8_t buf[1] = { 0 }; 89606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int serverid; 89706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 89806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_id != 0) { 89906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return INVALID_OPERATION; 90006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 90106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_lock(&m_serverWaitMutex); 90206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_serverStartRequested) { 90306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = -EBUSY; 90406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else { 90506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews serverid = m_nextServerId++; 90606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStartRequested = true; 90706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 90806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_unlock(&m_serverWaitMutex); 90906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = start_server_process(serverid); 91006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_lock(&m_serverWaitMutex); 91106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 91206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret > 0) { 91306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_serverStartRequested) { 91406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews struct timespec ts; 91506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews clock_gettime(CLOCK_REALTIME, &ts); 91606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ts.tv_sec += 5; 91706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = pthread_cond_timedwait(&m_serverWaitCond, &m_serverWaitMutex, &ts); 91806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 91906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (m_serverStartRequested) { 92006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStartRequested = false; 92106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = -ETIMEDOUT; 92206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else { 92306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeStrongBinder(m_serverStarted); 92406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeInt32(serverid); 92506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStarted = NULL; 92606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = NO_ERROR; 92706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 92806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else if (ret >= 0) { 92906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_serverStartRequested = false; 93006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = UNKNOWN_ERROR; 93106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 93206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_unlock(&m_serverWaitMutex); 93306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return ret; 93406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 93506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_NOP_TRANSACTION: 93606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 93706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_NOP_CALL_BACK: { 93806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data2, reply2; 93906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder; 94006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder = data.readStrongBinder(); 94106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (binder == NULL) { 94206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 94306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 94406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply2.writeInt32(NO_ERROR); 94506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder->transact(BINDER_LIB_TEST_CALL_BACK, data2, &reply2); 94606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 94706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 9487060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg case BINDER_LIB_TEST_GET_SELF_TRANSACTION: 9497060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg reply->writeStrongBinder(this); 9507060431a6f0eb395bdc32171aecc51c25fbe7dacArve Hjønnevåg return NO_ERROR; 95106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_GET_ID_TRANSACTION: 95206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeInt32(m_id); 95306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 95406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_INDIRECT_TRANSACTION: { 95506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t count; 95606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews uint32_t indirect_code; 95706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> binder; 95806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 95906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews count = data.readInt32(); 96006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeInt32(m_id); 96106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeInt32(count); 96206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews for (int i = 0; i < count; i++) { 96306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder = data.readStrongBinder(); 96406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (binder == NULL) { 96506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 96606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 96706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews indirect_code = data.readInt32(); 96806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle data2(&data); 96906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (!data2.isValid()) { 97006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 97106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 97206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews BinderLibTestBundle reply2; 97306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder->transact(indirect_code, data2, &reply2); 97406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply2.appendTo(reply); 97506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 97606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 97706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 97806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_SET_ERROR_TRANSACTION: 97906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->setError(data.readInt32()); 98006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 98106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_GET_PTR_SIZE_TRANSACTION: 98206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->writeInt32(sizeof(void *)); 98306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 98406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_GET_STATUS_TRANSACTION: 98506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 98606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_ADD_STRONG_REF_TRANSACTION: 98706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews m_strongRef = data.readStrongBinder(); 98806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 98906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_LINK_DEATH_TRANSACTION: { 99006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 99106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data2, reply2; 99206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<TestDeathRecipient> testDeathRecipient = new TestDeathRecipient(); 99306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> target; 99406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> callback; 99506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 99606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews target = data.readStrongBinder(); 99706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (target == NULL) { 99806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 99906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 100006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews callback = data.readStrongBinder(); 100106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (callback == NULL) { 100206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 100306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 100406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = target->linkToDeath(testDeathRecipient); 100506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret == NO_ERROR) 100606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = testDeathRecipient->waitEvent(5); 100706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data2.writeInt32(ret); 100806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews callback->transact(BINDER_LIB_TEST_CALL_BACK, data2, &reply2); 100906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 101006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 101106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_WRITE_FILE_TRANSACTION: { 101206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 101306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t size; 101406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews const void *buf; 101506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int fd; 101606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 101706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews fd = data.readFileDescriptor(); 101806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (fd < 0) { 101906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 102006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 102106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = data.readInt32(&size); 102206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret != NO_ERROR) { 102306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return ret; 102406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 102506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews buf = data.readInplace(size); 102606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (buf == NULL) { 102706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 102806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 102906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = write(fd, buf, size); 103006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret != size) 103106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return UNKNOWN_ERROR; 103206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 103306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 103406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_PROMOTE_WEAK_REF_TRANSACTION: { 103506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 103606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews wp<IBinder> weak; 103706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> strong; 103806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data2, reply2; 103906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IServiceManager> sm = defaultServiceManager(); 104006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server = sm->getService(binderLibTestServiceName); 104106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 104206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews weak = data.readWeakBinder(); 104306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (weak == NULL) { 104406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return BAD_VALUE; 104506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 104606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews strong = weak.promote(); 104706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 104806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data2, &reply2); 104906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret != NO_ERROR) 105006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews exit(EXIT_FAILURE); 105106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 105206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (strong == NULL) { 105306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews reply->setError(1); 105406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 105506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 105606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 105706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_DELAYED_EXIT_TRANSACTION: 105806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews alarm(10); 105906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return NO_ERROR; 106006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews case BINDER_LIB_TEST_EXIT_TRANSACTION: 106106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews while (wait(NULL) != -1 || errno != ECHILD) 106206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ; 106306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews exit(EXIT_SUCCESS); 106452be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien case BINDER_LIB_TEST_CREATE_BINDER_TRANSACTION: { 106552be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien bool strongRef = data.readBool(); 106652be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien sp<IBinder> binder = new BBinder(); 106752be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien if (strongRef) { 106852be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien reply->writeStrongBinder(binder); 106952be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien } else { 107052be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien reply->writeWeakBinder(binder); 107152be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien } 107252be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien return NO_ERROR; 107352be2c9f52676b09a86e0eb7ba8fcd27af5a23caConnor O'Brien } 107406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews default: 107506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return UNKNOWN_TRANSACTION; 107606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews }; 107706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 107806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews private: 107906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t m_id; 108006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int32_t m_nextServerId; 108106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_mutex_t m_serverWaitMutex; 108206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews pthread_cond_t m_serverWaitCond; 108306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews bool m_serverStartRequested; 108406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> m_serverStarted; 108506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> m_strongRef; 108606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews}; 108706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 108806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsint run_server(int index, int readypipefd) 108906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews{ 109087c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien binderLibTestServiceName += String16(binderserversuffix); 109187c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien 109206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews status_t ret; 109306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IServiceManager> sm = defaultServiceManager(); 109406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews { 109506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<BinderLibTestService> testService = new BinderLibTestService(index); 109606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (index == 0) { 109706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = sm->addService(binderLibTestServiceName, testService); 109806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else { 109906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews sp<IBinder> server = sm->getService(binderLibTestServiceName); 110006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews Parcel data, reply; 110106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeInt32(index); 110206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews data.writeStrongBinder(testService); 110306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 110406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ret = server->transact(BINDER_LIB_TEST_REGISTER_SERVER, data, &reply); 110506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 110606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 110706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews write(readypipefd, &ret, sizeof(ret)); 110806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews close(readypipefd); 110906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: ret %d\n", __func__, ret); 111006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews if (ret) 111106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return 1; 111206b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: joinThreadPool\n", __func__); 111306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ProcessState::self()->startThreadPool(); 111406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews IPCThreadState::self()->joinThreadPool(); 111506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews //printf("%s: joinThreadPool returned\n", __func__); 111606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return 1; /* joinThreadPool should not return */ 111706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 111806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 111906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrewsint main(int argc, char **argv) { 112006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews int ret; 112106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 112287c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien if (argc == 4 && !strcmp(argv[1], "--servername")) { 112306b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binderservername = argv[2]; 112406b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } else { 112506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binderservername = argv[0]; 112606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 112706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 112887c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien if (argc == 5 && !strcmp(argv[1], binderserverarg)) { 112987c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien binderserversuffix = argv[4]; 113006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return run_server(atoi(argv[2]), atoi(argv[3])); 113106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews } 113287c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien binderserversuffix = new char[16]; 113387c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien snprintf(binderserversuffix, 16, "%d", getpid()); 113487c03cf9e26f066fe7ff0e6a54b88cae6f1f29fdConnor O'Brien binderLibTestServiceName += String16(binderserversuffix); 113506b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 113606b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ::testing::InitGoogleTest(&argc, argv); 113706b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews binder_env = AddGlobalTestEnvironment(new BinderLibTestEnv()); 113806b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews ProcessState::self()->startThreadPool(); 113906b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews return RUN_ALL_TESTS(); 114006b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews} 114106b01adcb882b4dd736b34bbcccf7a45f43d96a6Riley Andrews 1142