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