blob: ea799c06a266d99a6701ad2353fb7c5ed92fcdbc [file] [log] [blame]
Devin Moorec03e3aa2020-12-11 15:11:17 -08001/*
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <binder/Binder.h>
18#include <binder/IServiceManager.h>
19#include <binder/ProcessState.h>
20#include <binder/IPCThreadState.h>
21#include <binderdebug/BinderDebug.h>
22#include <gtest/gtest.h>
23#include <semaphore.h>
24#include <thread>
25
26#include <android/binderdebug/test/BnControl.h>
27#include <android/binderdebug/test/IControl.h>
28
29namespace android {
30namespace binderdebug {
31namespace test {
32
33class Control : public BnControl {
34public:
35 Control() {sem_init(&s, 1, 0);};
36 ::android::binder::Status Continue() override;
37 sem_t s;
38};
39
40::android::binder::Status Control::Continue() {
41 IPCThreadState::self()->flushCommands();
42 sem_post(&s);
43 return binder::Status::ok();
44}
45
46TEST(BinderDebugTests, BinderPid) {
47 BinderPidInfo pidInfo;
48 const auto& status = getBinderPidInfo(BinderDebugContext::BINDER, getpid(), &pidInfo);
49 ASSERT_EQ(status, OK);
50 // There should be one referenced PID for servicemanager
51 EXPECT_TRUE(!pidInfo.refPids.empty());
52}
53
54TEST(BinderDebugTests, BinderThreads) {
55 BinderPidInfo pidInfo;
56 const auto& status = getBinderPidInfo(BinderDebugContext::BINDER, getpid(), &pidInfo);
57 ASSERT_EQ(status, OK);
58 EXPECT_TRUE(pidInfo.threadUsage <= pidInfo.threadCount);
59 // The second looper thread can sometimes take longer to spawn.
60 EXPECT_GE(pidInfo.threadCount, 1);
61}
62
63extern "C" {
64int main(int argc, char** argv) {
65 ::testing::InitGoogleTest(&argc, argv);
66
67 // Create a child/client process to call into the main process so we can ensure
68 // looper thread has been registered before attempting to get the BinderPidInfo
69 pid_t pid = fork();
70 if (pid == 0) {
71 sp<IBinder> binder = android::defaultServiceManager()->getService(String16("binderdebug"));
72 sp<IControl> service;
73 if (binder != nullptr) {
74 service = android::interface_cast<IControl>(binder);
75 }
76 service->Continue();
77 exit(0);
78 }
79 sp<Control> iface = new Control;
80 android::defaultServiceManager()->addService(String16("binderdebug"), iface);
81 android::ProcessState::self()->setThreadPoolMaxThreadCount(8);
82 ProcessState::self()->startThreadPool();
83 sem_wait(&iface->s);
84
85 return RUN_ALL_TESTS();
86}
87} // extern "C"
88} // namespace test
89} // namespace binderdebug
90} // namespace android