458 lines
14 KiB
C++
458 lines
14 KiB
C++
/*
|
|
* 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(), 1u);
|
|
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(), 1u);
|
|
EXPECT_EQ(control_->ControlTags()[0], delegate_tag_);
|
|
ASSERT_EQ(control_->DynamicTags().size(), 1u);
|
|
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(), 1u);
|
|
ExpectMetadataEq(metadata, options_tag_, options);
|
|
} else {
|
|
EXPECT_EQ(metadata.entryCount(), 0u);
|
|
// 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(), 1u);
|
|
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
|