15156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen/*
25156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen * Copyright (C) 2016 The Android Open Source Project
35156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen *
45156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen * Licensed under the Apache License, Version 2.0 (the "License");
55156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen * you may not use this file except in compliance with the License.
65156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen * You may obtain a copy of the License at
75156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen *
85156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen *      http://www.apache.org/licenses/LICENSE-2.0
95156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen *
105156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen * Unless required by applicable law or agreed to in writing, software
115156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen * distributed under the License is distributed on an "AS IS" BASIS,
125156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen * See the License for the specific language governing permissions and
145156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen * limitations under the License.
155156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen */
165156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
17fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-Cohen#include "property.h"
185156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
195156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen#include <array>
205156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen#include <vector>
215156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
225156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen#include <camera/CameraMetadata.h>
235156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen#include <gmock/gmock.h>
245156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen#include <gtest/gtest.h>
2510264778189f69177c5ef820db2b8e803c99ab99Ari Hausman-Cohen#include <hardware/camera3.h>
265156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
275156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen#include "array_vector.h"
28e55f0c795c8e079566a178a6fae12f37d88956c8Ari Hausman-Cohen#include "metadata_common.h"
29e55f0c795c8e079566a178a6fae12f37d88956c8Ari Hausman-Cohen#include "test_common.h"
305156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
315156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohenusing testing::AtMost;
325156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohenusing testing::Return;
335156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohenusing testing::ReturnRef;
345156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohenusing testing::Test;
355156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohenusing testing::_;
365156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
375156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohennamespace v4l2_camera_hal {
385156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
39fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-Cohenclass PropertyTest : public Test {
405156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen protected:
415156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Need tags that match the data types being passed.
425156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  static constexpr int32_t byte_tag_ = ANDROID_CONTROL_SCENE_MODE_OVERRIDES;
435156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  static constexpr int32_t float_tag_ = ANDROID_COLOR_CORRECTION_GAINS;
445156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  static constexpr int32_t int_tag_ = ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION;
455156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  static constexpr int32_t int_tag2_ = ANDROID_JPEG_ORIENTATION;
465156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen};
475156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
48fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-CohenTEST_F(PropertyTest, Tags) {
49fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-Cohen  Property<int32_t> property(int_tag_, 1);
505156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
515156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Should have only the single tag it was constructed with.
5228e0f76353e06b24b7dae54e636dbb5ddc64d1a5Prashanth Swaminathan  EXPECT_EQ(property.ControlTags().size(), 0u);
5328e0f76353e06b24b7dae54e636dbb5ddc64d1a5Prashanth Swaminathan  EXPECT_EQ(property.DynamicTags().size(), 0u);
5428e0f76353e06b24b7dae54e636dbb5ddc64d1a5Prashanth Swaminathan  ASSERT_EQ(property.StaticTags().size(), 1u);
555156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // The macro doesn't like the int_tag_ variable being passed in directly.
565156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  int32_t expected_tag = int_tag_;
575156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  EXPECT_EQ(property.StaticTags()[0], expected_tag);
585156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen}
595156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
60fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-CohenTEST_F(PropertyTest, PopulateStaticSingleNumber) {
615156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Set up a fixed property.
625156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  int32_t data = 1234;
63fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-Cohen  Property<int32_t> property(int_tag_, data);
645156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
655156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Populate static fields.
665156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  android::CameraMetadata metadata;
675156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  ASSERT_EQ(property.PopulateStaticFields(&metadata), 0);
685156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
695156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Check the results.
705156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Should only have added 1 entry.
7128e0f76353e06b24b7dae54e636dbb5ddc64d1a5Prashanth Swaminathan  EXPECT_EQ(metadata.entryCount(), 1u);
725156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Should have added the right entry.
73e55f0c795c8e079566a178a6fae12f37d88956c8Ari Hausman-Cohen  ExpectMetadataEq(metadata, int_tag_, data);
745156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen}
755156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
76fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-Cohen// TODO(b/30839858): These tests are really testing the metadata_common.h
77fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-Cohen// UpdateMetadata methods, and shouldn't be conducted here.
78fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-CohenTEST_F(PropertyTest, PopulateStaticVector) {
795156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Set up a fixed property.
805156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  std::vector<float> data({0.1, 2.3, 4.5, 6.7});
81fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-Cohen  Property<std::vector<float>> property(float_tag_, data);
825156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
835156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Populate static fields.
845156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  android::CameraMetadata metadata;
855156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  ASSERT_EQ(property.PopulateStaticFields(&metadata), 0);
865156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
875156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Check the results.
885156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Should only have added 1 entry.
8928e0f76353e06b24b7dae54e636dbb5ddc64d1a5Prashanth Swaminathan  EXPECT_EQ(metadata.entryCount(), 1u);
905156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Should have added the right entry.
91e55f0c795c8e079566a178a6fae12f37d88956c8Ari Hausman-Cohen  ExpectMetadataEq(metadata, float_tag_, data);
925156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen}
935156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
94fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-CohenTEST_F(PropertyTest, PopulateStaticArray) {
955156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Set up a fixed property.
965156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  std::array<float, 4> data({{0.1, 2.3, 4.5, 6.7}});
97fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-Cohen  Property<std::array<float, 4>> property(float_tag_, data);
985156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
995156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Populate static fields.
1005156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  android::CameraMetadata metadata;
1015156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  ASSERT_EQ(property.PopulateStaticFields(&metadata), 0);
1025156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
1035156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Check the results.
1045156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Should only have added 1 entry.
10528e0f76353e06b24b7dae54e636dbb5ddc64d1a5Prashanth Swaminathan  EXPECT_EQ(metadata.entryCount(), 1u);
1065156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Should have added the right entry.
107e55f0c795c8e079566a178a6fae12f37d88956c8Ari Hausman-Cohen  ExpectMetadataEq(metadata, float_tag_, data);
1085156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen}
1095156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
110fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-CohenTEST_F(PropertyTest, PopulateStaticArrayVector) {
1115156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Set up a fixed property.
1125156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  ArrayVector<uint8_t, 3> data;
1135156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  data.push_back({{1, 2, 3}});
1145156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  data.push_back({{4, 5, 6}});
115fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-Cohen  Property<ArrayVector<uint8_t, 3>> property(byte_tag_, data);
1165156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
1175156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Populate static fields.
1185156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  android::CameraMetadata metadata;
1195156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  ASSERT_EQ(property.PopulateStaticFields(&metadata), 0);
1205156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
1215156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Check the results.
1225156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Should only have added 1 entry.
12328e0f76353e06b24b7dae54e636dbb5ddc64d1a5Prashanth Swaminathan  EXPECT_EQ(metadata.entryCount(), 1u);
1245156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Should have added the right entry.
125e55f0c795c8e079566a178a6fae12f37d88956c8Ari Hausman-Cohen  ExpectMetadataEq(metadata, byte_tag_, data);
1265156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen}
1275156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
128fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-CohenTEST_F(PropertyTest, PopulateDynamic) {
129fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-Cohen  Property<int32_t> property(int_tag_, 1);
1305156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
1315156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  android::CameraMetadata metadata;
1325156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  EXPECT_EQ(property.PopulateDynamicFields(&metadata), 0);
1335156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
1345156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  // Shouldn't have added anything.
1355156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  EXPECT_TRUE(metadata.isEmpty());
1365156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen}
1375156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
13810264778189f69177c5ef820db2b8e803c99ab99Ari Hausman-CohenTEST_F(PropertyTest, PopulateTemplate) {
13910264778189f69177c5ef820db2b8e803c99ab99Ari Hausman-Cohen  Property<int32_t> property(int_tag_, 1);
14010264778189f69177c5ef820db2b8e803c99ab99Ari Hausman-Cohen
14110264778189f69177c5ef820db2b8e803c99ab99Ari Hausman-Cohen  for (int i = 1; i < CAMERA3_TEMPLATE_COUNT; ++i) {
14210264778189f69177c5ef820db2b8e803c99ab99Ari Hausman-Cohen    android::CameraMetadata metadata;
14310264778189f69177c5ef820db2b8e803c99ab99Ari Hausman-Cohen    EXPECT_EQ(property.PopulateTemplateRequest(i, &metadata), 0);
14410264778189f69177c5ef820db2b8e803c99ab99Ari Hausman-Cohen    // Shouldn't have added anything.
14510264778189f69177c5ef820db2b8e803c99ab99Ari Hausman-Cohen    EXPECT_TRUE(metadata.isEmpty());
14610264778189f69177c5ef820db2b8e803c99ab99Ari Hausman-Cohen  }
14710264778189f69177c5ef820db2b8e803c99ab99Ari Hausman-Cohen}
14810264778189f69177c5ef820db2b8e803c99ab99Ari Hausman-Cohen
149fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-CohenTEST_F(PropertyTest, SupportsRequest) {
150fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-Cohen  Property<int32_t> property(int_tag_, 1);
1515156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  android::CameraMetadata metadata;
1525156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  EXPECT_EQ(property.SupportsRequestValues(metadata), true);
1535156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen}
1545156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
155fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-CohenTEST_F(PropertyTest, SetRequest) {
156fd0ecb791c93b8f593627bb42917bf6a44a9505cAri Hausman-Cohen  Property<int32_t> property(int_tag_, 1);
1575156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  android::CameraMetadata metadata;
1585156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen  EXPECT_EQ(property.SetRequestValues(metadata), 0);
1595156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen}
1605156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen
1615156c2d1c98e76bd74fdedcbce8eecf76925f207Ari Hausman-Cohen}  // namespace v4l2_camera_hal
162