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