1*605085a6SJohn Edward Broadbent #include "estoraged_conf.hpp"
2*605085a6SJohn Edward Broadbent #include "sanitize.hpp"
3*605085a6SJohn Edward Broadbent 
4*605085a6SJohn Edward Broadbent #include <sys/ioctl.h>
5*605085a6SJohn Edward Broadbent 
6*605085a6SJohn Edward Broadbent #include <stdplus/fd/managed.hpp>
7*605085a6SJohn Edward Broadbent #include <xyz/openbmc_project/Common/error.hpp>
8*605085a6SJohn Edward Broadbent 
9*605085a6SJohn Edward Broadbent #include <string>
10*605085a6SJohn Edward Broadbent #include <string_view>
11*605085a6SJohn Edward Broadbent 
12*605085a6SJohn Edward Broadbent #include <gmock/gmock-matchers.h>
13*605085a6SJohn Edward Broadbent #include <gmock/gmock.h>
14*605085a6SJohn Edward Broadbent #include <gtest/gtest.h>
15*605085a6SJohn Edward Broadbent 
16*605085a6SJohn Edward Broadbent namespace estoraged_test
17*605085a6SJohn Edward Broadbent {
18*605085a6SJohn Edward Broadbent 
19*605085a6SJohn Edward Broadbent using sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
20*605085a6SJohn Edward Broadbent using ::testing::_;
21*605085a6SJohn Edward Broadbent using ::testing::Return;
22*605085a6SJohn Edward Broadbent 
23*605085a6SJohn Edward Broadbent class IOCTLWrapperMock : public estoraged::IOCTLWrapperInterface
24*605085a6SJohn Edward Broadbent {
25*605085a6SJohn Edward Broadbent   public:
26*605085a6SJohn Edward Broadbent     MOCK_METHOD(int, doIoctl,
27*605085a6SJohn Edward Broadbent                 (std::string_view devPath, unsigned long request,
28*605085a6SJohn Edward Broadbent                  struct mmc_ioc_cmd idata),
29*605085a6SJohn Edward Broadbent                 (override));
30*605085a6SJohn Edward Broadbent 
31*605085a6SJohn Edward Broadbent     MOCK_METHOD(int, doIoctlMulti,
32*605085a6SJohn Edward Broadbent                 (std::string_view devPath, unsigned long request,
33*605085a6SJohn Edward Broadbent                  struct estoraged::mmc_io_multi_cmd_erase),
34*605085a6SJohn Edward Broadbent                 (override));
35*605085a6SJohn Edward Broadbent };
36*605085a6SJohn Edward Broadbent 
37*605085a6SJohn Edward Broadbent // mock ioctl returns 0, and everything passes
TEST(Sanitize,Successful)38*605085a6SJohn Edward Broadbent TEST(Sanitize, Successful)
39*605085a6SJohn Edward Broadbent {
40*605085a6SJohn Edward Broadbent     std::unique_ptr<IOCTLWrapperMock> mockIOCTL =
41*605085a6SJohn Edward Broadbent         std::make_unique<IOCTLWrapperMock>();
42*605085a6SJohn Edward Broadbent     IOCTLWrapperMock* mockPtr = mockIOCTL.get();
43*605085a6SJohn Edward Broadbent     estoraged::Sanitize goodSanitize("/dev/null", std::move(mockIOCTL));
44*605085a6SJohn Edward Broadbent     EXPECT_CALL(*mockPtr, doIoctl(_, _, _)).WillRepeatedly(Return(0));
45*605085a6SJohn Edward Broadbent     EXPECT_CALL(*mockPtr, doIoctlMulti(_, _, _)).WillRepeatedly(Return(0));
46*605085a6SJohn Edward Broadbent     EXPECT_NO_THROW(goodSanitize.doSanitize(52428800));
47*605085a6SJohn Edward Broadbent }
48*605085a6SJohn Edward Broadbent 
49*605085a6SJohn Edward Broadbent // doIoctlMulti returns -1, and Sanitize::emmcErase throws InternalFailure
TEST(Sanitize,Sanitize_emmcErase)50*605085a6SJohn Edward Broadbent TEST(Sanitize, Sanitize_emmcErase)
51*605085a6SJohn Edward Broadbent {
52*605085a6SJohn Edward Broadbent     std::unique_ptr<IOCTLWrapperMock> mockIOCTL =
53*605085a6SJohn Edward Broadbent         std::make_unique<IOCTLWrapperMock>();
54*605085a6SJohn Edward Broadbent     IOCTLWrapperMock* mockPtr = mockIOCTL.get();
55*605085a6SJohn Edward Broadbent     estoraged::Sanitize emptySanitize("", std::move(mockIOCTL));
56*605085a6SJohn Edward Broadbent     EXPECT_CALL(*mockPtr, doIoctlMulti(_, _, _)).WillRepeatedly(Return(-1));
57*605085a6SJohn Edward Broadbent     EXPECT_THROW(emptySanitize.doSanitize(4000000000), InternalFailure);
58*605085a6SJohn Edward Broadbent }
59*605085a6SJohn Edward Broadbent 
60*605085a6SJohn Edward Broadbent // mock ioctl returns 1, and emmcSanitize throws
TEST(Sanitize,Sanitize_emmcSanitize)61*605085a6SJohn Edward Broadbent TEST(Sanitize, Sanitize_emmcSanitize)
62*605085a6SJohn Edward Broadbent {
63*605085a6SJohn Edward Broadbent     std::unique_ptr<IOCTLWrapperMock> mockIOCTL =
64*605085a6SJohn Edward Broadbent         std::make_unique<IOCTLWrapperMock>();
65*605085a6SJohn Edward Broadbent     IOCTLWrapperMock* mockPtr = mockIOCTL.get();
66*605085a6SJohn Edward Broadbent     estoraged::Sanitize ioctlSanitize("/dev/null", std::move(mockIOCTL));
67*605085a6SJohn Edward Broadbent     EXPECT_CALL(*mockPtr, doIoctl(_, _, _)).WillRepeatedly(Return(1));
68*605085a6SJohn Edward Broadbent     EXPECT_CALL(*mockPtr, doIoctlMulti(_, _, _)).WillRepeatedly(Return(0));
69*605085a6SJohn Edward Broadbent     EXPECT_THROW(ioctlSanitize.doSanitize(4000000000), InternalFailure);
70*605085a6SJohn Edward Broadbent }
71*605085a6SJohn Edward Broadbent 
72*605085a6SJohn Edward Broadbent } // namespace estoraged_test
73