13450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk/*
23450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * Copyright (C) 2015 The Android Open Source Project
33450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk *
43450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * Licensed under the Apache License, Version 2.0 (the "License");
53450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * you may not use this file except in compliance with the License.
63450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * You may obtain a copy of the License at
73450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk *
83450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk *      http://www.apache.org/licenses/LICENSE-2.0
93450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk *
103450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * Unless required by applicable law or agreed to in writing, software
113450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * distributed under the License is distributed on an "AS IS" BASIS,
123450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * See the License for the specific language governing permissions and
143450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * limitations under the License.
153450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk */
163450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
173450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#define LOG_NDEBUG 0
183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#define LOG_TAG "CameraBinderTests"
193450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
203450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <binder/IInterface.h>
213450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <binder/IServiceManager.h>
223450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <binder/Parcel.h>
233450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <binder/ProcessState.h>
243450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <utils/Errors.h>
253450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <utils/Log.h>
263450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <utils/List.h>
273450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <utils/String8.h>
283450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <utils/String16.h>
293450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <utils/Condition.h>
303450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <utils/Mutex.h>
313450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <system/graphics.h>
323450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <hardware/gralloc.h>
333450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
343450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <camera/CameraMetadata.h>
35d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/ICameraService.h>
36d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/ICameraServiceListener.h>
37d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/BnCameraServiceListener.h>
38d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/camera2/ICameraDeviceUser.h>
39d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/camera2/ICameraDeviceCallbacks.h>
40d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/camera2/BnCameraDeviceCallbacks.h>
413450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <camera/camera2/CaptureRequest.h>
423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <camera/camera2/OutputConfiguration.h>
43d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <camera/camera2/SubmitInfo.h>
443450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <gui/BufferItemConsumer.h>
463450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <gui/IGraphicBufferProducer.h>
473450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <gui/Surface.h>
483450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <gtest/gtest.h>
503450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <unistd.h>
513450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <stdint.h>
523450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <utility>
533450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <vector>
543450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <map>
553450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <algorithm>
563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkusing namespace android;
583450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
593450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#define ASSERT_NOT_NULL(x) \
603450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    ASSERT_TRUE((x) != nullptr)
613450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
623450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#define SETUP_TIMEOUT 2000000000 // ns
633450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#define IDLE_TIMEOUT 2000000000 // ns
643450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
653450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk// Stub listener implementation
66d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalaclass TestCameraServiceListener : public hardware::BnCameraServiceListener {
67d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    std::map<String16, int32_t> mCameraTorchStatuses;
68f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala    std::map<String16, int32_t> mCameraStatuses;
693450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    mutable Mutex mLock;
703450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    mutable Condition mCondition;
713450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    mutable Condition mTorchCondition;
723450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkpublic:
733450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    virtual ~TestCameraServiceListener() {};
743450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
75f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala    virtual binder::Status onStatusChanged(int32_t status, const String16& cameraId) {
763450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
773450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mCameraStatuses[cameraId] = status;
783450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mCondition.broadcast();
79d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        return binder::Status::ok();
803450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    };
813450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
82d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status onTorchStatusChanged(int32_t status, const String16& cameraId) {
833450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
843450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mCameraTorchStatuses[cameraId] = status;
853450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mTorchCondition.broadcast();
86d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        return binder::Status::ok();
873450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    };
883450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
893450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    bool waitForNumCameras(size_t num) const {
903450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
913450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
923450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        if (mCameraStatuses.size() == num) {
933450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            return true;
943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
953450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
963450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        while (mCameraStatuses.size() < num) {
973450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            if (mCondition.waitRelative(mLock, SETUP_TIMEOUT) != OK) {
983450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk                return false;
993450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            }
1003450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
1013450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        return true;
1023450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    };
1033450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
104d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    bool waitForTorchState(int32_t status, int32_t cameraId) const {
1053450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
1063450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
1073450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        const auto& iter = mCameraTorchStatuses.find(String16(String8::format("%d", cameraId)));
1083450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        if (iter != mCameraTorchStatuses.end() && iter->second == status) {
1093450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            return true;
1103450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
1113450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
1123450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        bool foundStatus = false;
1133450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        while (!foundStatus) {
1143450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            if (mTorchCondition.waitRelative(mLock, SETUP_TIMEOUT) != OK) {
1153450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk                return false;
1163450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            }
1173450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            const auto& iter =
1183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk                    mCameraTorchStatuses.find(String16(String8::format("%d", cameraId)));
1193450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            foundStatus = (iter != mCameraTorchStatuses.end() && iter->second == status);
1203450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
1213450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        return true;
1223450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    };
1233450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
124d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    int32_t getTorchStatus(int32_t cameraId) const {
1253450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
1263450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        const auto& iter = mCameraTorchStatuses.find(String16(String8::format("%d", cameraId)));
1273450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        if (iter == mCameraTorchStatuses.end()) {
128d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            return hardware::ICameraServiceListener::TORCH_STATUS_UNKNOWN;
1293450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
1303450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        return iter->second;
1313450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    };
1323450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
133f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala    int32_t getStatus(const String16& cameraId) const {
1343450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
1353450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        const auto& iter = mCameraStatuses.find(cameraId);
1363450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        if (iter == mCameraStatuses.end()) {
137d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            return hardware::ICameraServiceListener::STATUS_UNKNOWN;
1383450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
1393450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        return iter->second;
1403450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    };
1413450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk};
1423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
1433450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk// Callback implementation
144d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalaclass TestCameraDeviceCallbacks : public hardware::camera2::BnCameraDeviceCallbacks {
1453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkpublic:
1463450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    enum Status {
1473450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        IDLE,
1483450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        ERROR,
1493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        PREPARED,
1503450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        RUNNING,
1513450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        SENT_RESULT,
152e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        UNINITIALIZED,
153e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        REPEATING_REQUEST_ERROR,
1549d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang        REQUEST_QUEUE_EMPTY,
1553450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    };
1563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
1573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkprotected:
1583450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    bool mError;
159d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    int32_t mLastStatus;
160d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    mutable std::vector<int32_t> mStatusesHit;
1613450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    mutable Mutex mLock;
1623450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    mutable Condition mStatusCondition;
1633450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkpublic:
1643450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    TestCameraDeviceCallbacks() : mError(false), mLastStatus(UNINITIALIZED) {}
1653450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
1663450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    virtual ~TestCameraDeviceCallbacks() {}
1673450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
168d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status onDeviceError(int errorCode,
1693450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            const CaptureResultExtras& resultExtras) {
170d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        (void) resultExtras;
1713450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        ALOGE("%s: onDeviceError occurred with: %d", __FUNCTION__, static_cast<int>(errorCode));
1723450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
1733450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mError = true;
1743450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mLastStatus = ERROR;
1753450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusesHit.push_back(mLastStatus);
1763450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusCondition.broadcast();
177d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        return binder::Status::ok();
1783450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
1793450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
180d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status onDeviceIdle() {
1813450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
1823450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mLastStatus = IDLE;
1833450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusesHit.push_back(mLastStatus);
1843450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusCondition.broadcast();
185d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        return binder::Status::ok();
1863450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
1873450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
188d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status onCaptureStarted(const CaptureResultExtras& resultExtras,
1893450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            int64_t timestamp) {
190d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        (void) resultExtras;
191d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        (void) timestamp;
1923450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
1933450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mLastStatus = RUNNING;
1943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusesHit.push_back(mLastStatus);
1953450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusCondition.broadcast();
196d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        return binder::Status::ok();
1973450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
1983450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
1993450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
200d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status onResultReceived(const CameraMetadata& metadata,
2015c22c15ed8c593189ed9bb8fcbccace2ca63b82aShuzhen Wang            const CaptureResultExtras& resultExtras,
2025c22c15ed8c593189ed9bb8fcbccace2ca63b82aShuzhen Wang            const std::vector<PhysicalCaptureResultInfo>& physicalResultInfos) {
203d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        (void) metadata;
204d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        (void) resultExtras;
2055c22c15ed8c593189ed9bb8fcbccace2ca63b82aShuzhen Wang        (void) physicalResultInfos;
2063450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
2073450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mLastStatus = SENT_RESULT;
2083450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusesHit.push_back(mLastStatus);
2093450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusCondition.broadcast();
210d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        return binder::Status::ok();
2113450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
2123450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
213d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status onPrepared(int streamId) {
214d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        (void) streamId;
2153450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
2163450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mLastStatus = PREPARED;
2173450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusesHit.push_back(mLastStatus);
2183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusCondition.broadcast();
219d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        return binder::Status::ok();
2203450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
2213450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2228ca23dca1cd450b4d93e8da1c8bd6f6ee61e2f5fYin-Chia Yeh    virtual binder::Status onRepeatingRequestError(
2238ca23dca1cd450b4d93e8da1c8bd6f6ee61e2f5fYin-Chia Yeh            int64_t lastFrameNumber, int32_t stoppedSequenceId) {
224e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        (void) lastFrameNumber;
2258ca23dca1cd450b4d93e8da1c8bd6f6ee61e2f5fYin-Chia Yeh        (void) stoppedSequenceId;
226e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        Mutex::Autolock l(mLock);
227e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        mLastStatus = REPEATING_REQUEST_ERROR;
228e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        mStatusesHit.push_back(mLastStatus);
229e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        mStatusCondition.broadcast();
230e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        return binder::Status::ok();
231e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen    }
232e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen
2339d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang    virtual binder::Status onRequestQueueEmpty() {
2349d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang        Mutex::Autolock l(mLock);
2359d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang        mLastStatus = REQUEST_QUEUE_EMPTY;
2369d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang        mStatusesHit.push_back(mLastStatus);
2379d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang        mStatusCondition.broadcast();
2389d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang        return binder::Status::ok();
2399d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang    }
2409d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang
2413450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    // Test helper functions:
2423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2433450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    bool hadError() const {
2443450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
2453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        return mError;
2463450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
2473450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2483450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    bool waitForStatus(Status status) const {
2493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
2503450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        if (mLastStatus == status) {
2513450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            return true;
2523450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
2533450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2543450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        while (std::find(mStatusesHit.begin(), mStatusesHit.end(), status)
2553450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk                == mStatusesHit.end()) {
2563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            if (mStatusCondition.waitRelative(mLock, IDLE_TIMEOUT) != OK) {
2583450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk                mStatusesHit.clear();
2593450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk                return false;
2603450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            }
2613450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
2623450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusesHit.clear();
2633450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2643450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        return true;
2653450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2663450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
2673450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2683450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    void clearStatus() const {
2693450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
2703450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusesHit.clear();
2713450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
2723450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2733450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    bool waitForIdle() const {
2743450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        return waitForStatus(IDLE);
2753450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
2763450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2773450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk};
2783450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehnamespace {
2800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    Mutex                     gLock;
2810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    class DeathNotifier : public IBinder::DeathRecipient
2820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    {
2830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    public:
2840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        DeathNotifier() {}
2850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        virtual void binderDied(const wp<IBinder>& /*who*/) {
2870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ALOGV("binderDied");
2880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            Mutex::Autolock _l(gLock);
2890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ALOGW("Camera service died!");
2900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
2910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    };
2920dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    sp<DeathNotifier>         gDeathNotifier;
2930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}; // anonymous namespace
2940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2953450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk// Exercise basic binder calls for the camera service
2963450ba7879be6522ea46a56c5e66e5382f5dd5baRuben BrunkTEST(CameraServiceBinderTest, CheckBinderCameraService) {
2973450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    ProcessState::self()->startThreadPool();
2983450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    sp<IServiceManager> sm = defaultServiceManager();
2993450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    sp<IBinder> binder = sm->getService(String16("media.camera"));
3003450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    ASSERT_NOT_NULL(binder);
3010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (gDeathNotifier == NULL) {
3020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        gDeathNotifier = new DeathNotifier();
3030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
3040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    binder->linkToDeath(gDeathNotifier);
305d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    sp<hardware::ICameraService> service =
306d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            interface_cast<hardware::ICameraService>(binder);
3073450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
308d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    binder::Status res;
3093450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
310d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    int32_t numCameras = 0;
311d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    res = service->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_ALL, &numCameras);
312d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    EXPECT_TRUE(res.isOk()) << res;
3133450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    EXPECT_LE(0, numCameras);
3143450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
3153450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    // Check listener binder calls
3163450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    sp<TestCameraServiceListener> listener(new TestCameraServiceListener());
317f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala    std::vector<hardware::CameraStatus> statuses;
318f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala    res = service->addListener(listener, &statuses);
319d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    EXPECT_TRUE(res.isOk()) << res;
3203450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
321f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala    EXPECT_EQ(numCameras, static_cast<const int>(statuses.size()));
322aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    for (const auto &it : statuses) {
323aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev        listener->onStatusChanged(it.status, String16(it.cameraId));
324aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    }
3253450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
3263450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    for (int32_t i = 0; i < numCameras; i++) {
327f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala        String16 cameraId = String16(String8::format("%d", i));
328d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        bool isSupported = false;
329f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala        res = service->supportsCameraApi(cameraId,
330d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                hardware::ICameraService::API_VERSION_2, &isSupported);
331d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
332d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
3333450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // We only care about binder calls for the Camera2 API.  Camera1 is deprecated.
334d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        if (!isSupported) {
3353450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            continue;
3363450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
3373450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
3383450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Check metadata binder call
3393450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        CameraMetadata metadata;
340f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala        res = service->getCameraCharacteristics(cameraId, &metadata);
341d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
3423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_FALSE(metadata.isEmpty());
3433450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
3443450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Make sure we're available, or skip device tests otherwise
345f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala        int32_t s = listener->getStatus(cameraId);
346d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_EQ(::android::hardware::ICameraServiceListener::STATUS_PRESENT, s);
347d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        if (s != ::android::hardware::ICameraServiceListener::STATUS_PRESENT) {
3483450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            continue;
3493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
3503450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
3513450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Check connect binder calls
3523450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<TestCameraDeviceCallbacks> callbacks(new TestCameraDeviceCallbacks());
353d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        sp<hardware::camera2::ICameraDeviceUser> device;
354f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala        res = service->connectDevice(callbacks, cameraId, String16("meeeeeeeee!"),
355d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                hardware::ICameraService::USE_CALLING_UID, /*out*/&device);
356d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
3573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        ASSERT_NE(nullptr, device.get());
3583450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        device->disconnect();
3593450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_FALSE(callbacks->hadError());
3603450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
361d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        int32_t torchStatus = listener->getTorchStatus(i);
362d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        if (torchStatus == hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF) {
3633450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            // Check torch calls
364f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala            res = service->setTorchMode(cameraId,
365d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                    /*enabled*/true, callbacks);
366d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            EXPECT_TRUE(res.isOk()) << res;
3673450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            EXPECT_TRUE(listener->waitForTorchState(
368d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                    hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_ON, i));
369f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala            res = service->setTorchMode(cameraId,
370d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                    /*enabled*/false, callbacks);
371d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            EXPECT_TRUE(res.isOk()) << res;
3723450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            EXPECT_TRUE(listener->waitForTorchState(
373d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                    hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF, i));
3743450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
3753450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
3763450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
377d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    res = service->removeListener(listener);
378d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    EXPECT_TRUE(res.isOk()) << res;
3793450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk}
3803450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
3813450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk// Test fixture for client focused binder tests
3823450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkclass CameraClientBinderTest : public testing::Test {
3833450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkprotected:
384d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    sp<hardware::ICameraService> service;
3853450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    int32_t numCameras;
386d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    std::vector<std::pair<sp<TestCameraDeviceCallbacks>, sp<hardware::camera2::ICameraDeviceUser>>>
387d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            openDeviceList;
3883450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    sp<TestCameraServiceListener> serviceListener;
3893450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
390d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    std::pair<sp<TestCameraDeviceCallbacks>, sp<hardware::camera2::ICameraDeviceUser>>
391f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala            openNewDevice(const String16& deviceId) {
3923450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<TestCameraDeviceCallbacks> callbacks(new TestCameraDeviceCallbacks());
393d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        sp<hardware::camera2::ICameraDeviceUser> device;
3943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        {
3953450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            SCOPED_TRACE("openNewDevice");
396d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            binder::Status res = service->connectDevice(callbacks, deviceId, String16("meeeeeeeee!"),
397d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                    hardware::ICameraService::USE_CALLING_UID, /*out*/&device);
398d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            EXPECT_TRUE(res.isOk()) << res;
3993450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
4003450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        auto p = std::make_pair(callbacks, device);
4013450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        openDeviceList.push_back(p);
4023450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        return p;
4033450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
4043450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
405d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    void closeDevice(std::pair<sp<TestCameraDeviceCallbacks>,
406d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            sp<hardware::camera2::ICameraDeviceUser>>& p) {
4073450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        if (p.second.get() != nullptr) {
408d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            binder::Status res = p.second->disconnect();
409d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            EXPECT_TRUE(res.isOk()) << res;
4103450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            {
4113450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk                SCOPED_TRACE("closeDevice");
4123450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk                EXPECT_FALSE(p.first->hadError());
4133450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            }
4143450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
4153450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        auto iter = std::find(openDeviceList.begin(), openDeviceList.end(), p);
4163450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        if (iter != openDeviceList.end()) {
4173450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            openDeviceList.erase(iter);
4183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
4193450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
4203450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4213450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    virtual void SetUp() {
4223450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        ProcessState::self()->startThreadPool();
4233450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<IServiceManager> sm = defaultServiceManager();
4243450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<IBinder> binder = sm->getService(String16("media.camera"));
425d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        service = interface_cast<hardware::ICameraService>(binder);
4263450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        serviceListener = new TestCameraServiceListener();
427f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala        std::vector<hardware::CameraStatus> statuses;
428f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala        service->addListener(serviceListener, &statuses);
429aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev        for (const auto &it : statuses) {
430aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev            serviceListener->onStatusChanged(it.status, String16(it.cameraId));
431aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev        }
432d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        service->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_BACKWARD_COMPATIBLE,
433d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                &numCameras);
4343450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
4353450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4363450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    virtual void TearDown() {
4373450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        service = nullptr;
4383450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        numCameras = 0;
4393450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        for (auto& p : openDeviceList) {
4403450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            closeDevice(p);
4413450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
4423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
4433450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4443450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk};
4453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4463450ba7879be6522ea46a56c5e66e5382f5dd5baRuben BrunkTEST_F(CameraClientBinderTest, CheckBinderCameraDeviceUser) {
4473450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    ASSERT_NOT_NULL(service);
4483450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    EXPECT_TRUE(serviceListener->waitForNumCameras(numCameras));
4493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    for (int32_t i = 0; i < numCameras; i++) {
450aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev        String8 cameraId8 = String8::format("%d", i);
4513450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Make sure we're available, or skip device tests otherwise
452aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev        String16 cameraId(cameraId8);
453f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala        int32_t s = serviceListener->getStatus(cameraId);
454d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_EQ(hardware::ICameraServiceListener::STATUS_PRESENT, s);
455d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        if (s != hardware::ICameraServiceListener::STATUS_PRESENT) {
4563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            continue;
4573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
458d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        binder::Status res;
459f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala        auto p = openNewDevice(cameraId);
4603450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<TestCameraDeviceCallbacks> callbacks = p.first;
461d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        sp<hardware::camera2::ICameraDeviceUser> device = p.second;
4623450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4633450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Setup a buffer queue; I'm just using the vendor opaque format here as that is
4643450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // guaranteed to be present
4653450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<IGraphicBufferProducer> gbProducer;
4663450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<IGraphicBufferConsumer> gbConsumer;
4673450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        BufferQueue::createBufferQueue(&gbProducer, &gbConsumer);
4683450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<BufferItemConsumer> opaqueConsumer = new BufferItemConsumer(gbConsumer,
4693450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk                GRALLOC_USAGE_SW_READ_NEVER, /*maxImages*/2, /*controlledByApp*/true);
4703450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_TRUE(opaqueConsumer.get() != nullptr);
4713450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        opaqueConsumer->setName(String8("nom nom nom"));
4723450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4733450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Set to VGA dimens for default, as that is guaranteed to be present
4743450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_EQ(OK, gbConsumer->setDefaultBufferSize(640, 480));
4753450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_EQ(OK, gbConsumer->setDefaultBufferFormat(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED));
4763450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4773450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<Surface> surface(new Surface(gbProducer, /*controlledByApp*/false));
4783450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4793450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        OutputConfiguration output(gbProducer, /*rotation*/0);
4803450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4813450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Can we configure?
482d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->beginConfigure();
483d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
484d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        status_t streamId;
485d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->createStream(output, &streamId);
486d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
4873450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_LE(0, streamId);
4885fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev        CameraMetadata sessionParams;
4895fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev        res = device->endConfigure(/*isConstrainedHighSpeed*/ false, sessionParams);
490d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
4913450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_FALSE(callbacks->hadError());
4923450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4933450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Can we make requests?
4943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        CameraMetadata requestTemplate;
495d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->createDefaultRequest(/*preview template*/1,
496d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                /*out*/&requestTemplate);
497d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
498d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
499d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        hardware::camera2::CaptureRequest request;
500aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev        request.mPhysicalCameraSettings.push_back({cameraId8.string(), requestTemplate});
501d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request.mSurfaceList.add(surface);
502d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request.mIsReprocess = false;
5033450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        int64_t lastFrameNumber = 0;
5043450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        int64_t lastFrameNumberPrev = 0;
5053450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        callbacks->clearStatus();
506d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
507d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        hardware::camera2::utils::SubmitInfo info;
508d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->submitRequest(request, /*streaming*/true, /*out*/&info);
509d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
5103450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT));
511d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_LE(0, info.mRequestId);
5123450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
5133450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Can we stop requests?
514d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->cancelRequest(info.mRequestId, /*out*/&lastFrameNumber);
515d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
5163450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_TRUE(callbacks->waitForIdle());
5173450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_FALSE(callbacks->hadError());
5183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
5193450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Can we do it again?
520d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        lastFrameNumberPrev = info.mLastFrameNumber;
5213450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        lastFrameNumber = 0;
5223450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        requestTemplate.clear();
523d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW,
524d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                /*out*/&requestTemplate);
525d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
526d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        hardware::camera2::CaptureRequest request2;
527aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev        request2.mPhysicalCameraSettings.push_back({cameraId8.string(), requestTemplate});
528d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request2.mSurfaceList.add(surface);
529d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request2.mIsReprocess = false;
5303450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        callbacks->clearStatus();
531d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        hardware::camera2::utils::SubmitInfo info2;
532d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->submitRequest(request2, /*streaming*/true,
533d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                /*out*/&info2);
534d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
535d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_EQ(hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES,
536d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                info2.mLastFrameNumber);
5373450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        lastFrameNumber = 0;
5383450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT));
539d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_LE(0, info2.mRequestId);
540d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->cancelRequest(info2.mRequestId, /*out*/&lastFrameNumber);
541d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
5423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_TRUE(callbacks->waitForIdle());
5433450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_LE(lastFrameNumberPrev, lastFrameNumber);
5443450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sleep(/*second*/1); // allow some time for errors to show up, if any
5453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_FALSE(callbacks->hadError());
5463450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
5473450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Can we do it with a request list?
5483450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        lastFrameNumberPrev = lastFrameNumber;
5493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        lastFrameNumber = 0;
5503450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        requestTemplate.clear();
5513450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        CameraMetadata requestTemplate2;
552d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW,
553d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                /*out*/&requestTemplate);
554d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
555d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW,
556d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                /*out*/&requestTemplate2);
557d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
558d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        android::hardware::camera2::CaptureRequest request3;
559d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        android::hardware::camera2::CaptureRequest request4;
560aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev        request3.mPhysicalCameraSettings.push_back({cameraId8.string(), requestTemplate});
561d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request3.mSurfaceList.add(surface);
562d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request3.mIsReprocess = false;
563aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev        request4.mPhysicalCameraSettings.push_back({cameraId8.string(), requestTemplate2});
564d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request4.mSurfaceList.add(surface);
565d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request4.mIsReprocess = false;
566d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        std::vector<hardware::camera2::CaptureRequest> requestList;
5673450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        requestList.push_back(request3);
5683450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        requestList.push_back(request4);
5693450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
5703450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        callbacks->clearStatus();
571d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        hardware::camera2::utils::SubmitInfo info3;
572d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->submitRequestList(requestList, /*streaming*/false,
573d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                /*out*/&info3);
574d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
575d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_LE(0, info3.mRequestId);
5763450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT));
5773450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_TRUE(callbacks->waitForIdle());
578d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_LE(lastFrameNumberPrev, info3.mLastFrameNumber);
5793450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sleep(/*second*/1); // allow some time for errors to show up, if any
5803450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_FALSE(callbacks->hadError());
5813450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
5823450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Can we unconfigure?
583d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->beginConfigure();
584d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
585d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->deleteStream(streamId);
586d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
5875fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev        res = device->endConfigure(/*isConstrainedHighSpeed*/ false, sessionParams);
588d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
589d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
5903450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sleep(/*second*/1); // allow some time for errors to show up, if any
5913450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_FALSE(callbacks->hadError());
5923450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
5933450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        closeDevice(p);
5943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
5953450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
5963450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk};
597aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev
598aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian PeevTEST_F(CameraClientBinderTest, CheckBinderCaptureRequest) {
599aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    sp<CaptureRequest> requestOriginal, requestParceled;
600aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    sp<IGraphicBufferProducer> gbProducer;
601aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    sp<IGraphicBufferConsumer> gbConsumer;
602aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    BufferQueue::createBufferQueue(&gbProducer, &gbConsumer);
603aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    sp<Surface> surface(new Surface(gbProducer, /*controlledByApp*/false));
604aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    Vector<sp<Surface>> surfaceList;
605aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    surfaceList.push_back(surface);
606aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    std::string physicalDeviceId1 = "0";
607aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    std::string physicalDeviceId2 = "1";
608aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    CameraMetadata physicalDeviceSettings1, physicalDeviceSettings2;
609aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    uint8_t intent1 = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
610aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    uint8_t intent2 = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
611aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_EQ(OK, physicalDeviceSettings1.update(ANDROID_CONTROL_CAPTURE_INTENT, &intent1, 1));
612aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_EQ(OK, physicalDeviceSettings2.update(ANDROID_CONTROL_CAPTURE_INTENT, &intent2, 1));
613aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev
614aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    requestParceled = new CaptureRequest();
615aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    Parcel p;
616aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_TRUE(requestParceled->readFromParcel(&p) != OK);
617aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    p.writeInt32(0);
618aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    p.setDataPosition(0);
619aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_TRUE(requestParceled->readFromParcel(&p) != OK);
620aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    p.freeData();
621aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    p.writeInt32(-1);
622aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    p.setDataPosition(0);
623aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_TRUE(requestParceled->readFromParcel(&p) != OK);
624aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    p.freeData();
625aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    p.writeInt32(1);
626aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    p.setDataPosition(0);
627aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_TRUE(requestParceled->readFromParcel(&p) != OK);
628aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev
629aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    requestOriginal = new CaptureRequest();
630aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    requestOriginal->mPhysicalCameraSettings.push_back({physicalDeviceId1,
631aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev            physicalDeviceSettings1});
632aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    requestOriginal->mPhysicalCameraSettings.push_back({physicalDeviceId2,
633aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev            physicalDeviceSettings2});
634aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    requestOriginal->mSurfaceList.push_back(surface);
635aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    requestOriginal->mIsReprocess = false;
636aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    requestOriginal->mSurfaceConverted = false;
637aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev
638aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    p.freeData();
639aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_TRUE(requestOriginal->writeToParcel(&p) == OK);
640aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    p.setDataPosition(0);
641aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_TRUE(requestParceled->readFromParcel(&p) == OK);
642aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_EQ(requestParceled->mIsReprocess, false);
643aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_FALSE(requestParceled->mSurfaceList.empty());
644aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_EQ(2u, requestParceled->mPhysicalCameraSettings.size());
645aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    auto it = requestParceled->mPhysicalCameraSettings.begin();
646aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_EQ(physicalDeviceId1, it->id);
647aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_TRUE(it->settings.exists(ANDROID_CONTROL_CAPTURE_INTENT));
648aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    auto entry = it->settings.find(ANDROID_CONTROL_CAPTURE_INTENT);
649aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_EQ(entry.data.u8[0], intent1);
650aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    it++;
651aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_EQ(physicalDeviceId2, it->id);
652aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_TRUE(it->settings.exists(ANDROID_CONTROL_CAPTURE_INTENT));
653aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    entry = it->settings.find(ANDROID_CONTROL_CAPTURE_INTENT);
654aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev    EXPECT_EQ(entry.data.u8[0], intent2);
655aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev};
656