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