xref: /openbmc/sdbusplus/test/async/fdio_timed/suite.cpp (revision 2cd25e64299ecc20e2258727e836a31b7ce6fad3)
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