1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker *
4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker *
8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker *
10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker */
16*ec779b8eSAndroid Build Coastguard Worker
17*ec779b8eSAndroid Build Coastguard Worker #define LOG_NDEBUG 0
18*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "CameraBinderTests"
19*ec779b8eSAndroid Build Coastguard Worker
20*ec779b8eSAndroid Build Coastguard Worker #include <binder/IInterface.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <binder/Parcel.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <binder/ProcessState.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <utils/Errors.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <utils/List.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <utils/String8.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <utils/String16.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <utils/Condition.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <utils/Mutex.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <system/graphics.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <hardware/camera3.h>
33*ec779b8eSAndroid Build Coastguard Worker #include <hardware/gralloc.h>
34*ec779b8eSAndroid Build Coastguard Worker
35*ec779b8eSAndroid Build Coastguard Worker #include <camera/CameraMetadata.h>
36*ec779b8eSAndroid Build Coastguard Worker #include <android/content/AttributionSourceState.h>
37*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/ICameraService.h>
38*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/ICameraServiceListener.h>
39*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/BnCameraServiceListener.h>
40*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/camera2/ICameraDeviceUser.h>
41*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/camera2/ICameraDeviceCallbacks.h>
42*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/camera2/BnCameraDeviceCallbacks.h>
43*ec779b8eSAndroid Build Coastguard Worker #include <camera/camera2/CaptureRequest.h>
44*ec779b8eSAndroid Build Coastguard Worker #include <camera/camera2/OutputConfiguration.h>
45*ec779b8eSAndroid Build Coastguard Worker #include <camera/camera2/SessionConfiguration.h>
46*ec779b8eSAndroid Build Coastguard Worker #include <camera/camera2/SubmitInfo.h>
47*ec779b8eSAndroid Build Coastguard Worker #include <camera/CameraUtils.h>
48*ec779b8eSAndroid Build Coastguard Worker #include <camera/StringUtils.h>
49*ec779b8eSAndroid Build Coastguard Worker
50*ec779b8eSAndroid Build Coastguard Worker #include <com_android_graphics_libgui_flags.h>
51*ec779b8eSAndroid Build Coastguard Worker #include <gui/BufferItemConsumer.h>
52*ec779b8eSAndroid Build Coastguard Worker #include <gui/IGraphicBufferProducer.h>
53*ec779b8eSAndroid Build Coastguard Worker #include <gui/Surface.h>
54*ec779b8eSAndroid Build Coastguard Worker
55*ec779b8eSAndroid Build Coastguard Worker #include <gtest/gtest.h>
56*ec779b8eSAndroid Build Coastguard Worker #include <unistd.h>
57*ec779b8eSAndroid Build Coastguard Worker #include <stdint.h>
58*ec779b8eSAndroid Build Coastguard Worker #include <utility>
59*ec779b8eSAndroid Build Coastguard Worker #include <vector>
60*ec779b8eSAndroid Build Coastguard Worker #include <map>
61*ec779b8eSAndroid Build Coastguard Worker #include <algorithm>
62*ec779b8eSAndroid Build Coastguard Worker
63*ec779b8eSAndroid Build Coastguard Worker using namespace android;
64*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::ICameraService;
65*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::camera2::ICameraDeviceUser;
66*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::camera2::CameraMetadataInfo;
67*ec779b8eSAndroid Build Coastguard Worker
68*ec779b8eSAndroid Build Coastguard Worker #define ASSERT_NOT_NULL(x) \
69*ec779b8eSAndroid Build Coastguard Worker ASSERT_TRUE((x) != nullptr)
70*ec779b8eSAndroid Build Coastguard Worker
71*ec779b8eSAndroid Build Coastguard Worker #define SETUP_TIMEOUT 2000000000 // ns
72*ec779b8eSAndroid Build Coastguard Worker #define IDLE_TIMEOUT 2000000000 // ns
73*ec779b8eSAndroid Build Coastguard Worker
74*ec779b8eSAndroid Build Coastguard Worker // Stub listener implementation
75*ec779b8eSAndroid Build Coastguard Worker class TestCameraServiceListener : public hardware::BnCameraServiceListener {
76*ec779b8eSAndroid Build Coastguard Worker std::map<std::string, int32_t> mCameraTorchStatuses;
77*ec779b8eSAndroid Build Coastguard Worker std::map<std::string, int32_t> mCameraStatuses;
78*ec779b8eSAndroid Build Coastguard Worker mutable Mutex mLock;
79*ec779b8eSAndroid Build Coastguard Worker mutable Condition mCondition;
80*ec779b8eSAndroid Build Coastguard Worker mutable Condition mTorchCondition;
81*ec779b8eSAndroid Build Coastguard Worker public:
~TestCameraServiceListener()82*ec779b8eSAndroid Build Coastguard Worker virtual ~TestCameraServiceListener() {};
83*ec779b8eSAndroid Build Coastguard Worker
onStatusChanged(int32_t status,const std::string & cameraId,int32_t)84*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onStatusChanged(int32_t status, const std::string& cameraId,
85*ec779b8eSAndroid Build Coastguard Worker [[maybe_unused]] int32_t /*deviceId*/) override {
86*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock l(mLock);
87*ec779b8eSAndroid Build Coastguard Worker mCameraStatuses[cameraId] = status;
88*ec779b8eSAndroid Build Coastguard Worker mCondition.broadcast();
89*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
90*ec779b8eSAndroid Build Coastguard Worker }
91*ec779b8eSAndroid Build Coastguard Worker
onPhysicalCameraStatusChanged(int32_t,const std::string &,const std::string &,int32_t)92*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onPhysicalCameraStatusChanged([[maybe_unused]] int32_t /*status*/,
93*ec779b8eSAndroid Build Coastguard Worker [[maybe_unused]] const std::string& /*cameraId*/,
94*ec779b8eSAndroid Build Coastguard Worker [[maybe_unused]] const std::string& /*physicalCameraId*/,
95*ec779b8eSAndroid Build Coastguard Worker [[maybe_unused]] int32_t /*deviceId*/) override {
96*ec779b8eSAndroid Build Coastguard Worker // No op
97*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
98*ec779b8eSAndroid Build Coastguard Worker }
99*ec779b8eSAndroid Build Coastguard Worker
onTorchStatusChanged(int32_t status,const std::string & cameraId,int32_t)100*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onTorchStatusChanged(int32_t status,
101*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, [[maybe_unused]] int32_t /*deviceId*/) override {
102*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock l(mLock);
103*ec779b8eSAndroid Build Coastguard Worker mCameraTorchStatuses[cameraId] = status;
104*ec779b8eSAndroid Build Coastguard Worker mTorchCondition.broadcast();
105*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
106*ec779b8eSAndroid Build Coastguard Worker }
107*ec779b8eSAndroid Build Coastguard Worker
onTorchStrengthLevelChanged(const std::string &,int32_t,int32_t)108*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onTorchStrengthLevelChanged(
109*ec779b8eSAndroid Build Coastguard Worker [[maybe_unused]] const std::string& /*cameraId*/,
110*ec779b8eSAndroid Build Coastguard Worker [[maybe_unused]] int32_t /*torchStrength*/,
111*ec779b8eSAndroid Build Coastguard Worker [[maybe_unused]] int32_t /*deviceId*/) override {
112*ec779b8eSAndroid Build Coastguard Worker // No op
113*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
114*ec779b8eSAndroid Build Coastguard Worker }
115*ec779b8eSAndroid Build Coastguard Worker
onCameraAccessPrioritiesChanged()116*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onCameraAccessPrioritiesChanged() override {
117*ec779b8eSAndroid Build Coastguard Worker // No op
118*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
119*ec779b8eSAndroid Build Coastguard Worker }
120*ec779b8eSAndroid Build Coastguard Worker
onCameraOpened(const std::string &,const std::string &,int32_t)121*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onCameraOpened([[maybe_unused]] const std::string& /*cameraId*/,
122*ec779b8eSAndroid Build Coastguard Worker [[maybe_unused]] const std::string& /*clientPackageName*/,
123*ec779b8eSAndroid Build Coastguard Worker [[maybe_unused]] int32_t /*deviceId*/) {
124*ec779b8eSAndroid Build Coastguard Worker // No op
125*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
126*ec779b8eSAndroid Build Coastguard Worker }
127*ec779b8eSAndroid Build Coastguard Worker
onCameraClosed(const std::string &,int32_t)128*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onCameraClosed([[maybe_unused]] const std::string& /*cameraId*/,
129*ec779b8eSAndroid Build Coastguard Worker [[maybe_unused]] int32_t /*deviceId*/) override {
130*ec779b8eSAndroid Build Coastguard Worker // No op
131*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
132*ec779b8eSAndroid Build Coastguard Worker }
133*ec779b8eSAndroid Build Coastguard Worker
onCameraOpenedInSharedMode(const std::string &,const std::string &,int32_t,bool)134*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onCameraOpenedInSharedMode(
135*ec779b8eSAndroid Build Coastguard Worker [[maybe_unused]] const std::string& /*cameraId*/,
136*ec779b8eSAndroid Build Coastguard Worker [[maybe_unused]] const std::string& /*clientPackageName*/,
137*ec779b8eSAndroid Build Coastguard Worker [[maybe_unused]] int32_t /*deviceId*/,
138*ec779b8eSAndroid Build Coastguard Worker [[maybe_unused]] bool /*isPrimaryClient*/) override {
139*ec779b8eSAndroid Build Coastguard Worker // No op
140*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
141*ec779b8eSAndroid Build Coastguard Worker }
142*ec779b8eSAndroid Build Coastguard Worker
waitForNumCameras(size_t num) const143*ec779b8eSAndroid Build Coastguard Worker bool waitForNumCameras(size_t num) const {
144*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock l(mLock);
145*ec779b8eSAndroid Build Coastguard Worker
146*ec779b8eSAndroid Build Coastguard Worker if (mCameraStatuses.size() == num) {
147*ec779b8eSAndroid Build Coastguard Worker return true;
148*ec779b8eSAndroid Build Coastguard Worker }
149*ec779b8eSAndroid Build Coastguard Worker
150*ec779b8eSAndroid Build Coastguard Worker while (mCameraStatuses.size() < num) {
151*ec779b8eSAndroid Build Coastguard Worker if (mCondition.waitRelative(mLock, SETUP_TIMEOUT) != OK) {
152*ec779b8eSAndroid Build Coastguard Worker return false;
153*ec779b8eSAndroid Build Coastguard Worker }
154*ec779b8eSAndroid Build Coastguard Worker }
155*ec779b8eSAndroid Build Coastguard Worker return true;
156*ec779b8eSAndroid Build Coastguard Worker }
157*ec779b8eSAndroid Build Coastguard Worker
waitForTorchState(int32_t status,int32_t cameraId) const158*ec779b8eSAndroid Build Coastguard Worker bool waitForTorchState(int32_t status, int32_t cameraId) const {
159*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock l(mLock);
160*ec779b8eSAndroid Build Coastguard Worker
161*ec779b8eSAndroid Build Coastguard Worker const auto& iter = mCameraTorchStatuses.find(std::to_string(cameraId));
162*ec779b8eSAndroid Build Coastguard Worker if (iter != mCameraTorchStatuses.end() && iter->second == status) {
163*ec779b8eSAndroid Build Coastguard Worker return true;
164*ec779b8eSAndroid Build Coastguard Worker }
165*ec779b8eSAndroid Build Coastguard Worker
166*ec779b8eSAndroid Build Coastguard Worker bool foundStatus = false;
167*ec779b8eSAndroid Build Coastguard Worker while (!foundStatus) {
168*ec779b8eSAndroid Build Coastguard Worker if (mTorchCondition.waitRelative(mLock, SETUP_TIMEOUT) != OK) {
169*ec779b8eSAndroid Build Coastguard Worker return false;
170*ec779b8eSAndroid Build Coastguard Worker }
171*ec779b8eSAndroid Build Coastguard Worker const auto& iter =
172*ec779b8eSAndroid Build Coastguard Worker mCameraTorchStatuses.find(std::to_string(cameraId));
173*ec779b8eSAndroid Build Coastguard Worker foundStatus = (iter != mCameraTorchStatuses.end() && iter->second == status);
174*ec779b8eSAndroid Build Coastguard Worker }
175*ec779b8eSAndroid Build Coastguard Worker return true;
176*ec779b8eSAndroid Build Coastguard Worker }
177*ec779b8eSAndroid Build Coastguard Worker
getTorchStatus(int32_t cameraId) const178*ec779b8eSAndroid Build Coastguard Worker int32_t getTorchStatus(int32_t cameraId) const {
179*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock l(mLock);
180*ec779b8eSAndroid Build Coastguard Worker const auto& iter = mCameraTorchStatuses.find(std::to_string(cameraId));
181*ec779b8eSAndroid Build Coastguard Worker if (iter == mCameraTorchStatuses.end()) {
182*ec779b8eSAndroid Build Coastguard Worker return hardware::ICameraServiceListener::TORCH_STATUS_UNKNOWN;
183*ec779b8eSAndroid Build Coastguard Worker }
184*ec779b8eSAndroid Build Coastguard Worker return iter->second;
185*ec779b8eSAndroid Build Coastguard Worker }
186*ec779b8eSAndroid Build Coastguard Worker
getStatus(const std::string & cameraId) const187*ec779b8eSAndroid Build Coastguard Worker int32_t getStatus(const std::string& cameraId) const {
188*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock l(mLock);
189*ec779b8eSAndroid Build Coastguard Worker const auto& iter = mCameraStatuses.find(cameraId);
190*ec779b8eSAndroid Build Coastguard Worker if (iter == mCameraStatuses.end()) {
191*ec779b8eSAndroid Build Coastguard Worker return hardware::ICameraServiceListener::STATUS_UNKNOWN;
192*ec779b8eSAndroid Build Coastguard Worker }
193*ec779b8eSAndroid Build Coastguard Worker return iter->second;
194*ec779b8eSAndroid Build Coastguard Worker }
195*ec779b8eSAndroid Build Coastguard Worker };
196*ec779b8eSAndroid Build Coastguard Worker
197*ec779b8eSAndroid Build Coastguard Worker // Callback implementation
198*ec779b8eSAndroid Build Coastguard Worker class TestCameraDeviceCallbacks : public hardware::camera2::BnCameraDeviceCallbacks {
199*ec779b8eSAndroid Build Coastguard Worker public:
200*ec779b8eSAndroid Build Coastguard Worker enum Status {
201*ec779b8eSAndroid Build Coastguard Worker IDLE,
202*ec779b8eSAndroid Build Coastguard Worker ERROR,
203*ec779b8eSAndroid Build Coastguard Worker PREPARED,
204*ec779b8eSAndroid Build Coastguard Worker RUNNING,
205*ec779b8eSAndroid Build Coastguard Worker SENT_RESULT,
206*ec779b8eSAndroid Build Coastguard Worker UNINITIALIZED,
207*ec779b8eSAndroid Build Coastguard Worker REPEATING_REQUEST_ERROR,
208*ec779b8eSAndroid Build Coastguard Worker REQUEST_QUEUE_EMPTY,
209*ec779b8eSAndroid Build Coastguard Worker };
210*ec779b8eSAndroid Build Coastguard Worker
211*ec779b8eSAndroid Build Coastguard Worker protected:
212*ec779b8eSAndroid Build Coastguard Worker bool mError;
213*ec779b8eSAndroid Build Coastguard Worker int32_t mLastStatus;
214*ec779b8eSAndroid Build Coastguard Worker mutable std::vector<int32_t> mStatusesHit;
215*ec779b8eSAndroid Build Coastguard Worker mutable Mutex mLock;
216*ec779b8eSAndroid Build Coastguard Worker mutable Condition mStatusCondition;
217*ec779b8eSAndroid Build Coastguard Worker public:
TestCameraDeviceCallbacks()218*ec779b8eSAndroid Build Coastguard Worker TestCameraDeviceCallbacks() : mError(false), mLastStatus(UNINITIALIZED) {}
219*ec779b8eSAndroid Build Coastguard Worker
~TestCameraDeviceCallbacks()220*ec779b8eSAndroid Build Coastguard Worker virtual ~TestCameraDeviceCallbacks() {}
221*ec779b8eSAndroid Build Coastguard Worker
onDeviceError(int errorCode,const CaptureResultExtras & resultExtras)222*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onDeviceError(int errorCode,
223*ec779b8eSAndroid Build Coastguard Worker const CaptureResultExtras& resultExtras) {
224*ec779b8eSAndroid Build Coastguard Worker (void) resultExtras;
225*ec779b8eSAndroid Build Coastguard Worker ALOGE("%s: onDeviceError occurred with: %d", __FUNCTION__, static_cast<int>(errorCode));
226*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock l(mLock);
227*ec779b8eSAndroid Build Coastguard Worker mError = true;
228*ec779b8eSAndroid Build Coastguard Worker mLastStatus = ERROR;
229*ec779b8eSAndroid Build Coastguard Worker mStatusesHit.push_back(mLastStatus);
230*ec779b8eSAndroid Build Coastguard Worker mStatusCondition.broadcast();
231*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
232*ec779b8eSAndroid Build Coastguard Worker }
233*ec779b8eSAndroid Build Coastguard Worker
onDeviceIdle()234*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onDeviceIdle() {
235*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock l(mLock);
236*ec779b8eSAndroid Build Coastguard Worker mLastStatus = IDLE;
237*ec779b8eSAndroid Build Coastguard Worker mStatusesHit.push_back(mLastStatus);
238*ec779b8eSAndroid Build Coastguard Worker mStatusCondition.broadcast();
239*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
240*ec779b8eSAndroid Build Coastguard Worker }
241*ec779b8eSAndroid Build Coastguard Worker
onCaptureStarted(const CaptureResultExtras & resultExtras,int64_t timestamp)242*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onCaptureStarted(const CaptureResultExtras& resultExtras,
243*ec779b8eSAndroid Build Coastguard Worker int64_t timestamp) {
244*ec779b8eSAndroid Build Coastguard Worker (void) resultExtras;
245*ec779b8eSAndroid Build Coastguard Worker (void) timestamp;
246*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock l(mLock);
247*ec779b8eSAndroid Build Coastguard Worker mLastStatus = RUNNING;
248*ec779b8eSAndroid Build Coastguard Worker mStatusesHit.push_back(mLastStatus);
249*ec779b8eSAndroid Build Coastguard Worker mStatusCondition.broadcast();
250*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
251*ec779b8eSAndroid Build Coastguard Worker }
252*ec779b8eSAndroid Build Coastguard Worker
onResultReceived(const CameraMetadataInfo & resultInfo,const CaptureResultExtras & resultExtras,const std::vector<PhysicalCaptureResultInfo> & physicalResultInfos)253*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onResultReceived(const CameraMetadataInfo& resultInfo,
254*ec779b8eSAndroid Build Coastguard Worker const CaptureResultExtras& resultExtras,
255*ec779b8eSAndroid Build Coastguard Worker const std::vector<PhysicalCaptureResultInfo>& physicalResultInfos) {
256*ec779b8eSAndroid Build Coastguard Worker (void) resultInfo;
257*ec779b8eSAndroid Build Coastguard Worker (void) resultExtras;
258*ec779b8eSAndroid Build Coastguard Worker (void) physicalResultInfos;
259*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock l(mLock);
260*ec779b8eSAndroid Build Coastguard Worker mLastStatus = SENT_RESULT;
261*ec779b8eSAndroid Build Coastguard Worker mStatusesHit.push_back(mLastStatus);
262*ec779b8eSAndroid Build Coastguard Worker mStatusCondition.broadcast();
263*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
264*ec779b8eSAndroid Build Coastguard Worker }
265*ec779b8eSAndroid Build Coastguard Worker
onPrepared(int streamId)266*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onPrepared(int streamId) {
267*ec779b8eSAndroid Build Coastguard Worker (void) streamId;
268*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock l(mLock);
269*ec779b8eSAndroid Build Coastguard Worker mLastStatus = PREPARED;
270*ec779b8eSAndroid Build Coastguard Worker mStatusesHit.push_back(mLastStatus);
271*ec779b8eSAndroid Build Coastguard Worker mStatusCondition.broadcast();
272*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
273*ec779b8eSAndroid Build Coastguard Worker }
274*ec779b8eSAndroid Build Coastguard Worker
onRepeatingRequestError(int64_t lastFrameNumber,int32_t stoppedSequenceId)275*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onRepeatingRequestError(
276*ec779b8eSAndroid Build Coastguard Worker int64_t lastFrameNumber, int32_t stoppedSequenceId) {
277*ec779b8eSAndroid Build Coastguard Worker (void) lastFrameNumber;
278*ec779b8eSAndroid Build Coastguard Worker (void) stoppedSequenceId;
279*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock l(mLock);
280*ec779b8eSAndroid Build Coastguard Worker mLastStatus = REPEATING_REQUEST_ERROR;
281*ec779b8eSAndroid Build Coastguard Worker mStatusesHit.push_back(mLastStatus);
282*ec779b8eSAndroid Build Coastguard Worker mStatusCondition.broadcast();
283*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
284*ec779b8eSAndroid Build Coastguard Worker }
285*ec779b8eSAndroid Build Coastguard Worker
onRequestQueueEmpty()286*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onRequestQueueEmpty() {
287*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock l(mLock);
288*ec779b8eSAndroid Build Coastguard Worker mLastStatus = REQUEST_QUEUE_EMPTY;
289*ec779b8eSAndroid Build Coastguard Worker mStatusesHit.push_back(mLastStatus);
290*ec779b8eSAndroid Build Coastguard Worker mStatusCondition.broadcast();
291*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
292*ec779b8eSAndroid Build Coastguard Worker }
293*ec779b8eSAndroid Build Coastguard Worker
onClientSharedAccessPriorityChanged(bool)294*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onClientSharedAccessPriorityChanged(
295*ec779b8eSAndroid Build Coastguard Worker [[maybe_unused]] bool /*isPrimaryClient*/) {
296*ec779b8eSAndroid Build Coastguard Worker // No-op
297*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok();
298*ec779b8eSAndroid Build Coastguard Worker }
299*ec779b8eSAndroid Build Coastguard Worker
300*ec779b8eSAndroid Build Coastguard Worker // Test helper functions:
301*ec779b8eSAndroid Build Coastguard Worker
hadError() const302*ec779b8eSAndroid Build Coastguard Worker bool hadError() const {
303*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock l(mLock);
304*ec779b8eSAndroid Build Coastguard Worker return mError;
305*ec779b8eSAndroid Build Coastguard Worker }
306*ec779b8eSAndroid Build Coastguard Worker
waitForStatus(Status status) const307*ec779b8eSAndroid Build Coastguard Worker bool waitForStatus(Status status) const {
308*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock l(mLock);
309*ec779b8eSAndroid Build Coastguard Worker if (mLastStatus == status) {
310*ec779b8eSAndroid Build Coastguard Worker return true;
311*ec779b8eSAndroid Build Coastguard Worker }
312*ec779b8eSAndroid Build Coastguard Worker
313*ec779b8eSAndroid Build Coastguard Worker while (std::find(mStatusesHit.begin(), mStatusesHit.end(), status)
314*ec779b8eSAndroid Build Coastguard Worker == mStatusesHit.end()) {
315*ec779b8eSAndroid Build Coastguard Worker
316*ec779b8eSAndroid Build Coastguard Worker if (mStatusCondition.waitRelative(mLock, IDLE_TIMEOUT) != OK) {
317*ec779b8eSAndroid Build Coastguard Worker mStatusesHit.clear();
318*ec779b8eSAndroid Build Coastguard Worker return false;
319*ec779b8eSAndroid Build Coastguard Worker }
320*ec779b8eSAndroid Build Coastguard Worker }
321*ec779b8eSAndroid Build Coastguard Worker mStatusesHit.clear();
322*ec779b8eSAndroid Build Coastguard Worker
323*ec779b8eSAndroid Build Coastguard Worker return true;
324*ec779b8eSAndroid Build Coastguard Worker }
325*ec779b8eSAndroid Build Coastguard Worker
clearStatus() const326*ec779b8eSAndroid Build Coastguard Worker void clearStatus() const {
327*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock l(mLock);
328*ec779b8eSAndroid Build Coastguard Worker mStatusesHit.clear();
329*ec779b8eSAndroid Build Coastguard Worker }
330*ec779b8eSAndroid Build Coastguard Worker
waitForIdle() const331*ec779b8eSAndroid Build Coastguard Worker bool waitForIdle() const {
332*ec779b8eSAndroid Build Coastguard Worker return waitForStatus(IDLE);
333*ec779b8eSAndroid Build Coastguard Worker }
334*ec779b8eSAndroid Build Coastguard Worker };
335*ec779b8eSAndroid Build Coastguard Worker
336*ec779b8eSAndroid Build Coastguard Worker namespace {
337*ec779b8eSAndroid Build Coastguard Worker Mutex gLock;
338*ec779b8eSAndroid Build Coastguard Worker class DeathNotifier : public IBinder::DeathRecipient
339*ec779b8eSAndroid Build Coastguard Worker {
340*ec779b8eSAndroid Build Coastguard Worker public:
DeathNotifier()341*ec779b8eSAndroid Build Coastguard Worker DeathNotifier() {}
342*ec779b8eSAndroid Build Coastguard Worker
binderDied(const wp<IBinder> &)343*ec779b8eSAndroid Build Coastguard Worker virtual void binderDied(const wp<IBinder>& /*who*/) {
344*ec779b8eSAndroid Build Coastguard Worker ALOGV("binderDied");
345*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock _l(gLock);
346*ec779b8eSAndroid Build Coastguard Worker ALOGW("Camera service died!");
347*ec779b8eSAndroid Build Coastguard Worker }
348*ec779b8eSAndroid Build Coastguard Worker };
349*ec779b8eSAndroid Build Coastguard Worker sp<DeathNotifier> gDeathNotifier;
350*ec779b8eSAndroid Build Coastguard Worker } // anonymous namespace
351*ec779b8eSAndroid Build Coastguard Worker
352*ec779b8eSAndroid Build Coastguard Worker // Exercise basic binder calls for the camera service
TEST(CameraServiceBinderTest,CheckBinderCameraService)353*ec779b8eSAndroid Build Coastguard Worker TEST(CameraServiceBinderTest, CheckBinderCameraService) {
354*ec779b8eSAndroid Build Coastguard Worker ProcessState::self()->startThreadPool();
355*ec779b8eSAndroid Build Coastguard Worker sp<IServiceManager> sm = defaultServiceManager();
356*ec779b8eSAndroid Build Coastguard Worker sp<IBinder> binder = sm->getService(String16("media.camera"));
357*ec779b8eSAndroid Build Coastguard Worker ASSERT_NOT_NULL(binder);
358*ec779b8eSAndroid Build Coastguard Worker if (gDeathNotifier == NULL) {
359*ec779b8eSAndroid Build Coastguard Worker gDeathNotifier = new DeathNotifier();
360*ec779b8eSAndroid Build Coastguard Worker }
361*ec779b8eSAndroid Build Coastguard Worker binder->linkToDeath(gDeathNotifier);
362*ec779b8eSAndroid Build Coastguard Worker sp<hardware::ICameraService> service =
363*ec779b8eSAndroid Build Coastguard Worker interface_cast<hardware::ICameraService>(binder);
364*ec779b8eSAndroid Build Coastguard Worker
365*ec779b8eSAndroid Build Coastguard Worker binder::Status res;
366*ec779b8eSAndroid Build Coastguard Worker
367*ec779b8eSAndroid Build Coastguard Worker int32_t numCameras = 0;
368*ec779b8eSAndroid Build Coastguard Worker AttributionSourceState clientAttribution;
369*ec779b8eSAndroid Build Coastguard Worker clientAttribution.deviceId = kDefaultDeviceId;
370*ec779b8eSAndroid Build Coastguard Worker clientAttribution.uid = hardware::ICameraService::USE_CALLING_UID;
371*ec779b8eSAndroid Build Coastguard Worker clientAttribution.packageName = "meeeeeeeee!";
372*ec779b8eSAndroid Build Coastguard Worker res = service->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_ALL, clientAttribution,
373*ec779b8eSAndroid Build Coastguard Worker /*devicePolicy*/0, &numCameras);
374*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
375*ec779b8eSAndroid Build Coastguard Worker EXPECT_LE(0, numCameras);
376*ec779b8eSAndroid Build Coastguard Worker
377*ec779b8eSAndroid Build Coastguard Worker // Check listener binder calls
378*ec779b8eSAndroid Build Coastguard Worker sp<TestCameraServiceListener> listener(new TestCameraServiceListener());
379*ec779b8eSAndroid Build Coastguard Worker std::vector<hardware::CameraStatus> statuses;
380*ec779b8eSAndroid Build Coastguard Worker res = service->addListener(listener, &statuses);
381*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
382*ec779b8eSAndroid Build Coastguard Worker
383*ec779b8eSAndroid Build Coastguard Worker EXPECT_EQ(numCameras, static_cast<const int>(statuses.size()));
384*ec779b8eSAndroid Build Coastguard Worker for (const auto &it : statuses) {
385*ec779b8eSAndroid Build Coastguard Worker listener->onStatusChanged(it.status, it.cameraId, clientAttribution.deviceId);
386*ec779b8eSAndroid Build Coastguard Worker }
387*ec779b8eSAndroid Build Coastguard Worker
388*ec779b8eSAndroid Build Coastguard Worker for (int32_t i = 0; i < numCameras; i++) {
389*ec779b8eSAndroid Build Coastguard Worker std::string cameraId = std::to_string(i);
390*ec779b8eSAndroid Build Coastguard Worker bool isSupported = false;
391*ec779b8eSAndroid Build Coastguard Worker res = service->supportsCameraApi(cameraId,
392*ec779b8eSAndroid Build Coastguard Worker hardware::ICameraService::API_VERSION_2, &isSupported);
393*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
394*ec779b8eSAndroid Build Coastguard Worker
395*ec779b8eSAndroid Build Coastguard Worker // We only care about binder calls for the Camera2 API. Camera1 is deprecated.
396*ec779b8eSAndroid Build Coastguard Worker if (!isSupported) {
397*ec779b8eSAndroid Build Coastguard Worker continue;
398*ec779b8eSAndroid Build Coastguard Worker }
399*ec779b8eSAndroid Build Coastguard Worker
400*ec779b8eSAndroid Build Coastguard Worker // Check metadata binder call
401*ec779b8eSAndroid Build Coastguard Worker CameraMetadata metadata;
402*ec779b8eSAndroid Build Coastguard Worker res = service->getCameraCharacteristics(cameraId,
403*ec779b8eSAndroid Build Coastguard Worker /*targetSdkVersion*/__ANDROID_API_FUTURE__, /*overrideToPortrait*/false,
404*ec779b8eSAndroid Build Coastguard Worker clientAttribution, /*devicePolicy*/0, &metadata);
405*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
406*ec779b8eSAndroid Build Coastguard Worker EXPECT_FALSE(metadata.isEmpty());
407*ec779b8eSAndroid Build Coastguard Worker
408*ec779b8eSAndroid Build Coastguard Worker // Make sure we're available, or skip device tests otherwise
409*ec779b8eSAndroid Build Coastguard Worker int32_t s = listener->getStatus(cameraId);
410*ec779b8eSAndroid Build Coastguard Worker EXPECT_EQ(::android::hardware::ICameraServiceListener::STATUS_PRESENT, s);
411*ec779b8eSAndroid Build Coastguard Worker if (s != ::android::hardware::ICameraServiceListener::STATUS_PRESENT) {
412*ec779b8eSAndroid Build Coastguard Worker continue;
413*ec779b8eSAndroid Build Coastguard Worker }
414*ec779b8eSAndroid Build Coastguard Worker
415*ec779b8eSAndroid Build Coastguard Worker // Check connect binder calls
416*ec779b8eSAndroid Build Coastguard Worker sp<TestCameraDeviceCallbacks> callbacks(new TestCameraDeviceCallbacks());
417*ec779b8eSAndroid Build Coastguard Worker sp<hardware::camera2::ICameraDeviceUser> device;
418*ec779b8eSAndroid Build Coastguard Worker res = service->connectDevice(callbacks, cameraId,
419*ec779b8eSAndroid Build Coastguard Worker /*oomScoreOffset*/ 0,
420*ec779b8eSAndroid Build Coastguard Worker /*targetSdkVersion*/__ANDROID_API_FUTURE__,
421*ec779b8eSAndroid Build Coastguard Worker /*overrideToPortrait*/false, clientAttribution, /*devicePolicy*/0,
422*ec779b8eSAndroid Build Coastguard Worker /*sharedMode*/false, /*out*/&device);
423*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
424*ec779b8eSAndroid Build Coastguard Worker ASSERT_NE(nullptr, device.get());
425*ec779b8eSAndroid Build Coastguard Worker device->disconnect();
426*ec779b8eSAndroid Build Coastguard Worker EXPECT_FALSE(callbacks->hadError());
427*ec779b8eSAndroid Build Coastguard Worker
428*ec779b8eSAndroid Build Coastguard Worker int32_t torchStatus = listener->getTorchStatus(i);
429*ec779b8eSAndroid Build Coastguard Worker if (torchStatus == hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF) {
430*ec779b8eSAndroid Build Coastguard Worker // Check torch calls
431*ec779b8eSAndroid Build Coastguard Worker res = service->setTorchMode(cameraId,
432*ec779b8eSAndroid Build Coastguard Worker /*enabled*/true, callbacks, clientAttribution, /*devicePolicy*/0);
433*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
434*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(listener->waitForTorchState(
435*ec779b8eSAndroid Build Coastguard Worker hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_ON, i));
436*ec779b8eSAndroid Build Coastguard Worker res = service->setTorchMode(cameraId,
437*ec779b8eSAndroid Build Coastguard Worker /*enabled*/false, callbacks, clientAttribution, /*devicePolicy*/0);
438*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
439*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(listener->waitForTorchState(
440*ec779b8eSAndroid Build Coastguard Worker hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF, i));
441*ec779b8eSAndroid Build Coastguard Worker }
442*ec779b8eSAndroid Build Coastguard Worker }
443*ec779b8eSAndroid Build Coastguard Worker
444*ec779b8eSAndroid Build Coastguard Worker res = service->removeListener(listener);
445*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
446*ec779b8eSAndroid Build Coastguard Worker }
447*ec779b8eSAndroid Build Coastguard Worker
448*ec779b8eSAndroid Build Coastguard Worker // Test fixture for client focused binder tests
449*ec779b8eSAndroid Build Coastguard Worker class CameraClientBinderTest : public testing::Test {
450*ec779b8eSAndroid Build Coastguard Worker protected:
451*ec779b8eSAndroid Build Coastguard Worker sp<hardware::ICameraService> service;
452*ec779b8eSAndroid Build Coastguard Worker int32_t numCameras;
453*ec779b8eSAndroid Build Coastguard Worker std::vector<std::pair<sp<TestCameraDeviceCallbacks>, sp<hardware::camera2::ICameraDeviceUser>>>
454*ec779b8eSAndroid Build Coastguard Worker openDeviceList;
455*ec779b8eSAndroid Build Coastguard Worker sp<TestCameraServiceListener> serviceListener;
456*ec779b8eSAndroid Build Coastguard Worker
457*ec779b8eSAndroid Build Coastguard Worker std::pair<sp<TestCameraDeviceCallbacks>, sp<hardware::camera2::ICameraDeviceUser>>
openNewDevice(const std::string & deviceId)458*ec779b8eSAndroid Build Coastguard Worker openNewDevice(const std::string& deviceId) {
459*ec779b8eSAndroid Build Coastguard Worker sp<TestCameraDeviceCallbacks> callbacks(new TestCameraDeviceCallbacks());
460*ec779b8eSAndroid Build Coastguard Worker sp<hardware::camera2::ICameraDeviceUser> device;
461*ec779b8eSAndroid Build Coastguard Worker {
462*ec779b8eSAndroid Build Coastguard Worker SCOPED_TRACE("openNewDevice");
463*ec779b8eSAndroid Build Coastguard Worker AttributionSourceState clientAttribution;
464*ec779b8eSAndroid Build Coastguard Worker clientAttribution.deviceId = kDefaultDeviceId;
465*ec779b8eSAndroid Build Coastguard Worker clientAttribution.uid = hardware::ICameraService::USE_CALLING_UID;
466*ec779b8eSAndroid Build Coastguard Worker clientAttribution.packageName = "meeeeeeeee!";
467*ec779b8eSAndroid Build Coastguard Worker binder::Status res = service->connectDevice(callbacks, deviceId,
468*ec779b8eSAndroid Build Coastguard Worker /*oomScoreOffset*/ 0,
469*ec779b8eSAndroid Build Coastguard Worker /*targetSdkVersion*/__ANDROID_API_FUTURE__,
470*ec779b8eSAndroid Build Coastguard Worker /*overrideToPortrait*/false, clientAttribution, /*devicePolicy*/0,
471*ec779b8eSAndroid Build Coastguard Worker /*sharedMode*/false, /*out*/&device);
472*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
473*ec779b8eSAndroid Build Coastguard Worker }
474*ec779b8eSAndroid Build Coastguard Worker auto p = std::make_pair(callbacks, device);
475*ec779b8eSAndroid Build Coastguard Worker openDeviceList.push_back(p);
476*ec779b8eSAndroid Build Coastguard Worker return p;
477*ec779b8eSAndroid Build Coastguard Worker }
478*ec779b8eSAndroid Build Coastguard Worker
closeDevice(std::pair<sp<TestCameraDeviceCallbacks>,sp<hardware::camera2::ICameraDeviceUser>> & p)479*ec779b8eSAndroid Build Coastguard Worker void closeDevice(std::pair<sp<TestCameraDeviceCallbacks>,
480*ec779b8eSAndroid Build Coastguard Worker sp<hardware::camera2::ICameraDeviceUser>>& p) {
481*ec779b8eSAndroid Build Coastguard Worker if (p.second.get() != nullptr) {
482*ec779b8eSAndroid Build Coastguard Worker binder::Status res = p.second->disconnect();
483*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
484*ec779b8eSAndroid Build Coastguard Worker {
485*ec779b8eSAndroid Build Coastguard Worker SCOPED_TRACE("closeDevice");
486*ec779b8eSAndroid Build Coastguard Worker EXPECT_FALSE(p.first->hadError());
487*ec779b8eSAndroid Build Coastguard Worker }
488*ec779b8eSAndroid Build Coastguard Worker }
489*ec779b8eSAndroid Build Coastguard Worker auto iter = std::find(openDeviceList.begin(), openDeviceList.end(), p);
490*ec779b8eSAndroid Build Coastguard Worker if (iter != openDeviceList.end()) {
491*ec779b8eSAndroid Build Coastguard Worker openDeviceList.erase(iter);
492*ec779b8eSAndroid Build Coastguard Worker }
493*ec779b8eSAndroid Build Coastguard Worker }
494*ec779b8eSAndroid Build Coastguard Worker
SetUp()495*ec779b8eSAndroid Build Coastguard Worker virtual void SetUp() {
496*ec779b8eSAndroid Build Coastguard Worker ProcessState::self()->startThreadPool();
497*ec779b8eSAndroid Build Coastguard Worker sp<IServiceManager> sm = defaultServiceManager();
498*ec779b8eSAndroid Build Coastguard Worker sp<IBinder> binder = sm->getService(String16("media.camera"));
499*ec779b8eSAndroid Build Coastguard Worker service = interface_cast<hardware::ICameraService>(binder);
500*ec779b8eSAndroid Build Coastguard Worker serviceListener = new TestCameraServiceListener();
501*ec779b8eSAndroid Build Coastguard Worker std::vector<hardware::CameraStatus> statuses;
502*ec779b8eSAndroid Build Coastguard Worker service->addListener(serviceListener, &statuses);
503*ec779b8eSAndroid Build Coastguard Worker AttributionSourceState clientAttribution;
504*ec779b8eSAndroid Build Coastguard Worker clientAttribution.deviceId = kDefaultDeviceId;
505*ec779b8eSAndroid Build Coastguard Worker for (const auto &it : statuses) {
506*ec779b8eSAndroid Build Coastguard Worker serviceListener->onStatusChanged(it.status, it.cameraId, clientAttribution.deviceId);
507*ec779b8eSAndroid Build Coastguard Worker }
508*ec779b8eSAndroid Build Coastguard Worker service->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_BACKWARD_COMPATIBLE,
509*ec779b8eSAndroid Build Coastguard Worker clientAttribution, /*devicePolicy*/0, &numCameras);
510*ec779b8eSAndroid Build Coastguard Worker }
511*ec779b8eSAndroid Build Coastguard Worker
TearDown()512*ec779b8eSAndroid Build Coastguard Worker virtual void TearDown() {
513*ec779b8eSAndroid Build Coastguard Worker service = nullptr;
514*ec779b8eSAndroid Build Coastguard Worker numCameras = 0;
515*ec779b8eSAndroid Build Coastguard Worker for (auto& p : openDeviceList) {
516*ec779b8eSAndroid Build Coastguard Worker closeDevice(p);
517*ec779b8eSAndroid Build Coastguard Worker }
518*ec779b8eSAndroid Build Coastguard Worker }
519*ec779b8eSAndroid Build Coastguard Worker };
520*ec779b8eSAndroid Build Coastguard Worker
TEST_F(CameraClientBinderTest,CheckBinderCameraDeviceUser)521*ec779b8eSAndroid Build Coastguard Worker TEST_F(CameraClientBinderTest, CheckBinderCameraDeviceUser) {
522*ec779b8eSAndroid Build Coastguard Worker ASSERT_NOT_NULL(service);
523*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(serviceListener->waitForNumCameras(numCameras));
524*ec779b8eSAndroid Build Coastguard Worker for (int32_t i = 0; i < numCameras; i++) {
525*ec779b8eSAndroid Build Coastguard Worker std::string cameraId = std::to_string(i);
526*ec779b8eSAndroid Build Coastguard Worker // Make sure we're available, or skip device tests otherwise
527*ec779b8eSAndroid Build Coastguard Worker int32_t s = serviceListener->getStatus(cameraId);
528*ec779b8eSAndroid Build Coastguard Worker EXPECT_EQ(hardware::ICameraServiceListener::STATUS_PRESENT, s);
529*ec779b8eSAndroid Build Coastguard Worker if (s != hardware::ICameraServiceListener::STATUS_PRESENT) {
530*ec779b8eSAndroid Build Coastguard Worker continue;
531*ec779b8eSAndroid Build Coastguard Worker }
532*ec779b8eSAndroid Build Coastguard Worker binder::Status res;
533*ec779b8eSAndroid Build Coastguard Worker auto p = openNewDevice(cameraId);
534*ec779b8eSAndroid Build Coastguard Worker sp<TestCameraDeviceCallbacks> callbacks = p.first;
535*ec779b8eSAndroid Build Coastguard Worker sp<hardware::camera2::ICameraDeviceUser> device = p.second;
536*ec779b8eSAndroid Build Coastguard Worker
537*ec779b8eSAndroid Build Coastguard Worker // Setup a buffer queue; I'm just using the vendor opaque format here as that is
538*ec779b8eSAndroid Build Coastguard Worker // guaranteed to be present
539*ec779b8eSAndroid Build Coastguard Worker #if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
540*ec779b8eSAndroid Build Coastguard Worker sp<BufferItemConsumer> opaqueConsumer = new BufferItemConsumer(
541*ec779b8eSAndroid Build Coastguard Worker GRALLOC_USAGE_SW_READ_NEVER, /*maxImages*/ 2, /*controlledByApp*/ true);
542*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(opaqueConsumer.get() != nullptr);
543*ec779b8eSAndroid Build Coastguard Worker opaqueConsumer->setName(String8("nom nom nom"));
544*ec779b8eSAndroid Build Coastguard Worker
545*ec779b8eSAndroid Build Coastguard Worker // Set to VGA dimens for default, as that is guaranteed to be present
546*ec779b8eSAndroid Build Coastguard Worker EXPECT_EQ(OK, opaqueConsumer->setDefaultBufferSize(640, 480));
547*ec779b8eSAndroid Build Coastguard Worker EXPECT_EQ(OK,
548*ec779b8eSAndroid Build Coastguard Worker opaqueConsumer->setDefaultBufferFormat(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED));
549*ec779b8eSAndroid Build Coastguard Worker
550*ec779b8eSAndroid Build Coastguard Worker sp<Surface> surface = opaqueConsumer->getSurface();
551*ec779b8eSAndroid Build Coastguard Worker
552*ec779b8eSAndroid Build Coastguard Worker sp<IGraphicBufferProducer> producer = surface->getIGraphicBufferProducer();
553*ec779b8eSAndroid Build Coastguard Worker std::string noPhysicalId;
554*ec779b8eSAndroid Build Coastguard Worker OutputConfiguration output(producer, /*rotation*/ 0, noPhysicalId);
555*ec779b8eSAndroid Build Coastguard Worker #else
556*ec779b8eSAndroid Build Coastguard Worker sp<IGraphicBufferProducer> gbProducer;
557*ec779b8eSAndroid Build Coastguard Worker sp<IGraphicBufferConsumer> gbConsumer;
558*ec779b8eSAndroid Build Coastguard Worker BufferQueue::createBufferQueue(&gbProducer, &gbConsumer);
559*ec779b8eSAndroid Build Coastguard Worker sp<BufferItemConsumer> opaqueConsumer = new BufferItemConsumer(gbConsumer,
560*ec779b8eSAndroid Build Coastguard Worker GRALLOC_USAGE_SW_READ_NEVER, /*maxImages*/2, /*controlledByApp*/true);
561*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(opaqueConsumer.get() != nullptr);
562*ec779b8eSAndroid Build Coastguard Worker opaqueConsumer->setName(String8("nom nom nom"));
563*ec779b8eSAndroid Build Coastguard Worker
564*ec779b8eSAndroid Build Coastguard Worker // Set to VGA dimens for default, as that is guaranteed to be present
565*ec779b8eSAndroid Build Coastguard Worker EXPECT_EQ(OK, gbConsumer->setDefaultBufferSize(640, 480));
566*ec779b8eSAndroid Build Coastguard Worker EXPECT_EQ(OK, gbConsumer->setDefaultBufferFormat(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED));
567*ec779b8eSAndroid Build Coastguard Worker
568*ec779b8eSAndroid Build Coastguard Worker sp<Surface> surface(new Surface(gbProducer, /*controlledByApp*/false));
569*ec779b8eSAndroid Build Coastguard Worker
570*ec779b8eSAndroid Build Coastguard Worker std::string noPhysicalId;
571*ec779b8eSAndroid Build Coastguard Worker OutputConfiguration output(gbProducer, /*rotation*/0, noPhysicalId);
572*ec779b8eSAndroid Build Coastguard Worker #endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
573*ec779b8eSAndroid Build Coastguard Worker
574*ec779b8eSAndroid Build Coastguard Worker // Can we configure?
575*ec779b8eSAndroid Build Coastguard Worker res = device->beginConfigure();
576*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
577*ec779b8eSAndroid Build Coastguard Worker status_t streamId;
578*ec779b8eSAndroid Build Coastguard Worker res = device->createStream(output, &streamId);
579*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
580*ec779b8eSAndroid Build Coastguard Worker EXPECT_LE(0, streamId);
581*ec779b8eSAndroid Build Coastguard Worker CameraMetadata sessionParams;
582*ec779b8eSAndroid Build Coastguard Worker std::vector<int> offlineStreamIds;
583*ec779b8eSAndroid Build Coastguard Worker res = device->endConfigure(/*isConstrainedHighSpeed*/ false, sessionParams,
584*ec779b8eSAndroid Build Coastguard Worker ns2ms(systemTime()), &offlineStreamIds);
585*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
586*ec779b8eSAndroid Build Coastguard Worker EXPECT_FALSE(callbacks->hadError());
587*ec779b8eSAndroid Build Coastguard Worker
588*ec779b8eSAndroid Build Coastguard Worker // Session configuration must also be supported in this case
589*ec779b8eSAndroid Build Coastguard Worker SessionConfiguration sessionConfiguration = { /*inputWidth*/ 0, /*inputHeight*/0,
590*ec779b8eSAndroid Build Coastguard Worker /*inputFormat*/ -1, CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE};
591*ec779b8eSAndroid Build Coastguard Worker sessionConfiguration.addOutputConfiguration(output);
592*ec779b8eSAndroid Build Coastguard Worker bool queryStatus;
593*ec779b8eSAndroid Build Coastguard Worker res = device->isSessionConfigurationSupported(sessionConfiguration, &queryStatus);
594*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk() ||
595*ec779b8eSAndroid Build Coastguard Worker (res.serviceSpecificErrorCode() == ICameraService::ERROR_INVALID_OPERATION))
596*ec779b8eSAndroid Build Coastguard Worker << res;
597*ec779b8eSAndroid Build Coastguard Worker if (res.isOk()) {
598*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(queryStatus);
599*ec779b8eSAndroid Build Coastguard Worker }
600*ec779b8eSAndroid Build Coastguard Worker
601*ec779b8eSAndroid Build Coastguard Worker // Can we make requests?
602*ec779b8eSAndroid Build Coastguard Worker CameraMetadata requestTemplate;
603*ec779b8eSAndroid Build Coastguard Worker res = device->createDefaultRequest(/*preview template*/1,
604*ec779b8eSAndroid Build Coastguard Worker /*out*/&requestTemplate);
605*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
606*ec779b8eSAndroid Build Coastguard Worker
607*ec779b8eSAndroid Build Coastguard Worker hardware::camera2::CaptureRequest request;
608*ec779b8eSAndroid Build Coastguard Worker request.mPhysicalCameraSettings.push_back({cameraId, requestTemplate});
609*ec779b8eSAndroid Build Coastguard Worker request.mSurfaceList.add(surface);
610*ec779b8eSAndroid Build Coastguard Worker request.mIsReprocess = false;
611*ec779b8eSAndroid Build Coastguard Worker int64_t lastFrameNumber = 0;
612*ec779b8eSAndroid Build Coastguard Worker int64_t lastFrameNumberPrev = 0;
613*ec779b8eSAndroid Build Coastguard Worker callbacks->clearStatus();
614*ec779b8eSAndroid Build Coastguard Worker
615*ec779b8eSAndroid Build Coastguard Worker hardware::camera2::utils::SubmitInfo info;
616*ec779b8eSAndroid Build Coastguard Worker res = device->submitRequest(request, /*streaming*/true, /*out*/&info);
617*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
618*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT));
619*ec779b8eSAndroid Build Coastguard Worker EXPECT_LE(0, info.mRequestId);
620*ec779b8eSAndroid Build Coastguard Worker
621*ec779b8eSAndroid Build Coastguard Worker // Can we stop requests?
622*ec779b8eSAndroid Build Coastguard Worker res = device->cancelRequest(info.mRequestId, /*out*/&lastFrameNumber);
623*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
624*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(callbacks->waitForIdle());
625*ec779b8eSAndroid Build Coastguard Worker EXPECT_FALSE(callbacks->hadError());
626*ec779b8eSAndroid Build Coastguard Worker
627*ec779b8eSAndroid Build Coastguard Worker // Can we do it again?
628*ec779b8eSAndroid Build Coastguard Worker lastFrameNumberPrev = info.mLastFrameNumber;
629*ec779b8eSAndroid Build Coastguard Worker lastFrameNumber = 0;
630*ec779b8eSAndroid Build Coastguard Worker requestTemplate.clear();
631*ec779b8eSAndroid Build Coastguard Worker res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW,
632*ec779b8eSAndroid Build Coastguard Worker /*out*/&requestTemplate);
633*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
634*ec779b8eSAndroid Build Coastguard Worker hardware::camera2::CaptureRequest request2;
635*ec779b8eSAndroid Build Coastguard Worker request2.mPhysicalCameraSettings.push_back({cameraId, requestTemplate});
636*ec779b8eSAndroid Build Coastguard Worker request2.mSurfaceList.add(surface);
637*ec779b8eSAndroid Build Coastguard Worker request2.mIsReprocess = false;
638*ec779b8eSAndroid Build Coastguard Worker callbacks->clearStatus();
639*ec779b8eSAndroid Build Coastguard Worker hardware::camera2::utils::SubmitInfo info2;
640*ec779b8eSAndroid Build Coastguard Worker res = device->submitRequest(request2, /*streaming*/true,
641*ec779b8eSAndroid Build Coastguard Worker /*out*/&info2);
642*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
643*ec779b8eSAndroid Build Coastguard Worker EXPECT_EQ(hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES,
644*ec779b8eSAndroid Build Coastguard Worker info2.mLastFrameNumber);
645*ec779b8eSAndroid Build Coastguard Worker lastFrameNumber = 0;
646*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT));
647*ec779b8eSAndroid Build Coastguard Worker EXPECT_LE(0, info2.mRequestId);
648*ec779b8eSAndroid Build Coastguard Worker res = device->cancelRequest(info2.mRequestId, /*out*/&lastFrameNumber);
649*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
650*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(callbacks->waitForIdle());
651*ec779b8eSAndroid Build Coastguard Worker EXPECT_LE(lastFrameNumberPrev, lastFrameNumber);
652*ec779b8eSAndroid Build Coastguard Worker sleep(/*second*/1); // allow some time for errors to show up, if any
653*ec779b8eSAndroid Build Coastguard Worker EXPECT_FALSE(callbacks->hadError());
654*ec779b8eSAndroid Build Coastguard Worker
655*ec779b8eSAndroid Build Coastguard Worker // Can we do it with a request list?
656*ec779b8eSAndroid Build Coastguard Worker lastFrameNumberPrev = lastFrameNumber;
657*ec779b8eSAndroid Build Coastguard Worker lastFrameNumber = 0;
658*ec779b8eSAndroid Build Coastguard Worker requestTemplate.clear();
659*ec779b8eSAndroid Build Coastguard Worker CameraMetadata requestTemplate2;
660*ec779b8eSAndroid Build Coastguard Worker res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW,
661*ec779b8eSAndroid Build Coastguard Worker /*out*/&requestTemplate);
662*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
663*ec779b8eSAndroid Build Coastguard Worker res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW,
664*ec779b8eSAndroid Build Coastguard Worker /*out*/&requestTemplate2);
665*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
666*ec779b8eSAndroid Build Coastguard Worker android::hardware::camera2::CaptureRequest request3;
667*ec779b8eSAndroid Build Coastguard Worker android::hardware::camera2::CaptureRequest request4;
668*ec779b8eSAndroid Build Coastguard Worker request3.mPhysicalCameraSettings.push_back({cameraId, requestTemplate});
669*ec779b8eSAndroid Build Coastguard Worker request3.mSurfaceList.add(surface);
670*ec779b8eSAndroid Build Coastguard Worker request3.mIsReprocess = false;
671*ec779b8eSAndroid Build Coastguard Worker request4.mPhysicalCameraSettings.push_back({cameraId, requestTemplate2});
672*ec779b8eSAndroid Build Coastguard Worker request4.mSurfaceList.add(surface);
673*ec779b8eSAndroid Build Coastguard Worker request4.mIsReprocess = false;
674*ec779b8eSAndroid Build Coastguard Worker std::vector<hardware::camera2::CaptureRequest> requestList;
675*ec779b8eSAndroid Build Coastguard Worker requestList.push_back(request3);
676*ec779b8eSAndroid Build Coastguard Worker requestList.push_back(request4);
677*ec779b8eSAndroid Build Coastguard Worker
678*ec779b8eSAndroid Build Coastguard Worker callbacks->clearStatus();
679*ec779b8eSAndroid Build Coastguard Worker hardware::camera2::utils::SubmitInfo info3;
680*ec779b8eSAndroid Build Coastguard Worker res = device->submitRequestList(requestList, /*streaming*/false,
681*ec779b8eSAndroid Build Coastguard Worker /*out*/&info3);
682*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
683*ec779b8eSAndroid Build Coastguard Worker EXPECT_LE(0, info3.mRequestId);
684*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT));
685*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(callbacks->waitForIdle());
686*ec779b8eSAndroid Build Coastguard Worker EXPECT_LE(lastFrameNumberPrev, info3.mLastFrameNumber);
687*ec779b8eSAndroid Build Coastguard Worker sleep(/*second*/1); // allow some time for errors to show up, if any
688*ec779b8eSAndroid Build Coastguard Worker EXPECT_FALSE(callbacks->hadError());
689*ec779b8eSAndroid Build Coastguard Worker
690*ec779b8eSAndroid Build Coastguard Worker // Can we unconfigure?
691*ec779b8eSAndroid Build Coastguard Worker res = device->beginConfigure();
692*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
693*ec779b8eSAndroid Build Coastguard Worker res = device->deleteStream(streamId);
694*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
695*ec779b8eSAndroid Build Coastguard Worker res = device->endConfigure(/*isConstrainedHighSpeed*/ false, sessionParams,
696*ec779b8eSAndroid Build Coastguard Worker ns2ms(systemTime()), &offlineStreamIds);
697*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(res.isOk()) << res;
698*ec779b8eSAndroid Build Coastguard Worker
699*ec779b8eSAndroid Build Coastguard Worker sleep(/*second*/1); // allow some time for errors to show up, if any
700*ec779b8eSAndroid Build Coastguard Worker EXPECT_FALSE(callbacks->hadError());
701*ec779b8eSAndroid Build Coastguard Worker
702*ec779b8eSAndroid Build Coastguard Worker closeDevice(p);
703*ec779b8eSAndroid Build Coastguard Worker }
704*ec779b8eSAndroid Build Coastguard Worker }
705*ec779b8eSAndroid Build Coastguard Worker
TEST_F(CameraClientBinderTest,CheckBinderCaptureRequest)706*ec779b8eSAndroid Build Coastguard Worker TEST_F(CameraClientBinderTest, CheckBinderCaptureRequest) {
707*ec779b8eSAndroid Build Coastguard Worker sp<CaptureRequest> requestOriginal, requestParceled;
708*ec779b8eSAndroid Build Coastguard Worker sp<IGraphicBufferProducer> gbProducer;
709*ec779b8eSAndroid Build Coastguard Worker sp<IGraphicBufferConsumer> gbConsumer;
710*ec779b8eSAndroid Build Coastguard Worker BufferQueue::createBufferQueue(&gbProducer, &gbConsumer);
711*ec779b8eSAndroid Build Coastguard Worker sp<Surface> surface(new Surface(gbProducer, /*controlledByApp*/false));
712*ec779b8eSAndroid Build Coastguard Worker Vector<sp<Surface>> surfaceList;
713*ec779b8eSAndroid Build Coastguard Worker surfaceList.push_back(surface);
714*ec779b8eSAndroid Build Coastguard Worker std::string physicalDeviceId1 = "0";
715*ec779b8eSAndroid Build Coastguard Worker std::string physicalDeviceId2 = "1";
716*ec779b8eSAndroid Build Coastguard Worker CameraMetadata physicalDeviceSettings1, physicalDeviceSettings2;
717*ec779b8eSAndroid Build Coastguard Worker uint8_t intent1 = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
718*ec779b8eSAndroid Build Coastguard Worker uint8_t intent2 = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
719*ec779b8eSAndroid Build Coastguard Worker EXPECT_EQ(OK, physicalDeviceSettings1.update(ANDROID_CONTROL_CAPTURE_INTENT, &intent1, 1));
720*ec779b8eSAndroid Build Coastguard Worker EXPECT_EQ(OK, physicalDeviceSettings2.update(ANDROID_CONTROL_CAPTURE_INTENT, &intent2, 1));
721*ec779b8eSAndroid Build Coastguard Worker
722*ec779b8eSAndroid Build Coastguard Worker requestParceled = new CaptureRequest();
723*ec779b8eSAndroid Build Coastguard Worker Parcel p;
724*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(requestParceled->readFromParcel(&p) != OK);
725*ec779b8eSAndroid Build Coastguard Worker p.writeInt32(0);
726*ec779b8eSAndroid Build Coastguard Worker p.setDataPosition(0);
727*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(requestParceled->readFromParcel(&p) != OK);
728*ec779b8eSAndroid Build Coastguard Worker p.freeData();
729*ec779b8eSAndroid Build Coastguard Worker p.writeInt32(-1);
730*ec779b8eSAndroid Build Coastguard Worker p.setDataPosition(0);
731*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(requestParceled->readFromParcel(&p) != OK);
732*ec779b8eSAndroid Build Coastguard Worker p.freeData();
733*ec779b8eSAndroid Build Coastguard Worker p.writeInt32(1);
734*ec779b8eSAndroid Build Coastguard Worker p.setDataPosition(0);
735*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(requestParceled->readFromParcel(&p) != OK);
736*ec779b8eSAndroid Build Coastguard Worker
737*ec779b8eSAndroid Build Coastguard Worker requestOriginal = new CaptureRequest();
738*ec779b8eSAndroid Build Coastguard Worker requestOriginal->mPhysicalCameraSettings.push_back({physicalDeviceId1,
739*ec779b8eSAndroid Build Coastguard Worker physicalDeviceSettings1});
740*ec779b8eSAndroid Build Coastguard Worker requestOriginal->mPhysicalCameraSettings.push_back({physicalDeviceId2,
741*ec779b8eSAndroid Build Coastguard Worker physicalDeviceSettings2});
742*ec779b8eSAndroid Build Coastguard Worker requestOriginal->mSurfaceList.push_back(surface);
743*ec779b8eSAndroid Build Coastguard Worker requestOriginal->mIsReprocess = false;
744*ec779b8eSAndroid Build Coastguard Worker requestOriginal->mSurfaceConverted = false;
745*ec779b8eSAndroid Build Coastguard Worker
746*ec779b8eSAndroid Build Coastguard Worker p.freeData();
747*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(requestOriginal->writeToParcel(&p) == OK);
748*ec779b8eSAndroid Build Coastguard Worker p.setDataPosition(0);
749*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(requestParceled->readFromParcel(&p) == OK);
750*ec779b8eSAndroid Build Coastguard Worker EXPECT_EQ(requestParceled->mIsReprocess, false);
751*ec779b8eSAndroid Build Coastguard Worker EXPECT_FALSE(requestParceled->mSurfaceList.empty());
752*ec779b8eSAndroid Build Coastguard Worker EXPECT_EQ(2u, requestParceled->mPhysicalCameraSettings.size());
753*ec779b8eSAndroid Build Coastguard Worker auto it = requestParceled->mPhysicalCameraSettings.begin();
754*ec779b8eSAndroid Build Coastguard Worker EXPECT_EQ(physicalDeviceId1, it->id);
755*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(it->settings.exists(ANDROID_CONTROL_CAPTURE_INTENT));
756*ec779b8eSAndroid Build Coastguard Worker auto entry = it->settings.find(ANDROID_CONTROL_CAPTURE_INTENT);
757*ec779b8eSAndroid Build Coastguard Worker EXPECT_EQ(entry.data.u8[0], intent1);
758*ec779b8eSAndroid Build Coastguard Worker it++;
759*ec779b8eSAndroid Build Coastguard Worker EXPECT_EQ(physicalDeviceId2, it->id);
760*ec779b8eSAndroid Build Coastguard Worker EXPECT_TRUE(it->settings.exists(ANDROID_CONTROL_CAPTURE_INTENT));
761*ec779b8eSAndroid Build Coastguard Worker entry = it->settings.find(ANDROID_CONTROL_CAPTURE_INTENT);
762*ec779b8eSAndroid Build Coastguard Worker EXPECT_EQ(entry.data.u8[0], intent2);
763*ec779b8eSAndroid Build Coastguard Worker }
764