blob: 151c5cebce333c75a16843de26e0db6c101320e3 [file] [log] [blame]
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_NDEBUG 0
18#define LOG_TAG "CameraProviderManagerTest"
19
20#include "../common/CameraProviderManager.h"
Vadim Caen7eccd7c2023-10-03 16:26:33 +020021#include <aidl/android/hardware/camera/device/BnCameraDevice.h>
22#include <aidl/android/hardware/camera/provider/BnCameraProvider.h>
23#include <android/binder_auto_utils.h>
24#include <android/binder_ibinder.h>
25#include <android/binder_interface_utils.h>
26#include <android/binder_libbinder.h>
27#include <android/binder_manager.h>
28#include <android/binder_parcel.h>
Emilian Peev71c73a22017-03-21 16:35:51 +000029#include <android/hardware/camera/device/3.2/ICameraDeviceCallback.h>
30#include <android/hardware/camera/device/3.2/ICameraDeviceSession.h>
Vadim Caen7eccd7c2023-10-03 16:26:33 +020031#include <android/hidl/manager/1.0/IServiceManager.h>
32#include <android/hidl/manager/1.0/IServiceNotification.h>
33#include <binder/IServiceManager.h>
Emilian Peev71c73a22017-03-21 16:35:51 +000034#include <camera_metadata_hidden.h>
Vadim Caen7eccd7c2023-10-03 16:26:33 +020035#include <com_android_internal_camera_flags.h>
36#include <flag_macros.h>
37#include <gmock/gmock.h>
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080038#include <gtest/gtest.h>
Vadim Caen7eccd7c2023-10-03 16:26:33 +020039#include <hidl/HidlBinderSupport.h>
Emilian Peevc93cac22020-08-17 16:00:10 -070040#include <utility>
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080041
42using namespace android;
43using namespace android::hardware::camera;
Vadim Caen7eccd7c2023-10-03 16:26:33 +020044using ::aidl::android::hardware::camera::provider::ICameraProviderCallback;
45using android::hardware::camera::common::V1_0::CameraMetadataType;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080046using android::hardware::camera::common::V1_0::Status;
Emilian Peev71c73a22017-03-21 16:35:51 +000047using android::hardware::camera::common::V1_0::VendorTag;
48using android::hardware::camera::common::V1_0::VendorTagSection;
Emilian Peev71c73a22017-03-21 16:35:51 +000049using android::hardware::camera::device::V3_2::ICameraDeviceCallback;
50using android::hardware::camera::device::V3_2::ICameraDeviceSession;
Eino-Ville Talvala63f36112018-12-06 14:57:03 -080051using android::hardware::camera::provider::V2_5::DeviceState;
Vadim Caen7eccd7c2023-10-03 16:26:33 +020052using ::testing::ElementsAre;
53
54namespace flags = com::android::internal::camera::flags;
Emilian Peev71c73a22017-03-21 16:35:51 +000055
56/**
57 * Basic test implementation of a camera ver. 3.2 device interface
58 */
59struct TestDeviceInterface : public device::V3_2::ICameraDevice {
60 std::vector<hardware::hidl_string> mDeviceNames;
Emilian Peev2a245e12020-04-07 16:54:14 -070061 android::hardware::hidl_vec<uint8_t> mCharacteristics;
62
63 TestDeviceInterface(std::vector<hardware::hidl_string> deviceNames,
64 android::hardware::hidl_vec<uint8_t> chars) :
65 mDeviceNames(deviceNames), mCharacteristics(chars) {}
66
Emilian Peev71c73a22017-03-21 16:35:51 +000067 TestDeviceInterface(std::vector<hardware::hidl_string> deviceNames) :
68 mDeviceNames(deviceNames) {}
Emilian Peev2a245e12020-04-07 16:54:14 -070069
Emilian Peev71c73a22017-03-21 16:35:51 +000070 using getResourceCost_cb = std::function<void(
71 hardware::camera::common::V1_0::Status status,
72 const hardware::camera::common::V1_0::CameraResourceCost& resourceCost)>;
73 virtual ::android::hardware::Return<void> getResourceCost(
74 getResourceCost_cb _hidl_cb) override {
75 hardware::camera::common::V1_0::CameraResourceCost resourceCost = {100,
76 mDeviceNames};
77 _hidl_cb(Status::OK, resourceCost);
78 return hardware::Void();
79 }
80
81 using getCameraCharacteristics_cb = std::function<void(
82 hardware::camera::common::V1_0::Status status,
83 const hardware::hidl_vec<uint8_t>& cameraCharacteristics)>;
84 hardware::Return<void> getCameraCharacteristics(
85 getCameraCharacteristics_cb _hidl_cb) override {
Emilian Peev2a245e12020-04-07 16:54:14 -070086 _hidl_cb(Status::OK, mCharacteristics);
Emilian Peev71c73a22017-03-21 16:35:51 +000087 return hardware::Void();
88 }
89
90 hardware::Return<hardware::camera::common::V1_0::Status> setTorchMode(
91 ::android::hardware::camera::common::V1_0::TorchMode) override {
92 return Status::OK;
93 }
94
95 using open_cb = std::function<void(
96 ::android::hardware::camera::common::V1_0::Status status,
97 const ::android::sp<ICameraDeviceSession>& session)>;
98 hardware::Return<void> open(
99 const ::android::sp<ICameraDeviceCallback>&,
100 open_cb _hidl_cb) override {
101 sp<ICameraDeviceSession> deviceSession = nullptr;
102 _hidl_cb(Status::OK, deviceSession);
103 return hardware::Void();
104 }
105
106 hardware::Return<void> dumpState(
107 const ::android::hardware::hidl_handle&) override {
108 return hardware::Void();
109 }
110};
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800111
112/**
113 * Basic test implementation of a camera provider
114 */
Eino-Ville Talvala63f36112018-12-06 14:57:03 -0800115struct TestICameraProvider : virtual public provider::V2_5::ICameraProvider {
Emilian Peev71c73a22017-03-21 16:35:51 +0000116 sp<provider::V2_4::ICameraProviderCallback> mCallbacks;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800117 std::vector<hardware::hidl_string> mDeviceNames;
Emilian Peev71c73a22017-03-21 16:35:51 +0000118 sp<device::V3_2::ICameraDevice> mDeviceInterface;
119 hardware::hidl_vec<common::V1_0::VendorTagSection> mVendorTagSections;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800120
Shuzhen Wang3d316f32022-10-25 20:33:34 +0000121 // Whether to call a physical camera unavailable callback upon setCallback
122 bool mHasPhysicalCameraUnavailableCallback;
123 hardware::hidl_string mLogicalCameraId;
124 hardware::hidl_string mUnavailablePhysicalCameraId;
125
Emilian Peev71c73a22017-03-21 16:35:51 +0000126 TestICameraProvider(const std::vector<hardware::hidl_string> &devices,
127 const hardware::hidl_vec<common::V1_0::VendorTagSection> &vendorSection) :
128 mDeviceNames(devices),
129 mDeviceInterface(new TestDeviceInterface(devices)),
Shuzhen Wang3d316f32022-10-25 20:33:34 +0000130 mVendorTagSections (vendorSection),
131 mHasPhysicalCameraUnavailableCallback(false) {}
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800132
Emilian Peev2a245e12020-04-07 16:54:14 -0700133 TestICameraProvider(const std::vector<hardware::hidl_string> &devices,
134 const hardware::hidl_vec<common::V1_0::VendorTagSection> &vendorSection,
135 android::hardware::hidl_vec<uint8_t> chars) :
136 mDeviceNames(devices),
137 mDeviceInterface(new TestDeviceInterface(devices, chars)),
Shuzhen Wang3d316f32022-10-25 20:33:34 +0000138 mVendorTagSections (vendorSection),
139 mHasPhysicalCameraUnavailableCallback(false) {}
140
141 TestICameraProvider(const std::vector<hardware::hidl_string> &devices,
142 const hardware::hidl_vec<common::V1_0::VendorTagSection> &vendorSection,
143 android::hardware::hidl_vec<uint8_t> chars,
144 const hardware::hidl_string& logicalCameraId,
145 const hardware::hidl_string& unavailablePhysicalCameraId) :
146 mDeviceNames(devices),
147 mDeviceInterface(new TestDeviceInterface(devices, chars)),
148 mVendorTagSections (vendorSection),
149 mHasPhysicalCameraUnavailableCallback(true),
150 mLogicalCameraId(logicalCameraId),
151 mUnavailablePhysicalCameraId(unavailablePhysicalCameraId) {}
Emilian Peev2a245e12020-04-07 16:54:14 -0700152
Emilian Peev71c73a22017-03-21 16:35:51 +0000153 virtual hardware::Return<Status> setCallback(
154 const sp<provider::V2_4::ICameraProviderCallback>& callbacks) override {
Eino-Ville Talvala63f36112018-12-06 14:57:03 -0800155 mCalledCounter[SET_CALLBACK]++;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800156 mCallbacks = callbacks;
Shuzhen Wang3d316f32022-10-25 20:33:34 +0000157 if (mHasPhysicalCameraUnavailableCallback) {
158 auto cast26 = provider::V2_6::ICameraProviderCallback::castFrom(callbacks);
159 if (!cast26.isOk()) {
160 ADD_FAILURE() << "Failed to cast ICameraProviderCallback to V2_6";
161 } else {
162 sp<provider::V2_6::ICameraProviderCallback> callback26 = cast26;
163 if (callback26 == nullptr) {
164 ADD_FAILURE() << "V2_6::ICameraProviderCallback is null after conversion";
165 } else {
166 callback26->physicalCameraDeviceStatusChange(mLogicalCameraId,
167 mUnavailablePhysicalCameraId,
168 android::hardware::camera::common::V1_0::CameraDeviceStatus::NOT_PRESENT);
169 }
170 }
171 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800172 return hardware::Return<Status>(Status::OK);
173 }
174
175 using getVendorTags_cb = std::function<void(Status status,
176 const hardware::hidl_vec<common::V1_0::VendorTagSection>& sections)>;
Emilian Peev71c73a22017-03-21 16:35:51 +0000177 hardware::Return<void> getVendorTags(getVendorTags_cb _hidl_cb) override {
Eino-Ville Talvala63f36112018-12-06 14:57:03 -0800178 mCalledCounter[GET_VENDOR_TAGS]++;
Emilian Peev71c73a22017-03-21 16:35:51 +0000179 _hidl_cb(Status::OK, mVendorTagSections);
180 return hardware::Void();
181 }
182
183 using isSetTorchModeSupported_cb = std::function<void(
184 ::android::hardware::camera::common::V1_0::Status status,
185 bool support)>;
186 virtual ::hardware::Return<void> isSetTorchModeSupported(
187 isSetTorchModeSupported_cb _hidl_cb) override {
Eino-Ville Talvala63f36112018-12-06 14:57:03 -0800188 mCalledCounter[IS_SET_TORCH_MODE_SUPPORTED]++;
Emilian Peev71c73a22017-03-21 16:35:51 +0000189 _hidl_cb(Status::OK, false);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800190 return hardware::Void();
191 }
192
193 using getCameraIdList_cb = std::function<void(Status status,
194 const hardware::hidl_vec<hardware::hidl_string>& cameraDeviceNames)>;
195 virtual hardware::Return<void> getCameraIdList(getCameraIdList_cb _hidl_cb) override {
Eino-Ville Talvala63f36112018-12-06 14:57:03 -0800196 mCalledCounter[GET_CAMERA_ID_LIST]++;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800197 _hidl_cb(Status::OK, mDeviceNames);
198 return hardware::Void();
199 }
200
201 using getCameraDeviceInterface_V1_x_cb = std::function<void(Status status,
202 const sp<device::V1_0::ICameraDevice>& device)>;
203 virtual hardware::Return<void> getCameraDeviceInterface_V1_x(
Jing Mikec7f9b132023-03-12 11:12:04 +0800204 [[maybe_unused]] const hardware::hidl_string& cameraDeviceName,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800205 getCameraDeviceInterface_V1_x_cb _hidl_cb) override {
Emilian Peev71c73a22017-03-21 16:35:51 +0000206 _hidl_cb(Status::OK, nullptr); //TODO: impl. of ver. 1.0 device interface
207 // otherwise enumeration will fail.
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800208 return hardware::Void();
209 }
210
211 using getCameraDeviceInterface_V3_x_cb = std::function<void(Status status,
212 const sp<device::V3_2::ICameraDevice>& device)>;
213 virtual hardware::Return<void> getCameraDeviceInterface_V3_x(
Emilian Peev71c73a22017-03-21 16:35:51 +0000214 const hardware::hidl_string&,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800215 getCameraDeviceInterface_V3_x_cb _hidl_cb) override {
Emilian Peev71c73a22017-03-21 16:35:51 +0000216 _hidl_cb(Status::OK, mDeviceInterface);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800217 return hardware::Void();
218 }
219
Eino-Ville Talvala63f36112018-12-06 14:57:03 -0800220 virtual hardware::Return<void> notifyDeviceStateChange(
221 hardware::hidl_bitfield<DeviceState> newState) override {
222 mCalledCounter[NOTIFY_DEVICE_STATE]++;
223 mCurrentState = newState;
224 return hardware::Void();
225 }
226
Emilian Peevc93cac22020-08-17 16:00:10 -0700227 virtual ::android::hardware::Return<bool> linkToDeath(
228 const ::android::sp<::android::hardware::hidl_death_recipient>& recipient,
229 uint64_t cookie) {
230 if (mInitialDeathRecipient.get() == nullptr) {
231 mInitialDeathRecipient =
232 std::make_unique<::android::hardware::hidl_binder_death_recipient>(recipient,
233 cookie, this);
234 }
235 return true;
236 }
237
238 void signalInitialBinderDeathRecipient() {
239 if (mInitialDeathRecipient.get() != nullptr) {
240 mInitialDeathRecipient->binderDied(nullptr /*who*/);
241 }
242 }
243
244 std::unique_ptr<::android::hardware::hidl_binder_death_recipient> mInitialDeathRecipient;
245
Eino-Ville Talvala63f36112018-12-06 14:57:03 -0800246 enum MethodNames {
247 SET_CALLBACK,
248 GET_VENDOR_TAGS,
249 IS_SET_TORCH_MODE_SUPPORTED,
250 NOTIFY_DEVICE_STATE,
251 GET_CAMERA_ID_LIST,
252
253 METHOD_NAME_COUNT
254 };
255 int mCalledCounter[METHOD_NAME_COUNT] {0};
256
257 hardware::hidl_bitfield<DeviceState> mCurrentState = 0xFFFFFFFF; // Unlikely to be a real state
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800258};
259
Vadim Caen7eccd7c2023-10-03 16:26:33 +0200260struct TestAidlCameraDevice : public aidl::android::hardware::camera::device::BnCameraDevice {
261 ::ndk::ScopedAStatus getCameraCharacteristics(
262 ::aidl::android::hardware::camera::device::CameraMetadata*) override {
263 return ndk::ScopedAStatus::ok();
264 }
265 ::ndk::ScopedAStatus getPhysicalCameraCharacteristics(
266 const std::string&,
267 ::aidl::android::hardware::camera::device::CameraMetadata*) override {
268 return ndk::ScopedAStatus::ok();
269 }
270 ::ndk::ScopedAStatus getResourceCost(
271 ::aidl::android::hardware::camera::common::CameraResourceCost* aidl_return) override {
272 auto cost = ::aidl::android::hardware::camera::common::CameraResourceCost();
273 aidl_return->resourceCost = 100;
274 return ndk::ScopedAStatus::ok();
275 }
276 ::ndk::ScopedAStatus isStreamCombinationSupported(
277 const ::aidl::android::hardware::camera::device::StreamConfiguration&, bool*) override {
278 return ndk::ScopedAStatus::ok();
279 }
280 ::ndk::ScopedAStatus
281 open(const std::shared_ptr<::aidl::android::hardware::camera::device::ICameraDeviceCallback>&,
282 std::shared_ptr<::aidl::android::hardware::camera::device::ICameraDeviceSession>*)
283 override {
284 return ndk::ScopedAStatus::ok();
285 }
286 ::ndk::ScopedAStatus openInjectionSession(
287 const std::shared_ptr<
288 ::aidl::android::hardware::camera::device::ICameraDeviceCallback>&,
289 std::shared_ptr<::aidl::android::hardware::camera::device::ICameraInjectionSession>*)
290 override {
291 return ndk::ScopedAStatus::ok();
292 }
293 ::ndk::ScopedAStatus setTorchMode(bool) override { return ndk::ScopedAStatus::ok(); }
294 ::ndk::ScopedAStatus turnOnTorchWithStrengthLevel(int32_t) override {
295 return ndk::ScopedAStatus::ok();
296 }
297 ::ndk::ScopedAStatus getTorchStrengthLevel(int32_t*) override {
298 return ndk::ScopedAStatus::ok();
299 }
300};
301
302/**
303 * Basic test implementation of a AIDL camera provider
304 */
305class TestAidlICameraProvider : public aidl::android::hardware::camera::provider::BnCameraProvider {
306 public:
307 std::shared_ptr<ICameraProviderCallback> mCallback;
308 std::vector<std::string> mDeviceNames;
309
310 TestAidlICameraProvider(const std::vector<std::string>& deviceNames) {
311 mDeviceNames = deviceNames;
312 }
313
314 ::ndk::ScopedAStatus setCallback(
315 const std::shared_ptr<
316 ::aidl::android::hardware::camera::provider::ICameraProviderCallback>& callback)
317 override {
318 mCallback = callback;
319 return ndk::ScopedAStatus::ok();
320 }
321 ::ndk::ScopedAStatus getVendorTags(
322 std::vector<::aidl::android::hardware::camera::common::VendorTagSection>*) override {
323 return ndk::ScopedAStatus::ok();
324 }
325 ::ndk::ScopedAStatus getCameraIdList(std::vector<std::string>* camera_list) override {
326 ALOGW("getCameraIdList");
327 for (size_t i = 0; i < mDeviceNames.size(); i++) {
328 camera_list->push_back(mDeviceNames.at(i));
329 }
330 return ndk::ScopedAStatus::ok();
331 }
332 ::ndk::ScopedAStatus getCameraDeviceInterface(
333 const std::string&,
334 std::shared_ptr<::aidl::android::hardware::camera::device::ICameraDevice>* device)
335 override {
336 *device = ndk::SharedRefBase::make<TestAidlCameraDevice>();
337 return ndk::ScopedAStatus::ok();
338 }
339 ::ndk::ScopedAStatus notifyDeviceStateChange(int64_t) override {
340 return ndk::ScopedAStatus::ok();
341 }
342 ::ndk::ScopedAStatus getConcurrentCameraIds(
343 std::vector<
344 ::aidl::android::hardware::camera::provider::ConcurrentCameraIdCombination>*)
345 override {
346 return ndk::ScopedAStatus::ok();
347 }
348 ::ndk::ScopedAStatus isConcurrentStreamCombinationSupported(
349 const std::vector<
350 ::aidl::android::hardware::camera::provider::CameraIdAndStreamCombination>&,
351 bool*) override {
352 return ndk::ScopedAStatus::ok();
353 }
354};
355
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800356/**
357 * Simple test version of the interaction proxy, to use to inject onRegistered calls to the
358 * CameraProviderManager
359 */
Vadim Caen7eccd7c2023-10-03 16:26:33 +0200360struct TestInteractionProxy : public CameraProviderManager::HidlServiceInteractionProxy,
361 public CameraProviderManager::AidlServiceInteractionProxy {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800362 sp<hidl::manager::V1_0::IServiceNotification> mManagerNotificationInterface;
Emilian Peev71c73a22017-03-21 16:35:51 +0000363 sp<TestICameraProvider> mTestCameraProvider;
Vadim Caen7eccd7c2023-10-03 16:26:33 +0200364 std::shared_ptr<TestAidlICameraProvider> mTestAidlCameraProvider;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800365
Emilian Peev71c73a22017-03-21 16:35:51 +0000366 TestInteractionProxy() {}
Eino-Ville Talvala998d1fe2019-10-23 10:34:53 -0700367
Emilian Peev71c73a22017-03-21 16:35:51 +0000368 void setProvider(sp<TestICameraProvider> provider) {
369 mTestCameraProvider = provider;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800370 }
Emilian Peev71c73a22017-03-21 16:35:51 +0000371
Vadim Caen7eccd7c2023-10-03 16:26:33 +0200372 void setAidlProvider(std::shared_ptr<TestAidlICameraProvider> provider) {
373 mTestAidlCameraProvider = provider;
374 }
375
Eino-Ville Talvalabb6e4142018-08-21 14:17:40 -0700376 std::vector<std::string> mLastRequestedServiceNames;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800377
378 virtual ~TestInteractionProxy() {}
379
380 virtual bool registerForNotifications(
Jing Mikec7f9b132023-03-12 11:12:04 +0800381 [[maybe_unused]] const std::string &serviceName,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800382 const sp<hidl::manager::V1_0::IServiceNotification> &notification) override {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800383 mManagerNotificationInterface = notification;
384 return true;
385 }
386
Eino-Ville Talvalaec960602019-10-15 11:46:16 -0700387 virtual sp<hardware::camera::provider::V2_4::ICameraProvider> tryGetService(
388 const std::string &serviceName) override {
Eino-Ville Talvala998d1fe2019-10-23 10:34:53 -0700389 // If no provider has been given, act like the HAL isn't available and return null.
390 if (mTestCameraProvider == nullptr) return nullptr;
Eino-Ville Talvalaec960602019-10-15 11:46:16 -0700391 return getService(serviceName);
392 }
393
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800394 virtual sp<hardware::camera::provider::V2_4::ICameraProvider> getService(
395 const std::string &serviceName) override {
Eino-Ville Talvala998d1fe2019-10-23 10:34:53 -0700396 // If no provider has been given, fail; in reality, getService would
397 // block for HALs that don't start correctly, so we should never use
398 // getService when we don't have a valid HAL running
399 if (mTestCameraProvider == nullptr) {
400 ADD_FAILURE() << "getService called with no valid provider; would block indefinitely";
401 // Real getService would block, but that's bad in unit tests. So
402 // just record an error and return nullptr
403 return nullptr;
404 }
Eino-Ville Talvalabb6e4142018-08-21 14:17:40 -0700405 mLastRequestedServiceNames.push_back(serviceName);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800406 return mTestCameraProvider;
407 }
408
Yin-Chia Yeh177b0c12019-06-25 10:53:03 -0700409 virtual hardware::hidl_vec<hardware::hidl_string> listServices() override {
Eino-Ville Talvala998d1fe2019-10-23 10:34:53 -0700410 // Always provide a list even if there's no actual provider yet, to
411 // simulate stuck HAL situations as well
Yin-Chia Yeh177b0c12019-06-25 10:53:03 -0700412 hardware::hidl_vec<hardware::hidl_string> ret = {"test/0"};
413 return ret;
414 }
415
Vadim Caen7eccd7c2023-10-03 16:26:33 +0200416 virtual std::shared_ptr<aidl::android::hardware::camera::provider::ICameraProvider>
417 getAidlService(const std::string&) {
418 return mTestAidlCameraProvider;
419 }
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800420};
421
Emilian Peev71c73a22017-03-21 16:35:51 +0000422struct TestStatusListener : public CameraProviderManager::StatusListener {
Shuzhen Wang3d316f32022-10-25 20:33:34 +0000423 int mPhysicalCameraStatusChangeCount = 0;
424
Emilian Peev71c73a22017-03-21 16:35:51 +0000425 ~TestStatusListener() {}
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800426
Austin Borger1c1bee02023-06-01 16:51:35 -0700427 void onDeviceStatusChanged(const std::string &,
Jayant Chowdhary0bd38522021-11-05 17:49:27 -0700428 CameraDeviceStatus) override {}
Austin Borger1c1bee02023-06-01 16:51:35 -0700429 void onDeviceStatusChanged(const std::string &, const std::string &,
Shuzhen Wang3d316f32022-10-25 20:33:34 +0000430 CameraDeviceStatus) override {
431 mPhysicalCameraStatusChangeCount++;
432 }
Austin Borger1c1bee02023-06-01 16:51:35 -0700433 void onTorchStatusChanged(const std::string &,
Jayant Chowdhary0bd38522021-11-05 17:49:27 -0700434 TorchModeStatus) override {}
Austin Borger1c1bee02023-06-01 16:51:35 -0700435 void onTorchStatusChanged(const std::string &,
Jayant Chowdhary0bd38522021-11-05 17:49:27 -0700436 TorchModeStatus, SystemCameraKind) override {}
Eino-Ville Talvala7cffc832018-06-03 17:32:53 -0700437 void onNewProviderRegistered() override {}
Emilian Peev71c73a22017-03-21 16:35:51 +0000438};
439
Emilian Peev2a245e12020-04-07 16:54:14 -0700440TEST(CameraProviderManagerTest, InitializeDynamicDepthTest) {
441 std::vector<hardware::hidl_string> deviceNames;
442 deviceNames.push_back("device@3.2/test/0");
443 hardware::hidl_vec<common::V1_0::VendorTagSection> vendorSection;
444 status_t res;
445 sp<CameraProviderManager> providerManager = new CameraProviderManager();
446 sp<TestStatusListener> statusListener = new TestStatusListener();
447 TestInteractionProxy serviceProxy;
448
449 android::hardware::hidl_vec<uint8_t> chars;
450 CameraMetadata meta;
451 int32_t charKeys[] = { ANDROID_DEPTH_DEPTH_IS_EXCLUSIVE,
452 ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS };
453 meta.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, charKeys,
454 sizeof(charKeys) / sizeof(charKeys[0]));
455 uint8_t depthIsExclusive = ANDROID_DEPTH_DEPTH_IS_EXCLUSIVE_FALSE;
456 meta.update(ANDROID_DEPTH_DEPTH_IS_EXCLUSIVE, &depthIsExclusive, 1);
457 int32_t sizes[] = { HAL_PIXEL_FORMAT_BLOB,
458 640, 480, ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT };
459 meta.update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, sizes,
460 sizeof(sizes) / sizeof(sizes[0]));
461 sizes[0] = HAL_PIXEL_FORMAT_Y16;
462 meta.update(ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS, sizes,
463 sizeof(sizes) / sizeof(sizes[0]));
464 int64_t durations[] = { HAL_PIXEL_FORMAT_BLOB, 640, 480, 0 };
465 meta.update(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, durations,
466 sizeof(durations) / sizeof(durations[0]));
467 meta.update(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, durations,
468 sizeof(durations) / sizeof(durations[0]));
469 durations[0]= HAL_PIXEL_FORMAT_Y16;
470 meta.update(ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS, durations,
471 sizeof(durations) / sizeof(durations[0]));
472 meta.update(ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS, durations,
473 sizeof(durations) / sizeof(durations[0]));
474 camera_metadata_t* metaBuffer = const_cast<camera_metadata_t*>(meta.getAndLock());
475 chars.setToExternal(reinterpret_cast<uint8_t*>(metaBuffer),
476 get_camera_metadata_size(metaBuffer));
477
478 sp<TestICameraProvider> provider = new TestICameraProvider(deviceNames,
479 vendorSection, chars);
480 serviceProxy.setProvider(provider);
481
482 res = providerManager->initialize(statusListener, &serviceProxy);
483 ASSERT_EQ(res, OK) << "Unable to initialize provider manager";
484}
485
Emilian Peev71c73a22017-03-21 16:35:51 +0000486TEST(CameraProviderManagerTest, InitializeTest) {
487 std::vector<hardware::hidl_string> deviceNames;
488 deviceNames.push_back("device@3.2/test/0");
489 deviceNames.push_back("device@1.0/test/0");
490 deviceNames.push_back("device@3.2/test/1");
491 hardware::hidl_vec<common::V1_0::VendorTagSection> vendorSection;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800492 status_t res;
493 sp<CameraProviderManager> providerManager = new CameraProviderManager();
Emilian Peev71c73a22017-03-21 16:35:51 +0000494 sp<TestStatusListener> statusListener = new TestStatusListener();
495 TestInteractionProxy serviceProxy;
496 sp<TestICameraProvider> provider = new TestICameraProvider(deviceNames,
497 vendorSection);
498 serviceProxy.setProvider(provider);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800499
Yin-Chia Yeh177b0c12019-06-25 10:53:03 -0700500 int numProviders = static_cast<int>(serviceProxy.listServices().size());
501
Emilian Peev71c73a22017-03-21 16:35:51 +0000502 res = providerManager->initialize(statusListener, &serviceProxy);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800503 ASSERT_EQ(res, OK) << "Unable to initialize provider manager";
Eino-Ville Talvala63f36112018-12-06 14:57:03 -0800504 // Check that both "legacy" and "external" providers (really the same object) are called
505 // once for all the init methods
Yin-Chia Yeh177b0c12019-06-25 10:53:03 -0700506 EXPECT_EQ(provider->mCalledCounter[TestICameraProvider::SET_CALLBACK], numProviders) <<
Eino-Ville Talvala63f36112018-12-06 14:57:03 -0800507 "Only one call to setCallback per provider expected during init";
Yin-Chia Yeh177b0c12019-06-25 10:53:03 -0700508 EXPECT_EQ(provider->mCalledCounter[TestICameraProvider::GET_VENDOR_TAGS], numProviders) <<
Eino-Ville Talvala63f36112018-12-06 14:57:03 -0800509 "Only one call to getVendorTags per provider expected during init";
Yin-Chia Yeh177b0c12019-06-25 10:53:03 -0700510 EXPECT_EQ(provider->mCalledCounter[TestICameraProvider::IS_SET_TORCH_MODE_SUPPORTED],
511 numProviders) <<
Eino-Ville Talvala63f36112018-12-06 14:57:03 -0800512 "Only one call to isSetTorchModeSupported per provider expected during init";
Yin-Chia Yeh177b0c12019-06-25 10:53:03 -0700513 EXPECT_EQ(provider->mCalledCounter[TestICameraProvider::GET_CAMERA_ID_LIST], numProviders) <<
Eino-Ville Talvala63f36112018-12-06 14:57:03 -0800514 "Only one call to getCameraIdList per provider expected during init";
Yin-Chia Yeh177b0c12019-06-25 10:53:03 -0700515 EXPECT_EQ(provider->mCalledCounter[TestICameraProvider::NOTIFY_DEVICE_STATE], numProviders) <<
Eino-Ville Talvala63f36112018-12-06 14:57:03 -0800516 "Only one call to notifyDeviceState per provider expected during init";
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800517
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800518 hardware::hidl_string testProviderFqInterfaceName =
519 "android.hardware.camera.provider@2.4::ICameraProvider";
520 hardware::hidl_string testProviderInstanceName = "test/0";
521 serviceProxy.mManagerNotificationInterface->onRegistration(
522 testProviderFqInterfaceName,
523 testProviderInstanceName, false);
524
Eino-Ville Talvalabb6e4142018-08-21 14:17:40 -0700525 ASSERT_EQ(serviceProxy.mLastRequestedServiceNames.back(), testProviderInstanceName) <<
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800526 "Incorrect instance requested from service manager";
527}
Emilian Peev71c73a22017-03-21 16:35:51 +0000528
529TEST(CameraProviderManagerTest, MultipleVendorTagTest) {
530 hardware::hidl_string sectionName = "VendorTestSection";
531 hardware::hidl_string tagName = "VendorTestTag";
532 uint32_t tagId = VENDOR_SECTION << 16;
533 hardware::hidl_vec<common::V1_0::VendorTagSection> vendorSection;
534 CameraMetadataType tagType = CameraMetadataType::BYTE;
535 vendorSection.resize(1);
536 vendorSection[0].sectionName = sectionName;
537 vendorSection[0].tags.resize(1);
538 vendorSection[0].tags[0].tagId = tagId;
539 vendorSection[0].tags[0].tagName = tagName;
540 vendorSection[0].tags[0].tagType = tagType;
541 std::vector<hardware::hidl_string> deviceNames = {"device@3.2/test/0"};
542
543 sp<CameraProviderManager> providerManager = new CameraProviderManager();
544 sp<TestStatusListener> statusListener = new TestStatusListener();
545 TestInteractionProxy serviceProxy;
546
547 sp<TestICameraProvider> provider = new TestICameraProvider(deviceNames,
548 vendorSection);
549 serviceProxy.setProvider(provider);
550
551 auto res = providerManager->initialize(statusListener, &serviceProxy);
552 ASSERT_EQ(res, OK) << "Unable to initialize provider manager";
553
554 hardware::hidl_string testProviderInstanceName = "test/0";
555 hardware::hidl_string testProviderFqInterfaceName =
556 "android.hardware.camera.provider@2.4::ICameraProvider";
557 serviceProxy.mManagerNotificationInterface->onRegistration(
558 testProviderFqInterfaceName, testProviderInstanceName, false);
Eino-Ville Talvalabb6e4142018-08-21 14:17:40 -0700559 ASSERT_EQ(serviceProxy.mLastRequestedServiceNames.back(), testProviderInstanceName) <<
Emilian Peev71c73a22017-03-21 16:35:51 +0000560 "Incorrect instance requested from service manager";
561
562 hardware::hidl_string sectionNameSecond = "SecondVendorTestSection";
563 hardware::hidl_string secondTagName = "SecondVendorTestTag";
564 CameraMetadataType secondTagType = CameraMetadataType::DOUBLE;
565 vendorSection[0].sectionName = sectionNameSecond;
566 vendorSection[0].tags[0].tagId = tagId;
567 vendorSection[0].tags[0].tagName = secondTagName;
568 vendorSection[0].tags[0].tagType = secondTagType;
569 deviceNames = {"device@3.2/test2/1"};
570
571 sp<TestICameraProvider> secondProvider = new TestICameraProvider(
572 deviceNames, vendorSection);
573 serviceProxy.setProvider(secondProvider);
574 hardware::hidl_string testProviderSecondInstanceName = "test2/0";
575 serviceProxy.mManagerNotificationInterface->onRegistration(
576 testProviderFqInterfaceName, testProviderSecondInstanceName, false);
Eino-Ville Talvalabb6e4142018-08-21 14:17:40 -0700577 ASSERT_EQ(serviceProxy.mLastRequestedServiceNames.back(),
Emilian Peev71c73a22017-03-21 16:35:51 +0000578 testProviderSecondInstanceName) <<
579 "Incorrect instance requested from service manager";
580
581 ASSERT_EQ(NO_ERROR , providerManager->setUpVendorTags());
582 sp<VendorTagDescriptorCache> vendorCache =
583 VendorTagDescriptorCache::getGlobalVendorTagCache();
584 ASSERT_NE(nullptr, vendorCache.get());
585
586 metadata_vendor_id_t vendorId = std::hash<std::string> {} (
587 testProviderInstanceName.c_str());
588 metadata_vendor_id_t vendorIdSecond = std::hash<std::string> {} (
589 testProviderSecondInstanceName.c_str());
590
591 hardware::hidl_string resultTag = vendorCache->getTagName(tagId, vendorId);
592 ASSERT_EQ(resultTag, tagName);
593
594 resultTag = vendorCache->getTagName(tagId, vendorIdSecond);
595 ASSERT_EQ(resultTag, secondTagName);
596
597 // Check whether we can create two separate CameraMetadata instances
598 // using different tag vendor vendors.
599 camera_metadata *metaBuffer = allocate_camera_metadata(10, 20);
600 ASSERT_NE(nullptr, metaBuffer);
601 set_camera_metadata_vendor_id(metaBuffer, vendorId);
602 CameraMetadata metadata(metaBuffer);
603
604 uint8_t byteVal = 10;
605 ASSERT_TRUE(metadata.isEmpty());
606 ASSERT_EQ(OK, metadata.update(tagId, &byteVal, 1));
607 ASSERT_FALSE(metadata.isEmpty());
608 ASSERT_TRUE(metadata.exists(tagId));
609
610 metaBuffer = allocate_camera_metadata(10, 20);
611 ASSERT_NE(nullptr, metaBuffer);
612 set_camera_metadata_vendor_id(metaBuffer, vendorIdSecond);
613 CameraMetadata secondMetadata(metaBuffer);
614
615 ASSERT_TRUE(secondMetadata.isEmpty());
616 double doubleVal = 1.0f;
617 ASSERT_EQ(OK, secondMetadata.update(tagId, &doubleVal, 1));
618 ASSERT_FALSE(secondMetadata.isEmpty());
619 ASSERT_TRUE(secondMetadata.exists(tagId));
620
621 // Check whether CameraMetadata copying works as expected
622 CameraMetadata metadataCopy(metadata);
623 ASSERT_FALSE(metadataCopy.isEmpty());
624 ASSERT_TRUE(metadataCopy.exists(tagId));
625 ASSERT_EQ(OK, metadataCopy.update(tagId, &byteVal, 1));
626 ASSERT_TRUE(metadataCopy.exists(tagId));
627
628 // Check whether values are as expected
629 camera_metadata_entry_t entry = metadata.find(tagId);
630 ASSERT_EQ(1u, entry.count);
631 ASSERT_EQ(byteVal, entry.data.u8[0]);
632 entry = secondMetadata.find(tagId);
633 ASSERT_EQ(1u, entry.count);
634 ASSERT_EQ(doubleVal, entry.data.d[0]);
635
636 // Swap and erase
637 secondMetadata.swap(metadataCopy);
638 ASSERT_TRUE(metadataCopy.exists(tagId));
639 ASSERT_TRUE(secondMetadata.exists(tagId));
640 ASSERT_EQ(OK, secondMetadata.erase(tagId));
641 ASSERT_TRUE(secondMetadata.isEmpty());
642 doubleVal = 0.0f;
643 ASSERT_EQ(OK, metadataCopy.update(tagId, &doubleVal, 1));
644 entry = metadataCopy.find(tagId);
645 ASSERT_EQ(1u, entry.count);
646 ASSERT_EQ(doubleVal, entry.data.d[0]);
647
648 // Append
649 uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_ACTION;
650 secondMetadata.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
651 // Append from two different vendor tag providers is not supported!
652 ASSERT_NE(OK, metadataCopy.append(secondMetadata));
653 ASSERT_EQ(OK, metadataCopy.erase(tagId));
654 metadataCopy.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
655 // However appending from same vendor tag provider should be fine
656 ASSERT_EQ(OK, metadata.append(secondMetadata));
Emilian Peev68dbd4e2017-04-11 11:44:29 +0100657 // Append from a metadata without vendor tag provider should be supported
Emilian Peev71c73a22017-03-21 16:35:51 +0000658 CameraMetadata regularMetadata(10, 20);
659 uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
660 regularMetadata.update(ANDROID_CONTROL_MODE, &controlMode, 1);
Emilian Peev68dbd4e2017-04-11 11:44:29 +0100661 ASSERT_EQ(OK, secondMetadata.append(regularMetadata));
662 ASSERT_EQ(2u, secondMetadata.entryCount());
Emilian Peev71c73a22017-03-21 16:35:51 +0000663 ASSERT_EQ(2u, metadata.entryCount());
664
665 // Dump
666 metadata.dump(1, 2);
667 metadataCopy.dump(1, 2);
668 secondMetadata.dump(1, 2);
669}
Eino-Ville Talvala63f36112018-12-06 14:57:03 -0800670
671TEST(CameraProviderManagerTest, NotifyStateChangeTest) {
672 std::vector<hardware::hidl_string> deviceNames {
673 "device@3.2/test/0",
674 "device@1.0/test/0",
675 "device@3.2/test/1"};
676
677 hardware::hidl_vec<common::V1_0::VendorTagSection> vendorSection;
678 status_t res;
679 sp<CameraProviderManager> providerManager = new CameraProviderManager();
680 sp<TestStatusListener> statusListener = new TestStatusListener();
681 TestInteractionProxy serviceProxy;
682 sp<TestICameraProvider> provider = new TestICameraProvider(deviceNames,
683 vendorSection);
684 serviceProxy.setProvider(provider);
685
686 res = providerManager->initialize(statusListener, &serviceProxy);
687 ASSERT_EQ(res, OK) << "Unable to initialize provider manager";
688
689 ASSERT_EQ(provider->mCurrentState,
690 static_cast<hardware::hidl_bitfield<DeviceState>>(DeviceState::NORMAL))
691 << "Initial device state not set";
692
693 res = providerManager->notifyDeviceStateChange(
694 static_cast<hardware::hidl_bitfield<DeviceState>>(DeviceState::FOLDED));
695
696 ASSERT_EQ(res, OK) << "Unable to call notifyDeviceStateChange";
697 ASSERT_EQ(provider->mCurrentState,
698 static_cast<hardware::hidl_bitfield<DeviceState>>(DeviceState::FOLDED))
699 << "Unable to change device state";
700
701}
Eino-Ville Talvala998d1fe2019-10-23 10:34:53 -0700702
703// Test that CameraProviderManager doesn't get stuck when the camera HAL isn't really working
704TEST(CameraProviderManagerTest, BadHalStartupTest) {
705
706 std::vector<hardware::hidl_string> deviceNames;
707 deviceNames.push_back("device@3.2/test/0");
708 deviceNames.push_back("device@1.0/test/0");
709 deviceNames.push_back("device@3.2/test/1");
710 hardware::hidl_vec<common::V1_0::VendorTagSection> vendorSection;
711 status_t res;
712
713 sp<CameraProviderManager> providerManager = new CameraProviderManager();
714 sp<TestStatusListener> statusListener = new TestStatusListener();
715 TestInteractionProxy serviceProxy;
716 sp<TestICameraProvider> provider = new TestICameraProvider(deviceNames,
717 vendorSection);
718
719 // Not setting up provider in the service proxy yet, to test cases where a
720 // HAL isn't starting right
721 res = providerManager->initialize(statusListener, &serviceProxy);
722 ASSERT_EQ(res, OK) << "Unable to initialize provider manager";
723
724 // Now set up provider and trigger a registration
725 serviceProxy.setProvider(provider);
726 int numProviders = static_cast<int>(serviceProxy.listServices().size());
727
728 hardware::hidl_string testProviderFqInterfaceName =
729 "android.hardware.camera.provider@2.4::ICameraProvider";
730 hardware::hidl_string testProviderInstanceName = "test/0";
731 serviceProxy.mManagerNotificationInterface->onRegistration(
732 testProviderFqInterfaceName,
733 testProviderInstanceName, false);
734
735 // Check that new provider is called once for all the init methods
736 EXPECT_EQ(provider->mCalledCounter[TestICameraProvider::SET_CALLBACK], numProviders) <<
737 "Only one call to setCallback per provider expected during register";
738 EXPECT_EQ(provider->mCalledCounter[TestICameraProvider::GET_VENDOR_TAGS], numProviders) <<
739 "Only one call to getVendorTags per provider expected during register";
740 EXPECT_EQ(provider->mCalledCounter[TestICameraProvider::IS_SET_TORCH_MODE_SUPPORTED],
741 numProviders) <<
742 "Only one call to isSetTorchModeSupported per provider expected during init";
743 EXPECT_EQ(provider->mCalledCounter[TestICameraProvider::GET_CAMERA_ID_LIST], numProviders) <<
744 "Only one call to getCameraIdList per provider expected during init";
745 EXPECT_EQ(provider->mCalledCounter[TestICameraProvider::NOTIFY_DEVICE_STATE], numProviders) <<
746 "Only one call to notifyDeviceState per provider expected during init";
747
748 ASSERT_EQ(serviceProxy.mLastRequestedServiceNames.back(), testProviderInstanceName) <<
749 "Incorrect instance requested from service manager";
750}
Emilian Peevc93cac22020-08-17 16:00:10 -0700751
752// Test that CameraProviderManager can handle races between provider death notifications and
753// provider registration callbacks
754TEST(CameraProviderManagerTest, BinderDeathRegistrationRaceTest) {
755
756 std::vector<hardware::hidl_string> deviceNames;
757 deviceNames.push_back("device@3.2/test/0");
758 deviceNames.push_back("device@3.2/test/1");
759 hardware::hidl_vec<common::V1_0::VendorTagSection> vendorSection;
760 status_t res;
761
762 sp<CameraProviderManager> providerManager = new CameraProviderManager();
763 sp<TestStatusListener> statusListener = new TestStatusListener();
764 TestInteractionProxy serviceProxy;
765 sp<TestICameraProvider> provider = new TestICameraProvider(deviceNames,
766 vendorSection);
767
768 // Not setting up provider in the service proxy yet, to test cases where a
769 // HAL isn't starting right
770 res = providerManager->initialize(statusListener, &serviceProxy);
771 ASSERT_EQ(res, OK) << "Unable to initialize provider manager";
772
773 // Now set up provider and trigger a registration
774 serviceProxy.setProvider(provider);
775
776 hardware::hidl_string testProviderFqInterfaceName =
777 "android.hardware.camera.provider@2.4::ICameraProvider";
778 hardware::hidl_string testProviderInstanceName = "test/0";
779 serviceProxy.mManagerNotificationInterface->onRegistration(
780 testProviderFqInterfaceName,
781 testProviderInstanceName, false);
782
783 // Simulate artificial delay of the registration callback which arrives before the
784 // death notification
785 serviceProxy.mManagerNotificationInterface->onRegistration(
786 testProviderFqInterfaceName,
787 testProviderInstanceName, false);
788
789 provider->signalInitialBinderDeathRecipient();
790
791 auto deviceCount = static_cast<unsigned> (providerManager->getCameraCount().second);
792 ASSERT_EQ(deviceCount, deviceNames.size()) <<
793 "Unexpected amount of camera devices";
794}
Shuzhen Wang3d316f32022-10-25 20:33:34 +0000795
796// Test that CameraProviderManager does not trigger
797// onDeviceStatusChanged(NOT_PRESENT) for physical camera before initialize()
798// returns.
799TEST(CameraProviderManagerTest, PhysicalCameraAvailabilityCallbackRaceTest) {
800 std::vector<hardware::hidl_string> deviceNames;
801 deviceNames.push_back("device@3.2/test/0");
802 hardware::hidl_vec<common::V1_0::VendorTagSection> vendorSection;
803
804 sp<CameraProviderManager> providerManager = new CameraProviderManager();
805 sp<TestStatusListener> statusListener = new TestStatusListener();
806 TestInteractionProxy serviceProxy;
807
808 android::hardware::hidl_vec<uint8_t> chars;
809 CameraMetadata meta;
810 int32_t charKeys[] = { ANDROID_REQUEST_AVAILABLE_CAPABILITIES };
811 meta.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, charKeys,
812 sizeof(charKeys) / sizeof(charKeys[0]));
813 uint8_t capabilities[] = { ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA };
814 meta.update(ANDROID_REQUEST_AVAILABLE_CAPABILITIES, capabilities,
815 sizeof(capabilities)/sizeof(capabilities[0]));
816 uint8_t physicalCameraIds[] = { '2', '\0', '3', '\0' };
817 meta.update(ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS, physicalCameraIds,
818 sizeof(physicalCameraIds)/sizeof(physicalCameraIds[0]));
819 camera_metadata_t* metaBuffer = const_cast<camera_metadata_t*>(meta.getAndLock());
820 chars.setToExternal(reinterpret_cast<uint8_t*>(metaBuffer),
821 get_camera_metadata_size(metaBuffer));
822
823 sp<TestICameraProvider> provider = new TestICameraProvider(deviceNames,
824 vendorSection, chars, "device@3.2/test/0", "2");
825 serviceProxy.setProvider(provider);
826
827 status_t res = providerManager->initialize(statusListener, &serviceProxy);
828 ASSERT_EQ(res, OK) << "Unable to initialize provider manager";
829
830 ASSERT_EQ(statusListener->mPhysicalCameraStatusChangeCount, 0)
831 << "Unexpected physical camera status change callback upon provider init.";
832
833 std::unordered_map<std::string, std::set<std::string>> unavailablePhysicalIds;
834 auto cameraIds = providerManager->getCameraDeviceIds(&unavailablePhysicalIds);
835 ASSERT_TRUE(unavailablePhysicalIds.count("0") > 0 && unavailablePhysicalIds["0"].count("2") > 0)
836 << "Unavailable physical camera Ids not set properly.";
837}
Vadim Caen7eccd7c2023-10-03 16:26:33 +0200838TEST_WITH_FLAGS(CameraProviderManagerTest, AidlVirtualCameraProviderDiscovered,
839 REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(flags, virtual_camera_service_discovery))) {
840 sp<CameraProviderManager> providerManager = new CameraProviderManager();
841 sp<TestStatusListener> statusListener = new TestStatusListener();
842 TestInteractionProxy serviceProxy;
843
844 status_t res = providerManager->initialize(statusListener, &serviceProxy, &serviceProxy);
845 ASSERT_EQ(res, OK) << "Unable to initialize provider manager";
846
847 std::vector<std::string> cameraList = {"device@1.1/virtual/123"};
848
849 std::shared_ptr<TestAidlICameraProvider> aidlProvider =
850 ndk::SharedRefBase::make<TestAidlICameraProvider>(cameraList);
851 ndk::SpAIBinder spBinder = aidlProvider->asBinder();
852 AIBinder* aiBinder = spBinder.get();
853 serviceProxy.setAidlProvider(aidlProvider);
854 providerManager->onServiceRegistration(
855 String16("android.hardware.camera.provider.ICameraProvider/virtual/0"),
856 AIBinder_toPlatformBinder(aiBinder));
857
858 std::unordered_map<std::string, std::set<std::string>> unavailableDeviceIds;
859 auto cameraIds = providerManager->getCameraDeviceIds(&unavailableDeviceIds);
860
861 EXPECT_THAT(cameraIds, ElementsAre("123"));
862}
863
864TEST_WITH_FLAGS(CameraProviderManagerTest, AidlVirtualCameraProviderDiscoveredOnInit,
865 REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(flags, virtual_camera_service_discovery))) {
866 sp<CameraProviderManager> providerManager = new CameraProviderManager();
867 sp<TestStatusListener> statusListener = new TestStatusListener();
868 TestInteractionProxy serviceProxy;
869
870 std::vector<std::string> cameraList = {"device@1.1/virtual/123"};
871
872 std::shared_ptr<TestAidlICameraProvider> aidlProvider =
873 ndk::SharedRefBase::make<TestAidlICameraProvider>(cameraList);
874 serviceProxy.setAidlProvider(aidlProvider);
875
876 status_t res = providerManager->initialize(statusListener, &serviceProxy, &serviceProxy);
877 ASSERT_EQ(res, OK) << "Unable to initialize provider manager";
878
879 std::unordered_map<std::string, std::set<std::string>> unavailableDeviceIds;
880 std::vector<std::string> cameraIds = providerManager->getCameraDeviceIds(&unavailableDeviceIds);
881
882 EXPECT_THAT(cameraIds, ElementsAre("123"));
883}