summaryrefslogtreecommitdiff
path: root/test/event-dispatcher.cpp
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2024-07-01 18:26:32 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2024-08-27 12:28:52 +0300
commit9cacf4e42086abe57b3998a0d909b49b97a1a7a5 (patch)
treea50b66c9b278dee49bbaf91a2171bfd2a7c9e638 /test/event-dispatcher.cpp
parente70cda4238deebefdc6a63692f96cb07bdd73d1e (diff)
ipa: rkisp1: Add ISP parameters abstraction class
Individual algorithms of the rkisp1 IPA module access their corresponding ISP parameters through the top-level structure rkisp1_params_cfg. This will not work anymore with the new parameters format. In order to ease the transition to the new format, abstract the ISP parameters in a new RkISP1Params class that offers the same interface regardless of the format. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
Diffstat (limited to 'test/event-dispatcher.cpp')
0 files changed, 0 insertions, 0 deletions
ef='#n126'>126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (C) 2020, Google Inc.
 * Copyright (C) 2021, Collabora Ltd.
 *
 * main.cpp - lc-compliance - The libcamera compliance tool
 */

#include <iomanip>
#include <iostream>
#include <string.h>

#include <gtest/gtest.h>

#include <libcamera/libcamera.h>

#include "environment.h"
#include "../cam/options.h"

using namespace libcamera;

enum {
	OptCamera = 'c',
	OptList = 'l',
	OptFilter = 'f',
	OptHelp = 'h',
};

/*
 * Make asserts act like exceptions, otherwise they only fail (or skip) the
 * current function. From gtest documentation:
 * https://google.github.io/googletest/advanced.html#asserting-on-subroutines-with-an-exception
 */
class ThrowListener : public testing::EmptyTestEventListener
{
	void OnTestPartResult(const testing::TestPartResult &result) override
	{
		if (result.type() == testing::TestPartResult::kFatalFailure ||
		    result.type() == testing::TestPartResult::kSkip)
			throw testing::AssertionException(result);
	}
};

static void listCameras(CameraManager *cm)
{
	for (const std::shared_ptr<Camera> &cam : cm->cameras())
		std::cout << "- " << cam.get()->id() << std::endl;
}

static int initCamera(CameraManager *cm, OptionsParser::Options options)
{
	std::shared_ptr<Camera> camera;

	int ret = cm->start();
	if (ret) {
		std::cout << "Failed to start camera manager: "
			  << strerror(-ret) << std::endl;
		return ret;
	}

	if (!options.isSet(OptCamera)) {
		std::cout << "No camera specified, available cameras:" << std::endl;
		listCameras(cm);
		return -ENODEV;
	}

	const std::string &cameraId = options[OptCamera];
	camera = cm->get(cameraId);
	if (!camera) {
		std::cout << "Camera " << cameraId << " not found, available cameras:" << std::endl;
		listCameras(cm);
		return -ENODEV;
	}

	Environment::get()->setup(cm, cameraId);

	std::cout << "Using camera " << cameraId << std::endl;

	return 0;
}

static int initGtestParameters(char *arg0, OptionsParser::Options options)
{
	const std::map<std::string, std::string> gtestFlags = { { "list", "--gtest_list_tests" },
								{ "filter", "--gtest_filter" } };

	int argc = 0;
	std::string filterParam;

	/*
	 * +2 to have space for both the 0th argument that is needed but not
	 * used and the null at the end.
	 */
	char **argv = new char *[(gtestFlags.size() + 2)];
	if (!argv)
		return -ENOMEM;

	argv[0] = arg0;
	argc++;

	if (options.isSet(OptList)) {
		argv[argc] = const_cast<char *>(gtestFlags.at("list").c_str());
		argc++;
	}

	if (options.isSet(OptFilter)) {
		/*
		 * The filter flag needs to be passed as a single parameter, in
		 * the format --gtest_filter=filterStr
		 */
		filterParam = gtestFlags.at("filter") + "=" +
			      static_cast<const std::string &>(options[OptFilter]);

		argv[argc] = const_cast<char *>(filterParam.c_str());
		argc++;
	}

	argv[argc] = nullptr;

	::testing::InitGoogleTest(&argc, argv);

	delete[] argv;

	return 0;
}

static int initGtest(char *arg0, OptionsParser::Options options)
{
	int ret = initGtestParameters(arg0, options);
	if (ret)
		return ret;

	testing::UnitTest::GetInstance()->listeners().Append(new ThrowListener);

	return 0;
}

static int parseOptions(int argc, char **argv, OptionsParser::Options *options)
{
	OptionsParser parser;
	parser.addOption(OptCamera, OptionString,
			 "Specify which camera to operate on, by id", "camera",
			 ArgumentRequired, "camera");
	parser.addOption(OptList, OptionNone, "List all tests and exit", "list");
	parser.addOption(OptFilter, OptionString,
			 "Specify which tests to run", "filter",
			 ArgumentRequired, "filter");
	parser.addOption(OptHelp, OptionNone, "Display this help message",
			 "help");

	*options = parser.parse(argc, argv);
	if (!options->valid())
		return -EINVAL;

	if (options->isSet(OptHelp)) {
		parser.usage();
		std::cerr << "Further options from Googletest can be passed as environment variables"
			  << std::endl;
		return -EINTR;
	}

	return 0;
}

int main(int argc, char **argv)
{
	OptionsParser::Options options;
	int ret = parseOptions(argc, argv, &options);
	if (ret == -EINTR)
		return EXIT_SUCCESS;
	if (ret < 0)
		return EXIT_FAILURE;

	std::unique_ptr<CameraManager> cm = std::make_unique<CameraManager>();

	/* No need to initialize the camera if we'll just list tests */
	if (!options.isSet(OptList)) {
		ret = initCamera(cm.get(), options);
		if (ret)
			return ret;
	}

	ret = initGtest(argv[0], options);
	if (ret)
		return ret;

	ret = RUN_ALL_TESTS();

	if (!options.isSet(OptList))
		cm->stop();

	return ret;
}