1 /* 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" 21 #include <android/hidl/manager/1.0/IServiceManager.h> 22 #include <android/hidl/manager/1.0/IServiceNotification.h> 23 #include <android/hardware/camera/device/3.2/ICameraDeviceCallback.h> 24 #include <android/hardware/camera/device/3.2/ICameraDeviceSession.h> 25 #include <camera_metadata_hidden.h> 26 #include <gtest/gtest.h> 27 28 using namespace android; 29 using namespace android::hardware::camera; 30 using android::hardware::camera::common::V1_0::Status; 31 using android::hardware::camera::common::V1_0::VendorTag; 32 using android::hardware::camera::common::V1_0::VendorTagSection; 33 using android::hardware::camera::common::V1_0::CameraMetadataType; 34 using android::hardware::camera::device::V3_2::ICameraDeviceCallback; 35 using android::hardware::camera::device::V3_2::ICameraDeviceSession; 36 37 /** 38 * Basic test implementation of a camera ver. 3.2 device interface 39 */ 40 struct TestDeviceInterface : public device::V3_2::ICameraDevice { 41 std::vector<hardware::hidl_string> mDeviceNames; 42 TestDeviceInterface(std::vector<hardware::hidl_string> deviceNames) : 43 mDeviceNames(deviceNames) {} 44 using getResourceCost_cb = std::function<void( 45 hardware::camera::common::V1_0::Status status, 46 const hardware::camera::common::V1_0::CameraResourceCost& resourceCost)>; 47 virtual ::android::hardware::Return<void> getResourceCost( 48 getResourceCost_cb _hidl_cb) override { 49 hardware::camera::common::V1_0::CameraResourceCost resourceCost = {100, 50 mDeviceNames}; 51 _hidl_cb(Status::OK, resourceCost); 52 return hardware::Void(); 53 } 54 55 using getCameraCharacteristics_cb = std::function<void( 56 hardware::camera::common::V1_0::Status status, 57 const hardware::hidl_vec<uint8_t>& cameraCharacteristics)>; 58 hardware::Return<void> getCameraCharacteristics( 59 getCameraCharacteristics_cb _hidl_cb) override { 60 hardware::hidl_vec<uint8_t> cameraCharacteristics; 61 _hidl_cb(Status::OK, cameraCharacteristics); 62 return hardware::Void(); 63 } 64 65 hardware::Return<hardware::camera::common::V1_0::Status> setTorchMode( 66 ::android::hardware::camera::common::V1_0::TorchMode) override { 67 return Status::OK; 68 } 69 70 using open_cb = std::function<void( 71 ::android::hardware::camera::common::V1_0::Status status, 72 const ::android::sp<ICameraDeviceSession>& session)>; 73 hardware::Return<void> open( 74 const ::android::sp<ICameraDeviceCallback>&, 75 open_cb _hidl_cb) override { 76 sp<ICameraDeviceSession> deviceSession = nullptr; 77 _hidl_cb(Status::OK, deviceSession); 78 return hardware::Void(); 79 } 80 81 hardware::Return<void> dumpState( 82 const ::android::hardware::hidl_handle&) override { 83 return hardware::Void(); 84 } 85 }; 86 87 /** 88 * Basic test implementation of a camera provider 89 */ 90 struct TestICameraProvider : virtual public provider::V2_4::ICameraProvider { 91 sp<provider::V2_4::ICameraProviderCallback> mCallbacks; 92 std::vector<hardware::hidl_string> mDeviceNames; 93 sp<device::V3_2::ICameraDevice> mDeviceInterface; 94 hardware::hidl_vec<common::V1_0::VendorTagSection> mVendorTagSections; 95 96 TestICameraProvider(const std::vector<hardware::hidl_string> &devices, 97 const hardware::hidl_vec<common::V1_0::VendorTagSection> &vendorSection) : 98 mDeviceNames(devices), 99 mDeviceInterface(new TestDeviceInterface(devices)), 100 mVendorTagSections (vendorSection) {} 101 102 virtual hardware::Return<Status> setCallback( 103 const sp<provider::V2_4::ICameraProviderCallback>& callbacks) override { 104 mCallbacks = callbacks; 105 return hardware::Return<Status>(Status::OK); 106 } 107 108 using getVendorTags_cb = std::function<void(Status status, 109 const hardware::hidl_vec<common::V1_0::VendorTagSection>& sections)>; 110 hardware::Return<void> getVendorTags(getVendorTags_cb _hidl_cb) override { 111 _hidl_cb(Status::OK, mVendorTagSections); 112 return hardware::Void(); 113 } 114 115 using isSetTorchModeSupported_cb = std::function<void( 116 ::android::hardware::camera::common::V1_0::Status status, 117 bool support)>; 118 virtual ::hardware::Return<void> isSetTorchModeSupported( 119 isSetTorchModeSupported_cb _hidl_cb) override { 120 _hidl_cb(Status::OK, false); 121 return hardware::Void(); 122 } 123 124 using getCameraIdList_cb = std::function<void(Status status, 125 const hardware::hidl_vec<hardware::hidl_string>& cameraDeviceNames)>; 126 virtual hardware::Return<void> getCameraIdList(getCameraIdList_cb _hidl_cb) override { 127 _hidl_cb(Status::OK, mDeviceNames); 128 return hardware::Void(); 129 } 130 131 using getCameraDeviceInterface_V1_x_cb = std::function<void(Status status, 132 const sp<device::V1_0::ICameraDevice>& device)>; 133 virtual hardware::Return<void> getCameraDeviceInterface_V1_x( 134 const hardware::hidl_string& cameraDeviceName, 135 getCameraDeviceInterface_V1_x_cb _hidl_cb) override { 136 (void) cameraDeviceName; 137 _hidl_cb(Status::OK, nullptr); //TODO: impl. of ver. 1.0 device interface 138 // otherwise enumeration will fail. 139 return hardware::Void(); 140 } 141 142 using getCameraDeviceInterface_V3_x_cb = std::function<void(Status status, 143 const sp<device::V3_2::ICameraDevice>& device)>; 144 virtual hardware::Return<void> getCameraDeviceInterface_V3_x( 145 const hardware::hidl_string&, 146 getCameraDeviceInterface_V3_x_cb _hidl_cb) override { 147 _hidl_cb(Status::OK, mDeviceInterface); 148 return hardware::Void(); 149 } 150 151 }; 152 153 /** 154 * Simple test version of the interaction proxy, to use to inject onRegistered calls to the 155 * CameraProviderManager 156 */ 157 struct TestInteractionProxy : public CameraProviderManager::ServiceInteractionProxy { 158 sp<hidl::manager::V1_0::IServiceNotification> mManagerNotificationInterface; 159 sp<TestICameraProvider> mTestCameraProvider; 160 161 TestInteractionProxy() {} 162 void setProvider(sp<TestICameraProvider> provider) { 163 mTestCameraProvider = provider; 164 } 165 166 std::string mLastRequestedServiceName; 167 168 virtual ~TestInteractionProxy() {} 169 170 virtual bool registerForNotifications( 171 const std::string &serviceName, 172 const sp<hidl::manager::V1_0::IServiceNotification> ¬ification) override { 173 (void) serviceName; 174 mManagerNotificationInterface = notification; 175 return true; 176 } 177 178 virtual sp<hardware::camera::provider::V2_4::ICameraProvider> getService( 179 const std::string &serviceName) override { 180 mLastRequestedServiceName = serviceName; 181 return mTestCameraProvider; 182 } 183 184 }; 185 186 struct TestStatusListener : public CameraProviderManager::StatusListener { 187 ~TestStatusListener() {} 188 189 void onDeviceStatusChanged(const String8 &, 190 hardware::camera::common::V1_0::CameraDeviceStatus) override {} 191 void onTorchStatusChanged(const String8 &, 192 hardware::camera::common::V1_0::TorchModeStatus) override {} 193 }; 194 195 TEST(CameraProviderManagerTest, InitializeTest) { 196 std::vector<hardware::hidl_string> deviceNames; 197 deviceNames.push_back("device (at) 3.2/test/0"); 198 deviceNames.push_back("device (at) 1.0/test/0"); 199 deviceNames.push_back("device (at) 3.2/test/1"); 200 hardware::hidl_vec<common::V1_0::VendorTagSection> vendorSection; 201 status_t res; 202 sp<CameraProviderManager> providerManager = new CameraProviderManager(); 203 sp<TestStatusListener> statusListener = new TestStatusListener(); 204 TestInteractionProxy serviceProxy; 205 sp<TestICameraProvider> provider = new TestICameraProvider(deviceNames, 206 vendorSection); 207 serviceProxy.setProvider(provider); 208 209 res = providerManager->initialize(statusListener, &serviceProxy); 210 ASSERT_EQ(res, OK) << "Unable to initialize provider manager"; 211 212 hardware::hidl_string legacyInstanceName = "legacy/0"; 213 ASSERT_EQ(serviceProxy.mLastRequestedServiceName, legacyInstanceName) << 214 "Legacy instance not requested from service manager"; 215 216 hardware::hidl_string testProviderFqInterfaceName = 217 "android.hardware.camera.provider (at) 2.4::ICameraProvider"; 218 hardware::hidl_string testProviderInstanceName = "test/0"; 219 serviceProxy.mManagerNotificationInterface->onRegistration( 220 testProviderFqInterfaceName, 221 testProviderInstanceName, false); 222 223 ASSERT_EQ(serviceProxy.mLastRequestedServiceName, testProviderInstanceName) << 224 "Incorrect instance requested from service manager"; 225 } 226 227 TEST(CameraProviderManagerTest, MultipleVendorTagTest) { 228 hardware::hidl_string sectionName = "VendorTestSection"; 229 hardware::hidl_string tagName = "VendorTestTag"; 230 uint32_t tagId = VENDOR_SECTION << 16; 231 hardware::hidl_vec<common::V1_0::VendorTagSection> vendorSection; 232 CameraMetadataType tagType = CameraMetadataType::BYTE; 233 vendorSection.resize(1); 234 vendorSection[0].sectionName = sectionName; 235 vendorSection[0].tags.resize(1); 236 vendorSection[0].tags[0].tagId = tagId; 237 vendorSection[0].tags[0].tagName = tagName; 238 vendorSection[0].tags[0].tagType = tagType; 239 std::vector<hardware::hidl_string> deviceNames = {"device (at) 3.2/test/0"}; 240 241 sp<CameraProviderManager> providerManager = new CameraProviderManager(); 242 sp<TestStatusListener> statusListener = new TestStatusListener(); 243 TestInteractionProxy serviceProxy; 244 245 sp<TestICameraProvider> provider = new TestICameraProvider(deviceNames, 246 vendorSection); 247 serviceProxy.setProvider(provider); 248 249 auto res = providerManager->initialize(statusListener, &serviceProxy); 250 ASSERT_EQ(res, OK) << "Unable to initialize provider manager"; 251 252 hardware::hidl_string testProviderInstanceName = "test/0"; 253 hardware::hidl_string testProviderFqInterfaceName = 254 "android.hardware.camera.provider (at) 2.4::ICameraProvider"; 255 serviceProxy.mManagerNotificationInterface->onRegistration( 256 testProviderFqInterfaceName, testProviderInstanceName, false); 257 ASSERT_EQ(serviceProxy.mLastRequestedServiceName, testProviderInstanceName) << 258 "Incorrect instance requested from service manager"; 259 260 hardware::hidl_string sectionNameSecond = "SecondVendorTestSection"; 261 hardware::hidl_string secondTagName = "SecondVendorTestTag"; 262 CameraMetadataType secondTagType = CameraMetadataType::DOUBLE; 263 vendorSection[0].sectionName = sectionNameSecond; 264 vendorSection[0].tags[0].tagId = tagId; 265 vendorSection[0].tags[0].tagName = secondTagName; 266 vendorSection[0].tags[0].tagType = secondTagType; 267 deviceNames = {"device (at) 3.2/test2/1"}; 268 269 sp<TestICameraProvider> secondProvider = new TestICameraProvider( 270 deviceNames, vendorSection); 271 serviceProxy.setProvider(secondProvider); 272 hardware::hidl_string testProviderSecondInstanceName = "test2/0"; 273 serviceProxy.mManagerNotificationInterface->onRegistration( 274 testProviderFqInterfaceName, testProviderSecondInstanceName, false); 275 ASSERT_EQ(serviceProxy.mLastRequestedServiceName, 276 testProviderSecondInstanceName) << 277 "Incorrect instance requested from service manager"; 278 279 ASSERT_EQ(NO_ERROR , providerManager->setUpVendorTags()); 280 sp<VendorTagDescriptorCache> vendorCache = 281 VendorTagDescriptorCache::getGlobalVendorTagCache(); 282 ASSERT_NE(nullptr, vendorCache.get()); 283 284 metadata_vendor_id_t vendorId = std::hash<std::string> {} ( 285 testProviderInstanceName.c_str()); 286 metadata_vendor_id_t vendorIdSecond = std::hash<std::string> {} ( 287 testProviderSecondInstanceName.c_str()); 288 289 hardware::hidl_string resultTag = vendorCache->getTagName(tagId, vendorId); 290 ASSERT_EQ(resultTag, tagName); 291 292 resultTag = vendorCache->getTagName(tagId, vendorIdSecond); 293 ASSERT_EQ(resultTag, secondTagName); 294 295 // Check whether we can create two separate CameraMetadata instances 296 // using different tag vendor vendors. 297 camera_metadata *metaBuffer = allocate_camera_metadata(10, 20); 298 ASSERT_NE(nullptr, metaBuffer); 299 set_camera_metadata_vendor_id(metaBuffer, vendorId); 300 CameraMetadata metadata(metaBuffer); 301 302 uint8_t byteVal = 10; 303 ASSERT_TRUE(metadata.isEmpty()); 304 ASSERT_EQ(OK, metadata.update(tagId, &byteVal, 1)); 305 ASSERT_FALSE(metadata.isEmpty()); 306 ASSERT_TRUE(metadata.exists(tagId)); 307 308 metaBuffer = allocate_camera_metadata(10, 20); 309 ASSERT_NE(nullptr, metaBuffer); 310 set_camera_metadata_vendor_id(metaBuffer, vendorIdSecond); 311 CameraMetadata secondMetadata(metaBuffer); 312 313 ASSERT_TRUE(secondMetadata.isEmpty()); 314 double doubleVal = 1.0f; 315 ASSERT_EQ(OK, secondMetadata.update(tagId, &doubleVal, 1)); 316 ASSERT_FALSE(secondMetadata.isEmpty()); 317 ASSERT_TRUE(secondMetadata.exists(tagId)); 318 319 // Check whether CameraMetadata copying works as expected 320 CameraMetadata metadataCopy(metadata); 321 ASSERT_FALSE(metadataCopy.isEmpty()); 322 ASSERT_TRUE(metadataCopy.exists(tagId)); 323 ASSERT_EQ(OK, metadataCopy.update(tagId, &byteVal, 1)); 324 ASSERT_TRUE(metadataCopy.exists(tagId)); 325 326 // Check whether values are as expected 327 camera_metadata_entry_t entry = metadata.find(tagId); 328 ASSERT_EQ(1u, entry.count); 329 ASSERT_EQ(byteVal, entry.data.u8[0]); 330 entry = secondMetadata.find(tagId); 331 ASSERT_EQ(1u, entry.count); 332 ASSERT_EQ(doubleVal, entry.data.d[0]); 333 334 // Swap and erase 335 secondMetadata.swap(metadataCopy); 336 ASSERT_TRUE(metadataCopy.exists(tagId)); 337 ASSERT_TRUE(secondMetadata.exists(tagId)); 338 ASSERT_EQ(OK, secondMetadata.erase(tagId)); 339 ASSERT_TRUE(secondMetadata.isEmpty()); 340 doubleVal = 0.0f; 341 ASSERT_EQ(OK, metadataCopy.update(tagId, &doubleVal, 1)); 342 entry = metadataCopy.find(tagId); 343 ASSERT_EQ(1u, entry.count); 344 ASSERT_EQ(doubleVal, entry.data.d[0]); 345 346 // Append 347 uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_ACTION; 348 secondMetadata.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 349 // Append from two different vendor tag providers is not supported! 350 ASSERT_NE(OK, metadataCopy.append(secondMetadata)); 351 ASSERT_EQ(OK, metadataCopy.erase(tagId)); 352 metadataCopy.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 353 // However appending from same vendor tag provider should be fine 354 ASSERT_EQ(OK, metadata.append(secondMetadata)); 355 // Append from a metadata without vendor tag provider should be supported 356 CameraMetadata regularMetadata(10, 20); 357 uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 358 regularMetadata.update(ANDROID_CONTROL_MODE, &controlMode, 1); 359 ASSERT_EQ(OK, secondMetadata.append(regularMetadata)); 360 ASSERT_EQ(2u, secondMetadata.entryCount()); 361 ASSERT_EQ(2u, metadata.entryCount()); 362 363 // Dump 364 metadata.dump(1, 2); 365 metadataCopy.dump(1, 2); 366 secondMetadata.dump(1, 2); 367 } 368