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;
68d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    std::map<int32_t, 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
75d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status onStatusChanged(int32_t status, int32_t 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
133d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    int32_t getStatus(int32_t 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,
1543450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    };
1553450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
1563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkprotected:
1573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    bool mError;
158d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    int32_t mLastStatus;
159d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    mutable std::vector<int32_t> mStatusesHit;
1603450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    mutable Mutex mLock;
1613450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    mutable Condition mStatusCondition;
1623450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkpublic:
1633450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    TestCameraDeviceCallbacks() : mError(false), mLastStatus(UNINITIALIZED) {}
1643450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
1653450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    virtual ~TestCameraDeviceCallbacks() {}
1663450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
167d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status onDeviceError(int errorCode,
1683450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            const CaptureResultExtras& resultExtras) {
169d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        (void) resultExtras;
1703450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        ALOGE("%s: onDeviceError occurred with: %d", __FUNCTION__, static_cast<int>(errorCode));
1713450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
1723450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mError = true;
1733450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mLastStatus = ERROR;
1743450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusesHit.push_back(mLastStatus);
1753450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusCondition.broadcast();
176d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        return binder::Status::ok();
1773450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
1783450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
179d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status onDeviceIdle() {
1803450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
1813450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mLastStatus = IDLE;
1823450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusesHit.push_back(mLastStatus);
1833450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusCondition.broadcast();
184d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        return binder::Status::ok();
1853450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
1863450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
187d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status onCaptureStarted(const CaptureResultExtras& resultExtras,
1883450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            int64_t timestamp) {
189d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        (void) resultExtras;
190d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        (void) timestamp;
1913450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
1923450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mLastStatus = RUNNING;
1933450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusesHit.push_back(mLastStatus);
1943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusCondition.broadcast();
195d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        return binder::Status::ok();
1963450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
1973450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
1983450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
199d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status onResultReceived(const CameraMetadata& metadata,
2003450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            const CaptureResultExtras& resultExtras) {
201d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        (void) metadata;
202d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        (void) resultExtras;
2033450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
2043450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mLastStatus = SENT_RESULT;
2053450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusesHit.push_back(mLastStatus);
2063450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusCondition.broadcast();
207d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        return binder::Status::ok();
2083450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
2093450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
210d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual binder::Status onPrepared(int streamId) {
211d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        (void) streamId;
2123450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
2133450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mLastStatus = PREPARED;
2143450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusesHit.push_back(mLastStatus);
2153450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusCondition.broadcast();
216d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        return binder::Status::ok();
2173450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
2183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
219e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen    virtual binder::Status onRepeatingRequestError(int64_t lastFrameNumber) {
220e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        (void) lastFrameNumber;
221e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        Mutex::Autolock l(mLock);
222e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        mLastStatus = REPEATING_REQUEST_ERROR;
223e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        mStatusesHit.push_back(mLastStatus);
224e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        mStatusCondition.broadcast();
225e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        return binder::Status::ok();
226e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen    }
227e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen
2283450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    // Test helper functions:
2293450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2303450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    bool hadError() const {
2313450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
2323450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        return mError;
2333450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
2343450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2353450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    bool waitForStatus(Status status) const {
2363450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
2373450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        if (mLastStatus == status) {
2383450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            return true;
2393450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
2403450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2413450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        while (std::find(mStatusesHit.begin(), mStatusesHit.end(), status)
2423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk                == mStatusesHit.end()) {
2433450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2443450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            if (mStatusCondition.waitRelative(mLock, IDLE_TIMEOUT) != OK) {
2453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk                mStatusesHit.clear();
2463450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk                return false;
2473450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            }
2483450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
2493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusesHit.clear();
2503450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2513450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        return true;
2523450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2533450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
2543450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2553450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    void clearStatus() const {
2563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        Mutex::Autolock l(mLock);
2573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        mStatusesHit.clear();
2583450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
2593450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2603450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    bool waitForIdle() const {
2613450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        return waitForStatus(IDLE);
2623450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
2633450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2643450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk};
2653450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
2660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehnamespace {
2670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    Mutex                     gLock;
2680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    class DeathNotifier : public IBinder::DeathRecipient
2690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    {
2700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    public:
2710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        DeathNotifier() {}
2720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        virtual void binderDied(const wp<IBinder>& /*who*/) {
2740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ALOGV("binderDied");
2750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            Mutex::Autolock _l(gLock);
2760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ALOGW("Camera service died!");
2770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        }
2780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    };
2790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    sp<DeathNotifier>         gDeathNotifier;
2800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}; // anonymous namespace
2810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2823450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk// Exercise basic binder calls for the camera service
2833450ba7879be6522ea46a56c5e66e5382f5dd5baRuben BrunkTEST(CameraServiceBinderTest, CheckBinderCameraService) {
2843450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    ProcessState::self()->startThreadPool();
2853450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    sp<IServiceManager> sm = defaultServiceManager();
2863450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    sp<IBinder> binder = sm->getService(String16("media.camera"));
2873450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    ASSERT_NOT_NULL(binder);
2880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    if (gDeathNotifier == NULL) {
2890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        gDeathNotifier = new DeathNotifier();
2900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
2910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    binder->linkToDeath(gDeathNotifier);
292d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    sp<hardware::ICameraService> service =
293d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            interface_cast<hardware::ICameraService>(binder);
2943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
295d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    binder::Status res;
2963450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
297d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    int32_t numCameras = 0;
298d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    res = service->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_ALL, &numCameras);
299d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    EXPECT_TRUE(res.isOk()) << res;
3003450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    EXPECT_LE(0, numCameras);
3013450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
3023450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    // Check listener binder calls
3033450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    sp<TestCameraServiceListener> listener(new TestCameraServiceListener());
304d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    res = service->addListener(listener);
305d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    EXPECT_TRUE(res.isOk()) << res;
3063450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
3073450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    EXPECT_TRUE(listener->waitForNumCameras(numCameras));
3083450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
3093450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    for (int32_t i = 0; i < numCameras; i++) {
310d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        bool isSupported = false;
311d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = service->supportsCameraApi(i,
312d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                hardware::ICameraService::API_VERSION_2, &isSupported);
313d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
314d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
3153450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // We only care about binder calls for the Camera2 API.  Camera1 is deprecated.
316d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        if (!isSupported) {
3173450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            continue;
3183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
3193450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
3203450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Check metadata binder call
3213450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        CameraMetadata metadata;
322d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = service->getCameraCharacteristics(i, &metadata);
323d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
3243450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_FALSE(metadata.isEmpty());
3253450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
3263450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Make sure we're available, or skip device tests otherwise
327d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        int32_t s = listener->getStatus(i);
328d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_EQ(::android::hardware::ICameraServiceListener::STATUS_PRESENT, s);
329d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        if (s != ::android::hardware::ICameraServiceListener::STATUS_PRESENT) {
3303450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            continue;
3313450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
3323450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
3333450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Check connect binder calls
3343450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<TestCameraDeviceCallbacks> callbacks(new TestCameraDeviceCallbacks());
335d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        sp<hardware::camera2::ICameraDeviceUser> device;
336d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = service->connectDevice(callbacks, i, String16("meeeeeeeee!"),
337d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                hardware::ICameraService::USE_CALLING_UID, /*out*/&device);
338d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
3393450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        ASSERT_NE(nullptr, device.get());
3403450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        device->disconnect();
3413450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_FALSE(callbacks->hadError());
3423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
343d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        int32_t torchStatus = listener->getTorchStatus(i);
344d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        if (torchStatus == hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF) {
3453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            // Check torch calls
346d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            res = service->setTorchMode(String16(String8::format("%d", i)),
347d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                    /*enabled*/true, callbacks);
348d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            EXPECT_TRUE(res.isOk()) << res;
3493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            EXPECT_TRUE(listener->waitForTorchState(
350d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                    hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_ON, i));
351d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            res = service->setTorchMode(String16(String8::format("%d", i)),
352d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                    /*enabled*/false, callbacks);
353d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            EXPECT_TRUE(res.isOk()) << res;
3543450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            EXPECT_TRUE(listener->waitForTorchState(
355d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                    hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF, i));
3563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
3573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
3583450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
359d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    res = service->removeListener(listener);
360d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    EXPECT_TRUE(res.isOk()) << res;
3613450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk}
3623450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
3633450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk// Test fixture for client focused binder tests
3643450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkclass CameraClientBinderTest : public testing::Test {
3653450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkprotected:
366d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    sp<hardware::ICameraService> service;
3673450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    int32_t numCameras;
368d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    std::vector<std::pair<sp<TestCameraDeviceCallbacks>, sp<hardware::camera2::ICameraDeviceUser>>>
369d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            openDeviceList;
3703450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    sp<TestCameraServiceListener> serviceListener;
3713450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
372d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    std::pair<sp<TestCameraDeviceCallbacks>, sp<hardware::camera2::ICameraDeviceUser>>
373d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            openNewDevice(int deviceId) {
3743450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<TestCameraDeviceCallbacks> callbacks(new TestCameraDeviceCallbacks());
375d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        sp<hardware::camera2::ICameraDeviceUser> device;
3763450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        {
3773450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            SCOPED_TRACE("openNewDevice");
378d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            binder::Status res = service->connectDevice(callbacks, deviceId, String16("meeeeeeeee!"),
379d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                    hardware::ICameraService::USE_CALLING_UID, /*out*/&device);
380d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            EXPECT_TRUE(res.isOk()) << res;
3813450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
3823450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        auto p = std::make_pair(callbacks, device);
3833450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        openDeviceList.push_back(p);
3843450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        return p;
3853450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
3863450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
387d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    void closeDevice(std::pair<sp<TestCameraDeviceCallbacks>,
388d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            sp<hardware::camera2::ICameraDeviceUser>>& p) {
3893450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        if (p.second.get() != nullptr) {
390d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            binder::Status res = p.second->disconnect();
391d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala            EXPECT_TRUE(res.isOk()) << res;
3923450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            {
3933450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk                SCOPED_TRACE("closeDevice");
3943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk                EXPECT_FALSE(p.first->hadError());
3953450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            }
3963450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
3973450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        auto iter = std::find(openDeviceList.begin(), openDeviceList.end(), p);
3983450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        if (iter != openDeviceList.end()) {
3993450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            openDeviceList.erase(iter);
4003450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
4013450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
4023450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4033450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    virtual void SetUp() {
4043450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        ProcessState::self()->startThreadPool();
4053450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<IServiceManager> sm = defaultServiceManager();
4063450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<IBinder> binder = sm->getService(String16("media.camera"));
407d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        service = interface_cast<hardware::ICameraService>(binder);
4083450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        serviceListener = new TestCameraServiceListener();
4093450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        service->addListener(serviceListener);
410d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        service->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_BACKWARD_COMPATIBLE,
411d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                &numCameras);
4123450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
4133450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4143450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    virtual void TearDown() {
4153450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        service = nullptr;
4163450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        numCameras = 0;
4173450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        for (auto& p : openDeviceList) {
4183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            closeDevice(p);
4193450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
4203450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
4213450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4223450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk};
4233450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4243450ba7879be6522ea46a56c5e66e5382f5dd5baRuben BrunkTEST_F(CameraClientBinderTest, CheckBinderCameraDeviceUser) {
4253450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    ASSERT_NOT_NULL(service);
4263450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    EXPECT_TRUE(serviceListener->waitForNumCameras(numCameras));
4273450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    for (int32_t i = 0; i < numCameras; i++) {
4283450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Make sure we're available, or skip device tests otherwise
429d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        int32_t s = serviceListener->getStatus(i);
430d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_EQ(hardware::ICameraServiceListener::STATUS_PRESENT, s);
431d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        if (s != hardware::ICameraServiceListener::STATUS_PRESENT) {
4323450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk            continue;
4333450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        }
434d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        binder::Status res;
4353450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4363450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        auto p = openNewDevice(i);
4373450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<TestCameraDeviceCallbacks> callbacks = p.first;
438d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        sp<hardware::camera2::ICameraDeviceUser> device = p.second;
4393450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4403450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Setup a buffer queue; I'm just using the vendor opaque format here as that is
4413450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // guaranteed to be present
4423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<IGraphicBufferProducer> gbProducer;
4433450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<IGraphicBufferConsumer> gbConsumer;
4443450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        BufferQueue::createBufferQueue(&gbProducer, &gbConsumer);
4453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<BufferItemConsumer> opaqueConsumer = new BufferItemConsumer(gbConsumer,
4463450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk                GRALLOC_USAGE_SW_READ_NEVER, /*maxImages*/2, /*controlledByApp*/true);
4473450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_TRUE(opaqueConsumer.get() != nullptr);
4483450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        opaqueConsumer->setName(String8("nom nom nom"));
4493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4503450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Set to VGA dimens for default, as that is guaranteed to be present
4513450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_EQ(OK, gbConsumer->setDefaultBufferSize(640, 480));
4523450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_EQ(OK, gbConsumer->setDefaultBufferFormat(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED));
4533450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4543450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sp<Surface> surface(new Surface(gbProducer, /*controlledByApp*/false));
4553450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        OutputConfiguration output(gbProducer, /*rotation*/0);
4573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4583450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Can we configure?
459d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->beginConfigure();
460d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
461d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        status_t streamId;
462d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->createStream(output, &streamId);
463d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
4643450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_LE(0, streamId);
465d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->endConfigure(/*isConstrainedHighSpeed*/ false);
466d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
4673450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_FALSE(callbacks->hadError());
4683450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4693450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Can we make requests?
4703450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        CameraMetadata requestTemplate;
471d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->createDefaultRequest(/*preview template*/1,
472d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                /*out*/&requestTemplate);
473d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
474d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
475d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        hardware::camera2::CaptureRequest request;
476d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request.mMetadata = requestTemplate;
477d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request.mSurfaceList.add(surface);
478d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request.mIsReprocess = false;
4793450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        int64_t lastFrameNumber = 0;
4803450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        int64_t lastFrameNumberPrev = 0;
4813450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        callbacks->clearStatus();
482d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
483d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        hardware::camera2::utils::SubmitInfo info;
484d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->submitRequest(request, /*streaming*/true, /*out*/&info);
485d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
4863450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT));
487d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_LE(0, info.mRequestId);
4883450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4893450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Can we stop requests?
490d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->cancelRequest(info.mRequestId, /*out*/&lastFrameNumber);
491d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
4923450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_TRUE(callbacks->waitForIdle());
4933450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_FALSE(callbacks->hadError());
4943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
4953450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Can we do it again?
496d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        lastFrameNumberPrev = info.mLastFrameNumber;
4973450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        lastFrameNumber = 0;
4983450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        requestTemplate.clear();
499d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW,
500d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                /*out*/&requestTemplate);
501d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
502d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        hardware::camera2::CaptureRequest request2;
503d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request2.mMetadata = requestTemplate;
504d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request2.mSurfaceList.add(surface);
505d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request2.mIsReprocess = false;
5063450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        callbacks->clearStatus();
507d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        hardware::camera2::utils::SubmitInfo info2;
508d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->submitRequest(request2, /*streaming*/true,
509d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                /*out*/&info2);
510d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
511d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_EQ(hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES,
512d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                info2.mLastFrameNumber);
5133450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        lastFrameNumber = 0;
5143450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT));
515d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_LE(0, info2.mRequestId);
516d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->cancelRequest(info2.mRequestId, /*out*/&lastFrameNumber);
517d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
5183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_TRUE(callbacks->waitForIdle());
5193450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_LE(lastFrameNumberPrev, lastFrameNumber);
5203450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sleep(/*second*/1); // allow some time for errors to show up, if any
5213450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_FALSE(callbacks->hadError());
5223450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
5233450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Can we do it with a request list?
5243450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        lastFrameNumberPrev = lastFrameNumber;
5253450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        lastFrameNumber = 0;
5263450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        requestTemplate.clear();
5273450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        CameraMetadata requestTemplate2;
528d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW,
529d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                /*out*/&requestTemplate);
530d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
531d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW,
532d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                /*out*/&requestTemplate2);
533d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
534d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        android::hardware::camera2::CaptureRequest request3;
535d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        android::hardware::camera2::CaptureRequest request4;
536d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request3.mMetadata = requestTemplate;
537d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request3.mSurfaceList.add(surface);
538d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request3.mIsReprocess = false;
539d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request4.mMetadata = requestTemplate2;
540d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request4.mSurfaceList.add(surface);
541d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        request4.mIsReprocess = false;
542d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        std::vector<hardware::camera2::CaptureRequest> requestList;
5433450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        requestList.push_back(request3);
5443450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        requestList.push_back(request4);
5453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
5463450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        callbacks->clearStatus();
547d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        hardware::camera2::utils::SubmitInfo info3;
548d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->submitRequestList(requestList, /*streaming*/false,
549d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                /*out*/&info3);
550d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
551d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_LE(0, info3.mRequestId);
5523450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT));
5533450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_TRUE(callbacks->waitForIdle());
554d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_LE(lastFrameNumberPrev, info3.mLastFrameNumber);
5553450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sleep(/*second*/1); // allow some time for errors to show up, if any
5563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_FALSE(callbacks->hadError());
5573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
5583450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        // Can we unconfigure?
559d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->beginConfigure();
560d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
561d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->deleteStream(streamId);
562d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
563d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        res = device->endConfigure(/*isConstrainedHighSpeed*/ false);
564d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        EXPECT_TRUE(res.isOk()) << res;
565d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
5663450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        sleep(/*second*/1); // allow some time for errors to show up, if any
5673450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        EXPECT_FALSE(callbacks->hadError());
5683450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
5693450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk        closeDevice(p);
5703450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    }
5713450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
5723450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk};
573