1f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross/* 2f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross * Copyright (C) 2016 The Android Open Source Project 3f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross * 4f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross * Licensed under the Apache License, Version 2.0 (the "License"); 5f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross * you may not use this file except in compliance with the License. 6f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross * You may obtain a copy of the License at 7f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross * 8f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross * http://www.apache.org/licenses/LICENSE-2.0 9f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross * 10f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross * Unless required by applicable law or agreed to in writing, software 11f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross * distributed under the License is distributed on an "AS IS" BASIS, 12f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross * See the License for the specific language governing permissions and 14f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross * limitations under the License. 15f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross */ 16f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 17f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross#include <signal.h> 18f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross#include <sys/types.h> 19f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross#include <unistd.h> 20f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 21f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross#include <binder/Binder.h> 22f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross#include <binder/IBinder.h> 23f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross#include <binder/IServiceManager.h> 24f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross#include <binder/Parcel.h> 25f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross#include <binder/ProcessState.h> 26f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 27f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross#include <gtest/gtest.h> 28f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 29f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross#include "Allocator.h" 30f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross#include "Binder.h" 31f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 32f572b91c4f5acf739742da53ae3406e615c2d756Colin Crossnamespace android { 33f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 34f572b91c4f5acf739742da53ae3406e615c2d756Colin Crossstatic const String16 service_name("test.libmemunreachable_binder"); 35f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 36f572b91c4f5acf739742da53ae3406e615c2d756Colin Crossclass BinderService : public BBinder { 37f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross public: 38f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross BinderService() = default; 39f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross virtual ~BinderService() = default; 40f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 41f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross virtual status_t onTransact(uint32_t /*code*/, const Parcel& data, Parcel* reply, 42f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross uint32_t /*flags*/ = 0) { 43f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross reply->writeStrongBinder(ref); 44f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross ref = data.readStrongBinder(); 45f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross return 0; 46f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross } 47f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 48f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross private: 49f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross sp<IBinder> ref; 50f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross}; 51f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 52f572b91c4f5acf739742da53ae3406e615c2d756Colin Crossclass BinderObject : public BBinder { 53f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross public: 54f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross BinderObject() = default; 55f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross ~BinderObject() = default; 56f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross}; 57f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 58f572b91c4f5acf739742da53ae3406e615c2d756Colin Crossclass ServiceProcess { 59f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross public: 60f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross ServiceProcess() : child_(0) {} 61f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross ~ServiceProcess() { Stop(); } 62f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 63f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross bool Run() { 64f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross pid_t ret = fork(); 65f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross if (ret < 0) { 66f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross return false; 67f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross } else if (ret == 0) { 68f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross // child 69f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross _exit(Service()); 70f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross } else { 71f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross // parent 72f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross child_ = ret; 73f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross return true; 74f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross } 75f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross } 76f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 77f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross bool Stop() { 78f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross if (child_ > 0) { 79f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross if (kill(child_, SIGTERM)) { 80f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross return false; 81f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross } 82f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross int status = 0; 83f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross if (TEMP_FAILURE_RETRY(waitpid(child_, &status, 0)) != child_) { 84f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross return false; 85f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross } 86f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross child_ = 0; 87f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross return WIFEXITED(status) && WEXITSTATUS(status) == 0; 88f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross } 89f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 90f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross return true; 91f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross } 92f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 93f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross int Service() { 94f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross sp<ProcessState> proc{ProcessState::self()}; 95f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross sp<IServiceManager> sm = defaultServiceManager(); 96f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross if (sm == nullptr) { 97f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross fprintf(stderr, "Failed to get service manager\n"); 98f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross return 1; 99f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross } 100f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross if (sm->addService(service_name, new BinderService()) != OK) { 101f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross fprintf(stderr, "Failed to add test service\n"); 102f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross return 1; 103f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross } 104f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross proc->startThreadPool(); 105f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross pause(); 106f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross return 0; 107f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross } 108f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 109f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross private: 110f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross pid_t child_; 111f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross}; 112f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 113f572b91c4f5acf739742da53ae3406e615c2d756Colin Crossclass BinderTest : public ::testing::Test { 114f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross protected: 115f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross ServiceProcess service_process_; 116f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross}; 117f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 118f572b91c4f5acf739742da53ae3406e615c2d756Colin CrossTEST_F(BinderTest, binder) { 119f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross ServiceProcess service_process; 120f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross ASSERT_TRUE(service_process.Run()); 121f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 122f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross sp<IServiceManager> sm = defaultServiceManager(); 123f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross ASSERT_TRUE(sm != nullptr); 124f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 125f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross // A small sleep allows the service to start, which 126f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross // prevents a longer sleep in getService. 127f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross usleep(100000); 128f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 129f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross sp<IBinder> service = sm->getService(service_name); 130f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross ASSERT_TRUE(service != nullptr); 131f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 132f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross sp<IBinder> binder{new BinderObject()}; 133f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 134f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross Parcel send; 135f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross Parcel reply; 136f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 137f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross send.writeStrongBinder(binder); 138f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross status_t rv = service->transact(0, send, &reply); 139f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross ASSERT_EQ(static_cast<status_t>(OK), rv); 140f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 141f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross Heap heap; 142f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross allocator::vector<uintptr_t> refs{heap}; 143f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 144f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross ASSERT_TRUE(BinderReferences(refs)); 145f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 146f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross bool found_ref = false; 147f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross for (auto ref : refs) { 148f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross if (ref == reinterpret_cast<uintptr_t>(binder.get())) { 149f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross found_ref = true; 150f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross } 151f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross } 152f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 153f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross ASSERT_TRUE(found_ref); 154f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross} 155f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross 156f572b91c4f5acf739742da53ae3406e615c2d756Colin Cross} // namespace android 157