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