From patchwork Mon Apr 13 13:30:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 3438 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 0911A6279B for ; Mon, 13 Apr 2020 15:31:06 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="O0EeYu5G"; dkim-atps=neutral Received: from pendragon.bb.dnainternet.fi (81-175-216-236.bb.dnainternet.fi [81.175.216.236]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A5231A42 for ; Mon, 13 Apr 2020 15:31:05 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1586784665; bh=3vjkyhzAgooy6N+mAEkoE8z1/M7zDgPtGCd5Tgg527E=; h=From:To:Subject:Date:In-Reply-To:References:From; b=O0EeYu5GZbvO1byfc3GDbQUnqmRZcKfC3mnjOI68oXu59xAgWWCUk/+PSU07MnM1K Y96NMfHezM9P8XXslRrBvyFKImT86Mwi0bRFT42BA3Tb3j2ENVQPjb4ffD0Rv8IqgB yei49nYUJb0gdX/Z6hddUGOvJE4mVFS0o/WeRHzU= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Mon, 13 Apr 2020 16:30:40 +0300 Message-Id: <20200413133047.11913-5-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200413133047.11913-1-laurent.pinchart@ideasonboard.com> References: <20200413133047.11913-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 04/11] test: Add File class tests 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: , X-List-Received-Date: Mon, 13 Apr 2020 13:31:06 -0000 Add tests for the File class API. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- Changes since v1: - Use mkstemp() to generate temporary file name - Add error() test --- test/file.cpp | 293 +++++++++++++++++++++++++++++++++++++++++++++++ test/meson.build | 1 + 2 files changed, 294 insertions(+) create mode 100644 test/file.cpp diff --git a/test/file.cpp b/test/file.cpp new file mode 100644 index 000000000000..6558399808f8 --- /dev/null +++ b/test/file.cpp @@ -0,0 +1,293 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2020, Google Inc. + * + * file.cpp - File I/O operations tests + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "file.h" +#include "test.h" + +using namespace std; +using namespace libcamera; + +class FileTest : public Test +{ +protected: + int init() + { + fileName_ = "/tmp/libcamera.test.XXXXXX"; + int fd = mkstemp(&fileName_.front()); + if (fd == -1) + return TestFail; + + write(fd, "libcamera", 9); + close(fd); + + return TestPass; + } + + int run() + { + /* Test static functions. */ + if (!File::exists("/dev/null")) { + cerr << "Valid file not found" << endl; + return TestFail; + } + + if (File::exists("/dev/null/invalid")) { + cerr << "Invalid file should not exist" << endl; + return TestFail; + } + + /* Test unnamed file. */ + File file; + + if (!file.fileName().empty()) { + cerr << "Unnamed file has non-empty file name" << endl; + return TestFail; + } + + if (file.exists()) { + cerr << "Unnamed file exists" << endl; + return TestFail; + } + + if (file.isOpen()) { + cerr << "File is open after construction" << endl; + return TestFail; + } + + if (file.openMode() != File::NotOpen) { + cerr << "File has invalid open mode after construction" + << endl; + return TestFail; + } + + if (file.size() >= 0) { + cerr << "Unnamed file has a size" << endl; + return TestFail; + } + + if (file.open(File::ReadWrite)) { + cerr << "Opening unnamed file succeeded" << endl; + return TestFail; + } + + if (file.error() == 0) { + cerr << "Open failure didn't set error" << endl; + return TestFail; + } + + /* Test named file referring to an invalid file. */ + file.setFileName("/dev/null/invalid"); + + if (file.fileName() != "/dev/null/invalid") { + cerr << "File reports incorrect file name" << endl; + return TestFail; + } + + if (file.exists()) { + cerr << "Invalid file exists" << endl; + return TestFail; + } + + if (file.isOpen()) { + cerr << "Invalid file is open after construction" << endl; + return TestFail; + } + + if (file.openMode() != File::NotOpen) { + cerr << "Invalid file has invalid open mode after construction" + << endl; + return TestFail; + } + + if (file.size() >= 0) { + cerr << "Invalid file has a size" << endl; + return TestFail; + } + + if (file.open(File::ReadWrite)) { + cerr << "Opening invalid file succeeded" << endl; + return TestFail; + } + + /* Test named file referring to a valid file. */ + file.setFileName("/dev/null"); + + if (!file.exists()) { + cerr << "Valid file does not exist" << endl; + return TestFail; + } + + if (file.isOpen()) { + cerr << "Valid file is open after construction" << endl; + return TestFail; + } + + if (file.openMode() != File::NotOpen) { + cerr << "Valid file has invalid open mode after construction" + << endl; + return TestFail; + } + + if (file.size() >= 0) { + cerr << "Invalid file has a size" << endl; + return TestFail; + } + + /* Test open and close. */ + if (!file.open(File::ReadWrite)) { + cerr << "Opening file failed" << endl; + return TestFail; + } + + if (!file.isOpen()) { + cerr << "Open file reported as closed" << endl; + return TestFail; + } + + if (file.openMode() != File::ReadWrite) { + cerr << "Open file has invalid open mode" << endl; + return TestFail; + } + + file.close(); + + if (file.isOpen()) { + cerr << "Closed file reported as open" << endl; + return TestFail; + } + + if (file.openMode() != File::NotOpen) { + cerr << "Closed file has invalid open mode" << endl; + return TestFail; + } + + /* Test size(). */ + file.setFileName("/proc/self/exe"); + + if (file.size() >= 0) { + cerr << "File has valid size before open" << endl; + return TestFail; + } + + file.open(File::ReadOnly); + + ssize_t size = file.size(); + if (size <= 0) { + cerr << "File has invalid size after open" << endl; + return TestFail; + } + + /* Test mapping and unmapping. */ + Span data = file.map(); + if (data.empty()) { + cerr << "Mapping of complete file failed" << endl; + return TestFail; + } + + if (data.size() != static_cast(size)) { + cerr << "Mapping of complete file has invalid size" << endl; + return TestFail; + } + + if (!file.unmap(data.data())) { + cerr << "Unmapping of complete file failed" << endl; + return TestFail; + } + + data = file.map(4096, 8192); + if (data.empty()) { + cerr << "Mapping of file region failed" << endl; + return TestFail; + } + + if (data.size() != 8192) { + cerr << "Mapping of file region has invalid size" << endl; + return TestFail; + } + + if (!file.unmap(data.data())) { + cerr << "Unmapping of file region failed" << endl; + return TestFail; + } + + file.close(); + + /* Test private mapping. */ + file.setFileName(fileName_); + file.open(File::ReadWrite); + + data = file.map(0, -1, File::MapPrivate); + if (data.empty()) { + cerr << "Private mapping failed" << endl; + return TestFail; + } + + std::string str{ reinterpret_cast(data.data()), data.size() }; + if (str != "libcamera") { + cerr << "Invalid contents of private mapping" << endl; + return TestFail; + } + + memcpy(data.data(), "LIBCAMERA", 9); + + if (!file.unmap(data.data())) { + cerr << "Private unmapping failed" << endl; + return TestFail; + } + + data = file.map(); + + str = { reinterpret_cast(data.data()), data.size() }; + if (str != "libcamera") { + cerr << "Private mapping changed file contents" << endl; + return TestFail; + } + + /* Test shared mapping. */ + data = file.map(); + if (data.empty()) { + cerr << "Shared mapping failed" << endl; + return TestFail; + } + + memcpy(data.data(), "LIBCAMERA", 9); + + if (!file.unmap(data.data())) { + cerr << "Shared unmapping failed" << endl; + return TestFail; + } + + data = file.map(); + + str = { reinterpret_cast(data.data()), data.size() }; + if (str != "LIBCAMERA") { + cerr << "Shared mapping failed to change file contents" + << endl; + return TestFail; + } + + return TestPass; + } + + void cleanup() + { + unlink(fileName_.c_str()); + } + +private: + std::string fileName_; +}; + +TEST_REGISTER(FileTest) diff --git a/test/meson.build b/test/meson.build index 8ab58ac15a2a..5a45a85effd3 100644 --- a/test/meson.build +++ b/test/meson.build @@ -26,6 +26,7 @@ internal_tests = [ ['event', 'event.cpp'], ['event-dispatcher', 'event-dispatcher.cpp'], ['event-thread', 'event-thread.cpp'], + ['file', 'file.cpp'], ['file-descriptor', 'file-descriptor.cpp'], ['message', 'message.cpp'], ['object', 'object.cpp'],