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