xref: /openbmc/phosphor-ipmi-flash/bmc/firmware-handler/test/file_handler_unittest.cpp (revision ba90fd7ae0088caa3317d747415213ebb925cc8f)
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