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