11760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen/*
21760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * Copyright (C) 2016 The Android Open Source Project
31760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen *
41760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * Licensed under the Apache License, Version 2.0 (the "License");
51760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * you may not use this file except in compliance with the License.
61760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * You may obtain a copy of the License at
71760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen *
81760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen *      http://www.apache.org/licenses/LICENSE-2.0
91760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen *
101760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * Unless required by applicable law or agreed to in writing, software
111760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * distributed under the License is distributed on an "AS IS" BASIS,
121760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * See the License for the specific language governing permissions and
141760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen * limitations under the License.
151760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen */
161760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
171760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen#include "map_converter.h"
181760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
191760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen#include <gmock/gmock.h>
201760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen#include <gtest/gtest.h>
211760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
221760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen#include "converter_interface_mock.h"
231760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
241760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohenusing testing::Return;
251760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohenusing testing::SetArgPointee;
261760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohenusing testing::Test;
271760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohenusing testing::_;
281760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
291760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohennamespace v4l2_camera_hal {
301760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
311760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohenclass MapConverterTest : public Test {
321760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen protected:
331760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  virtual void SetUp() {
341760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen    converter_.reset(new ConverterInterfaceMock<int, int32_t>());
351760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen    dut_.reset(new MapConverter<int, int32_t, int32_t>(converter_, map_));
361760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  }
371760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
381760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  virtual void ExpectConvertToV4L2(int32_t converted, int32_t expected) {
391760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen    int initial = 99;
401760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen    EXPECT_CALL(*converter_, MetadataToV4L2(initial, _))
411760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen        .WillOnce(DoAll(SetArgPointee<1>(converted), Return(0)));
421760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
431760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen    int32_t actual = expected + 1;  // Initialize to non-expected value.
441760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen    ASSERT_EQ(dut_->MetadataToV4L2(initial, &actual), 0);
451760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen    EXPECT_EQ(actual, expected);
461760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  }
471760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
481760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  std::shared_ptr<ConverterInterfaceMock<int, int32_t>> converter_;
491760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  std::unique_ptr<MapConverter<int, int32_t, int32_t>> dut_;
501760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
511760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  const std::map<int32_t, int32_t> map_{{10, 1}, {40, 4}, {20, 2}, {30, 3}};
521760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen};
531760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
541760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-CohenTEST_F(MapConverterTest, NormalConversionToV4L2) {
551760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  // A value that matches the map perfectly.
561760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  auto kv = map_.begin();
571760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  ExpectConvertToV4L2(kv->first, kv->second);
581760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen}
591760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
601760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-CohenTEST_F(MapConverterTest, RoundingDownConversionToV4L2) {
611760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  // A value that's in range but not an exact key value.
621760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  auto kv = map_.begin();
631760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  ExpectConvertToV4L2(kv->first + 1, kv->second);
641760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen}
651760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
661760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-CohenTEST_F(MapConverterTest, RoundingUpConversionToV4L2) {
671760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  // A value that's in range but not an exact key value.
681760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  auto kv = map_.begin();
691760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  ++kv;
701760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  ExpectConvertToV4L2(kv->first - 1, kv->second);
711760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen}
721760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
731760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-CohenTEST_F(MapConverterTest, ClampUpConversionToV4L2) {
741760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  // A value that's below range.
751760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  auto kv = map_.begin();
761760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  ExpectConvertToV4L2(kv->first - 1, kv->second);
771760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen}
781760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
791760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-CohenTEST_F(MapConverterTest, ClampDownConversionToV4L2) {
801760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  // A value that's above range (even after fitting to step).
811760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  auto kv = map_.rbegin();
821760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  ExpectConvertToV4L2(kv->first + 1, kv->second);
831760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen}
841760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
851760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-CohenTEST_F(MapConverterTest, ConversionErrorToV4L2) {
861760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  int initial = 99;
871760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  int err = -99;
881760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  EXPECT_CALL(*converter_, MetadataToV4L2(initial, _)).WillOnce(Return(err));
891760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
901760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  int32_t unused;
911760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  EXPECT_EQ(dut_->MetadataToV4L2(initial, &unused), err);
921760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen}
931760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
941760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-CohenTEST_F(MapConverterTest, NormalConversionToMetadata) {
951760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  auto kv = map_.begin();
961760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  int expected = 99;
971760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  EXPECT_CALL(*converter_, V4L2ToMetadata(kv->first, _))
981760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen      .WillOnce(DoAll(SetArgPointee<1>(expected), Return(0)));
991760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
1001760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  int actual = expected + 1;  // Initialize to non-expected value.
1011760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  ASSERT_EQ(dut_->V4L2ToMetadata(kv->second, &actual), 0);
1021760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  EXPECT_EQ(actual, expected);
1031760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen}
1041760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
1051760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-CohenTEST_F(MapConverterTest, NotFoundConversionToMetadata) {
1061760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  int unused;
1071760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen  ASSERT_EQ(dut_->V4L2ToMetadata(100, &unused), -EINVAL);
1081760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen}
1091760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen
1101760aa2912463b63bb1af52e24cb0bbf58c0965dAri Hausman-Cohen}  // namespace v4l2_camera_hal
111