@@ -16,6 +16,7 @@ lc_compliance_sources = files([
'helpers/capture.cpp',
'main.cpp',
'tests/capture_test.cpp',
+ 'tests/controls_test.cpp'
])
lc_compliance_includes = ([
new file mode 100644
@@ -0,0 +1,98 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2023, Ideas On Board Oy
+ *
+ * controls_test.cpp - Test controls and properties
+ */
+
+#include <array>
+#include <iostream>
+
+#include <libcamera/control_ids.h>
+#include <libcamera/controls.h>
+#include <libcamera/property_ids.h>
+
+#include <gtest/gtest.h>
+
+#include "environment.h"
+
+using namespace libcamera;
+
+std::array<const ControlIdMap *, 2> controlMaps = {
+ &controls::controls,
+ &properties::properties,
+};
+
+class ControlTest : public testing::TestWithParam<const ControlIdMap *>
+{
+public:
+ static std::string nameParameters(const testing::TestParamInfo<ControlTest::ParamType> &info);
+
+protected:
+ void SetUp() override;
+ void TearDown() override;
+
+ std::shared_ptr<Camera> 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<ControlTest::ParamType> &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 expanding 'controlMaps'.
+ */
+INSTANTIATE_TEST_SUITE_P(ControlsTest, ControlTest,
+ testing::ValuesIn(controlMaps),
+ ControlTest::nameParameters);
Test for mandatory controls and properties to be supported by a Camera. Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> --- src/apps/lc-compliance/meson.build | 1 + .../lc-compliance/tests/controls_test.cpp | 98 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 src/apps/lc-compliance/tests/controls_test.cpp