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