1ded66d0fSJason Ling #include "file_handler.hpp"
2ded66d0fSJason Ling
3ded66d0fSJason Ling #include <cstdint>
4ded66d0fSJason Ling #include <cstdio>
5ded66d0fSJason Ling #include <fstream>
6ded66d0fSJason Ling #include <vector>
7ded66d0fSJason Ling
8ded66d0fSJason Ling #include <gtest/gtest.h>
9ded66d0fSJason Ling
10ded66d0fSJason Ling namespace ipmi_flash
11ded66d0fSJason Ling {
12ded66d0fSJason Ling
13ded66d0fSJason Ling static constexpr auto TESTPATH = "test.output";
14ded66d0fSJason Ling
15ded66d0fSJason Ling class FileHandlerOpenTest : public ::testing::Test
16ded66d0fSJason Ling {
17ded66d0fSJason Ling protected:
TearDown()18ded66d0fSJason Ling void TearDown() override
19ded66d0fSJason Ling {
20ded66d0fSJason Ling (void)std::remove(TESTPATH);
21ded66d0fSJason Ling }
22ded66d0fSJason Ling };
23ded66d0fSJason Ling
TEST_F(FileHandlerOpenTest,VerifyDefaultOpenIsHappy)2456a2273fSJason Ling TEST_F(FileHandlerOpenTest, VerifyDefaultOpenIsHappy)
25ded66d0fSJason Ling {
26ded66d0fSJason Ling /* Opening a fail may create it? */
27ded66d0fSJason Ling
28ded66d0fSJason Ling FileHandler handler(TESTPATH);
29ded66d0fSJason Ling EXPECT_TRUE(handler.open(""));
30*ba90fd7aSWilliam A. Kennington III EXPECT_TRUE(handler.open(""));
31ded66d0fSJason Ling }
32ded66d0fSJason Ling
TEST_F(FileHandlerOpenTest,VerifyOpenForReadFailsWithNoFile)3356a2273fSJason Ling TEST_F(FileHandlerOpenTest, VerifyOpenForReadFailsWithNoFile)
3456a2273fSJason Ling {
3556a2273fSJason Ling FileHandler handler(TESTPATH);
36*ba90fd7aSWilliam A. Kennington III EXPECT_EQ(handler.getSize(), 0);
3756a2273fSJason Ling EXPECT_FALSE(handler.open("", std::ios::in));
38*ba90fd7aSWilliam A. Kennington III EXPECT_EQ(handler.getSize(), 0);
3956a2273fSJason Ling }
4056a2273fSJason Ling
TEST_F(FileHandlerOpenTest,VerifyOpenForReadSucceedsWithFile)4156a2273fSJason Ling TEST_F(FileHandlerOpenTest, VerifyOpenForReadSucceedsWithFile)
4256a2273fSJason Ling {
4356a2273fSJason Ling std::ofstream testfile;
4456a2273fSJason Ling testfile.open(TESTPATH, std::ios::out);
4556a2273fSJason Ling testfile << "Hello world";
4656a2273fSJason Ling FileHandler handler(TESTPATH);
4756a2273fSJason Ling EXPECT_TRUE(handler.open("", std::ios::in));
4856a2273fSJason Ling }
4956a2273fSJason Ling
TEST_F(FileHandlerOpenTest,VerifyWriteDataWrites)50ded66d0fSJason Ling TEST_F(FileHandlerOpenTest, VerifyWriteDataWrites)
51ded66d0fSJason Ling {
52ded66d0fSJason Ling /* Verify writing bytes writes them... flushing data can be an issue here,
53ded66d0fSJason Ling * so we close first.
54ded66d0fSJason Ling */
55ded66d0fSJason Ling FileHandler handler(TESTPATH);
56ded66d0fSJason Ling EXPECT_TRUE(handler.open(""));
57ded66d0fSJason Ling
58ded66d0fSJason Ling std::vector<std::uint8_t> bytes = {0x01, 0x02};
59ded66d0fSJason Ling std::uint32_t offset = 0;
60ded66d0fSJason Ling
61ded66d0fSJason Ling EXPECT_TRUE(handler.write(offset, bytes));
62ded66d0fSJason Ling handler.close();
63ded66d0fSJason Ling
64ded66d0fSJason Ling std::ifstream data;
65ded66d0fSJason Ling data.open(TESTPATH, std::ios::binary);
66ded66d0fSJason Ling char expectedBytes[2];
67ded66d0fSJason Ling data.read(&expectedBytes[0], sizeof(expectedBytes));
68ded66d0fSJason Ling EXPECT_EQ(expectedBytes[0], bytes[0]);
69ded66d0fSJason Ling EXPECT_EQ(expectedBytes[1], bytes[1]);
70ded66d0fSJason Ling /* annoyingly the memcmp was failing... but it's the same data. */
71ded66d0fSJason Ling }
72ded66d0fSJason Ling
TEST_F(FileHandlerOpenTest,VerifySimpleRead)7356a2273fSJason Ling TEST_F(FileHandlerOpenTest, VerifySimpleRead)
7456a2273fSJason Ling {
7556a2273fSJason Ling std::ofstream testfile;
7656a2273fSJason Ling testfile.open(TESTPATH, std::ios::out);
7756a2273fSJason Ling std::vector<std::uint8_t> testPattern = {0x0, 0x1, 0x2, 0x3, 0x4,
7856a2273fSJason Ling 0x5, 0x6, 0x7, 0x8, 0x9};
7956a2273fSJason Ling testfile.write(reinterpret_cast<const char*>(testPattern.data()),
8056a2273fSJason Ling testPattern.size());
8156a2273fSJason Ling testfile.close();
8256a2273fSJason Ling FileHandler handler(TESTPATH);
83*ba90fd7aSWilliam A. Kennington III EXPECT_EQ(handler.getSize(), testPattern.size());
8456a2273fSJason Ling EXPECT_TRUE(handler.open("", std::ios::in));
8556a2273fSJason Ling auto result = handler.read(0, 10);
86*ba90fd7aSWilliam A. Kennington III EXPECT_EQ(handler.getSize(), testPattern.size());
8756a2273fSJason Ling ASSERT_TRUE(result);
8856a2273fSJason Ling EXPECT_EQ(result->size(), 10);
8956a2273fSJason Ling EXPECT_EQ(*result, testPattern);
9056a2273fSJason Ling }
9156a2273fSJason Ling
TEST_F(FileHandlerOpenTest,VerifyTruncatedAndOffsetReads)9256a2273fSJason Ling TEST_F(FileHandlerOpenTest, VerifyTruncatedAndOffsetReads)
9356a2273fSJason Ling {
9456a2273fSJason Ling std::ofstream testfile;
9556a2273fSJason Ling testfile.open(TESTPATH, std::ios::out);
9656a2273fSJason Ling std::vector<std::uint8_t> testPattern = {0x0, 0x1, 0x2, 0x3, 0x4,
9756a2273fSJason Ling 0x5, 0x6, 0x7, 0x8, 0x9};
9856a2273fSJason Ling std::vector<std::uint8_t> expectedResult(testPattern.begin() + 3,
9956a2273fSJason Ling testPattern.end());
10056a2273fSJason Ling
10156a2273fSJason Ling testfile.write(reinterpret_cast<const char*>(testPattern.data()),
10256a2273fSJason Ling testPattern.size());
10356a2273fSJason Ling testfile.close();
10456a2273fSJason Ling FileHandler handler(TESTPATH);
10556a2273fSJason Ling EXPECT_TRUE(handler.open("", std::ios::in));
10656a2273fSJason Ling auto result = handler.read(3, 10);
10756a2273fSJason Ling ASSERT_TRUE(result);
10856a2273fSJason Ling EXPECT_EQ(*result, expectedResult);
10956a2273fSJason Ling }
11056a2273fSJason Ling
TEST_F(FileHandlerOpenTest,VerifyBadOffsetReadsFail)11156a2273fSJason Ling TEST_F(FileHandlerOpenTest, VerifyBadOffsetReadsFail)
11256a2273fSJason Ling {
11356a2273fSJason Ling std::ofstream testfile;
11456a2273fSJason Ling testfile.open(TESTPATH, std::ios::out);
11556a2273fSJason Ling std::vector<std::uint8_t> testPattern = {0x0, 0x1, 0x2, 0x3, 0x4,
11656a2273fSJason Ling 0x5, 0x6, 0x7, 0x8, 0x9};
11756a2273fSJason Ling testfile.write(reinterpret_cast<const char*>(testPattern.data()),
11856a2273fSJason Ling testPattern.size());
11956a2273fSJason Ling testfile.close();
12056a2273fSJason Ling FileHandler handler(TESTPATH);
12156a2273fSJason Ling EXPECT_TRUE(handler.open("", std::ios::in));
12256a2273fSJason Ling auto result = handler.read(11, 10);
12356a2273fSJason Ling EXPECT_FALSE(result);
12456a2273fSJason Ling }
12556a2273fSJason Ling
126ded66d0fSJason Ling } // namespace ipmi_flash
127