1*2cd25e64SAlexander Hansen #include "suite.hpp"
2*2cd25e64SAlexander Hansen
3*2cd25e64SAlexander Hansen #include <unistd.h>
4*2cd25e64SAlexander Hansen
5*2cd25e64SAlexander Hansen #include <sdbusplus/async.hpp>
6*2cd25e64SAlexander Hansen
7*2cd25e64SAlexander Hansen #include <filesystem>
8*2cd25e64SAlexander Hansen #include <format>
9*2cd25e64SAlexander Hansen #include <fstream>
10*2cd25e64SAlexander Hansen
11*2cd25e64SAlexander Hansen #include <gtest/gtest.h>
12*2cd25e64SAlexander Hansen
13*2cd25e64SAlexander Hansen using namespace std::literals;
14*2cd25e64SAlexander Hansen
15*2cd25e64SAlexander Hansen namespace fs = std::filesystem;
16*2cd25e64SAlexander Hansen
FdioTimedTest()17*2cd25e64SAlexander Hansen FdioTimedTest::FdioTimedTest()
18*2cd25e64SAlexander Hansen {
19*2cd25e64SAlexander Hansen constexpr auto path_base = "/tmp/test_fdio_timed";
20*2cd25e64SAlexander Hansen
21*2cd25e64SAlexander Hansen path = std::format("{}{}", path_base, getpid());
22*2cd25e64SAlexander Hansen
23*2cd25e64SAlexander Hansen if (!fs::exists(path))
24*2cd25e64SAlexander Hansen {
25*2cd25e64SAlexander Hansen fs::create_directory(path);
26*2cd25e64SAlexander Hansen }
27*2cd25e64SAlexander Hansen
28*2cd25e64SAlexander Hansen fd = inotify_init1(IN_NONBLOCK);
29*2cd25e64SAlexander Hansen EXPECT_NE(fd, -1) << "Error occurred during the inotify_init1, error: "
30*2cd25e64SAlexander Hansen << errno;
31*2cd25e64SAlexander Hansen
32*2cd25e64SAlexander Hansen wd = inotify_add_watch(fd, path.c_str(), IN_CLOSE_WRITE);
33*2cd25e64SAlexander Hansen EXPECT_NE(wd, -1) << "Error occurred during the inotify_add_watch, error: "
34*2cd25e64SAlexander Hansen << errno;
35*2cd25e64SAlexander Hansen fdioInstance = std::make_unique<sdbusplus::async::fdio>(
36*2cd25e64SAlexander Hansen *ctx, fd, std::chrono::microseconds(1000));
37*2cd25e64SAlexander Hansen }
38*2cd25e64SAlexander Hansen
~FdioTimedTest()39*2cd25e64SAlexander Hansen FdioTimedTest::~FdioTimedTest() noexcept
40*2cd25e64SAlexander Hansen {
41*2cd25e64SAlexander Hansen if (fd != -1)
42*2cd25e64SAlexander Hansen {
43*2cd25e64SAlexander Hansen if (wd != -1)
44*2cd25e64SAlexander Hansen {
45*2cd25e64SAlexander Hansen inotify_rm_watch(fd, wd);
46*2cd25e64SAlexander Hansen }
47*2cd25e64SAlexander Hansen close(fd);
48*2cd25e64SAlexander Hansen }
49*2cd25e64SAlexander Hansen ctx.reset();
50*2cd25e64SAlexander Hansen
51*2cd25e64SAlexander Hansen if (fs::exists(path))
52*2cd25e64SAlexander Hansen {
53*2cd25e64SAlexander Hansen fs::remove_all(path);
54*2cd25e64SAlexander Hansen }
55*2cd25e64SAlexander Hansen }
56*2cd25e64SAlexander Hansen
writeToFile()57*2cd25e64SAlexander Hansen auto FdioTimedTest::writeToFile() -> sdbusplus::async::task<>
58*2cd25e64SAlexander Hansen {
59*2cd25e64SAlexander Hansen std::ofstream outfile((path / "test_fdio.txt").native());
60*2cd25e64SAlexander Hansen EXPECT_TRUE(outfile.is_open())
61*2cd25e64SAlexander Hansen << "Error occurred during file open, error: " << errno;
62*2cd25e64SAlexander Hansen outfile << "Test fdio!" << std::endl;
63*2cd25e64SAlexander Hansen outfile.close();
64*2cd25e64SAlexander Hansen co_return;
65*2cd25e64SAlexander Hansen }
66*2cd25e64SAlexander Hansen
testFdTimedEvents(bool & ran,testWriteOperation writeOperation,int testIterations)67*2cd25e64SAlexander Hansen auto FdioTimedTest::testFdTimedEvents(
68*2cd25e64SAlexander Hansen bool& ran, testWriteOperation writeOperation, int testIterations)
69*2cd25e64SAlexander Hansen -> sdbusplus::async::task<>
70*2cd25e64SAlexander Hansen {
71*2cd25e64SAlexander Hansen for (int i = 0; i < testIterations; i++)
72*2cd25e64SAlexander Hansen {
73*2cd25e64SAlexander Hansen switch (writeOperation)
74*2cd25e64SAlexander Hansen {
75*2cd25e64SAlexander Hansen case testWriteOperation::writeSync:
76*2cd25e64SAlexander Hansen co_await writeToFile();
77*2cd25e64SAlexander Hansen break;
78*2cd25e64SAlexander Hansen case testWriteOperation::writeAsync:
79*2cd25e64SAlexander Hansen ctx->spawn(sdbusplus::async::sleep_for(*ctx, 1s) |
80*2cd25e64SAlexander Hansen stdexec::then([&]() { ctx->spawn(writeToFile()); }));
81*2cd25e64SAlexander Hansen break;
82*2cd25e64SAlexander Hansen case testWriteOperation::writeSkip:
83*2cd25e64SAlexander Hansen default:
84*2cd25e64SAlexander Hansen break;
85*2cd25e64SAlexander Hansen }
86*2cd25e64SAlexander Hansen
87*2cd25e64SAlexander Hansen bool receivedTimeout = false;
88*2cd25e64SAlexander Hansen
89*2cd25e64SAlexander Hansen try
90*2cd25e64SAlexander Hansen {
91*2cd25e64SAlexander Hansen co_await fdioInstance->next();
92*2cd25e64SAlexander Hansen }
93*2cd25e64SAlexander Hansen catch (const sdbusplus::async::fdio_timeout_exception& e)
94*2cd25e64SAlexander Hansen {
95*2cd25e64SAlexander Hansen receivedTimeout = true;
96*2cd25e64SAlexander Hansen }
97*2cd25e64SAlexander Hansen
98*2cd25e64SAlexander Hansen switch (writeOperation)
99*2cd25e64SAlexander Hansen {
100*2cd25e64SAlexander Hansen case testWriteOperation::writeSync:
101*2cd25e64SAlexander Hansen EXPECT_FALSE(receivedTimeout) << "Expected event";
102*2cd25e64SAlexander Hansen break;
103*2cd25e64SAlexander Hansen case testWriteOperation::writeAsync:
104*2cd25e64SAlexander Hansen case testWriteOperation::writeSkip:
105*2cd25e64SAlexander Hansen default:
106*2cd25e64SAlexander Hansen EXPECT_TRUE(receivedTimeout) << "Expected timeout";
107*2cd25e64SAlexander Hansen break;
108*2cd25e64SAlexander Hansen }
109*2cd25e64SAlexander Hansen }
110*2cd25e64SAlexander Hansen ran = true;
111*2cd25e64SAlexander Hansen
112*2cd25e64SAlexander Hansen co_return;
113*2cd25e64SAlexander Hansen }
114