1*090ab8e1SEd Tanous #pragma once
2*090ab8e1SEd Tanous #include <filesystem>
3*090ab8e1SEd Tanous #include <string>
4*090ab8e1SEd Tanous #include <string_view>
5*090ab8e1SEd Tanous 
6*090ab8e1SEd Tanous #include <gtest/gtest.h>
7*090ab8e1SEd Tanous 
8*090ab8e1SEd Tanous struct TemporaryFileHandle
9*090ab8e1SEd Tanous {
10*090ab8e1SEd Tanous     std::filesystem::path path;
11*090ab8e1SEd Tanous     std::string stringPath;
12*090ab8e1SEd Tanous 
13*090ab8e1SEd Tanous     // Creates a temporary file with the contents provided, removes it on
14*090ab8e1SEd Tanous     // destruction.
TemporaryFileHandleTemporaryFileHandle15*090ab8e1SEd Tanous     explicit TemporaryFileHandle(std::string_view sampleData) :
16*090ab8e1SEd Tanous         path(std::filesystem::temp_directory_path() /
17*090ab8e1SEd Tanous              "bmcweb_http_response_test_XXXXXXXXXXX")
18*090ab8e1SEd Tanous     {
19*090ab8e1SEd Tanous         stringPath = path.string();
20*090ab8e1SEd Tanous 
21*090ab8e1SEd Tanous         int fd = mkstemp(stringPath.data());
22*090ab8e1SEd Tanous         EXPECT_GT(fd, 0);
23*090ab8e1SEd Tanous         EXPECT_EQ(write(fd, sampleData.data(), sampleData.size()),
24*090ab8e1SEd Tanous                   sampleData.size());
25*090ab8e1SEd Tanous         close(fd);
26*090ab8e1SEd Tanous     }
27*090ab8e1SEd Tanous 
28*090ab8e1SEd Tanous     TemporaryFileHandle(const TemporaryFileHandle&) = delete;
29*090ab8e1SEd Tanous     TemporaryFileHandle(TemporaryFileHandle&&) = delete;
30*090ab8e1SEd Tanous     TemporaryFileHandle& operator=(const TemporaryFileHandle&) = delete;
31*090ab8e1SEd Tanous     TemporaryFileHandle& operator=(TemporaryFileHandle&&) = delete;
32*090ab8e1SEd Tanous 
~TemporaryFileHandleTemporaryFileHandle33*090ab8e1SEd Tanous     ~TemporaryFileHandle()
34*090ab8e1SEd Tanous     {
35*090ab8e1SEd Tanous         std::filesystem::remove(path);
36*090ab8e1SEd Tanous     }
37*090ab8e1SEd Tanous };
38