/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2023, Ideas On Board Oy * * controls_test.cpp - Test controls and properties */ #include #include #include #include #include #include #include "environment.h" using namespace libcamera; std::array controlMaps = { &controls::controls, &properties::properties, }; class ControlTest : public testing::TestWithParam { public: static std::string nameParameters(const testing::TestParamInfo &info); protected: void SetUp() override; void TearDown() override; std::shared_ptr camera_; }; void ControlTest::SetUp() { Environment *env = Environment::get(); camera_ = env->cm()->get(env->cameraId()); ASSERT_EQ(camera_->acquire(), 0); } void ControlTest::TearDown() { if (!camera_) return; camera_->release(); camera_.reset(); } std::string ControlTest::nameParameters(const testing::TestParamInfo &info) { const ControlIdMap *idMap = info.param; if (idMap == &controls::controls) return "controls"; else if (idMap == &properties::properties) return "properties"; return "vendor"; } /* Test that mandatory controls and properties are supported by a camera. */ TEST_P(ControlTest, RequiredControls) { auto controlMap = GetParam(); for (const auto &[id, ctrl] : *controlMap) { if (!ctrl->required()) continue; if (controlMap == &controls::controls) { const auto it = camera_->controls().find(ctrl); if (it == camera_->controls().end()) FAIL() << "Mandatory control \"" << ctrl->name() << "\" not supported" << std::endl; } else if (controlMap == &properties::properties) { bool found = camera_->properties().contains(id); if (!found) FAIL() << "Mandatory property \"" << ctrl->name() << "\" not supported" << std::endl; } } } /* * Use a Value-Parametrized Test case so that vendors can easily test vendor * control lists by expading 'controlMaps'. */ INSTANTIATE_TEST_SUITE_P(ControlsTest, ControlTest, testing::ValuesIn(controlMaps), ControlTest::nameParameters);