1c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai/*
2c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai * Copyright (C) 2018 The Android Open Source Project
3c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai *
4c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai * Licensed under the Apache License, Version 2.0 (the "License");
5c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai * you may not use this file except in compliance with the License.
6c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai * You may obtain a copy of the License at
7c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai *
8c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai *      http://www.apache.org/licenses/LICENSE-2.0
9c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai *
10c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai * Unless required by applicable law or agreed to in writing, software
11c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai * distributed under the License is distributed on an "AS IS" BASIS,
12c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai * See the License for the specific language governing permissions and
14c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai * limitations under the License.
15c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai */
16c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
17c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai#define LOG_TAG "SurfaceParcelable_test"
18c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
19c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai#include <gtest/gtest.h>
20c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
21c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai#include <binder/IServiceManager.h>
22c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai#include <binder/ProcessState.h>
23c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai#include <gui/BufferHubProducer.h>
24c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai#include <gui/BufferQueue.h>
25c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai#include <gui/view/Surface.h>
26c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai#include <utils/Log.h>
27c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
28c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cainamespace android {
29c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
30c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caistatic const String16 kTestServiceName = String16("SurfaceParcelableTestService");
31c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caistatic const String16 kSurfaceName = String16("TEST_SURFACE");
32c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caistatic const uint32_t kBufferWidth = 100;
33c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caistatic const uint32_t kBufferHeight = 1;
34c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caistatic const uint32_t kBufferFormat = HAL_PIXEL_FORMAT_BLOB;
35c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
36c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caienum SurfaceParcelableTestServiceCode {
37c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    CREATE_BUFFER_QUEUE_SURFACE = IBinder::FIRST_CALL_TRANSACTION,
38c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    CREATE_BUFFER_HUB_SURFACE,
39c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai};
40c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
41c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caiclass SurfaceParcelableTestService : public BBinder {
42c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caipublic:
43c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    SurfaceParcelableTestService() {
44c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        // BufferQueue
45c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        BufferQueue::createBufferQueue(&mBufferQueueProducer, &mBufferQueueConsumer);
46c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
47c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        // BufferHub
48c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        dvr::ProducerQueueConfigBuilder configBuilder;
49c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        mProducerQueue = dvr::ProducerQueue::Create(configBuilder.SetDefaultWidth(kBufferWidth)
50c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                                                            .SetDefaultHeight(kBufferHeight)
51c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                                                            .SetDefaultFormat(kBufferFormat)
52c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                                                            .Build(),
53c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                                                    dvr::UsagePolicy{});
54c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        mBufferHubProducer = BufferHubProducer::Create(mProducerQueue);
55c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    }
56c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
57c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    ~SurfaceParcelableTestService() = default;
58c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
59c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    virtual status_t onTransact(uint32_t code, const Parcel& /*data*/, Parcel* reply,
60c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                                uint32_t /*flags*/ = 0) {
61c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        switch (code) {
62c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            case CREATE_BUFFER_QUEUE_SURFACE: {
63c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                view::Surface surfaceShim;
64c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                surfaceShim.name = kSurfaceName;
65c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                surfaceShim.graphicBufferProducer = mBufferQueueProducer;
66c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                return surfaceShim.writeToParcel(reply);
67c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            }
68c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            case CREATE_BUFFER_HUB_SURFACE: {
69c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                view::Surface surfaceShim;
70c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                surfaceShim.name = kSurfaceName;
71c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                surfaceShim.graphicBufferProducer = mBufferHubProducer;
72c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                return surfaceShim.writeToParcel(reply);
73c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            }
74c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            default:
75c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                return UNKNOWN_TRANSACTION;
76c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        };
77c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    }
78c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
79c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caiprotected:
80c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    sp<IGraphicBufferProducer> mBufferQueueProducer;
81c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    sp<IGraphicBufferConsumer> mBufferQueueConsumer;
82c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
83c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    std::shared_ptr<dvr::ProducerQueue> mProducerQueue;
84c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    sp<IGraphicBufferProducer> mBufferHubProducer;
85c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai};
86c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
87c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caistatic int runBinderServer() {
88c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    ProcessState::self()->startThreadPool();
89c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
90c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    sp<IServiceManager> sm = defaultServiceManager();
91c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    sp<SurfaceParcelableTestService> service = new SurfaceParcelableTestService;
92c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    sm->addService(kTestServiceName, service, false);
93c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
94c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    ALOGI("Binder server running...");
95c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
96c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    while (true) {
97c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        int stat, retval;
98c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        retval = wait(&stat);
99c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        if (retval == -1 && errno == ECHILD) {
100c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            break;
101c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        }
102c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    }
103c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
104c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    ALOGI("Binder server exiting...");
105c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    return 0;
106c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai}
107c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
108c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caiclass SurfaceParcelableTest : public ::testing::TestWithParam<uint32_t> {
109c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caiprotected:
110c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    virtual void SetUp() {
111c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        mService = defaultServiceManager()->getService(kTestServiceName);
112c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        if (mService == nullptr) {
113c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            ALOGE("Failed to connect to the test service.");
114c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            return;
115c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        }
116c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
117c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        ALOGI("Binder service is ready for client.");
118c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    }
119c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
120c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    status_t GetSurface(view::Surface* surfaceShim) {
121c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        ALOGI("...Test: %d", GetParam());
122c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
123c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        uint32_t opCode = GetParam();
124c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        Parcel data;
125c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        Parcel reply;
126c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        status_t error = mService->transact(opCode, data, &reply);
127c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        if (error != NO_ERROR) {
128c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            ALOGE("Failed to get surface over binder, error=%d.", error);
129c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            return error;
130c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        }
131c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
132c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        error = surfaceShim->readFromParcel(&reply);
133c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        if (error != NO_ERROR) {
134c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            ALOGE("Failed to get surface from parcel, error=%d.", error);
135c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            return error;
136c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        }
137c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
138c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        return NO_ERROR;
139c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    }
140c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
141c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caiprivate:
142c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    sp<IBinder> mService;
143c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai};
144c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
145c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' CaiTEST_P(SurfaceParcelableTest, SendOverBinder) {
146c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    view::Surface surfaceShim;
147c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    EXPECT_EQ(GetSurface(&surfaceShim), NO_ERROR);
148c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    EXPECT_EQ(surfaceShim.name, kSurfaceName);
149c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    EXPECT_FALSE(surfaceShim.graphicBufferProducer == nullptr);
150c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai}
151c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
152c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' CaiINSTANTIATE_TEST_CASE_P(SurfaceBackends, SurfaceParcelableTest,
153c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                        ::testing::Values(CREATE_BUFFER_QUEUE_SURFACE, CREATE_BUFFER_HUB_SURFACE));
154c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
155c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai} // namespace android
156c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
157c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caiint main(int argc, char** argv) {
158c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    pid_t pid = fork();
159c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    if (pid == 0) {
160c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        android::ProcessState::self()->startThreadPool();
161c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        ::testing::InitGoogleTest(&argc, argv);
162c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        return RUN_ALL_TESTS();
163c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
164c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    } else {
165c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        ALOGI("Test process pid: %d.", pid);
166c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        return android::runBinderServer();
167c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    }
168c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai}
169