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