xref: /openbmc/estoraged/src/test/erase/zero_test.cpp (revision 59dffa63)
1 #include "estoraged_conf.hpp"
2 #include "zero.hpp"
3 
4 #include <fcntl.h>
5 #include <unistd.h>
6 
7 #include <stdplus/fd/create.hpp>
8 #include <stdplus/fd/managed.hpp>
9 #include <xyz/openbmc_project/Common/error.hpp>
10 
11 #include <fstream>
12 #include <system_error>
13 
14 #include <gmock/gmock-matchers.h>
15 #include <gmock/gmock.h>
16 #include <gtest/gtest.h>
17 
18 using estoraged::Zero;
19 using sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
20 using stdplus::fd::ManagedFd;
21 
22 namespace estoraged_test
23 {
24 
25 TEST(Zeros, zeroPass)
26 {
27     std::string testFileName = "testfile_pass";
28     std::ofstream testFile;
29 
30     testFile.open(testFileName,
31                   std::ios::out | std::ios::binary | std::ios::trunc);
32     testFile.close();
33     uint64_t size = 4096;
34     Zero pass(testFileName);
35     EXPECT_NO_THROW(pass.writeZero(size));
36     EXPECT_NO_THROW(pass.verifyZero(size));
37 }
38 
39 /* This test that pattern writes the correct number of bytes even if
40  * size of the drive is not divisable by the block size
41  */
42 TEST(Zeros, notDivisible)
43 {
44     std::string testFileName = "testfile_notDivisible";
45     std::ofstream testFile;
46 
47     testFile.open(testFileName,
48                   std::ios::out | std::ios::binary | std::ios::trunc);
49     testFile.close();
50 
51     uint64_t size = 4097;
52     // 4097 is not divisible by the block size, and we expect no errors
53     Zero pass(testFileName);
54     EXPECT_NO_THROW(pass.writeZero(size));
55     EXPECT_NO_THROW(pass.verifyZero(size));
56 }
57 
58 TEST(Zeros, notZeroStart)
59 {
60     std::string testFileName = "testfile_notZeroStart";
61     std::ofstream testFile;
62 
63     // open the file and write none zero to it
64     int dummyValue = 0x88776655;
65     testFile.open(testFileName, std::ios::binary | std::ios::out);
66     testFile.write((const char*)&dummyValue, sizeof(dummyValue));
67     testFile.close();
68     uint64_t size = 4096;
69     Zero pass(testFileName);
70     EXPECT_NO_THROW(pass.writeZero(size - sizeof(dummyValue)));
71 
72     // force flush, needed for unit testing
73     std::ofstream file;
74     file.open(testFileName);
75     file.close();
76 
77     EXPECT_THROW(pass.verifyZero(size), InternalFailure);
78 }
79 
80 TEST(Zeros, notZeroEnd)
81 {
82     std::string testFileName = "testfile_notZeroEnd";
83     std::ofstream testFile;
84 
85     testFile.open(testFileName,
86                   std::ios::out | std::ios::binary | std::ios::trunc);
87     testFile.close();
88 
89     uint64_t size = 4096;
90     Zero pass(testFileName);
91     int dummyValue = 88;
92     EXPECT_NO_THROW(pass.writeZero(size - sizeof(dummyValue)));
93 
94     // open the file and write none zero to it
95     testFile.open(testFileName, std::ios::out);
96     testFile << dummyValue;
97     testFile.close();
98 
99     EXPECT_THROW(pass.verifyZero(size), InternalFailure);
100 }
101 
102 } // namespace estoraged_test
103