1cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen/* 2cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen * Copyright (C) 2016 The Android Open Source Project 3cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen * 4cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen * Licensed under the Apache License, Version 2.0 (the "License"); 5cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen * you may not use this file except in compliance with the License. 6cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen * You may obtain a copy of the License at 7cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen * 8cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen * http://www.apache.org/licenses/LICENSE-2.0 9cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen * 10cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen * Unless required by applicable law or agreed to in writing, software 11cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen * distributed under the License is distributed on an "AS IS" BASIS, 12cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen * See the License for the specific language governing permissions and 14cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen * limitations under the License. 15cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen */ 16cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 17cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen#include "state.h" 18cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 19cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen#include <camera/CameraMetadata.h> 20cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen#include <gmock/gmock.h> 21cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen#include <gtest/gtest.h> 22cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 23cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen#include "metadata_common.h" 24cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen#include "state_delegate_interface_mock.h" 25cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen#include "test_common.h" 26cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 27cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohenusing testing::AtMost; 28cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohenusing testing::Expectation; 29cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohenusing testing::Return; 30cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohenusing testing::SetArgPointee; 31cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohenusing testing::Test; 32cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohenusing testing::_; 33cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 34cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohennamespace v4l2_camera_hal { 35cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 36cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohenclass StateTest : public Test { 37cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen protected: 38cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen virtual void SetUp() { 39cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen mock_delegate_.reset(new StateDelegateInterfaceMock<uint8_t>()); 40cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen // Nullify state so an error will be thrown if a test doesn't call 41cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen // PrepareState. 42cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen state_.reset(); 43cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen } 44cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 45cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen virtual void PrepareState() { 46cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen // Use this method after all the EXPECT_CALLs to pass ownership of the mocks 47cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen // to the device. 48cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen state_.reset(new State<uint8_t>(tag_, std::move(mock_delegate_))); 49cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen } 50cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 51cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen std::unique_ptr<State<uint8_t>> state_; 52cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen std::unique_ptr<StateDelegateInterfaceMock<uint8_t>> mock_delegate_; 53cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 54cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen // Need tag that matches the data type (uint8_t) being passed. 55cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen const int32_t tag_ = ANDROID_CONTROL_AF_STATE; 56cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen}; 57cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 58cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-CohenTEST_F(StateTest, Tags) { 59cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen PrepareState(); 60cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen EXPECT_TRUE(state_->StaticTags().empty()); 61cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen EXPECT_TRUE(state_->ControlTags().empty()); 6228e0f76353e06b24b7dae54e636dbb5ddc64d1a5Prashanth Swaminathan ASSERT_EQ(state_->DynamicTags().size(), 1u); 63cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen EXPECT_EQ(state_->DynamicTags()[0], tag_); 64cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen} 65cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 66cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-CohenTEST_F(StateTest, PopulateStatic) { 67cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen PrepareState(); 68cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen android::CameraMetadata metadata; 69cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen ASSERT_EQ(state_->PopulateStaticFields(&metadata), 0); 70cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen EXPECT_TRUE(metadata.isEmpty()); 71cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen} 72cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 73cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-CohenTEST_F(StateTest, PopulateDynamic) { 74cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen uint8_t expected = 99; 75cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen EXPECT_CALL(*mock_delegate_, GetValue(_)) 76cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen .WillOnce(DoAll(SetArgPointee<0>(expected), Return(0))); 77cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 78cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen PrepareState(); 79cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 80cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen android::CameraMetadata metadata; 81cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen ASSERT_EQ(state_->PopulateDynamicFields(&metadata), 0); 8228e0f76353e06b24b7dae54e636dbb5ddc64d1a5Prashanth Swaminathan EXPECT_EQ(metadata.entryCount(), 1u); 83cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen ExpectMetadataEq(metadata, tag_, expected); 84cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen} 85cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 86cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-CohenTEST_F(StateTest, PopulateDynamicFail) { 87cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen int err = 123; 88cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen EXPECT_CALL(*mock_delegate_, GetValue(_)).WillOnce(Return(err)); 89cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 90cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen PrepareState(); 91cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 92cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen android::CameraMetadata metadata; 93cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen ASSERT_EQ(state_->PopulateDynamicFields(&metadata), err); 94cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen} 95cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 96cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-CohenTEST_F(StateTest, PopulateTemplate) { 97cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen int template_type = 3; 98cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen PrepareState(); 99cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen android::CameraMetadata metadata; 100cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen ASSERT_EQ(state_->PopulateTemplateRequest(template_type, &metadata), 0); 101cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen EXPECT_TRUE(metadata.isEmpty()); 102cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen} 103cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 104cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-CohenTEST_F(StateTest, SupportsRequest) { 105cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen PrepareState(); 106cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen android::CameraMetadata metadata; 107cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen EXPECT_TRUE(state_->SupportsRequestValues(metadata)); 108cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen} 109cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 110cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-CohenTEST_F(StateTest, SetRequest) { 111cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen PrepareState(); 112cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen android::CameraMetadata metadata; 113cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen ASSERT_EQ(state_->SetRequestValues(metadata), 0); 114cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen} 115cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen 116cf5f57f263ab6e0a9c7e71bc18771c824e109f4dAri Hausman-Cohen} // namespace v4l2_camera_hal 117