aboutsummaryrefslogtreecommitdiffstats
path: root/tests/fd.cc
diff options
context:
space:
mode:
authorLexi Winter <lexi@le-fay.org>2025-06-21 17:18:57 +0100
committerLexi Winter <lexi@le-fay.org>2025-06-21 17:18:57 +0100
commitd27d1302d1fa1b96bf8f53f17fce947f19d21330 (patch)
treef56ef29d7816c3b574b3359c746355a44e3b0819 /tests/fd.cc
parent75c6b5fee029ec95e7e45e18525e3e78b9616f48 (diff)
downloadnihil-d27d1302d1fa1b96bf8f53f17fce947f19d21330.tar.gz
nihil-d27d1302d1fa1b96bf8f53f17fce947f19d21330.tar.bz2
add nihil.config (incomplete)
Diffstat (limited to 'tests/fd.cc')
-rw-r--r--tests/fd.cc200
1 files changed, 0 insertions, 200 deletions
diff --git a/tests/fd.cc b/tests/fd.cc
deleted file mode 100644
index fbf353e..0000000
--- a/tests/fd.cc
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * This source code is released into the public domain.
- */
-
-#include <span>
-
-#include <stdio.h>
-#include <fcntl.h>
-
-#include <catch2/catch_test_macros.hpp>
-
-import nihil;
-
-using namespace std::literals;
-
-namespace {
-
-// Test if an fd is open.
-auto fd_is_open(int fd) -> bool {
- auto const ret = ::fcntl(fd, F_GETFL);
- return ret == 0;
-}
-
-} // anonymous namespace
-
-TEST_CASE("fd: construct empty", "[fd]") {
- nihil::fd fd;
-
- REQUIRE(!fd);
- REQUIRE_THROWS_AS(fd.get(), nihil::fd_logic_error);
-}
-
-TEST_CASE("fd: construct from fd", "[fd]") {
- auto file = ::open("/dev/null", O_RDONLY);
- REQUIRE(file > 0);
-
- {
- auto fd = nihil::fd(file);
- REQUIRE(fd_is_open(fd.get()));
- }
-
- REQUIRE(!fd_is_open(file));
-}
-
-TEST_CASE("fd: close", "[fd]") {
- auto file = ::open("/dev/null", O_RDONLY);
- REQUIRE(file > 0);
-
- auto fd = nihil::fd(file);
- REQUIRE(fd);
-
- auto const ret = fd.close();
- REQUIRE(ret);
- REQUIRE(!fd_is_open(file));
-}
-
-TEST_CASE("fd: move construct", "[fd]") {
- auto file = ::open("/dev/null", O_RDONLY);
- REQUIRE(file > 0);
-
- auto fd1 = nihil::fd(file);
- REQUIRE(fd_is_open(fd1.get()));
-
- auto fd2(std::move(fd1));
- REQUIRE(!fd1);
- REQUIRE(fd2);
- REQUIRE(fd2.get() == file);
- REQUIRE(fd_is_open(file));
-}
-
-TEST_CASE("fd: move assign", "[fd]") {
- auto file = ::open("/dev/null", O_RDONLY);
- REQUIRE(file > 0);
-
- auto fd1 = nihil::fd(file);
- REQUIRE(fd_is_open(fd1.get()));
-
- auto fd2 = nihil::fd();
- REQUIRE(!fd2);
-
- fd2 = std::move(fd1);
-
- REQUIRE(!fd1);
- REQUIRE(fd2);
- REQUIRE(fd2.get() == file);
- REQUIRE(fd_is_open(file));
-}
-
-TEST_CASE("fd: release", "[fd]") {
- auto file = ::open("/dev/null", O_RDONLY);
- REQUIRE(file > 0);
-
- auto fd = nihil::fd(file);
- auto fdesc = std::move(fd).release();
- REQUIRE(!fd);
- REQUIRE(fdesc == file);
-}
-
-TEST_CASE("fd: dup", "[fd]") {
- auto file = ::open("/dev/null", O_RDONLY);
- REQUIRE(file > 0);
-
- auto fd = nihil::fd(file);
- REQUIRE(fd);
-
- auto fd2 = dup(fd);
- REQUIRE(fd2);
- REQUIRE(fd.get() != fd2->get());
-}
-
-TEST_CASE("fd: dup2", "[fd]") {
- auto file = ::open("/dev/null", O_RDONLY);
- REQUIRE(file > 0);
-
- REQUIRE(!fd_is_open(666));
-
- auto fd = nihil::fd(file);
- auto fd2 = dup(fd, 666);
-
- REQUIRE(fd);
- REQUIRE(fd2);
- REQUIRE(fd2->get() == 666);
-}
-
-TEST_CASE("fd: flags", "[fd]") {
- auto file = ::open("/dev/null", O_RDONLY);
- REQUIRE(file > 0);
-
- auto fd = nihil::fd(file);
-
- {
- auto const ret = replaceflags(fd, 0);
- REQUIRE(ret);
- REQUIRE(getflags(fd) == 0);
- }
-
- {
- auto const ret = setflags(fd, O_NONBLOCK);
- REQUIRE(ret == O_NONBLOCK);
- REQUIRE(getflags(fd) == O_NONBLOCK);
- }
-
- {
- auto const ret = setflags(fd, O_SYNC);
- REQUIRE(ret == (O_NONBLOCK|O_SYNC));
- REQUIRE(getflags(fd) == (O_NONBLOCK|O_SYNC));
- }
-
- {
- auto const ret = clearflags(fd, O_NONBLOCK);
- REQUIRE(ret == O_SYNC);
- REQUIRE(getflags(fd) == O_SYNC);
- }
-}
-
-TEST_CASE("fd: fdflags", "[fd]") {
- auto file = ::open("/dev/null", O_RDONLY);
- REQUIRE(file > 0);
-
- auto fd = nihil::fd(file);
-
- {
- auto const ret = replacefdflags(fd, 0);
- REQUIRE(ret);
- REQUIRE(getfdflags(fd) == 0);
- }
-
- {
- auto const ret = setfdflags(fd, FD_CLOEXEC);
- REQUIRE(ret == FD_CLOEXEC);
- REQUIRE(getfdflags(fd) == FD_CLOEXEC);
- }
-
- {
- auto const ret = clearfdflags(fd, FD_CLOEXEC);
- REQUIRE(ret == 0);
- REQUIRE(getfdflags(fd) == 0);
- }
-}
-
-TEST_CASE("fd: pipe, read, write", "[fd]") {
- auto fds = nihil::pipe();
- REQUIRE(fds);
-
- auto [fd1, fd2] = std::move(*fds);
-
- auto constexpr test_string = "test string"sv;
-
- auto ret = write(fd1, test_string);
- REQUIRE(ret);
- REQUIRE(*ret == test_string.size());
-
- auto readbuf = std::array<char, test_string.size() * 2>{};
- ret = read(fd2, readbuf);
- REQUIRE(ret);
- REQUIRE(*ret == test_string.size());
-
- auto read_string = std::string_view(std::span(readbuf).subspan(0, *ret));
- REQUIRE(read_string == test_string);
-}