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