19bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen/*
29bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen * Copyright (C) 2016 The Android Open Source Project
39bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen *
49bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen * Licensed under the Apache License, Version 2.0 (the "License");
59bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen * you may not use this file except in compliance with the License.
69bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen * You may obtain a copy of the License at
79bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen *
89bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen *      http://www.apache.org/licenses/LICENSE-2.0
99bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen *
109bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen * Unless required by applicable law or agreed to in writing, software
119bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen * distributed under the License is distributed on an "AS IS" BASIS,
129bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen * See the License for the specific language governing permissions and
149bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen * limitations under the License.
159bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen */
169bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen
179bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen#include "tagged_control_delegate.h"
189bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen
199bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen#include <gmock/gmock.h>
209bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen#include <gtest/gtest.h>
219bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen
229bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen#include "control_delegate_interface_mock.h"
239bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen
249bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohenusing testing::Return;
259bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohenusing testing::SetArgPointee;
269bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohenusing testing::Test;
279bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohenusing testing::_;
289bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen
299bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohennamespace v4l2_camera_hal {
309bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen
319bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohenclass TaggedControlDelegateTest : public Test {
329bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen protected:
339bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  virtual void SetUp() {
349bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen    mock_delegate_.reset(new ControlDelegateInterfaceMock<uint8_t>());
359bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen    // Nullify dut so an error will be thrown if a test doesn't call PrepareDUT.
369bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen    dut_.reset();
379bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  }
389bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen
399bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  virtual void PrepareDUT() {
409bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen    // Use this method after all the EXPECT_CALLs to pass ownership of the
419bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen    // delegate
429bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen    // to the device.
439bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen    dut_.reset(
449bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen        new TaggedControlDelegate<uint8_t>(tag_, std::move(mock_delegate_)));
459bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  }
469bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen
479bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  std::unique_ptr<TaggedControlDelegate<uint8_t>> dut_;
489bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  std::unique_ptr<ControlDelegateInterfaceMock<uint8_t>> mock_delegate_;
499bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  const int32_t tag_ = 123;
509bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen};
519bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen
529bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-CohenTEST_F(TaggedControlDelegateTest, GetTag) {
539bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  PrepareDUT();
549bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  EXPECT_EQ(dut_->tag(), tag_);
559bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen}
569bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen
579bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-CohenTEST_F(TaggedControlDelegateTest, GetSuccess) {
589bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  uint8_t expected = 3;
599bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  EXPECT_CALL(*mock_delegate_, GetValue(_))
609bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen      .WillOnce(DoAll(SetArgPointee<0>(expected), Return(0)));
619bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  PrepareDUT();
629bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  uint8_t actual = expected + 1;  // Initialize to an incorrect value.
639bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  ASSERT_EQ(dut_->GetValue(&actual), 0);
649bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  EXPECT_EQ(actual, expected);
659bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen}
669bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen
679bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-CohenTEST_F(TaggedControlDelegateTest, GetFailure) {
689bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  int err = 3;
699bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  EXPECT_CALL(*mock_delegate_, GetValue(_)).WillOnce(Return(err));
709bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  PrepareDUT();
719bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  uint8_t unused = 0;
729bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  ASSERT_EQ(dut_->GetValue(&unused), err);
739bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen}
749bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen
759bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-CohenTEST_F(TaggedControlDelegateTest, SetSuccess) {
769bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  uint8_t value = 3;
779bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  EXPECT_CALL(*mock_delegate_, SetValue(value)).WillOnce(Return(0));
789bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  PrepareDUT();
799bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  ASSERT_EQ(dut_->SetValue(value), 0);
809bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen}
819bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen
829bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-CohenTEST_F(TaggedControlDelegateTest, SetFailure) {
839bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  int err = 3;
849bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  uint8_t value = 12;
859bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  EXPECT_CALL(*mock_delegate_, SetValue(value)).WillOnce(Return(err));
869bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  PrepareDUT();
879bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen  ASSERT_EQ(dut_->SetValue(value), err);
889bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen}
899bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen
909bd94f5581f50cb2a47f56e6f9dc44ed8a951903Ari Hausman-Cohen}  // namespace v4l2_camera_hal
91