You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
457 lines
14 KiB
457 lines
14 KiB
/* |
|
* 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 "control.h" |
|
|
|
#include <camera/CameraMetadata.h> |
|
#include <gmock/gmock.h> |
|
#include <gtest/gtest.h> |
|
|
|
#include "control_delegate_interface_mock.h" |
|
#include "control_options_interface_mock.h" |
|
#include "metadata_common.h" |
|
#include "test_common.h" |
|
|
|
using testing::AtMost; |
|
using testing::Expectation; |
|
using testing::Return; |
|
using testing::SetArgPointee; |
|
using testing::Test; |
|
using testing::_; |
|
|
|
namespace v4l2_camera_hal { |
|
|
|
class ControlTest : public Test { |
|
protected: |
|
virtual void SetUp() { |
|
mock_delegate_.reset(new ControlDelegateInterfaceMock<uint8_t>()); |
|
mock_options_.reset(new ControlOptionsInterfaceMock<uint8_t>()); |
|
// Nullify control so an error will be thrown if a test doesn't call |
|
// PrepareControl. |
|
control_.reset(); |
|
} |
|
|
|
virtual void PrepareControl() { |
|
// Use this method after all the EXPECT_CALLs to pass ownership of the mocks |
|
// to the device. |
|
std::unique_ptr<TaggedControlDelegate<uint8_t>> delegate = |
|
std::make_unique<TaggedControlDelegate<uint8_t>>( |
|
delegate_tag_, std::move(mock_delegate_)); |
|
std::unique_ptr<TaggedControlOptions<uint8_t>> options = |
|
std::make_unique<TaggedControlOptions<uint8_t>>( |
|
report_options_ ? options_tag_ : DO_NOT_REPORT_OPTIONS, |
|
std::move(mock_options_)); |
|
if (use_options_) { |
|
control_.reset( |
|
new Control<uint8_t>(std::move(delegate), std::move(options))); |
|
} else { |
|
control_.reset(new Control<uint8_t>(std::move(delegate))); |
|
} |
|
} |
|
|
|
virtual void ExpectTags() { |
|
if (use_options_ && report_options_) { |
|
ASSERT_EQ(control_->StaticTags().size(), 1); |
|
EXPECT_EQ(control_->StaticTags()[0], options_tag_); |
|
} else { |
|
EXPECT_TRUE(control_->StaticTags().empty()); |
|
} |
|
// Controls use the same delgate, and thus tag, for getting and setting. |
|
ASSERT_EQ(control_->ControlTags().size(), 1); |
|
EXPECT_EQ(control_->ControlTags()[0], delegate_tag_); |
|
ASSERT_EQ(control_->DynamicTags().size(), 1); |
|
EXPECT_EQ(control_->DynamicTags()[0], delegate_tag_); |
|
} |
|
|
|
virtual void ExpectOptions(const std::vector<uint8_t>& options) { |
|
// Options should be available. |
|
android::CameraMetadata metadata; |
|
ASSERT_EQ(control_->PopulateStaticFields(&metadata), 0); |
|
if (use_options_ && report_options_) { |
|
EXPECT_EQ(metadata.entryCount(), 1); |
|
ExpectMetadataEq(metadata, options_tag_, options); |
|
} else { |
|
EXPECT_EQ(metadata.entryCount(), 0); |
|
// Shouldn't be expecting any options. |
|
EXPECT_TRUE(options.empty()); |
|
} |
|
} |
|
|
|
virtual void ExpectValue(uint8_t value) { |
|
android::CameraMetadata metadata; |
|
ASSERT_EQ(control_->PopulateDynamicFields(&metadata), 0); |
|
EXPECT_EQ(metadata.entryCount(), 1); |
|
ExpectMetadataEq(metadata, delegate_tag_, value); |
|
} |
|
|
|
std::unique_ptr<Control<uint8_t>> control_; |
|
std::unique_ptr<ControlDelegateInterfaceMock<uint8_t>> mock_delegate_; |
|
std::unique_ptr<ControlOptionsInterfaceMock<uint8_t>> mock_options_; |
|
bool use_options_ = true; |
|
bool report_options_ = true; |
|
|
|
// Need tags that match the data type (uint8_t) being passed. |
|
const int32_t delegate_tag_ = ANDROID_COLOR_CORRECTION_ABERRATION_MODE; |
|
const int32_t options_tag_ = |
|
ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES; |
|
}; |
|
|
|
TEST_F(ControlTest, Tags) { |
|
PrepareControl(); |
|
ExpectTags(); |
|
} |
|
|
|
TEST_F(ControlTest, TagsNoOptions) { |
|
use_options_ = false; |
|
PrepareControl(); |
|
ExpectTags(); |
|
} |
|
|
|
TEST_F(ControlTest, TagsUnreportedOptions) { |
|
report_options_ = false; |
|
PrepareControl(); |
|
ExpectTags(); |
|
} |
|
|
|
TEST_F(ControlTest, PopulateStatic) { |
|
std::vector<uint8_t> expected{1, 10, 20}; |
|
EXPECT_CALL(*mock_options_, MetadataRepresentation()) |
|
.WillOnce(Return(expected)); |
|
PrepareControl(); |
|
ExpectOptions(expected); |
|
} |
|
|
|
TEST_F(ControlTest, PopulateStaticNoOptions) { |
|
use_options_ = false; |
|
PrepareControl(); |
|
ExpectOptions({}); |
|
} |
|
|
|
TEST_F(ControlTest, PopulateStaticUnreportedOptions) { |
|
report_options_ = false; |
|
PrepareControl(); |
|
ExpectOptions({}); |
|
} |
|
|
|
TEST_F(ControlTest, PopulateDynamic) { |
|
uint8_t test_option = 99; |
|
EXPECT_CALL(*mock_delegate_, GetValue(_)) |
|
.WillOnce(DoAll(SetArgPointee<0>(test_option), Return(0))); |
|
PrepareControl(); |
|
ExpectValue(test_option); |
|
} |
|
|
|
TEST_F(ControlTest, PopulateDynamicNoOptions) { |
|
// Lack of options shouldn't change anything for PopulateDynamic. |
|
use_options_ = false; |
|
uint8_t test_option = 99; |
|
EXPECT_CALL(*mock_delegate_, GetValue(_)) |
|
.WillOnce(DoAll(SetArgPointee<0>(test_option), Return(0))); |
|
PrepareControl(); |
|
ExpectValue(test_option); |
|
} |
|
|
|
TEST_F(ControlTest, PopulateDynamicUnreportedOptions) { |
|
// Lack of reported options shouldn't change anything for PopulateDynamic. |
|
report_options_ = false; |
|
uint8_t test_option = 99; |
|
EXPECT_CALL(*mock_delegate_, GetValue(_)) |
|
.WillOnce(DoAll(SetArgPointee<0>(test_option), Return(0))); |
|
PrepareControl(); |
|
ExpectValue(test_option); |
|
} |
|
|
|
TEST_F(ControlTest, PopulateDynamicFail) { |
|
int err = -99; |
|
EXPECT_CALL(*mock_delegate_, GetValue(_)).WillOnce(Return(err)); |
|
PrepareControl(); |
|
|
|
android::CameraMetadata metadata; |
|
EXPECT_EQ(control_->PopulateDynamicFields(&metadata), err); |
|
|
|
// Should not have added an entry. |
|
EXPECT_TRUE(metadata.isEmpty()); |
|
} |
|
|
|
TEST_F(ControlTest, PopulateTemplate) { |
|
int template_type = 3; |
|
uint8_t default_value = 123; |
|
EXPECT_CALL(*mock_options_, DefaultValueForTemplate(template_type, _)) |
|
.WillOnce(DoAll(SetArgPointee<1>(default_value), Return(0))); |
|
PrepareControl(); |
|
|
|
android::CameraMetadata metadata; |
|
EXPECT_EQ(control_->PopulateTemplateRequest(template_type, &metadata), 0); |
|
ExpectMetadataEq(metadata, delegate_tag_, default_value); |
|
} |
|
|
|
TEST_F(ControlTest, PopulateTemplateFail) { |
|
int template_type = 3; |
|
int err = 10; |
|
EXPECT_CALL(*mock_options_, DefaultValueForTemplate(template_type, _)) |
|
.WillOnce(Return(err)); |
|
PrepareControl(); |
|
|
|
android::CameraMetadata metadata; |
|
EXPECT_EQ(control_->PopulateTemplateRequest(template_type, &metadata), err); |
|
} |
|
|
|
TEST_F(ControlTest, PopulateTemplateOptionless) { |
|
use_options_ = false; |
|
int template_type = 3; |
|
uint8_t value = 12; |
|
// Should use delegate instead of options if no options. |
|
EXPECT_CALL(*mock_delegate_, GetValue(_)) |
|
.WillOnce(DoAll(SetArgPointee<0>(value), Return(0))); |
|
PrepareControl(); |
|
|
|
android::CameraMetadata metadata; |
|
EXPECT_EQ(control_->PopulateTemplateRequest(template_type, &metadata), 0); |
|
ExpectMetadataEq(metadata, delegate_tag_, value); |
|
} |
|
|
|
TEST_F(ControlTest, PopulateTemplateOptionlessFail) { |
|
use_options_ = false; |
|
int template_type = 3; |
|
int err = 10; |
|
// Should use delegate instead of options if no options. |
|
EXPECT_CALL(*mock_delegate_, GetValue(_)).WillOnce(Return(err)); |
|
PrepareControl(); |
|
|
|
android::CameraMetadata metadata; |
|
EXPECT_EQ(control_->PopulateTemplateRequest(template_type, &metadata), err); |
|
} |
|
|
|
TEST_F(ControlTest, PopulateTemplateUnreportedOptions) { |
|
report_options_ = false; |
|
int template_type = 3; |
|
uint8_t default_value = 123; |
|
// Unreported options should behave just like reported ones for templating. |
|
EXPECT_CALL(*mock_options_, DefaultValueForTemplate(template_type, _)) |
|
.WillOnce(DoAll(SetArgPointee<1>(default_value), Return(0))); |
|
PrepareControl(); |
|
|
|
android::CameraMetadata metadata; |
|
EXPECT_EQ(control_->PopulateTemplateRequest(template_type, &metadata), 0); |
|
ExpectMetadataEq(metadata, delegate_tag_, default_value); |
|
} |
|
|
|
TEST_F(ControlTest, PopulateTemplateUnreportedOptionsFail) { |
|
report_options_ = false; |
|
int template_type = 3; |
|
int err = 10; |
|
// Unreported options should behave just like reported ones for templating. |
|
EXPECT_CALL(*mock_options_, DefaultValueForTemplate(template_type, _)) |
|
.WillOnce(Return(err)); |
|
PrepareControl(); |
|
|
|
android::CameraMetadata metadata; |
|
EXPECT_EQ(control_->PopulateTemplateRequest(template_type, &metadata), err); |
|
} |
|
|
|
TEST_F(ControlTest, SupportsRequest) { |
|
android::CameraMetadata metadata; |
|
uint8_t test_option = 123; |
|
ASSERT_EQ(UpdateMetadata(&metadata, delegate_tag_, test_option), 0); |
|
|
|
EXPECT_CALL(*mock_options_, IsSupported(test_option)).WillOnce(Return(true)); |
|
PrepareControl(); |
|
|
|
EXPECT_EQ(control_->SupportsRequestValues(metadata), true); |
|
} |
|
|
|
TEST_F(ControlTest, SupportsRequestNoOptions) { |
|
use_options_ = false; |
|
android::CameraMetadata metadata; |
|
uint8_t test_option = 123; |
|
ASSERT_EQ(UpdateMetadata(&metadata, delegate_tag_, test_option), 0); |
|
PrepareControl(); |
|
|
|
EXPECT_EQ(control_->SupportsRequestValues(metadata), true); |
|
} |
|
|
|
TEST_F(ControlTest, SupportsRequestUnreportedOptions) { |
|
report_options_ = false; |
|
android::CameraMetadata metadata; |
|
uint8_t test_option = 123; |
|
ASSERT_EQ(UpdateMetadata(&metadata, delegate_tag_, test_option), 0); |
|
|
|
EXPECT_CALL(*mock_options_, IsSupported(test_option)).WillOnce(Return(true)); |
|
PrepareControl(); |
|
|
|
EXPECT_EQ(control_->SupportsRequestValues(metadata), true); |
|
} |
|
|
|
TEST_F(ControlTest, SupportsRequestFail) { |
|
android::CameraMetadata metadata; |
|
uint8_t test_option = 123; |
|
ASSERT_EQ(UpdateMetadata(&metadata, delegate_tag_, test_option), 0); |
|
|
|
EXPECT_CALL(*mock_options_, IsSupported(test_option)).WillOnce(Return(false)); |
|
PrepareControl(); |
|
|
|
EXPECT_EQ(control_->SupportsRequestValues(metadata), false); |
|
} |
|
|
|
TEST_F(ControlTest, SupportsRequestUnreportedOptionsFail) { |
|
report_options_ = false; |
|
android::CameraMetadata metadata; |
|
uint8_t test_option = 123; |
|
ASSERT_EQ(UpdateMetadata(&metadata, delegate_tag_, test_option), 0); |
|
|
|
// Unreported options should still be checked against. |
|
EXPECT_CALL(*mock_options_, IsSupported(test_option)).WillOnce(Return(false)); |
|
PrepareControl(); |
|
|
|
EXPECT_EQ(control_->SupportsRequestValues(metadata), false); |
|
} |
|
|
|
TEST_F(ControlTest, SupportsRequestInvalidNumber) { |
|
// Start with a request for multiple values. |
|
android::CameraMetadata metadata; |
|
std::vector<uint8_t> test_data = {1, 2, 3}; |
|
ASSERT_EQ(UpdateMetadata(&metadata, delegate_tag_, test_data), 0); |
|
PrepareControl(); |
|
EXPECT_EQ(control_->SupportsRequestValues(metadata), false); |
|
} |
|
|
|
TEST_F(ControlTest, SupportsRequestInvalidNumberNoOptions) { |
|
use_options_ = false; |
|
// Start with a request for multiple values. |
|
android::CameraMetadata metadata; |
|
std::vector<uint8_t> test_data = {1, 2, 3}; |
|
ASSERT_EQ(UpdateMetadata(&metadata, delegate_tag_, test_data), 0); |
|
PrepareControl(); |
|
// Not having any explicit options does not exempt a control |
|
// from requiring the right number of values. |
|
EXPECT_EQ(control_->SupportsRequestValues(metadata), false); |
|
} |
|
|
|
TEST_F(ControlTest, SupportsRequestEmpty) { |
|
android::CameraMetadata metadata; |
|
PrepareControl(); |
|
EXPECT_EQ(control_->SupportsRequestValues(metadata), true); |
|
} |
|
|
|
TEST_F(ControlTest, SetRequest) { |
|
android::CameraMetadata metadata; |
|
uint8_t test_option = 123; |
|
ASSERT_EQ(UpdateMetadata(&metadata, delegate_tag_, test_option), 0); |
|
|
|
Expectation validation_check = |
|
EXPECT_CALL(*mock_options_, IsSupported(test_option)) |
|
.WillOnce(Return(true)); |
|
EXPECT_CALL(*mock_delegate_, SetValue(test_option)) |
|
.After(validation_check) |
|
.WillOnce(Return(0)); |
|
PrepareControl(); |
|
|
|
// Make the request. |
|
ASSERT_EQ(control_->SetRequestValues(metadata), 0); |
|
} |
|
|
|
TEST_F(ControlTest, SetRequestNoOptions) { |
|
use_options_ = false; |
|
android::CameraMetadata metadata; |
|
uint8_t test_option = 123; |
|
ASSERT_EQ(UpdateMetadata(&metadata, delegate_tag_, test_option), 0); |
|
|
|
// No options, no validation check. |
|
EXPECT_CALL(*mock_delegate_, SetValue(test_option)).WillOnce(Return(0)); |
|
PrepareControl(); |
|
|
|
// Make the request. |
|
ASSERT_EQ(control_->SetRequestValues(metadata), 0); |
|
} |
|
|
|
TEST_F(ControlTest, SetRequestUnreportedOptions) { |
|
report_options_ = false; |
|
android::CameraMetadata metadata; |
|
uint8_t test_option = 123; |
|
ASSERT_EQ(UpdateMetadata(&metadata, delegate_tag_, test_option), 0); |
|
|
|
// Unreported options still get a validation check. |
|
Expectation validation_check = |
|
EXPECT_CALL(*mock_options_, IsSupported(test_option)) |
|
.WillOnce(Return(true)); |
|
EXPECT_CALL(*mock_delegate_, SetValue(test_option)) |
|
.After(validation_check) |
|
.WillOnce(Return(0)); |
|
PrepareControl(); |
|
|
|
// Make the request. |
|
ASSERT_EQ(control_->SetRequestValues(metadata), 0); |
|
} |
|
|
|
TEST_F(ControlTest, SetRequestSettingFail) { |
|
android::CameraMetadata metadata; |
|
uint8_t test_option = 123; |
|
ASSERT_EQ(UpdateMetadata(&metadata, delegate_tag_, test_option), 0); |
|
|
|
int err = 99; |
|
Expectation validation_check = |
|
EXPECT_CALL(*mock_options_, IsSupported(test_option)) |
|
.WillOnce(Return(true)); |
|
EXPECT_CALL(*mock_delegate_, SetValue(test_option)) |
|
.After(validation_check) |
|
.WillOnce(Return(err)); |
|
PrepareControl(); |
|
|
|
EXPECT_EQ(control_->SetRequestValues(metadata), err); |
|
} |
|
|
|
TEST_F(ControlTest, SetRequestValidationFail) { |
|
android::CameraMetadata metadata; |
|
uint8_t test_option = 123; |
|
ASSERT_EQ(UpdateMetadata(&metadata, delegate_tag_, test_option), 0); |
|
|
|
EXPECT_CALL(*mock_options_, IsSupported(test_option)).WillOnce(Return(false)); |
|
PrepareControl(); |
|
|
|
EXPECT_EQ(control_->SetRequestValues(metadata), -EINVAL); |
|
} |
|
|
|
TEST_F(ControlTest, SetRequestInvalidNumber) { |
|
// Start with a request for multiple values. |
|
android::CameraMetadata metadata; |
|
std::vector<uint8_t> test_data = {1, 2, 3}; |
|
ASSERT_EQ(UpdateMetadata(&metadata, delegate_tag_, test_data), 0); |
|
|
|
PrepareControl(); |
|
EXPECT_EQ(control_->SetRequestValues(metadata), -EINVAL); |
|
} |
|
|
|
TEST_F(ControlTest, SetRequestInvalidNumberNoOptions) { |
|
use_options_ = false; |
|
// Start with a request for multiple values. |
|
android::CameraMetadata metadata; |
|
std::vector<uint8_t> test_data = {1, 2, 3}; |
|
ASSERT_EQ(UpdateMetadata(&metadata, delegate_tag_, test_data), 0); |
|
|
|
PrepareControl(); |
|
// Not having explicit options does not change that an incorrect |
|
// number of values is invalid. |
|
EXPECT_EQ(control_->SetRequestValues(metadata), -EINVAL); |
|
} |
|
|
|
TEST_F(ControlTest, SetRequestEmpty) { |
|
// Should do nothing. |
|
android::CameraMetadata metadata; |
|
PrepareControl(); |
|
EXPECT_EQ(control_->SetRequestValues(metadata), 0); |
|
} |
|
|
|
} // namespace v4l2_camera_hal
|
|
|