xref: /openbmc/estoraged/src/test/erase/pattern_test.cpp (revision 7f2ab6432a5f3aeb2ecf131169a3d44569007f1c)
1 #include "estoraged_conf.hpp"
2 #include "pattern.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 <system_error>
12 
13 #include <gmock/gmock-matchers.h>
14 #include <gmock/gmock.h>
15 #include <gtest/gtest.h>
16 
17 using sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
18 using stdplus::fd::ManagedFd;
19 
20 class MockManagedFd : public ManagedFd
21 {
22   public:
23     MockManagedFd(int fd) : ManagedFd(std::move(fd))
24     {}
25     ~MockManagedFd()
26     {}
27 };
28 
29 TEST(pattern, patternPass)
30 {
31     uint64_t size = 4096;
32     int fds[2];
33     Pattern pass("fileName");
34     if (pipe(fds))
35     {
36         FAIL();
37     }
38     MockManagedFd writeFd(fds[1]);
39     EXPECT_NO_THROW(pass.writePattern(size, writeFd));
40     MockManagedFd verifyFd(fds[0]);
41     EXPECT_NO_THROW(pass.verifyPattern(size, verifyFd));
42 }
43 
44 /* This test that pattern writes the correct number of bytes even if
45  * size of the drive is not divisable by the block size
46  */
47 TEST(pattern, patternPassNotDivisible)
48 {
49     uint64_t size = 4097;
50     // 4097 is not divisible by the block size, and we expect no errors
51     int fds[2];
52     Pattern pass("fileName");
53     if (pipe(fds))
54     {
55         FAIL();
56     }
57     MockManagedFd writeFd(fds[1]);
58     EXPECT_NO_THROW(pass.writePattern(size, writeFd));
59     MockManagedFd verifyFd(fds[0]);
60     EXPECT_NO_THROW(pass.verifyPattern(size, verifyFd));
61 }
62 
63 TEST(pattern, patternsDontMatch)
64 {
65     uint64_t size = 4096;
66     int fds[2];
67     Pattern pass("fileName");
68     if (pipe(fds))
69     {
70         FAIL();
71     }
72     int dummyValue = 88;
73     if (::write(fds[1], &dummyValue, sizeof(dummyValue)) != sizeof(dummyValue))
74     {
75         FAIL();
76     }
77     MockManagedFd writeFd(fds[1]);
78     pass.writePattern(size - sizeof(dummyValue), writeFd);
79     MockManagedFd verifyFd(fds[0]);
80     EXPECT_THROW(pass.verifyPattern(size, verifyFd), InternalFailure);
81 }
82