From patchwork Thu Jan 29 11:00:07 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= X-Patchwork-Id: 26038 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 925E6C3200 for ; Thu, 29 Jan 2026 11:00:12 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 3190861FCE; Thu, 29 Jan 2026 12:00:12 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="i1Wzre5U"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 6021D61FC6 for ; Thu, 29 Jan 2026 12:00:11 +0100 (CET) Received: from pb-laptop.local (185.221.142.123.nat.pool.zt.hu [185.221.142.123]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id BC7E11AED for ; Thu, 29 Jan 2026 11:59:33 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1769684373; bh=oKX8qomrGLzS5bwYnNC7KHridwvGdmq1Bs7u1spK3iA=; h=From:To:Subject:Date:From; b=i1Wzre5U44dtFHKuXWBcgGzWbs1eaSnqd4bu/HTsGD3Y4Ke+V4y4wcGKchZnD7VJR x0duW+BGYYfZOWoG5ZT4sUQuvmWWSTE7HQ2Nv3ovIJFaFBqtnXT5ngD3t4DAxcn9RJ HSQm+jwvP37lc7x1xVlSH/sNtbNXh0LunlXd6/kU= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [PATCH v2] test: Remove uses of `O_TMPFILE` Date: Thu, 29 Jan 2026 12:00:07 +0100 Message-ID: <20260129110007.1221054-1-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.52.0 MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" `O_TMPFILE` requires file system support, which may not be available in certain environments, usually containerized ones. So do not use it. A new function is added for tests to be able to create unnamed temporary files using `libcamera::MemFd` as the implementation. Signed-off-by: Barnabás Pőcze Reviewed-by: Laurent Pinchart --- changes in v2: * add function to create unnamed temporary files v1: https://patchwork.libcamera.org/patch/26010/ --- test/ipc/unixsocket.cpp | 34 ++++++++++++++-------------------- test/libtest/meson.build | 1 + test/libtest/misc.cpp | 19 +++++++++++++++++++ test/libtest/misc.h | 17 +++++++++++++++++ test/log/log_api.cpp | 14 ++++++-------- test/shared-fd.cpp | 3 ++- test/unique-fd.cpp | 3 ++- 7 files changed, 61 insertions(+), 30 deletions(-) create mode 100644 test/libtest/misc.cpp create mode 100644 test/libtest/misc.h -- 2.52.0 diff --git a/test/ipc/unixsocket.cpp b/test/ipc/unixsocket.cpp index f39bd986b..0e603a69c 100644 --- a/test/ipc/unixsocket.cpp +++ b/test/ipc/unixsocket.cpp @@ -23,6 +23,7 @@ #include "libcamera/internal/ipc_unixsocket.h" +#include "misc.h" #include "test.h" #define CMD_CLOSE 0 @@ -137,11 +138,11 @@ private: } case CMD_JOIN: { - int outfd = open("/tmp", O_TMPFILE | O_RDWR, - S_IRUSR | S_IWUSR); - if (outfd < 0) { + auto outfd = test::createTemporaryFile(); + if (!outfd.isValid()) { + ret = errno; cerr << "Create out file failed" << endl; - stop(outfd); + stop(ret); return; } @@ -152,15 +153,13 @@ private: if (num < 0) { cerr << "Read failed" << endl; - close(outfd); stop(-EIO); return; } else if (!num) break; - if (write(outfd, buf, num) < 0) { + if (write(outfd.get(), buf, num) < 0) { cerr << "Write failed" << endl; - close(outfd); stop(-EIO); return; } @@ -169,9 +168,9 @@ private: close(fd); } - lseek(outfd, 0, 0); + lseek(outfd.get(), 0, SEEK_SET); response.data.push_back(CMD_JOIN); - response.fds.push_back(outfd); + response.fds.push_back(outfd.get()); ret = ipc_.send(response); if (ret < 0) { @@ -179,8 +178,6 @@ private: stop(ret); } - close(outfd); - break; } @@ -315,22 +312,21 @@ protected: "Foo", "Bar", }; - int fds[2]; + std::array fds; for (unsigned int i = 0; i < std::size(strings); i++) { unsigned int len = strlen(strings[i]); - fds[i] = open("/tmp", O_TMPFILE | O_RDWR, - S_IRUSR | S_IWUSR); - if (fds[i] < 0) + fds[i] = test::createTemporaryFile(); + if (!fds[i].isValid()) return TestFail; - ret = write(fds[i], strings[i], len); + ret = write(fds[i].get(), strings[i], len); if (ret < 0) return TestFail; - lseek(fds[i], 0, 0); - message.fds.push_back(fds[i]); + lseek(fds[i].get(), 0, SEEK_SET); + message.fds.push_back(fds[i].get()); } message.data.push_back(CMD_JOIN); @@ -343,8 +339,6 @@ protected: unsigned int len = strlen(strings[i]); std::vector buf(len); - close(fds[i]); - if (read(response.fds[0], buf.data(), len) <= 0) return TestFail; diff --git a/test/libtest/meson.build b/test/libtest/meson.build index 351629f3c..fd89f8047 100644 --- a/test/libtest/meson.build +++ b/test/libtest/meson.build @@ -3,6 +3,7 @@ libtest_sources = files([ 'buffer_source.cpp', 'camera_test.cpp', + 'misc.cpp', 'test.cpp', ]) diff --git a/test/libtest/misc.cpp b/test/libtest/misc.cpp new file mode 100644 index 000000000..d4506c869 --- /dev/null +++ b/test/libtest/misc.cpp @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2026, Ideas on Board Oy + * + * libcamera test miscellaneous utilities + */ + +#include "misc.h" + +#include + +namespace test { + +libcamera::UniqueFD createTemporaryFile() +{ + return libcamera::MemFd::create("libcamera-test-temporary-file", 0); +} + +} /* namespace test */ diff --git a/test/libtest/misc.h b/test/libtest/misc.h new file mode 100644 index 000000000..a7b4acbeb --- /dev/null +++ b/test/libtest/misc.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2026, Ideas on Board Oy + * + * libcamera test miscellaneous utilities + */ + +#pragma once + +#include + +namespace test { + +[[nodiscard]] +libcamera::UniqueFD createTemporaryFile(); + +} diff --git a/test/log/log_api.cpp b/test/log/log_api.cpp index 8d19cf0ce..684abf8b8 100644 --- a/test/log/log_api.cpp +++ b/test/log/log_api.cpp @@ -20,6 +20,7 @@ #include +#include "misc.h" #include "test.h" using namespace std; @@ -109,18 +110,17 @@ protected: int testFile() { - int fd = open("/tmp", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR); - if (fd < 0) { + auto fd = test::createTemporaryFile(); + if (!fd.isValid()) { cerr << "Failed to open tmp log file" << endl; return TestFail; } char path[32]; - snprintf(path, sizeof(path), "/proc/self/fd/%u", fd); + snprintf(path, sizeof(path), "/proc/self/fd/%u", fd.get()); if (logSetFile(path) < 0) { cerr << "Failed to set log file" << endl; - close(fd); return TestFail; } @@ -128,13 +128,11 @@ protected: char buf[1000]; memset(buf, 0, sizeof(buf)); - lseek(fd, 0, SEEK_SET); - if (read(fd, buf, sizeof(buf)) < 0) { + lseek(fd.get(), 0, SEEK_SET); + if (read(fd.get(), buf, sizeof(buf)) < 0) { cerr << "Failed to read tmp log file" << endl; - close(fd); return TestFail; } - close(fd); istringstream iss(buf); return verifyOutput(iss); diff --git a/test/shared-fd.cpp b/test/shared-fd.cpp index 57199dfe7..26e3140ad 100644 --- a/test/shared-fd.cpp +++ b/test/shared-fd.cpp @@ -14,6 +14,7 @@ #include #include +#include "misc.h" #include "test.h" using namespace libcamera; @@ -27,7 +28,7 @@ protected: desc1_ = nullptr; desc2_ = nullptr; - fd_ = open("/tmp", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR); + fd_ = test::createTemporaryFile().release(); if (fd_ < 0) return TestFail; diff --git a/test/unique-fd.cpp b/test/unique-fd.cpp index e556439ea..280205980 100644 --- a/test/unique-fd.cpp +++ b/test/unique-fd.cpp @@ -14,6 +14,7 @@ #include #include +#include "misc.h" #include "test.h" using namespace libcamera; @@ -189,7 +190,7 @@ protected: private: int createFd() { - fd_ = open("/tmp", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR); + fd_ = test::createTemporaryFile().release(); if (fd_ < 0) return TestFail;