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