1dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews/* 2dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews * Copyright (C) 2014 The Android Open Source Project 3dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews * 4dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews * Licensed under the Apache License, Version 2.0 (the "License"); 5dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews * you may not use this file except in compliance with the License. 6dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews * You may obtain a copy of the License at 7dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews * 8dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews * http://www.apache.org/licenses/LICENSE-2.0 9dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews * 10dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews * Unless required by applicable law or agreed to in writing, software 11dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews * distributed under the License is distributed on an "AS IS" BASIS, 12dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews * See the License for the specific language governing permissions and 14dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews * limitations under the License. 15dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews */ 16dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 17dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews#include <errno.h> 18dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews#include <fcntl.h> 19dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews#include <stdio.h> 20dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews#include <stdlib.h> 21dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 22dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews#include <gtest/gtest.h> 23e05dc6d59c3be6ac42bdc7f415a7ea80a3ed1e18Dan Willemsen#include <linux/android/binder.h> 24dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews#include <binder/IBinder.h> 25dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews#include <sys/mman.h> 26dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews#include <poll.h> 27dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 28dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews#define BINDER_DEV_NAME "/dev/binder" 29dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 30dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrewstesting::Environment* binder_env; 31dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 32dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrewsclass BinderDriverInterfaceTestEnv : public ::testing::Environment { 33dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews virtual void SetUp() { 34dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews int ret; 35dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t max_threads = 0; 36dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 370fe7ce375ed6c9fcd86b8bb3a836bc37c9740831Nick Kralevich m_binderFd = open(BINDER_DEV_NAME, O_RDWR | O_NONBLOCK | O_CLOEXEC); 38dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews ASSERT_GE(m_binderFd, 0); 39dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews m_buffer = mmap(NULL, 64*1024, PROT_READ, MAP_SHARED, m_binderFd, 0); 40dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews ASSERT_NE(m_buffer, (void *)NULL); 41dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews ret = ioctl(m_binderFd, BINDER_SET_MAX_THREADS, &max_threads); 42dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(0, ret); 43dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EnterLooper(); 44dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 45dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews virtual void TearDown() { 46dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews close(m_binderFd); 47dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 48dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews private: 49dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews int m_binderFd; 50dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews void *m_buffer; 51dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews public: 52dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews int getBinderFd(void) { 53dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews return m_binderFd; 54dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 55dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews void EnterLooper(void) { 56dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews int ret; 57dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews const uint32_t bc[] = { 58dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews BC_ENTER_LOOPER, 59dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews }; 60dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct binder_write_read bwr = binder_write_read(); 6129d8cf91bed3c9f72a97046655bc3bdc05952d3aRiley Andrews bwr.write_buffer = (uintptr_t)bc; 62dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.write_size = sizeof(bc); 63dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews ret = ioctl(m_binderFd, BINDER_WRITE_READ, &bwr); 64dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(0, ret); 65dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews if (ret < 0) { 66dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(0, errno); 67dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 68dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(sizeof(bc), bwr.write_consumed); 69dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 70dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews}; 71dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 72dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrewsclass BinderDriverInterfaceTest : public ::testing::Test { 73dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews public: 74dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews virtual void SetUp() { 75dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews m_binderFd = static_cast<BinderDriverInterfaceTestEnv *>(binder_env)->getBinderFd(); 76dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 77dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews virtual void TearDown() { 78dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 79dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews protected: 80dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews void binderTestIoctlRetErr2(int cmd, void *arg, int expect_ret, int expect_errno, int accept_errno) { 81dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews int ret; 82dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 83dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews ret = ioctl(m_binderFd, cmd, arg); 84dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(expect_ret, ret); 85dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews if (ret < 0) { 86dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews if (errno != accept_errno) 87dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(expect_errno, errno); 88dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 89dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 90dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews void binderTestIoctlErr2(int cmd, void *arg, int expect_errno, int accept_errno) { 91dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctlRetErr2(cmd, arg, -1, expect_errno, accept_errno); 92dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 93dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews void binderTestIoctlErr1(int cmd, void *arg, int expect_errno) { 94dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctlErr2(cmd, arg, expect_errno, expect_errno); 95dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 96dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews void binderTestIoctl(int cmd, void *arg) { 97dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctlRetErr2(cmd, arg, 0, 0, 0); 98dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 99dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews void binderTestIoctlUnimplemented(int cmd, void *arg) { 100dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews int ret; 101dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 102dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews ret = ioctl(m_binderFd, cmd, arg); 103dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews if (ret < 0) { 104dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews /* Not currently implmented. Allow ret == -1, errno == EINVAL */ 105dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(-1, ret); 106dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(EINVAL, errno); 107dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 108dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 109dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews void binderTestReadEmpty(void) { 110dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews size_t i; 111dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t br[32]; 112dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct binder_write_read bwr = binder_write_read(); 113dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews SCOPED_TRACE("TestReadEmpty"); 11429d8cf91bed3c9f72a97046655bc3bdc05952d3aRiley Andrews bwr.read_buffer = (uintptr_t)br; 115dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.read_size = sizeof(br); 116dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctlErr1(BINDER_WRITE_READ, &bwr, EAGAIN); 11750bcb00a9112b70183f7826675d8455cfd978e6aRiley Andrews EXPECT_EQ(0u, bwr.read_consumed); 118dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews for (i = 0; i * sizeof(uint32_t) < bwr.read_consumed; i++) { 119dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews SCOPED_TRACE(testing::Message() << "i = " << i); 120dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(BR_NOOP, br[i]); 121dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 122dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 123dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews void binderWaitForReadData(int timeout_ms) { 124dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews int ret; 125dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews pollfd pfd = pollfd(); 126dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 127dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews pfd.fd = m_binderFd; 128dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews pfd.events = POLLIN; 129dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews ret = poll(&pfd, 1, timeout_ms); 130dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(1, ret); 131dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 132dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews private: 133dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews int m_binderFd; 134dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews}; 135dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 136dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, Version) { 137dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct binder_version version; 138dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctl(BINDER_VERSION, &version); 139dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews ASSERT_EQ(BINDER_CURRENT_PROTOCOL_VERSION, version.protocol_version); 140dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 141dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 142dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, WriteReadNull) { 143dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctlErr1(BINDER_WRITE_READ, NULL, EFAULT); 144dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 145dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 146dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, SetIdleTimeoutNull) { 147dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctlErr2(BINDER_SET_IDLE_TIMEOUT, NULL, EFAULT, EINVAL); 148dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 149dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 150dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, SetMaxThreadsNull) { 151dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctlErr2(BINDER_SET_MAX_THREADS, NULL, EFAULT, EINVAL); /* TODO: don't accept EINVAL */ 152dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 153dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 154dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, SetIdlePriorityNull) { 155dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctlErr2(BINDER_SET_IDLE_PRIORITY, NULL, EFAULT, EINVAL); 156dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 157dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 158dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, VersionNull) { 159dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctlErr2(BINDER_VERSION, NULL, EFAULT, EINVAL); /* TODO: don't accept EINVAL */ 160dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 161dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 162dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, SetIdleTimeoutNoTest) { 163dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews int64_t idle_timeout = 100000; 164dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctlUnimplemented(BINDER_SET_IDLE_TIMEOUT, &idle_timeout); 165dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 166dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 167dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, SetMaxThreads) { 168dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t max_threads = 0; 169dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctl(BINDER_SET_MAX_THREADS, &max_threads); 170dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 171dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 172dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, SetIdlePriorityNoTest) { 173dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews int idle_priority = 0; 174dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctlUnimplemented(BINDER_SET_IDLE_PRIORITY, &idle_priority); 175dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 176dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 177dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, SetContextMgrBusy) { 178dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews int32_t dummy = 0; 179dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctlErr1(BINDER_SET_CONTEXT_MGR, &dummy, EBUSY); 180dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 181dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 182dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, ThreadExit) { 183dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews int32_t dummy = 0; 184dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctl(BINDER_THREAD_EXIT, &dummy); 185dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews static_cast<BinderDriverInterfaceTestEnv *>(binder_env)->EnterLooper(); 186dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 187dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 188dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, WriteReadEmpty) { 189dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct binder_write_read bwr = binder_write_read(); 190dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctl(BINDER_WRITE_READ, &bwr); 191dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 192dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 193dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, Read) { 194dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestReadEmpty(); 195dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 196dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 197dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, IncRefsAcquireReleaseDecRefs) { 198dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews const uint32_t bc[] = { 199dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews BC_INCREFS, 200dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 0, 201dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews BC_ACQUIRE, 202dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 0, 203dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews BC_RELEASE, 204dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 0, 205dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews BC_DECREFS, 206dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 0, 207dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews }; 208dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct binder_write_read bwr = binder_write_read(); 20929d8cf91bed3c9f72a97046655bc3bdc05952d3aRiley Andrews bwr.write_buffer = (uintptr_t)bc; 210dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.write_size = sizeof(bc); 211dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctl(BINDER_WRITE_READ, &bwr); 212dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(sizeof(bc), bwr.write_consumed); 213dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestReadEmpty(); 214dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 215dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 216dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, Transaction) { 217dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binder_uintptr_t cookie = 1234; 218dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct { 219dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd1; 220dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct binder_transaction_data arg1; 221dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } __attribute__((packed)) bc1 = { 222dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .cmd1 = BC_TRANSACTION, 223dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .arg1 = { 224dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .target = { 0 }, 225dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .cookie = 0, 226dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .code = android::IBinder::PING_TRANSACTION, 227dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .flags = 0, 228dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .sender_pid = 0, 229dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .sender_euid = 0, 230dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .data_size = 0, 231dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .offsets_size = 0, 23278f2a376144057e1390563c22c4f00a872e37671Wei Wang .data = { 23378f2a376144057e1390563c22c4f00a872e37671Wei Wang .ptr = {0, 0}, 23478f2a376144057e1390563c22c4f00a872e37671Wei Wang }, 235dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews }, 236dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews }; 237dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct { 238dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd0; 239dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd1; 240dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd2; 241dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binder_transaction_data arg2; 242dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t pad[16]; 243dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } __attribute__((packed)) br; 244dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct binder_write_read bwr = binder_write_read(); 245dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 24629d8cf91bed3c9f72a97046655bc3bdc05952d3aRiley Andrews bwr.write_buffer = (uintptr_t)&bc1; 247dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.write_size = sizeof(bc1); 24829d8cf91bed3c9f72a97046655bc3bdc05952d3aRiley Andrews bwr.read_buffer = (uintptr_t)&br; 249dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.read_size = sizeof(br); 250dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 251dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews { 252dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews SCOPED_TRACE("1st WriteRead"); 253dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctl(BINDER_WRITE_READ, &bwr); 254dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 255dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(sizeof(bc1), bwr.write_consumed); 256dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews if (bwr.read_consumed < offsetof(typeof(br), pad)) { 257dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews SCOPED_TRACE("2nd WriteRead"); 258dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderWaitForReadData(10000); 259dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctl(BINDER_WRITE_READ, &bwr); 260dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 261dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(offsetof(typeof(br), pad), bwr.read_consumed); 262dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews if (bwr.read_consumed > offsetof(typeof(br), cmd0)) 263dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(BR_NOOP, br.cmd0); 264dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews if (bwr.read_consumed > offsetof(typeof(br), cmd1)) 265dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(BR_TRANSACTION_COMPLETE, br.cmd1); 266dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews if (bwr.read_consumed > offsetof(typeof(br), cmd2)) 267dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(BR_REPLY, br.cmd2); 268dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews if (bwr.read_consumed >= offsetof(typeof(br), pad)) { 26950bcb00a9112b70183f7826675d8455cfd978e6aRiley Andrews EXPECT_EQ(0u, br.arg2.target.ptr); 27050bcb00a9112b70183f7826675d8455cfd978e6aRiley Andrews EXPECT_EQ(0u, br.arg2.cookie); 27150bcb00a9112b70183f7826675d8455cfd978e6aRiley Andrews EXPECT_EQ(0u, br.arg2.code); 27250bcb00a9112b70183f7826675d8455cfd978e6aRiley Andrews EXPECT_EQ(0u, br.arg2.flags); 27350bcb00a9112b70183f7826675d8455cfd978e6aRiley Andrews EXPECT_EQ(0u, br.arg2.data_size); 27450bcb00a9112b70183f7826675d8455cfd978e6aRiley Andrews EXPECT_EQ(0u, br.arg2.offsets_size); 275dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 276dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews SCOPED_TRACE("3rd WriteRead"); 277dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 278dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestReadEmpty(); 279dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 280dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct { 281dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd1; 282dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binder_uintptr_t arg1; 283dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } __attribute__((packed)) bc2 = { 284dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .cmd1 = BC_FREE_BUFFER, 285dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .arg1 = br.arg2.data.ptr.buffer, 286dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews }; 287dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 28829d8cf91bed3c9f72a97046655bc3bdc05952d3aRiley Andrews bwr.write_buffer = (uintptr_t)&bc2; 289dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.write_size = sizeof(bc2); 290dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.write_consumed = 0; 291dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.read_size = 0; 292dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 293dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctl(BINDER_WRITE_READ, &bwr); 294dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(sizeof(bc2), bwr.write_consumed); 295dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 296dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestReadEmpty(); 297dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 298dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 299dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, RequestDeathNotification) { 300dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binder_uintptr_t cookie = 1234; 301dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct { 302dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd0; 303dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t arg0; 304dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd1; 305dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct binder_handle_cookie arg1; 306dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd2; 307dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct binder_handle_cookie arg2; 308dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd3; 309dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t arg3; 310dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } __attribute__((packed)) bc = { 311dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .cmd0 = BC_INCREFS, 312dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .arg0 = 0, 313dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .cmd1 = BC_REQUEST_DEATH_NOTIFICATION, 314dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .arg1 = { 315dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .handle = 0, 316dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .cookie = cookie, 317dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews }, 318dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .cmd2 = BC_CLEAR_DEATH_NOTIFICATION, 319dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .arg2 = { 320dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .handle = 0, 321dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .cookie = cookie, 322dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews }, 323dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .cmd3 = BC_DECREFS, 324dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .arg3 = 0, 325dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews }; 326dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct { 327dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd0; 328dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd1; 329dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binder_uintptr_t arg1; 330dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t pad[16]; 331dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } __attribute__((packed)) br; 332dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct binder_write_read bwr = binder_write_read(); 333dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 33429d8cf91bed3c9f72a97046655bc3bdc05952d3aRiley Andrews bwr.write_buffer = (uintptr_t)&bc; 335dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.write_size = sizeof(bc); 33629d8cf91bed3c9f72a97046655bc3bdc05952d3aRiley Andrews bwr.read_buffer = (uintptr_t)&br; 337dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.read_size = sizeof(br); 338dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 339dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctl(BINDER_WRITE_READ, &bwr); 340dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(sizeof(bc), bwr.write_consumed); 341dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(sizeof(br) - sizeof(br.pad), bwr.read_consumed); 342dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(BR_NOOP, br.cmd0); 343dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(BR_CLEAR_DEATH_NOTIFICATION_DONE, br.cmd1); 344dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(cookie, br.arg1); 345dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestReadEmpty(); 346dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 347dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 348dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrewsint main(int argc, char **argv) { 349dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews ::testing::InitGoogleTest(&argc, argv); 350dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 351dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binder_env = AddGlobalTestEnvironment(new BinderDriverInterfaceTestEnv()); 352dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 353dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews return RUN_ALL_TESTS(); 354dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 355