summaryrefslogtreecommitdiff
path: root/src/qcam/assets/feathericons/youtube.svg
diff options
context:
space:
mode:
authorPaul Elder <paul.elder@ideasonboard.com>2020-07-08 17:00:41 +0900
committerPaul Elder <paul.elder@ideasonboard.com>2020-07-10 16:11:44 +0900
commitae50922879a817c2e215fb144e6083a7702dec7e (patch)
tree42553466d67e4da19ac2d461cf1435ec1700ba54 /src/qcam/assets/feathericons/youtube.svg
parente52cc8c916a61e0e09cbdd9002b9a90cfcc4f611 (diff)
v4l2: v4l2_camera: Fix stream selection for buffer operations
The buffer operations in V4L2Camera were getting the stream from the wrong place. Fix it. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'src/qcam/assets/feathericons/youtube.svg')
0 files changed, 0 insertions, 0 deletions
id='n198' href='#n198'>198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (C) 2021, Google Inc.
 *
 * unique-fd.cpp - UniqueFD test
 */

#include <fcntl.h>
#include <iostream>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

#include <libcamera/base/unique_fd.h>
#include <libcamera/base/utils.h>

#include "test.h"

using namespace libcamera;
using namespace std;

class UniqueFDTest : public Test
{
protected:
	int init() override
	{
		return createFd();
	}

	int run() override
	{
		/* Test creating empty UniqueFD. */
		UniqueFD fd;

		if (fd.isValid() || fd.get() != -1) {
			std::cout << "Failed fd check (default constructor)"
				  << std::endl;
			return TestFail;
		}

		/* Test creating UniqueFD from numerical file descriptor. */
		UniqueFD fd2(fd_);
		if (!fd2.isValid() || fd2.get() != fd_) {
			std::cout << "Failed fd check (fd constructor)"
				  << std::endl;
			return TestFail;
		}

		if (!isValidFd(fd_)) {
			std::cout << "Failed fd validity (fd constructor)"
				  << std::endl;
			return TestFail;
		}

		/* Test move constructor. */
		UniqueFD fd3(std::move(fd2));
		if (!fd3.isValid() || fd3.get() != fd_) {
			std::cout << "Failed fd check (move constructor)"
				  << std::endl;
			return TestFail;
		}

		if (fd2.isValid() || fd2.get() != -1) {
			std::cout << "Failed moved fd check (move constructor)"
				  << std::endl;
			return TestFail;
		}

		if (!isValidFd(fd_)) {
			std::cout << "Failed fd validity (move constructor)"
				  << std::endl;
			return TestFail;
		}

		/* Test move assignment operator. */
		fd = std::move(fd3);
		if (!fd.isValid() || fd.get() != fd_) {
			std::cout << "Failed fd check (move assignment)"
				  << std::endl;
			return TestFail;
		}

		if (fd3.isValid() || fd3.get() != -1) {
			std::cout << "Failed moved fd check (move assignment)"
				  << std::endl;
			return TestFail;
		}

		if (!isValidFd(fd_)) {
			std::cout << "Failed fd validity (move assignment)"
				  << std::endl;
			return TestFail;
		}

		/* Test swapping. */
		fd2.swap(fd);
		if (!fd2.isValid() || fd2.get() != fd_) {
			std::cout << "Failed fd check (swap)"
				  << std::endl;
			return TestFail;
		}

		if (fd.isValid() || fd.get() != -1) {
			std::cout << "Failed swapped fd check (swap)"
				  << std::endl;
			return TestFail;
		}

		if (!isValidFd(fd_)) {
			std::cout << "Failed fd validity (swap)"
				  << std::endl;
			return TestFail;
		}

		/* Test release. */
		int numFd = fd2.release();
		if (fd2.isValid() || fd2.get() != -1) {
			std::cout << "Failed fd check (release)"
				  << std::endl;
			return TestFail;
		}

		if (numFd != fd_) {
			std::cout << "Failed released fd check (release)"
				  << std::endl;
			return TestFail;
		}

		if (!isValidFd(fd_)) {
			std::cout << "Failed fd validity (release)"
				  << std::endl;
			return TestFail;
		}

		/* Test reset assignment. */
		fd.reset(numFd);
		if (!fd.isValid() || fd.get() != fd_) {
			std::cout << "Failed fd check (reset assignment)"
				  << std::endl;
			return TestFail;
		}

		if (!isValidFd(fd_)) {
			std::cout << "Failed fd validity (reset assignment)"
				  << std::endl;
			return TestFail;
		}

		/* Test reset destruction. */
		fd.reset();
		if (fd.isValid() || fd.get() != -1) {
			std::cout << "Failed fd check (reset destruction)"
				  << std::endl;
			return TestFail;
		}

		if (isValidFd(fd_)) {
			std::cout << "Failed fd validity (reset destruction)"
				  << std::endl;
			return TestFail;
		}

		/* Test destruction. */
		if (createFd() == TestFail) {
			std::cout << "Failed to recreate test fd"
				  << std::endl;
			return TestFail;
		}

		{
			UniqueFD fd4(fd_);
		}

		if (isValidFd(fd_)) {
			std::cout << "Failed fd validity (destruction)"
				  << std::endl;
			return TestFail;
		}

		return TestPass;
	}

	void cleanup() override
	{
		if (fd_ > 0)
			close(fd_);
	}

private:
	int createFd()
	{
		fd_ = open("/tmp", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR);
		if (fd_ < 0)
			return TestFail;

		/* Cache inode number of temp file. */
		struct stat s;
		if (fstat(fd_, &s))
			return TestFail;

		inodeNr_ = s.st_ino;

		return 0;
	}

	bool isValidFd(int fd)
	{
		struct stat s;
		if (fstat(fd, &s))
			return false;

		/* Check that inode number matches cached temp file. */
		return s.st_ino == inodeNr_;
	}

	int fd_;
	ino_t inodeNr_;
};

TEST_REGISTER(UniqueFDTest)