blob: 7c0a44a64ff206b7609d2732ac8ce3433e9e336d [file] [log] [blame]
Tianyu Jiang83e514e2019-05-15 15:05:30 -07001/*
2 * Copyright (C) 2019 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#define LOG_TAG "GraphicBufferOverBinder_test"
18
19#include <binder/IServiceManager.h>
20#include <binder/Parcel.h>
21#include <binder/ProcessState.h>
22#include <gtest/gtest.h>
23#include <gui/BufferQueue.h>
24#include <gui/IGraphicBufferConsumer.h>
25#include <gui/IGraphicBufferProducer.h>
26#include <ui/BufferHubBuffer.h>
27#include <ui/GraphicBuffer.h>
28#include <utils/Log.h>
29
30namespace android {
31
32constexpr uint32_t kTestWidth = 1024;
33constexpr uint32_t kTestHeight = 1;
34constexpr uint32_t kTestFormat = HAL_PIXEL_FORMAT_BLOB;
35constexpr uint32_t kTestLayerCount = 1;
36constexpr uint64_t kTestUsage = GraphicBuffer::USAGE_SW_WRITE_OFTEN;
37static const String16 kTestServiceName = String16("GraphicBufferOverBinderTestService");
38enum GraphicBufferOverBinderTestServiceCode {
39 GRAPHIC_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
40 GRAPHIC_BUFFER_FROM_BUFFER_HUB_BUFFER,
41};
42
43class GraphicBufferOverBinderTestService : public BBinder {
44public:
45 GraphicBufferOverBinderTestService() {
46 // GraphicBuffer
47 mGraphicBuffer = new GraphicBuffer(kTestWidth, kTestHeight, kTestFormat, kTestLayerCount,
48 kTestUsage);
49 ALOGI("mGraphicBuffer id %" PRIi32, mGraphicBuffer->getBufferId());
50
51 // BufferHub-backed GraphicBuffer
52 std::unique_ptr<BufferHubBuffer> bufferHubBuffer =
53 BufferHubBuffer::create(kTestWidth, kTestHeight, kTestLayerCount, kTestFormat,
54 kTestUsage, /*userMetadataSize=*/0);
55 mBufferhubBackedGraphicBuffer = new GraphicBuffer(std::move(bufferHubBuffer));
56 if (!mBufferhubBackedGraphicBuffer->isBufferHubBuffer()) {
57 ALOGE("Failed to back GraphicBuffer with BufferHub.");
58 }
59 if (bufferHubBuffer != nullptr) {
60 ALOGE("Failed to move BufferHubBuffer to GraphicBuffer");
61 }
62 ALOGI("mBufferhubBackedGraphicBuffer id %" PRIi32,
63 mBufferhubBackedGraphicBuffer->getBufferId());
64 }
65
66 ~GraphicBufferOverBinderTestService() = default;
67
68 virtual status_t onTransact(uint32_t code, const Parcel& /*data*/, Parcel* reply,
69 uint32_t /*flags*/ = 0) {
70 switch (code) {
71 case GRAPHIC_BUFFER: {
72 return reply->write(*mGraphicBuffer);
73 }
74 case GRAPHIC_BUFFER_FROM_BUFFER_HUB_BUFFER: {
75 return reply->write(*mBufferhubBackedGraphicBuffer);
76 }
77 default:
78 return UNKNOWN_TRANSACTION;
79 };
80 }
81
82protected:
83 sp<GraphicBuffer> mGraphicBuffer;
84 sp<GraphicBuffer> mBufferhubBackedGraphicBuffer;
85};
86
87static int runBinderServer() {
88 ProcessState::self()->startThreadPool();
89
90 sp<IServiceManager> sm = defaultServiceManager();
91 sp<GraphicBufferOverBinderTestService> service = new GraphicBufferOverBinderTestService;
92 sm->addService(kTestServiceName, service, false);
93
94 ALOGI("Binder server running...");
95
96 while (true) {
97 int stat, retval;
98 retval = wait(&stat);
99 if (retval == -1 && errno == ECHILD) {
100 break;
101 }
102 }
103
104 ALOGI("Binder server exiting...");
105 return 0;
106}
107
108class GraphicBufferOverBinderTest : public ::testing::TestWithParam<uint32_t> {
109protected:
110 virtual void SetUp() {
111 mService = defaultServiceManager()->getService(kTestServiceName);
112 if (mService == nullptr) {
113 ALOGE("Failed to connect to the test service.");
114 return;
115 }
116
117 ALOGI("Binder service is ready for client.");
118 }
119
120 status_t GetGraphicBuffer(sp<GraphicBuffer>* outBuf, uint32_t opCode) {
121 Parcel data;
122 Parcel reply;
123 status_t error = mService->transact(opCode, data, &reply);
124 if (error != NO_ERROR) {
125 ALOGE("Failed to get graphic buffer over binder, error=%d.", error);
126 return error;
127 }
128
129 *outBuf = new GraphicBuffer();
130 return reply.read(**outBuf);
131 }
132
133private:
134 sp<IBinder> mService;
135};
136
137TEST_F(GraphicBufferOverBinderTest, SendGraphicBufferOverBinder) {
138 sp<GraphicBuffer> gb;
139 EXPECT_EQ(GetGraphicBuffer(&gb, GRAPHIC_BUFFER), OK);
140 EXPECT_NE(gb, nullptr);
141 EXPECT_FALSE(gb->isBufferHubBuffer());
142 void* vaddr;
143 EXPECT_EQ(gb->lock(kTestUsage, &vaddr), OK);
144 EXPECT_EQ(gb->unlock(), OK);
145}
146
147TEST_F(GraphicBufferOverBinderTest, SendGraphicBufferFromBufferHubBufferOverBinder) {
148 sp<GraphicBuffer> gb;
149 EXPECT_EQ(GetGraphicBuffer(&gb, GRAPHIC_BUFFER_FROM_BUFFER_HUB_BUFFER), NO_ERROR);
150 EXPECT_NE(gb, nullptr);
151 EXPECT_TRUE(gb->isBufferHubBuffer());
152 void* vaddr;
153 EXPECT_EQ(gb->lock(kTestUsage, &vaddr), OK);
154 EXPECT_EQ(gb->unlock(), OK);
155}
156
157} // namespace android
158
159int main(int argc, char** argv) {
160 pid_t pid = fork();
161 if (pid == 0) {
162 android::ProcessState::self()->startThreadPool();
163 ::testing::InitGoogleTest(&argc, argv);
164 return RUN_ALL_TESTS();
165
166 } else {
167 ALOGI("Test process pid: %d.", pid);
168 return android::runBinderServer();
169 }
170}