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 #include <camera/CameraMetadata.h> 18 #include <gmock/gmock.h> 19 #include <gtest/gtest.h> 20 21 #include "../v4l2_wrapper_mock.h" 22 #include "converter_interface_mock.h" 23 #include "metadata_common.h" 24 #include "partial_metadata_factory.h" 25 #include "test_common.h" 26 27 using testing::AtMost; 28 using testing::Expectation; 29 using testing::Return; 30 using testing::SetArgPointee; 31 using testing::Test; 32 using testing::_; 33 34 namespace v4l2_camera_hal { 35 36 class PartialMetadataFactoryTest : public Test { 37 protected: 38 virtual void SetUp() { 39 mock_device_.reset(new V4L2WrapperMock()); 40 mock_converter_.reset(new ConverterInterfaceMock<uint8_t, int32_t>()); 41 // Nullify control so an error will be thrown 42 // if a test doesn't construct it. 43 control_.reset(); 44 } 45 46 virtual void ExpectControlTags() { 47 ASSERT_EQ(control_->StaticTags().size(), 1u); 48 EXPECT_EQ(control_->StaticTags()[0], options_tag_); 49 ASSERT_EQ(control_->ControlTags().size(), 1u); 50 EXPECT_EQ(control_->ControlTags()[0], delegate_tag_); 51 ASSERT_EQ(control_->DynamicTags().size(), 1u); 52 EXPECT_EQ(control_->DynamicTags()[0], delegate_tag_); 53 } 54 55 virtual void ExpectControlOptions(const std::vector<uint8_t>& options) { 56 // Options should be available. 57 android::CameraMetadata metadata; 58 ASSERT_EQ(control_->PopulateStaticFields(&metadata), 0); 59 EXPECT_EQ(metadata.entryCount(), 1u); 60 ExpectMetadataEq(metadata, options_tag_, options); 61 } 62 63 virtual void ExpectControlValue(uint8_t value) { 64 android::CameraMetadata metadata; 65 ASSERT_EQ(control_->PopulateDynamicFields(&metadata), 0); 66 EXPECT_EQ(metadata.entryCount(), 1u); 67 ExpectMetadataEq(metadata, delegate_tag_, value); 68 } 69 70 std::unique_ptr<Control<uint8_t>> control_; 71 std::shared_ptr<ConverterInterfaceMock<uint8_t, int32_t>> mock_converter_; 72 std::shared_ptr<V4L2WrapperMock> mock_device_; 73 74 // Need tags that match the data type (uint8_t) being passed. 75 const int32_t delegate_tag_ = ANDROID_COLOR_CORRECTION_ABERRATION_MODE; 76 const int32_t options_tag_ = 77 ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES; 78 }; 79 80 class DISABLED_PartialMetadataFactoryTest : public PartialMetadataFactoryTest { 81 }; 82 83 TEST_F(PartialMetadataFactoryTest, FixedState) { 84 uint8_t value = 13; 85 std::unique_ptr<State<uint8_t>> state = FixedState(delegate_tag_, value); 86 87 ASSERT_EQ(state->StaticTags().size(), 0u); 88 ASSERT_EQ(state->ControlTags().size(), 0u); 89 ASSERT_EQ(state->DynamicTags().size(), 1u); 90 EXPECT_EQ(state->DynamicTags()[0], delegate_tag_); 91 92 android::CameraMetadata metadata; 93 ASSERT_EQ(state->PopulateDynamicFields(&metadata), 0); 94 EXPECT_EQ(metadata.entryCount(), 1u); 95 ExpectMetadataEq(metadata, delegate_tag_, value); 96 } 97 98 TEST_F(PartialMetadataFactoryTest, NoEffectMenu) { 99 std::vector<uint8_t> test_options = {9, 8, 12}; 100 control_ = 101 NoEffectMenuControl<uint8_t>(delegate_tag_, options_tag_, test_options); 102 ASSERT_NE(control_, nullptr); 103 104 ExpectControlTags(); 105 106 // Options should be available. 107 ExpectControlOptions(test_options); 108 // Default value should be test_options[0]. 109 ExpectControlValue(test_options[0]); 110 } 111 112 TEST_F(PartialMetadataFactoryTest, NoEffectGenericMenu) { 113 uint8_t default_val = 9; 114 control_ = NoEffectControl<uint8_t>( 115 ControlType::kMenu, delegate_tag_, options_tag_, default_val); 116 ASSERT_NE(control_, nullptr); 117 118 ExpectControlTags(); 119 120 // Options should be available. 121 ExpectControlOptions({default_val}); 122 // |default_val| should be default option. 123 ExpectControlValue(default_val); 124 } 125 126 TEST_F(PartialMetadataFactoryTest, NoEffectSlider) { 127 std::vector<uint8_t> test_range = {9, 12}; 128 control_ = NoEffectSliderControl<uint8_t>( 129 delegate_tag_, options_tag_, test_range[0], test_range[1]); 130 ASSERT_NE(control_, nullptr); 131 132 ExpectControlTags(); 133 134 // Single option should be available. 135 ExpectControlOptions(test_range); 136 // Default value should be the minimum (test_range[0]). 137 ExpectControlValue(test_range[0]); 138 } 139 140 TEST_F(PartialMetadataFactoryTest, NoEffectGenericSlider) { 141 uint8_t default_val = 9; 142 control_ = NoEffectControl<uint8_t>( 143 ControlType::kSlider, delegate_tag_, options_tag_, default_val); 144 ASSERT_NE(control_, nullptr); 145 146 ExpectControlTags(); 147 148 // Range containing only |default_val| should be available. 149 ExpectControlOptions({default_val, default_val}); 150 // |default_val| should be default option. 151 ExpectControlValue(default_val); 152 } 153 154 TEST_F(PartialMetadataFactoryTest, V4L2FactoryQueryFail) { 155 int control_id = 55; 156 // Should query the device. 157 EXPECT_CALL(*mock_device_, QueryControl(control_id, _)).WillOnce(Return(-1)); 158 control_ = V4L2Control<uint8_t>(ControlType::kMenu, 159 delegate_tag_, 160 options_tag_, 161 mock_device_, 162 control_id, 163 mock_converter_); 164 // Failure, should return null. 165 ASSERT_EQ(control_, nullptr); 166 } 167 168 TEST_F(PartialMetadataFactoryTest, V4L2FactoryQueryBadType) { 169 int control_id = 55; 170 v4l2_query_ext_ctrl query_result; 171 query_result.type = V4L2_CTRL_TYPE_CTRL_CLASS; 172 // Should query the device. 173 EXPECT_CALL(*mock_device_, QueryControl(control_id, _)) 174 .WillOnce(DoAll(SetArgPointee<1>(query_result), Return(0))); 175 control_ = V4L2Control<uint8_t>(ControlType::kMenu, 176 delegate_tag_, 177 options_tag_, 178 mock_device_, 179 control_id, 180 mock_converter_); 181 // Failure, should return null. 182 ASSERT_EQ(control_, nullptr); 183 } 184 185 TEST_F(PartialMetadataFactoryTest, V4L2FactoryQueryBadRange) { 186 int control_id = 55; 187 v4l2_query_ext_ctrl query_result; 188 query_result.type = V4L2_CTRL_TYPE_MENU; 189 query_result.minimum = 10; 190 query_result.maximum = 1; // Less than minimum. 191 // Should query the device. 192 EXPECT_CALL(*mock_device_, QueryControl(control_id, _)) 193 .WillOnce(DoAll(SetArgPointee<1>(query_result), Return(0))); 194 control_ = V4L2Control<uint8_t>(ControlType::kMenu, 195 delegate_tag_, 196 options_tag_, 197 mock_device_, 198 control_id, 199 mock_converter_); 200 // Failure, should return null. 201 ASSERT_EQ(control_, nullptr); 202 } 203 204 TEST_F(PartialMetadataFactoryTest, V4L2FactoryTypeRequestMenuMismatch) { 205 int control_id = 55; 206 v4l2_query_ext_ctrl query_result; 207 query_result.type = V4L2_CTRL_TYPE_INTEGER; 208 query_result.minimum = 1; 209 query_result.maximum = 7; 210 query_result.step = 2; 211 // Have conversions for values 1-5, by step size 2. 212 std::map<int32_t, uint8_t> conversion_map = {{1, 10}, {3, 30}, {5, 50}}; 213 214 // Should query the device. 215 EXPECT_CALL(*mock_device_, QueryControl(control_id, _)) 216 .WillOnce(DoAll(SetArgPointee<1>(query_result), Return(0))); 217 218 // If you ask for a Menu, but the V4L2 control is a slider type, that's bad. 219 control_ = V4L2Control<uint8_t>(ControlType::kMenu, 220 delegate_tag_, 221 options_tag_, 222 mock_device_, 223 control_id, 224 mock_converter_); 225 ASSERT_EQ(control_, nullptr); 226 } 227 228 TEST_F(PartialMetadataFactoryTest, V4L2FactoryTypeRequestSliderMismatch) { 229 int control_id = 55; 230 v4l2_query_ext_ctrl query_result; 231 query_result.type = V4L2_CTRL_TYPE_MENU; 232 query_result.minimum = 1; 233 query_result.maximum = 7; 234 query_result.step = 2; 235 // Have conversions for values 1-5, by step size 2. 236 std::map<int32_t, uint8_t> conversion_map = {{1, 10}, {3, 30}, {5, 50}}; 237 238 // Should query the device. 239 EXPECT_CALL(*mock_device_, QueryControl(control_id, _)) 240 .WillOnce(DoAll(SetArgPointee<1>(query_result), Return(0))); 241 242 // If you ask for a Slider and get a Menu, that's bad. 243 control_ = V4L2Control<uint8_t>(ControlType::kSlider, 244 delegate_tag_, 245 options_tag_, 246 mock_device_, 247 control_id, 248 mock_converter_); 249 ASSERT_EQ(control_, nullptr); 250 } 251 252 TEST_F(DISABLED_PartialMetadataFactoryTest, V4L2FactoryMenu) { 253 // TODO(b/30921166): Correct Menu support so this can be re-enabled. 254 int control_id = 55; 255 v4l2_query_ext_ctrl query_result; 256 query_result.type = V4L2_CTRL_TYPE_MENU; 257 query_result.minimum = 1; 258 query_result.maximum = 7; 259 query_result.step = 2; 260 // Have conversions for values 1-5, by step size 2. 261 std::map<int32_t, uint8_t> conversion_map = {{1, 10}, {3, 30}, {5, 50}}; 262 263 // Should query the device. 264 EXPECT_CALL(*mock_device_, QueryControl(control_id, _)) 265 .WillOnce(DoAll(SetArgPointee<1>(query_result), Return(0))); 266 // Should convert values. 267 std::vector<uint8_t> expected_options; 268 for (auto kv : conversion_map) { 269 EXPECT_CALL(*mock_converter_, V4L2ToMetadata(kv.first, _)) 270 .WillOnce(DoAll(SetArgPointee<1>(kv.second), Return(0))); 271 expected_options.push_back(kv.second); 272 } 273 // Will fail to convert 7 with -EINVAL, shouldn't matter. 274 EXPECT_CALL(*mock_converter_, V4L2ToMetadata(7, _)).WillOnce(Return(-EINVAL)); 275 276 control_ = V4L2Control<uint8_t>(ControlType::kMenu, 277 delegate_tag_, 278 options_tag_, 279 mock_device_, 280 control_id, 281 mock_converter_); 282 ASSERT_NE(control_, nullptr); 283 284 ExpectControlTags(); 285 ExpectControlOptions(expected_options); 286 } 287 288 TEST_F(DISABLED_PartialMetadataFactoryTest, V4L2FactoryMenuConversionFail) { 289 // TODO(b/30921166): Correct Menu support so this can be re-enabled. 290 int control_id = 55; 291 v4l2_query_ext_ctrl query_result; 292 query_result.type = V4L2_CTRL_TYPE_MENU; 293 query_result.minimum = 1; 294 query_result.maximum = 7; 295 query_result.step = 2; 296 297 // Should query the device. 298 EXPECT_CALL(*mock_device_, QueryControl(control_id, _)) 299 .WillOnce(DoAll(SetArgPointee<1>(query_result), Return(0))); 300 // Conversion fails with non-EINVAL error. 301 EXPECT_CALL(*mock_converter_, V4L2ToMetadata(_, _)).WillOnce(Return(-1)); 302 303 control_ = V4L2Control<uint8_t>(ControlType::kMenu, 304 delegate_tag_, 305 options_tag_, 306 mock_device_, 307 control_id, 308 mock_converter_); 309 ASSERT_EQ(control_, nullptr); 310 } 311 312 TEST_F(DISABLED_PartialMetadataFactoryTest, V4L2FactoryMenuNoConversions) { 313 // TODO(b/30921166): Correct Menu support so this can be re-enabled. 314 int control_id = 55; 315 v4l2_query_ext_ctrl query_result; 316 query_result.type = V4L2_CTRL_TYPE_MENU; 317 query_result.minimum = 1; 318 query_result.maximum = 1; 319 query_result.step = 1; 320 321 // Should query the device. 322 EXPECT_CALL(*mock_device_, QueryControl(control_id, _)) 323 .WillOnce(DoAll(SetArgPointee<1>(query_result), Return(0))); 324 // Conversion fails with -EINVAL error. 325 EXPECT_CALL(*mock_converter_, V4L2ToMetadata(1, _)).WillOnce(Return(-EINVAL)); 326 327 control_ = V4L2Control<uint8_t>(ControlType::kMenu, 328 delegate_tag_, 329 options_tag_, 330 mock_device_, 331 control_id, 332 mock_converter_); 333 // Since there were no convertable options, should fail. 334 ASSERT_EQ(control_, nullptr); 335 } 336 337 TEST_F(PartialMetadataFactoryTest, V4L2FactoryInteger) { 338 int control_id = 55; 339 v4l2_query_ext_ctrl query_result; 340 query_result.type = V4L2_CTRL_TYPE_INTEGER; 341 query_result.minimum = 1; 342 query_result.maximum = 7; 343 query_result.step = 2; 344 // Have conversions for values 1 & 7. 345 std::map<int32_t, uint8_t> conversion_map = {{1, 10}, {7, 70}}; 346 347 // Should query the device. 348 EXPECT_CALL(*mock_device_, QueryControl(control_id, _)) 349 .WillOnce(DoAll(SetArgPointee<1>(query_result), Return(0))); 350 // Should convert values. 351 std::vector<uint8_t> expected_options; 352 for (auto kv : conversion_map) { 353 EXPECT_CALL(*mock_converter_, V4L2ToMetadata(kv.first, _)) 354 .WillOnce(DoAll(SetArgPointee<1>(kv.second), Return(0))); 355 expected_options.push_back(kv.second); 356 } 357 358 control_ = V4L2Control<uint8_t>(ControlType::kSlider, 359 delegate_tag_, 360 options_tag_, 361 mock_device_, 362 control_id, 363 mock_converter_); 364 ASSERT_NE(control_, nullptr); 365 366 ExpectControlTags(); 367 ExpectControlOptions(expected_options); 368 369 // Should be fitting converted values to steps. 370 uint8_t set_val = 10; 371 android::CameraMetadata metadata; 372 EXPECT_EQ(UpdateMetadata(&metadata, delegate_tag_, set_val), 0); 373 EXPECT_CALL(*mock_converter_, MetadataToV4L2(set_val, _)) 374 .WillOnce(DoAll(SetArgPointee<1>(4), Return(0))); 375 // When it calls into the device, the 4 returned above should be 376 // rounded down to the step value of 3. 377 EXPECT_CALL(*mock_device_, SetControl(control_id, 3, _)).WillOnce(Return(0)); 378 EXPECT_EQ(control_->SetRequestValues(metadata), 0); 379 } 380 381 TEST_F(PartialMetadataFactoryTest, V4L2FactoryIntegerFailedConversion) { 382 int control_id = 55; 383 v4l2_query_ext_ctrl query_result; 384 query_result.type = V4L2_CTRL_TYPE_INTEGER; 385 query_result.minimum = 1; 386 query_result.maximum = 7; 387 query_result.step = 2; 388 389 // Should query the device. 390 EXPECT_CALL(*mock_device_, QueryControl(control_id, _)) 391 .WillOnce(DoAll(SetArgPointee<1>(query_result), Return(0))); 392 // Fail to convert a value. Even -EINVAL is bad in this case. 393 EXPECT_CALL(*mock_converter_, V4L2ToMetadata(1, _)).WillOnce(Return(-EINVAL)); 394 395 control_ = V4L2Control<uint8_t>(ControlType::kSlider, 396 delegate_tag_, 397 options_tag_, 398 mock_device_, 399 control_id, 400 mock_converter_); 401 ASSERT_EQ(control_, nullptr); 402 } 403 404 TEST_F(PartialMetadataFactoryTest, V4L2FallbackMenu) { 405 uint8_t default_val = 9; 406 int control_id = 55; 407 408 // Should query the device. 409 EXPECT_CALL(*mock_device_, QueryControl(control_id, _)).WillOnce(Return(-1)); 410 411 // Shouldn't fail, should fall back to menu control. 412 control_ = V4L2ControlOrDefault<uint8_t>(ControlType::kMenu, 413 delegate_tag_, 414 options_tag_, 415 mock_device_, 416 control_id, 417 mock_converter_, 418 default_val); 419 ASSERT_NE(control_, nullptr); 420 421 ExpectControlTags(); 422 423 // Options should be available. 424 ExpectControlOptions({default_val}); 425 // |default_val| should be default option. 426 ExpectControlValue(default_val); 427 } 428 429 TEST_F(PartialMetadataFactoryTest, V4L2FallbackSlider) { 430 uint8_t default_val = 9; 431 int control_id = 55; 432 433 // Should query the device. 434 EXPECT_CALL(*mock_device_, QueryControl(control_id, _)).WillOnce(Return(-1)); 435 436 // Shouldn't fail, should fall back to slider control. 437 control_ = V4L2ControlOrDefault<uint8_t>(ControlType::kSlider, 438 delegate_tag_, 439 options_tag_, 440 mock_device_, 441 control_id, 442 mock_converter_, 443 default_val); 444 ASSERT_NE(control_, nullptr); 445 446 ExpectControlTags(); 447 448 // Range containing only |default_val| should be available. 449 ExpectControlOptions({default_val, default_val}); 450 // |default_val| should be default option. 451 ExpectControlValue(default_val); 452 } 453 454 } // namespace v4l2_camera_hal 455