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 "static_properties.h" 18 19 #include <gmock/gmock.h> 20 #include <gtest/gtest.h> 21 #include <hardware/camera3.h> 22 #include <system/camera.h> 23 24 #include "metadata/metadata_reader_mock.h" 25 26 using testing::AtMost; 27 using testing::Expectation; 28 using testing::Return; 29 using testing::SetArgPointee; 30 using testing::Test; 31 using testing::_; 32 33 namespace default_camera_hal { 34 35 class StaticPropertiesTest : public Test { 36 protected: 37 virtual void SetUp() { 38 // Ensure tests will probably fail if PrepareDUT isn't called. 39 dut_.reset(); 40 mock_reader_ = std::make_unique<MetadataReaderMock>(); 41 } 42 43 void PrepareDUT() { 44 dut_.reset(StaticProperties::NewStaticProperties(std::move(mock_reader_))); 45 } 46 47 void PrepareDefaultDUT() { 48 SetDefaultExpectations(); 49 PrepareDUT(); 50 ASSERT_NE(dut_, nullptr); 51 } 52 53 void SetDefaultExpectations() { 54 EXPECT_CALL(*mock_reader_, Facing(_)) 55 .Times(AtMost(1)) 56 .WillOnce(DoAll(SetArgPointee<0>(test_facing_), Return(0))); 57 EXPECT_CALL(*mock_reader_, Orientation(_)) 58 .Times(AtMost(1)) 59 .WillOnce(DoAll(SetArgPointee<0>(test_orientation_), Return(0))); 60 EXPECT_CALL(*mock_reader_, MaxInputStreams(_)) 61 .Times(AtMost(1)) 62 .WillOnce(DoAll(SetArgPointee<0>(test_max_inputs_), Return(0))); 63 EXPECT_CALL(*mock_reader_, MaxOutputStreams(_, _, _)) 64 .Times(AtMost(1)) 65 .WillOnce(DoAll(SetArgPointee<0>(test_max_raw_outputs_), 66 SetArgPointee<1>(test_max_non_stalling_outputs_), 67 SetArgPointee<2>(test_max_stalling_outputs_), 68 Return(0))); 69 EXPECT_CALL(*mock_reader_, RequestCapabilities(_)) 70 .Times(AtMost(1)) 71 .WillOnce( 72 DoAll(SetArgPointee<0>(test_request_capabilities_), Return(0))); 73 EXPECT_CALL(*mock_reader_, StreamConfigurations(_)) 74 .Times(AtMost(1)) 75 .WillOnce(DoAll(SetArgPointee<0>(test_configs_), Return(0))); 76 EXPECT_CALL(*mock_reader_, StreamStallDurations(_)) 77 .Times(AtMost(1)) 78 .WillOnce(DoAll(SetArgPointee<0>(test_stalls_), Return(0))); 79 EXPECT_CALL(*mock_reader_, ReprocessFormats(_)) 80 .Times(AtMost(1)) 81 .WillOnce(DoAll(SetArgPointee<0>(test_reprocess_map_), Return(0))); 82 } 83 84 camera3_stream_t MakeStream(int32_t format, 85 bool output = true, 86 bool input = false, 87 int32_t width = kWidth, 88 int32_t height = kHeight) { 89 int type = -1; 90 if (output && input) { 91 type = CAMERA3_STREAM_BIDIRECTIONAL; 92 } else if (output) { 93 type = CAMERA3_STREAM_OUTPUT; 94 } else if (input) { 95 type = CAMERA3_STREAM_INPUT; 96 } 97 camera3_stream_t stream; 98 stream.stream_type = type; 99 stream.width = width; 100 stream.height = height; 101 stream.format = format; 102 return stream; 103 } 104 105 void ExpectConfigurationSupported(std::vector<camera3_stream_t>& streams, 106 bool expected) { 107 std::vector<camera3_stream_t*> stream_addresses; 108 for (size_t i = 0; i < streams.size(); ++i) { 109 stream_addresses.push_back(&streams[i]); 110 } 111 camera3_stream_configuration_t config = { 112 static_cast<uint32_t>(stream_addresses.size()), 113 stream_addresses.data(), 114 CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE, 115 nullptr}; 116 PrepareDefaultDUT(); 117 EXPECT_EQ(dut_->StreamConfigurationSupported(&config), expected); 118 } 119 120 std::unique_ptr<StaticProperties> dut_; 121 std::unique_ptr<MetadataReaderMock> mock_reader_; 122 123 // Some helper values used for stream testing. 124 static constexpr int32_t kWidth = 320; 125 static constexpr int32_t kHeight = 240; 126 static constexpr int32_t kAlternateWidth = 640; 127 static constexpr int32_t kAlternateHeight = 480; 128 129 const int test_facing_ = CAMERA_FACING_FRONT; 130 const int test_orientation_ = 90; 131 const int32_t test_max_inputs_ = 3; 132 const int32_t test_max_raw_outputs_ = 1; 133 const int32_t test_max_non_stalling_outputs_ = 2; 134 const int32_t test_max_stalling_outputs_ = 3; 135 const std::set<uint8_t> test_request_capabilities_ = { 136 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE, 137 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR, 138 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING}; 139 140 // Some formats for various purposes (in various combinations, 141 // these types should be capable of testing all failure conditions). 142 const int32_t output_multisize_non_stalling_ = 1; 143 const int32_t bidirectional_self_supporting_stalling_ = 2; 144 const int32_t bidirectional_raw_ = HAL_PIXEL_FORMAT_RAW10; 145 const int32_t input_ = 3; 146 const int32_t other = input_; 147 148 const std::vector<StreamConfiguration> test_configs_ = { 149 {{{output_multisize_non_stalling_, 150 kWidth, 151 kHeight, 152 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT}}}, 153 {{{output_multisize_non_stalling_, 154 kAlternateWidth, 155 kAlternateHeight, 156 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT}}}, 157 {{{bidirectional_self_supporting_stalling_, 158 kWidth, 159 kHeight, 160 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT}}}, 161 {{{bidirectional_self_supporting_stalling_, 162 kWidth, 163 kHeight, 164 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT}}}, 165 {{{bidirectional_raw_, 166 kWidth, 167 kHeight, 168 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT}}}, 169 {{{bidirectional_raw_, 170 kWidth, 171 kHeight, 172 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT}}}, 173 {{{input_, 174 kWidth, 175 kHeight, 176 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT}}}}; 177 // Raw having a stall duration shouldn't matter, 178 // it should still be counted as the raw type. 179 const std::vector<StreamStallDuration> test_stalls_ = { 180 {{{output_multisize_non_stalling_, kWidth, kHeight, 0}}}, 181 {{{output_multisize_non_stalling_, 182 kAlternateWidth, 183 kAlternateHeight, 184 0}}}, 185 {{{bidirectional_self_supporting_stalling_, kWidth, kHeight, 10}}}, 186 {{{bidirectional_raw_, kWidth, kHeight, 15}}}}; 187 // Format 2 can go to itself or 1. 3 and RAW can only go to 1. 188 const ReprocessFormatMap test_reprocess_map_ = { 189 {bidirectional_self_supporting_stalling_, 190 {output_multisize_non_stalling_, 191 bidirectional_self_supporting_stalling_}}, 192 {bidirectional_raw_, {output_multisize_non_stalling_}}, 193 {input_, {output_multisize_non_stalling_}}}; 194 // Codify the above information about format capabilities in some helpful 195 // vectors. 196 int32_t multi_size_format_ = 1; 197 const std::vector<int32_t> input_formats_ = {2, 3, HAL_PIXEL_FORMAT_RAW10}; 198 const std::vector<int32_t> output_formats_ = {1, 2, HAL_PIXEL_FORMAT_RAW10}; 199 }; 200 201 TEST_F(StaticPropertiesTest, FactorySuccess) { 202 PrepareDefaultDUT(); 203 EXPECT_EQ(dut_->facing(), test_facing_); 204 EXPECT_EQ(dut_->orientation(), test_orientation_); 205 206 // Stream configurations tested seperately. 207 } 208 209 TEST_F(StaticPropertiesTest, FactoryFailedFacing) { 210 SetDefaultExpectations(); 211 // Override with a failure expectation. 212 EXPECT_CALL(*mock_reader_, Facing(_)).WillOnce(Return(99)); 213 PrepareDUT(); 214 EXPECT_EQ(dut_, nullptr); 215 } 216 217 TEST_F(StaticPropertiesTest, FactoryFailedOrientation) { 218 SetDefaultExpectations(); 219 // Override with a failure expectation. 220 EXPECT_CALL(*mock_reader_, Orientation(_)).WillOnce(Return(99)); 221 PrepareDUT(); 222 EXPECT_EQ(dut_, nullptr); 223 } 224 225 TEST_F(StaticPropertiesTest, FactoryFailedMaxInputs) { 226 SetDefaultExpectations(); 227 // Override with a failure expectation. 228 EXPECT_CALL(*mock_reader_, MaxInputStreams(_)).WillOnce(Return(99)); 229 PrepareDUT(); 230 EXPECT_EQ(dut_, nullptr); 231 } 232 233 TEST_F(StaticPropertiesTest, FactoryFailedMaxOutputs) { 234 SetDefaultExpectations(); 235 // Override with a failure expectation. 236 EXPECT_CALL(*mock_reader_, MaxOutputStreams(_, _, _)).WillOnce(Return(99)); 237 PrepareDUT(); 238 EXPECT_EQ(dut_, nullptr); 239 } 240 241 TEST_F(StaticPropertiesTest, FactoryFailedRequestCapabilities) { 242 SetDefaultExpectations(); 243 // Override with a failure expectation. 244 EXPECT_CALL(*mock_reader_, RequestCapabilities(_)).WillOnce(Return(99)); 245 PrepareDUT(); 246 EXPECT_EQ(dut_, nullptr); 247 } 248 249 TEST_F(StaticPropertiesTest, FactoryFailedStreamConfigs) { 250 SetDefaultExpectations(); 251 // Override with a failure expectation. 252 EXPECT_CALL(*mock_reader_, StreamConfigurations(_)).WillOnce(Return(99)); 253 PrepareDUT(); 254 EXPECT_EQ(dut_, nullptr); 255 } 256 257 TEST_F(StaticPropertiesTest, FactoryFailedStallDurations) { 258 SetDefaultExpectations(); 259 // Override with a failure expectation. 260 EXPECT_CALL(*mock_reader_, StreamStallDurations(_)).WillOnce(Return(99)); 261 PrepareDUT(); 262 EXPECT_EQ(dut_, nullptr); 263 } 264 265 TEST_F(StaticPropertiesTest, FactoryFailedReprocessFormats) { 266 SetDefaultExpectations(); 267 // Override with a failure expectation. 268 EXPECT_CALL(*mock_reader_, ReprocessFormats(_)).WillOnce(Return(99)); 269 PrepareDUT(); 270 EXPECT_EQ(dut_, nullptr); 271 } 272 273 TEST_F(StaticPropertiesTest, FactoryNoReprocessFormats) { 274 // If there are no inputs allowed, the reprocess formats shouldn't matter. 275 SetDefaultExpectations(); 276 // Override max inputs. 277 EXPECT_CALL(*mock_reader_, MaxInputStreams(_)) 278 .WillOnce(DoAll(SetArgPointee<0>(0), Return(0))); 279 // Override reprocess formats with a failure expectation. 280 EXPECT_CALL(*mock_reader_, ReprocessFormats(_)) 281 .Times(AtMost(1)) 282 .WillOnce(Return(99)); 283 PrepareDUT(); 284 // Should be ok. 285 EXPECT_NE(dut_, nullptr); 286 } 287 288 TEST_F(StaticPropertiesTest, FactoryInvalidCapabilities) { 289 SetDefaultExpectations(); 290 // Override configs with an extra output format. 291 std::vector<StreamConfiguration> configs = test_configs_; 292 configs.push_back( 293 {{{5, 294 kWidth, 295 kHeight, 296 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT}}}); 297 EXPECT_CALL(*mock_reader_, StreamConfigurations(_)) 298 .WillOnce(DoAll(SetArgPointee<0>(configs), Return(0))); 299 PrepareDUT(); 300 // Should fail because not every output has a stall. 301 EXPECT_EQ(dut_, nullptr); 302 } 303 304 TEST_F(StaticPropertiesTest, InvalidReprocessNoInputs) { 305 SetDefaultExpectations(); 306 // Override configs by removing all inputs. 307 std::vector<StreamConfiguration> configs = test_configs_; 308 for (auto it = configs.begin(); it != configs.end();) { 309 if ((*it).direction == 310 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT) { 311 it = configs.erase(it); 312 } else { 313 ++it; 314 } 315 } 316 EXPECT_CALL(*mock_reader_, StreamConfigurations(_)) 317 .WillOnce(DoAll(SetArgPointee<0>(configs), Return(0))); 318 PrepareDUT(); 319 // Should fail because inputs are supported but there are no input formats. 320 EXPECT_EQ(dut_, nullptr); 321 } 322 323 TEST_F(StaticPropertiesTest, InvalidReprocessExtraInput) { 324 SetDefaultExpectations(); 325 // Override configs with an extra input format. 326 std::vector<StreamConfiguration> configs = test_configs_; 327 configs.push_back({{{5, 328 kWidth, 329 kHeight, 330 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT}}}); 331 EXPECT_CALL(*mock_reader_, StreamConfigurations(_)) 332 .WillOnce(DoAll(SetArgPointee<0>(configs), Return(0))); 333 PrepareDUT(); 334 // Should fail because no reprocess outputs are listed for the extra input. 335 EXPECT_EQ(dut_, nullptr); 336 } 337 338 TEST_F(StaticPropertiesTest, InvalidReprocessExtraMapEntry) { 339 SetDefaultExpectations(); 340 // Override the reprocess map with an extra entry. 341 ReprocessFormatMap reprocess_map = test_reprocess_map_; 342 reprocess_map[5] = {1}; 343 EXPECT_CALL(*mock_reader_, ReprocessFormats(_)) 344 .WillOnce(DoAll(SetArgPointee<0>(reprocess_map), Return(0))); 345 PrepareDUT(); 346 // Should fail because the extra map entry doesn't correspond to an input. 347 EXPECT_EQ(dut_, nullptr); 348 } 349 350 TEST_F(StaticPropertiesTest, InvalidReprocessWrongMapEntries) { 351 SetDefaultExpectations(); 352 // Override the reprocess map replacing the entry for the 353 // input-only format with the output-only format. 354 ReprocessFormatMap reprocess_map = test_reprocess_map_; 355 reprocess_map.erase(input_); 356 reprocess_map[output_multisize_non_stalling_] = {1}; 357 EXPECT_CALL(*mock_reader_, ReprocessFormats(_)) 358 .WillOnce(DoAll(SetArgPointee<0>(reprocess_map), Return(0))); 359 PrepareDUT(); 360 // Should fail because not all input formats are present/ 361 // one of the map "input" formats is output only. 362 EXPECT_EQ(dut_, nullptr); 363 } 364 365 TEST_F(StaticPropertiesTest, InvalidReprocessNotAnOutput) { 366 SetDefaultExpectations(); 367 // Override the reprocess map with a non-output output entry. 368 ReprocessFormatMap reprocess_map = test_reprocess_map_; 369 reprocess_map[input_].insert(input_); 370 EXPECT_CALL(*mock_reader_, ReprocessFormats(_)) 371 .WillOnce(DoAll(SetArgPointee<0>(reprocess_map), Return(0))); 372 PrepareDUT(); 373 // Should fail because a specified output format doesn't support output. 374 EXPECT_EQ(dut_, nullptr); 375 } 376 377 TEST_F(StaticPropertiesTest, TemplatesValid) { 378 PrepareDefaultDUT(); 379 for (int i = 1; i < CAMERA3_TEMPLATE_COUNT; ++i) { 380 EXPECT_TRUE(dut_->TemplateSupported(i)); 381 } 382 } 383 384 TEST_F(StaticPropertiesTest, ConfigureSingleOutput) { 385 std::vector<camera3_stream_t> streams; 386 streams.push_back(MakeStream(output_multisize_non_stalling_)); 387 ExpectConfigurationSupported(streams, true); 388 } 389 390 TEST_F(StaticPropertiesTest, ConfigureMultipleOutputs) { 391 std::vector<camera3_stream_t> streams; 392 // 2 outputs, of different sizes. 393 streams.push_back(MakeStream(bidirectional_raw_)); 394 // Use the alternate size. 395 streams.push_back(MakeStream(output_multisize_non_stalling_, 396 true, 397 false, 398 kAlternateWidth, 399 kAlternateHeight)); 400 ExpectConfigurationSupported(streams, true); 401 } 402 403 TEST_F(StaticPropertiesTest, ConfigureInput) { 404 std::vector<camera3_stream_t> streams; 405 // Single input -> different output. 406 streams.push_back(MakeStream(input_, false, true)); 407 // Use the alternate size, it should be ok. 408 streams.push_back(MakeStream(output_multisize_non_stalling_, 409 true, 410 false, 411 kAlternateWidth, 412 kAlternateHeight)); 413 ExpectConfigurationSupported(streams, true); 414 } 415 416 TEST_F(StaticPropertiesTest, ConfigureBidirectional) { 417 std::vector<camera3_stream_t> streams; 418 // Single input -> same output. 419 streams.push_back( 420 MakeStream(bidirectional_self_supporting_stalling_, true, true)); 421 ExpectConfigurationSupported(streams, true); 422 } 423 424 TEST_F(StaticPropertiesTest, ConfigureMultipleReprocess) { 425 std::vector<camera3_stream_t> streams; 426 // Single input -> multiple outputs. 427 streams.push_back( 428 MakeStream(bidirectional_self_supporting_stalling_, true, true)); 429 streams.push_back(MakeStream(output_multisize_non_stalling_)); 430 ExpectConfigurationSupported(streams, true); 431 } 432 433 TEST_F(StaticPropertiesTest, ConfigureNull) { 434 PrepareDefaultDUT(); 435 EXPECT_FALSE(dut_->StreamConfigurationSupported(nullptr)); 436 } 437 438 TEST_F(StaticPropertiesTest, ConfigureEmptyStreams) { 439 std::vector<camera3_stream_t*> streams(1); 440 camera3_stream_configuration_t config = { 441 0, streams.data(), CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE, nullptr}; 442 PrepareDefaultDUT(); 443 EXPECT_FALSE(dut_->StreamConfigurationSupported(&config)); 444 } 445 446 TEST_F(StaticPropertiesTest, ConfigureNullStreams) { 447 std::vector<camera3_stream_t*> streams(2, nullptr); 448 camera3_stream_configuration_t config = { 449 static_cast<uint32_t>(streams.size()), 450 streams.data(), 451 CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE, 452 nullptr}; 453 PrepareDefaultDUT(); 454 EXPECT_FALSE(dut_->StreamConfigurationSupported(&config)); 455 } 456 457 TEST_F(StaticPropertiesTest, ConfigureNullStreamVector) { 458 // Even if the camera claims to have multiple streams, check for null. 459 camera3_stream_configuration_t config = { 460 3, nullptr, CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE, nullptr}; 461 PrepareDefaultDUT(); 462 EXPECT_FALSE(dut_->StreamConfigurationSupported(&config)); 463 } 464 465 TEST_F(StaticPropertiesTest, ConfigureNoOutput) { 466 std::vector<camera3_stream_t> streams; 467 // Only an input stream, no output. 468 streams.push_back(MakeStream(input_, false, true)); 469 ExpectConfigurationSupported(streams, false); 470 } 471 472 TEST_F(StaticPropertiesTest, ConfigureInvalidType) { 473 std::vector<camera3_stream_t> streams; 474 // Not input, output, or bidirectional. 475 streams.push_back(MakeStream(output_multisize_non_stalling_, false, false)); 476 ExpectConfigurationSupported(streams, false); 477 } 478 479 TEST_F(StaticPropertiesTest, ConfigureSpecFormatDoesNotExist) { 480 std::vector<camera3_stream_t> streams; 481 // Format 99 is not supported in any form. 482 streams.push_back(MakeStream(99)); 483 ExpectConfigurationSupported(streams, false); 484 } 485 486 TEST_F(StaticPropertiesTest, ConfigureSpecSizeDoesNotExist) { 487 std::vector<camera3_stream_t> streams; 488 // Size 99 x 99 not supported for the output format. 489 streams.push_back( 490 MakeStream(output_multisize_non_stalling_, true, false, 99, 99)); 491 ExpectConfigurationSupported(streams, false); 492 } 493 494 TEST_F(StaticPropertiesTest, ConfigureNotAnInput) { 495 std::vector<camera3_stream_t> streams; 496 streams.push_back(MakeStream(output_multisize_non_stalling_)); 497 // Can't use output-only format as an input. 498 streams.push_back(MakeStream(output_multisize_non_stalling_, false, true)); 499 ExpectConfigurationSupported(streams, false); 500 } 501 502 TEST_F(StaticPropertiesTest, ConfigureNotAnOutput) { 503 std::vector<camera3_stream_t> streams; 504 // Can't use input-only format as an output. 505 streams.push_back(MakeStream(input_)); 506 ExpectConfigurationSupported(streams, false); 507 } 508 509 TEST_F(StaticPropertiesTest, ConfigureTooManyInputs) { 510 std::vector<camera3_stream_t> streams; 511 // At the threshold is ok. 512 for (int32_t i = 0; i < test_max_inputs_; ++i) { 513 streams.push_back(MakeStream(input_, false, true)); 514 } 515 // Have a valid output still. 516 streams.push_back(MakeStream(output_multisize_non_stalling_)); 517 ExpectConfigurationSupported(streams, false); 518 519 // Reset. 520 mock_reader_ = std::make_unique<MetadataReaderMock>(); 521 streams.clear(); 522 523 // Try again with too many. 524 for (int32_t i = 0; i <= test_max_inputs_; ++i) { 525 streams.push_back(MakeStream(input_, false, true)); 526 } 527 // Have a valid output still. 528 streams.push_back(MakeStream(output_multisize_non_stalling_)); 529 ExpectConfigurationSupported(streams, false); 530 } 531 532 TEST_F(StaticPropertiesTest, ConfigureTooManyRaw) { 533 std::vector<camera3_stream_t> streams; 534 // At the threshold is ok. 535 for (int32_t i = 0; i < test_max_raw_outputs_; ++i) { 536 streams.push_back(MakeStream(bidirectional_raw_)); 537 } 538 ExpectConfigurationSupported(streams, true); 539 540 // Reset. 541 mock_reader_ = std::make_unique<MetadataReaderMock>(); 542 streams.clear(); 543 544 // Try again with too many. 545 for (int32_t i = 0; i <= test_max_raw_outputs_; ++i) { 546 streams.push_back(MakeStream(bidirectional_raw_)); 547 } 548 ExpectConfigurationSupported(streams, false); 549 } 550 551 TEST_F(StaticPropertiesTest, ConfigureTooManyStalling) { 552 std::vector<camera3_stream_t> streams; 553 // At the threshold is ok. 554 for (int32_t i = 0; i < test_max_stalling_outputs_; ++i) { 555 streams.push_back(MakeStream(bidirectional_self_supporting_stalling_)); 556 } 557 ExpectConfigurationSupported(streams, true); 558 559 // Reset. 560 mock_reader_ = std::make_unique<MetadataReaderMock>(); 561 streams.clear(); 562 563 // Try again with too many. 564 for (int32_t i = 0; i <= test_max_stalling_outputs_; ++i) { 565 streams.push_back(MakeStream(bidirectional_self_supporting_stalling_)); 566 } 567 ExpectConfigurationSupported(streams, false); 568 } 569 570 TEST_F(StaticPropertiesTest, ConfigureTooManyNonStalling) { 571 std::vector<camera3_stream_t> streams; 572 // At the threshold is ok. 573 for (int32_t i = 0; i < test_max_non_stalling_outputs_; ++i) { 574 streams.push_back(MakeStream(output_multisize_non_stalling_)); 575 } 576 ExpectConfigurationSupported(streams, true); 577 578 // Reset. 579 mock_reader_ = std::make_unique<MetadataReaderMock>(); 580 streams.clear(); 581 582 // Try again with too many. 583 for (int32_t i = 0; i <= test_max_non_stalling_outputs_; ++i) { 584 streams.push_back(MakeStream(output_multisize_non_stalling_)); 585 } 586 ExpectConfigurationSupported(streams, false); 587 } 588 589 TEST_F(StaticPropertiesTest, ConfigureUnuspportedInput) { 590 std::vector<camera3_stream_t> streams; 591 streams.push_back(MakeStream(input_, false, true)); 592 streams.push_back(MakeStream(bidirectional_raw_)); 593 // No matching output format for input. 594 ExpectConfigurationSupported(streams, false); 595 } 596 597 TEST_F(StaticPropertiesTest, ConfigureUnsupportedOutput) { 598 std::vector<camera3_stream_t> streams; 599 streams.push_back(MakeStream(input_, false, true)); 600 // The universal output does match input. 601 streams.push_back(MakeStream(output_multisize_non_stalling_)); 602 // Raw does not match input. 603 streams.push_back(MakeStream(bidirectional_raw_)); 604 // Input is matched; it's ok that raw doesn't match (only the actual 605 // requests care). 606 ExpectConfigurationSupported(streams, true); 607 } 608 609 TEST_F(StaticPropertiesTest, ConfigureUnsupportedBidirectional) { 610 std::vector<camera3_stream_t> streams; 611 // The test raw format, while supporting both input and output, 612 // does not actually support itself. 613 streams.push_back(MakeStream(bidirectional_raw_, true, true)); 614 ExpectConfigurationSupported(streams, false); 615 } 616 617 TEST_F(StaticPropertiesTest, ConfigureBadOperationMode) { 618 // A valid stream set. 619 camera3_stream_t stream = MakeStream(output_multisize_non_stalling_); 620 camera3_stream_t* stream_address = &stream; 621 // But not a valid config. 622 camera3_stream_configuration_t config = { 623 1, 624 &stream_address, 625 99, // Not a valid operation mode. 626 nullptr 627 }; 628 PrepareDefaultDUT(); 629 EXPECT_FALSE(dut_->StreamConfigurationSupported(&config)); 630 } 631 632 TEST_F(StaticPropertiesTest, ReprocessingSingleOutput) { 633 camera3_stream_t input_stream = MakeStream(input_); 634 camera3_stream_t output_stream = MakeStream(output_multisize_non_stalling_); 635 PrepareDefaultDUT(); 636 EXPECT_TRUE(dut_->ReprocessingSupported(&input_stream, {&output_stream})); 637 } 638 639 TEST_F(StaticPropertiesTest, ReprocessingMultipleOutputs) { 640 camera3_stream_t input_stream = 641 MakeStream(bidirectional_self_supporting_stalling_, false, true); 642 // Bi-directional self-supporting supports the universal output and itself. 643 camera3_stream_t output_stream1 = MakeStream(output_multisize_non_stalling_); 644 camera3_stream_t output_stream2 = 645 MakeStream(bidirectional_self_supporting_stalling_); 646 PrepareDefaultDUT(); 647 EXPECT_TRUE(dut_->ReprocessingSupported(&input_stream, 648 {&output_stream1, &output_stream2})); 649 } 650 651 TEST_F(StaticPropertiesTest, ReprocessingNoInput) { 652 camera3_stream_t output_stream = MakeStream(output_multisize_non_stalling_); 653 PrepareDefaultDUT(); 654 EXPECT_FALSE(dut_->ReprocessingSupported(nullptr, {&output_stream})); 655 } 656 657 TEST_F(StaticPropertiesTest, ReprocessingNoOutput) { 658 camera3_stream_t input_stream = MakeStream(input_); 659 PrepareDefaultDUT(); 660 EXPECT_FALSE(dut_->ReprocessingSupported(&input_stream, {})); 661 } 662 663 TEST_F(StaticPropertiesTest, ReprocessingInvalidOutput) { 664 camera3_stream_t input_stream = MakeStream(input_, false, true); 665 // The universal output does match input. 666 camera3_stream_t output_stream1 = MakeStream(output_multisize_non_stalling_); 667 // Raw does not match input. 668 camera3_stream_t output_stream2 = MakeStream(bidirectional_raw_); 669 PrepareDefaultDUT(); 670 EXPECT_FALSE(dut_->ReprocessingSupported(&input_stream, 671 {&output_stream1, &output_stream2})); 672 } 673 674 } // namespace default_camera_hal 675