blob: 13b9e964b191a056070d500bbe1c70721443dfd2 [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "static_properties.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <hardware/camera3.h>
#include <system/camera.h>
#include "metadata/metadata_reader_mock.h"
using testing::AtMost;
using testing::Expectation;
using testing::Return;
using testing::SetArgPointee;
using testing::Test;
using testing::_;
namespace default_camera_hal {
class StaticPropertiesTest : public Test {
protected:
virtual void SetUp() {
// Ensure tests will probably fail if PrepareDUT isn't called.
dut_.reset();
mock_reader_ = std::make_unique<MetadataReaderMock>();
}
void PrepareDUT() {
dut_.reset(StaticProperties::NewStaticProperties(std::move(mock_reader_)));
}
void PrepareDefaultDUT() {
SetDefaultExpectations();
PrepareDUT();
ASSERT_NE(dut_, nullptr);
}
void SetDefaultExpectations() {
EXPECT_CALL(*mock_reader_, Facing(_))
.Times(AtMost(1))
.WillOnce(DoAll(SetArgPointee<0>(test_facing_), Return(0)));
EXPECT_CALL(*mock_reader_, Orientation(_))
.Times(AtMost(1))
.WillOnce(DoAll(SetArgPointee<0>(test_orientation_), Return(0)));
EXPECT_CALL(*mock_reader_, MaxInputStreams(_))
.Times(AtMost(1))
.WillOnce(DoAll(SetArgPointee<0>(test_max_inputs_), Return(0)));
EXPECT_CALL(*mock_reader_, MaxOutputStreams(_, _, _))
.Times(AtMost(1))
.WillOnce(DoAll(SetArgPointee<0>(test_max_raw_outputs_),
SetArgPointee<1>(test_max_non_stalling_outputs_),
SetArgPointee<2>(test_max_stalling_outputs_),
Return(0)));
EXPECT_CALL(*mock_reader_, RequestCapabilities(_))
.Times(AtMost(1))
.WillOnce(
DoAll(SetArgPointee<0>(test_request_capabilities_), Return(0)));
EXPECT_CALL(*mock_reader_, StreamConfigurations(_))
.Times(AtMost(1))
.WillOnce(DoAll(SetArgPointee<0>(test_configs_), Return(0)));
EXPECT_CALL(*mock_reader_, StreamStallDurations(_))
.Times(AtMost(1))
.WillOnce(DoAll(SetArgPointee<0>(test_stalls_), Return(0)));
EXPECT_CALL(*mock_reader_, ReprocessFormats(_))
.Times(AtMost(1))
.WillOnce(DoAll(SetArgPointee<0>(test_reprocess_map_), Return(0)));
}
camera3_stream_t MakeStream(int32_t format,
bool output = true,
bool input = false,
int32_t width = kWidth,
int32_t height = kHeight) {
int type = -1;
if (output && input) {
type = CAMERA3_STREAM_BIDIRECTIONAL;
} else if (output) {
type = CAMERA3_STREAM_OUTPUT;
} else if (input) {
type = CAMERA3_STREAM_INPUT;
}
camera3_stream_t stream;
stream.stream_type = type;
stream.width = width;
stream.height = height;
stream.format = format;
return stream;
}
void ExpectConfigurationSupported(std::vector<camera3_stream_t>& streams,
bool expected) {
std::vector<camera3_stream_t*> stream_addresses;
for (size_t i = 0; i < streams.size(); ++i) {
stream_addresses.push_back(&streams[i]);
}
camera3_stream_configuration_t config = {
static_cast<uint32_t>(stream_addresses.size()),
stream_addresses.data(),
CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE,
nullptr};
PrepareDefaultDUT();
EXPECT_EQ(dut_->StreamConfigurationSupported(&config), expected);
}
std::unique_ptr<StaticProperties> dut_;
std::unique_ptr<MetadataReaderMock> mock_reader_;
// Some helper values used for stream testing.
static constexpr int32_t kWidth = 320;
static constexpr int32_t kHeight = 240;
static constexpr int32_t kAlternateWidth = 640;
static constexpr int32_t kAlternateHeight = 480;
const int test_facing_ = CAMERA_FACING_FRONT;
const int test_orientation_ = 90;
const int32_t test_max_inputs_ = 3;
const int32_t test_max_raw_outputs_ = 1;
const int32_t test_max_non_stalling_outputs_ = 2;
const int32_t test_max_stalling_outputs_ = 3;
const std::set<uint8_t> test_request_capabilities_ = {
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE,
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR,
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING};
// Some formats for various purposes (in various combinations,
// these types should be capable of testing all failure conditions).
const int32_t output_multisize_non_stalling_ = 1;
const int32_t bidirectional_self_supporting_stalling_ = 2;
const int32_t bidirectional_raw_ = HAL_PIXEL_FORMAT_RAW10;
const int32_t input_ = 3;
const int32_t other = input_;
const std::vector<StreamConfiguration> test_configs_ = {
{{{output_multisize_non_stalling_,
kWidth,
kHeight,
ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT}}},
{{{output_multisize_non_stalling_,
kAlternateWidth,
kAlternateHeight,
ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT}}},
{{{bidirectional_self_supporting_stalling_,
kWidth,
kHeight,
ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT}}},
{{{bidirectional_self_supporting_stalling_,
kWidth,
kHeight,
ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT}}},
{{{bidirectional_raw_,
kWidth,
kHeight,
ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT}}},
{{{bidirectional_raw_,
kWidth,
kHeight,
ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT}}},
{{{input_,
kWidth,
kHeight,
ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT}}}};
// Raw having a stall duration shouldn't matter,
// it should still be counted as the raw type.
const std::vector<StreamStallDuration> test_stalls_ = {
{{{output_multisize_non_stalling_, kWidth, kHeight, 0}}},
{{{output_multisize_non_stalling_,
kAlternateWidth,
kAlternateHeight,
0}}},
{{{bidirectional_self_supporting_stalling_, kWidth, kHeight, 10}}},
{{{bidirectional_raw_, kWidth, kHeight, 15}}}};
// Format 2 can go to itself or 1. 3 and RAW can only go to 1.
const ReprocessFormatMap test_reprocess_map_ = {
{bidirectional_self_supporting_stalling_,
{output_multisize_non_stalling_,
bidirectional_self_supporting_stalling_}},
{bidirectional_raw_, {output_multisize_non_stalling_}},
{input_, {output_multisize_non_stalling_}}};
// Codify the above information about format capabilities in some helpful
// vectors.
int32_t multi_size_format_ = 1;
const std::vector<int32_t> input_formats_ = {2, 3, HAL_PIXEL_FORMAT_RAW10};
const std::vector<int32_t> output_formats_ = {1, 2, HAL_PIXEL_FORMAT_RAW10};
};
TEST_F(StaticPropertiesTest, FactorySuccess) {
PrepareDefaultDUT();
EXPECT_EQ(dut_->facing(), test_facing_);
EXPECT_EQ(dut_->orientation(), test_orientation_);
// Stream configurations tested seperately.
}
TEST_F(StaticPropertiesTest, FactoryFailedFacing) {
SetDefaultExpectations();
// Override with a failure expectation.
EXPECT_CALL(*mock_reader_, Facing(_)).WillOnce(Return(99));
PrepareDUT();
EXPECT_EQ(dut_, nullptr);
}
TEST_F(StaticPropertiesTest, FactoryFailedOrientation) {
SetDefaultExpectations();
// Override with a failure expectation.
EXPECT_CALL(*mock_reader_, Orientation(_)).WillOnce(Return(99));
PrepareDUT();
EXPECT_EQ(dut_, nullptr);
}
TEST_F(StaticPropertiesTest, FactoryFailedMaxInputs) {
SetDefaultExpectations();
// Override with a failure expectation.
EXPECT_CALL(*mock_reader_, MaxInputStreams(_)).WillOnce(Return(99));
PrepareDUT();
EXPECT_EQ(dut_, nullptr);
}
TEST_F(StaticPropertiesTest, FactoryFailedMaxOutputs) {
SetDefaultExpectations();
// Override with a failure expectation.
EXPECT_CALL(*mock_reader_, MaxOutputStreams(_, _, _)).WillOnce(Return(99));
PrepareDUT();
EXPECT_EQ(dut_, nullptr);
}
TEST_F(StaticPropertiesTest, FactoryFailedRequestCapabilities) {
SetDefaultExpectations();
// Override with a failure expectation.
EXPECT_CALL(*mock_reader_, RequestCapabilities(_)).WillOnce(Return(99));
PrepareDUT();
EXPECT_EQ(dut_, nullptr);
}
TEST_F(StaticPropertiesTest, FactoryFailedStreamConfigs) {
SetDefaultExpectations();
// Override with a failure expectation.
EXPECT_CALL(*mock_reader_, StreamConfigurations(_)).WillOnce(Return(99));
PrepareDUT();
EXPECT_EQ(dut_, nullptr);
}
TEST_F(StaticPropertiesTest, FactoryFailedStallDurations) {
SetDefaultExpectations();
// Override with a failure expectation.
EXPECT_CALL(*mock_reader_, StreamStallDurations(_)).WillOnce(Return(99));
PrepareDUT();
EXPECT_EQ(dut_, nullptr);
}
TEST_F(StaticPropertiesTest, FactoryFailedReprocessFormats) {
SetDefaultExpectations();
// Override with a failure expectation.
EXPECT_CALL(*mock_reader_, ReprocessFormats(_)).WillOnce(Return(99));
PrepareDUT();
EXPECT_EQ(dut_, nullptr);
}
TEST_F(StaticPropertiesTest, FactoryNoReprocessFormats) {
// If there are no inputs allowed, the reprocess formats shouldn't matter.
SetDefaultExpectations();
// Override max inputs.
EXPECT_CALL(*mock_reader_, MaxInputStreams(_))
.WillOnce(DoAll(SetArgPointee<0>(0), Return(0)));
// Override reprocess formats with a failure expectation.
EXPECT_CALL(*mock_reader_, ReprocessFormats(_))
.Times(AtMost(1))
.WillOnce(Return(99));
PrepareDUT();
// Should be ok.
EXPECT_NE(dut_, nullptr);
}
TEST_F(StaticPropertiesTest, FactoryInvalidCapabilities) {
SetDefaultExpectations();
// Override configs with an extra output format.
std::vector<StreamConfiguration> configs = test_configs_;
configs.push_back(
{{{5,
kWidth,
kHeight,
ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT}}});
EXPECT_CALL(*mock_reader_, StreamConfigurations(_))
.WillOnce(DoAll(SetArgPointee<0>(configs), Return(0)));
PrepareDUT();
// Should fail because not every output has a stall.
EXPECT_EQ(dut_, nullptr);
}
TEST_F(StaticPropertiesTest, InvalidReprocessNoInputs) {
SetDefaultExpectations();
// Override configs by removing all inputs.
std::vector<StreamConfiguration> configs = test_configs_;
for (auto it = configs.begin(); it != configs.end();) {
if ((*it).direction ==
ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT) {
it = configs.erase(it);
} else {
++it;
}
}
EXPECT_CALL(*mock_reader_, StreamConfigurations(_))
.WillOnce(DoAll(SetArgPointee<0>(configs), Return(0)));
PrepareDUT();
// Should fail because inputs are supported but there are no input formats.
EXPECT_EQ(dut_, nullptr);
}
TEST_F(StaticPropertiesTest, InvalidReprocessExtraInput) {
SetDefaultExpectations();
// Override configs with an extra input format.
std::vector<StreamConfiguration> configs = test_configs_;
configs.push_back({{{5,
kWidth,
kHeight,
ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT}}});
EXPECT_CALL(*mock_reader_, StreamConfigurations(_))
.WillOnce(DoAll(SetArgPointee<0>(configs), Return(0)));
PrepareDUT();
// Should fail because no reprocess outputs are listed for the extra input.
EXPECT_EQ(dut_, nullptr);
}
TEST_F(StaticPropertiesTest, InvalidReprocessExtraMapEntry) {
SetDefaultExpectations();
// Override the reprocess map with an extra entry.
ReprocessFormatMap reprocess_map = test_reprocess_map_;
reprocess_map[5] = {1};
EXPECT_CALL(*mock_reader_, ReprocessFormats(_))
.WillOnce(DoAll(SetArgPointee<0>(reprocess_map), Return(0)));
PrepareDUT();
// Should fail because the extra map entry doesn't correspond to an input.
EXPECT_EQ(dut_, nullptr);
}
TEST_F(StaticPropertiesTest, InvalidReprocessWrongMapEntries) {
SetDefaultExpectations();
// Override the reprocess map replacing the entry for the
// input-only format with the output-only format.
ReprocessFormatMap reprocess_map = test_reprocess_map_;
reprocess_map.erase(input_);
reprocess_map[output_multisize_non_stalling_] = {1};
EXPECT_CALL(*mock_reader_, ReprocessFormats(_))
.WillOnce(DoAll(SetArgPointee<0>(reprocess_map), Return(0)));
PrepareDUT();
// Should fail because not all input formats are present/
// one of the map "input" formats is output only.
EXPECT_EQ(dut_, nullptr);
}
TEST_F(StaticPropertiesTest, InvalidReprocessNotAnOutput) {
SetDefaultExpectations();
// Override the reprocess map with a non-output output entry.
ReprocessFormatMap reprocess_map = test_reprocess_map_;
reprocess_map[input_].insert(input_);
EXPECT_CALL(*mock_reader_, ReprocessFormats(_))
.WillOnce(DoAll(SetArgPointee<0>(reprocess_map), Return(0)));
PrepareDUT();
// Should fail because a specified output format doesn't support output.
EXPECT_EQ(dut_, nullptr);
}
TEST_F(StaticPropertiesTest, TemplatesValid) {
PrepareDefaultDUT();
for (int i = 1; i < CAMERA3_TEMPLATE_COUNT; ++i) {
EXPECT_TRUE(dut_->TemplateSupported(i));
}
}
TEST_F(StaticPropertiesTest, ConfigureSingleOutput) {
std::vector<camera3_stream_t> streams;
streams.push_back(MakeStream(output_multisize_non_stalling_));
ExpectConfigurationSupported(streams, true);
}
TEST_F(StaticPropertiesTest, ConfigureMultipleOutputs) {
std::vector<camera3_stream_t> streams;
// 2 outputs, of different sizes.
streams.push_back(MakeStream(bidirectional_raw_));
// Use the alternate size.
streams.push_back(MakeStream(output_multisize_non_stalling_,
true,
false,
kAlternateWidth,
kAlternateHeight));
ExpectConfigurationSupported(streams, true);
}
TEST_F(StaticPropertiesTest, ConfigureInput) {
std::vector<camera3_stream_t> streams;
// Single input -> different output.
streams.push_back(MakeStream(input_, false, true));
// Use the alternate size, it should be ok.
streams.push_back(MakeStream(output_multisize_non_stalling_,
true,
false,
kAlternateWidth,
kAlternateHeight));
ExpectConfigurationSupported(streams, true);
}
TEST_F(StaticPropertiesTest, ConfigureBidirectional) {
std::vector<camera3_stream_t> streams;
// Single input -> same output.
streams.push_back(
MakeStream(bidirectional_self_supporting_stalling_, true, true));
ExpectConfigurationSupported(streams, true);
}
TEST_F(StaticPropertiesTest, ConfigureMultipleReprocess) {
std::vector<camera3_stream_t> streams;
// Single input -> multiple outputs.
streams.push_back(
MakeStream(bidirectional_self_supporting_stalling_, true, true));
streams.push_back(MakeStream(output_multisize_non_stalling_));
ExpectConfigurationSupported(streams, true);
}
TEST_F(StaticPropertiesTest, ConfigureNull) {
PrepareDefaultDUT();
EXPECT_FALSE(dut_->StreamConfigurationSupported(nullptr));
}
TEST_F(StaticPropertiesTest, ConfigureEmptyStreams) {
std::vector<camera3_stream_t*> streams(1);
camera3_stream_configuration_t config = {
0, streams.data(), CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE, nullptr};
PrepareDefaultDUT();
EXPECT_FALSE(dut_->StreamConfigurationSupported(&config));
}
TEST_F(StaticPropertiesTest, ConfigureNullStreams) {
std::vector<camera3_stream_t*> streams(2, nullptr);
camera3_stream_configuration_t config = {
static_cast<uint32_t>(streams.size()),
streams.data(),
CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE,
nullptr};
PrepareDefaultDUT();
EXPECT_FALSE(dut_->StreamConfigurationSupported(&config));
}
TEST_F(StaticPropertiesTest, ConfigureNullStreamVector) {
// Even if the camera claims to have multiple streams, check for null.
camera3_stream_configuration_t config = {
3, nullptr, CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE, nullptr};
PrepareDefaultDUT();
EXPECT_FALSE(dut_->StreamConfigurationSupported(&config));
}
TEST_F(StaticPropertiesTest, ConfigureNoOutput) {
std::vector<camera3_stream_t> streams;
// Only an input stream, no output.
streams.push_back(MakeStream(input_, false, true));
ExpectConfigurationSupported(streams, false);
}
TEST_F(StaticPropertiesTest, ConfigureInvalidType) {
std::vector<camera3_stream_t> streams;
// Not input, output, or bidirectional.
streams.push_back(MakeStream(output_multisize_non_stalling_, false, false));
ExpectConfigurationSupported(streams, false);
}
TEST_F(StaticPropertiesTest, ConfigureSpecFormatDoesNotExist) {
std::vector<camera3_stream_t> streams;
// Format 99 is not supported in any form.
streams.push_back(MakeStream(99));
ExpectConfigurationSupported(streams, false);
}
TEST_F(StaticPropertiesTest, ConfigureSpecSizeDoesNotExist) {
std::vector<camera3_stream_t> streams;
// Size 99 x 99 not supported for the output format.
streams.push_back(
MakeStream(output_multisize_non_stalling_, true, false, 99, 99));
ExpectConfigurationSupported(streams, false);
}
TEST_F(StaticPropertiesTest, ConfigureNotAnInput) {
std::vector<camera3_stream_t> streams;
streams.push_back(MakeStream(output_multisize_non_stalling_));
// Can't use output-only format as an input.
streams.push_back(MakeStream(output_multisize_non_stalling_, false, true));
ExpectConfigurationSupported(streams, false);
}
TEST_F(StaticPropertiesTest, ConfigureNotAnOutput) {
std::vector<camera3_stream_t> streams;
// Can't use input-only format as an output.
streams.push_back(MakeStream(input_));
ExpectConfigurationSupported(streams, false);
}
TEST_F(StaticPropertiesTest, ConfigureTooManyInputs) {
std::vector<camera3_stream_t> streams;
// At the threshold is ok.
for (int32_t i = 0; i < test_max_inputs_; ++i) {
streams.push_back(MakeStream(input_, false, true));
}
// Have a valid output still.
streams.push_back(MakeStream(output_multisize_non_stalling_));
ExpectConfigurationSupported(streams, false);
// Reset.
mock_reader_ = std::make_unique<MetadataReaderMock>();
streams.clear();
// Try again with too many.
for (int32_t i = 0; i <= test_max_inputs_; ++i) {
streams.push_back(MakeStream(input_, false, true));
}
// Have a valid output still.
streams.push_back(MakeStream(output_multisize_non_stalling_));
ExpectConfigurationSupported(streams, false);
}
TEST_F(StaticPropertiesTest, ConfigureTooManyRaw) {
std::vector<camera3_stream_t> streams;
// At the threshold is ok.
for (int32_t i = 0; i < test_max_raw_outputs_; ++i) {
streams.push_back(MakeStream(bidirectional_raw_));
}
ExpectConfigurationSupported(streams, true);
// Reset.
mock_reader_ = std::make_unique<MetadataReaderMock>();
streams.clear();
// Try again with too many.
for (int32_t i = 0; i <= test_max_raw_outputs_; ++i) {
streams.push_back(MakeStream(bidirectional_raw_));
}
ExpectConfigurationSupported(streams, false);
}
TEST_F(StaticPropertiesTest, ConfigureTooManyStalling) {
std::vector<camera3_stream_t> streams;
// At the threshold is ok.
for (int32_t i = 0; i < test_max_stalling_outputs_; ++i) {
streams.push_back(MakeStream(bidirectional_self_supporting_stalling_));
}
ExpectConfigurationSupported(streams, true);
// Reset.
mock_reader_ = std::make_unique<MetadataReaderMock>();
streams.clear();
// Try again with too many.
for (int32_t i = 0; i <= test_max_stalling_outputs_; ++i) {
streams.push_back(MakeStream(bidirectional_self_supporting_stalling_));
}
ExpectConfigurationSupported(streams, false);
}
TEST_F(StaticPropertiesTest, ConfigureTooManyNonStalling) {
std::vector<camera3_stream_t> streams;
// At the threshold is ok.
for (int32_t i = 0; i < test_max_non_stalling_outputs_; ++i) {
streams.push_back(MakeStream(output_multisize_non_stalling_));
}
ExpectConfigurationSupported(streams, true);
// Reset.
mock_reader_ = std::make_unique<MetadataReaderMock>();
streams.clear();
// Try again with too many.
for (int32_t i = 0; i <= test_max_non_stalling_outputs_; ++i) {
streams.push_back(MakeStream(output_multisize_non_stalling_));
}
ExpectConfigurationSupported(streams, false);
}
TEST_F(StaticPropertiesTest, ConfigureUnuspportedInput) {
std::vector<camera3_stream_t> streams;
streams.push_back(MakeStream(input_, false, true));
streams.push_back(MakeStream(bidirectional_raw_));
// No matching output format for input.
ExpectConfigurationSupported(streams, false);
}
TEST_F(StaticPropertiesTest, ConfigureUnsupportedOutput) {
std::vector<camera3_stream_t> streams;
streams.push_back(MakeStream(input_, false, true));
// The universal output does match input.
streams.push_back(MakeStream(output_multisize_non_stalling_));
// Raw does not match input.
streams.push_back(MakeStream(bidirectional_raw_));
// Input is matched; it's ok that raw doesn't match (only the actual
// requests care).
ExpectConfigurationSupported(streams, true);
}
TEST_F(StaticPropertiesTest, ConfigureUnsupportedBidirectional) {
std::vector<camera3_stream_t> streams;
// The test raw format, while supporting both input and output,
// does not actually support itself.
streams.push_back(MakeStream(bidirectional_raw_, true, true));
ExpectConfigurationSupported(streams, false);
}
TEST_F(StaticPropertiesTest, ConfigureBadOperationMode) {
// A valid stream set.
camera3_stream_t stream = MakeStream(output_multisize_non_stalling_);
camera3_stream_t* stream_address = &stream;
// But not a valid config.
camera3_stream_configuration_t config = {
1,
&stream_address,
99, // Not a valid operation mode.
nullptr
};
PrepareDefaultDUT();
EXPECT_FALSE(dut_->StreamConfigurationSupported(&config));
}
TEST_F(StaticPropertiesTest, ReprocessingSingleOutput) {
camera3_stream_t input_stream = MakeStream(input_);
camera3_stream_t output_stream = MakeStream(output_multisize_non_stalling_);
PrepareDefaultDUT();
EXPECT_TRUE(dut_->ReprocessingSupported(&input_stream, {&output_stream}));
}
TEST_F(StaticPropertiesTest, ReprocessingMultipleOutputs) {
camera3_stream_t input_stream =
MakeStream(bidirectional_self_supporting_stalling_, false, true);
// Bi-directional self-supporting supports the universal output and itself.
camera3_stream_t output_stream1 = MakeStream(output_multisize_non_stalling_);
camera3_stream_t output_stream2 =
MakeStream(bidirectional_self_supporting_stalling_);
PrepareDefaultDUT();
EXPECT_TRUE(dut_->ReprocessingSupported(&input_stream,
{&output_stream1, &output_stream2}));
}
TEST_F(StaticPropertiesTest, ReprocessingNoInput) {
camera3_stream_t output_stream = MakeStream(output_multisize_non_stalling_);
PrepareDefaultDUT();
EXPECT_FALSE(dut_->ReprocessingSupported(nullptr, {&output_stream}));
}
TEST_F(StaticPropertiesTest, ReprocessingNoOutput) {
camera3_stream_t input_stream = MakeStream(input_);
PrepareDefaultDUT();
EXPECT_FALSE(dut_->ReprocessingSupported(&input_stream, {}));
}
TEST_F(StaticPropertiesTest, ReprocessingInvalidOutput) {
camera3_stream_t input_stream = MakeStream(input_, false, true);
// The universal output does match input.
camera3_stream_t output_stream1 = MakeStream(output_multisize_non_stalling_);
// Raw does not match input.
camera3_stream_t output_stream2 = MakeStream(bidirectional_raw_);
PrepareDefaultDUT();
EXPECT_FALSE(dut_->ReprocessingSupported(&input_stream,
{&output_stream1, &output_stream2}));
}
} // namespace default_camera_hal