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> 23dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews#include <linux/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, 232dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .data = {0, 0}, 233dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews }, 234dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews }; 235dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct { 236dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd0; 237dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd1; 238dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd2; 239dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binder_transaction_data arg2; 240dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t pad[16]; 241dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } __attribute__((packed)) br; 242dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct binder_write_read bwr = binder_write_read(); 243dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 24429d8cf91bed3c9f72a97046655bc3bdc05952d3aRiley Andrews bwr.write_buffer = (uintptr_t)&bc1; 245dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.write_size = sizeof(bc1); 24629d8cf91bed3c9f72a97046655bc3bdc05952d3aRiley Andrews bwr.read_buffer = (uintptr_t)&br; 247dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.read_size = sizeof(br); 248dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 249dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews { 250dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews SCOPED_TRACE("1st WriteRead"); 251dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctl(BINDER_WRITE_READ, &bwr); 252dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 253dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(sizeof(bc1), bwr.write_consumed); 254dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews if (bwr.read_consumed < offsetof(typeof(br), pad)) { 255dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews SCOPED_TRACE("2nd WriteRead"); 256dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderWaitForReadData(10000); 257dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctl(BINDER_WRITE_READ, &bwr); 258dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 259dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(offsetof(typeof(br), pad), bwr.read_consumed); 260dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews if (bwr.read_consumed > offsetof(typeof(br), cmd0)) 261dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(BR_NOOP, br.cmd0); 262dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews if (bwr.read_consumed > offsetof(typeof(br), cmd1)) 263dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(BR_TRANSACTION_COMPLETE, br.cmd1); 264dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews if (bwr.read_consumed > offsetof(typeof(br), cmd2)) 265dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(BR_REPLY, br.cmd2); 266dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews if (bwr.read_consumed >= offsetof(typeof(br), pad)) { 26750bcb00a9112b70183f7826675d8455cfd978e6aRiley Andrews EXPECT_EQ(0u, br.arg2.target.ptr); 26850bcb00a9112b70183f7826675d8455cfd978e6aRiley Andrews EXPECT_EQ(0u, br.arg2.cookie); 26950bcb00a9112b70183f7826675d8455cfd978e6aRiley Andrews EXPECT_EQ(0u, br.arg2.code); 27050bcb00a9112b70183f7826675d8455cfd978e6aRiley Andrews EXPECT_EQ(0u, br.arg2.flags); 27150bcb00a9112b70183f7826675d8455cfd978e6aRiley Andrews EXPECT_EQ(0u, br.arg2.data_size); 27250bcb00a9112b70183f7826675d8455cfd978e6aRiley Andrews EXPECT_EQ(0u, br.arg2.offsets_size); 273dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 274dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews SCOPED_TRACE("3rd WriteRead"); 275dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 276dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestReadEmpty(); 277dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 278dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct { 279dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd1; 280dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binder_uintptr_t arg1; 281dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } __attribute__((packed)) bc2 = { 282dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .cmd1 = BC_FREE_BUFFER, 283dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .arg1 = br.arg2.data.ptr.buffer, 284dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews }; 285dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 28629d8cf91bed3c9f72a97046655bc3bdc05952d3aRiley Andrews bwr.write_buffer = (uintptr_t)&bc2; 287dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.write_size = sizeof(bc2); 288dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.write_consumed = 0; 289dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.read_size = 0; 290dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 291dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctl(BINDER_WRITE_READ, &bwr); 292dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(sizeof(bc2), bwr.write_consumed); 293dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } 294dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestReadEmpty(); 295dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 296dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 297dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley AndrewsTEST_F(BinderDriverInterfaceTest, RequestDeathNotification) { 298dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binder_uintptr_t cookie = 1234; 299dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct { 300dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd0; 301dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t arg0; 302dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd1; 303dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct binder_handle_cookie arg1; 304dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd2; 305dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct binder_handle_cookie arg2; 306dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd3; 307dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t arg3; 308dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } __attribute__((packed)) bc = { 309dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .cmd0 = BC_INCREFS, 310dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .arg0 = 0, 311dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .cmd1 = BC_REQUEST_DEATH_NOTIFICATION, 312dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .arg1 = { 313dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .handle = 0, 314dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .cookie = cookie, 315dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews }, 316dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .cmd2 = BC_CLEAR_DEATH_NOTIFICATION, 317dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .arg2 = { 318dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .handle = 0, 319dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .cookie = cookie, 320dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews }, 321dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .cmd3 = BC_DECREFS, 322dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews .arg3 = 0, 323dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews }; 324dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct { 325dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd0; 326dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t cmd1; 327dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binder_uintptr_t arg1; 328dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews uint32_t pad[16]; 329dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews } __attribute__((packed)) br; 330dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews struct binder_write_read bwr = binder_write_read(); 331dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 33229d8cf91bed3c9f72a97046655bc3bdc05952d3aRiley Andrews bwr.write_buffer = (uintptr_t)&bc; 333dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.write_size = sizeof(bc); 33429d8cf91bed3c9f72a97046655bc3bdc05952d3aRiley Andrews bwr.read_buffer = (uintptr_t)&br; 335dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews bwr.read_size = sizeof(br); 336dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 337dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestIoctl(BINDER_WRITE_READ, &bwr); 338dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(sizeof(bc), bwr.write_consumed); 339dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(sizeof(br) - sizeof(br.pad), bwr.read_consumed); 340dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(BR_NOOP, br.cmd0); 341dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(BR_CLEAR_DEATH_NOTIFICATION_DONE, br.cmd1); 342dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews EXPECT_EQ(cookie, br.arg1); 343dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binderTestReadEmpty(); 344dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 345dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 346dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrewsint main(int argc, char **argv) { 347dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews ::testing::InitGoogleTest(&argc, argv); 348dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 349dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews binder_env = AddGlobalTestEnvironment(new BinderDriverInterfaceTestEnv()); 350dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 351dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews return RUN_ALL_TESTS(); 352dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews} 353dc9b148985f5b75f2ea9faf1b045b50400b3e141Riley Andrews 354