blob: 846059d894d66dc0f838d3c9650d3b552175590a [file] [log] [blame]
John Edward Broadbent4bc8a102021-12-30 16:11:49 -08001#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
John Edward Broadbent69786762022-01-21 14:16:23 -080011#include <fstream>
John Edward Broadbent4bc8a102021-12-30 16:11:49 -080012#include <system_error>
13
14#include <gmock/gmock-matchers.h>
15#include <gmock/gmock.h>
16#include <gtest/gtest.h>
17
18using estoraged::Zero;
19using sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
John Edward Broadbent4bc8a102021-12-30 16:11:49 -080020
21namespace estoraged_test
22{
23
24TEST(Zeros, zeroPass)
25{
John Edward Broadbent69786762022-01-21 14:16:23 -080026 std::string testFileName = "testfile_pass";
27 std::ofstream testFile;
28
29 testFile.open(testFileName,
30 std::ios::out | std::ios::binary | std::ios::trunc);
31 testFile.close();
John Edward Broadbent4bc8a102021-12-30 16:11:49 -080032 uint64_t size = 4096;
John Edward Broadbent69786762022-01-21 14:16:23 -080033 Zero pass(testFileName);
34 EXPECT_NO_THROW(pass.writeZero(size));
35 EXPECT_NO_THROW(pass.verifyZero(size));
John Edward Broadbent4bc8a102021-12-30 16:11:49 -080036}
37
38/* This test that pattern writes the correct number of bytes even if
39 * size of the drive is not divisable by the block size
40 */
41TEST(Zeros, notDivisible)
42{
John Edward Broadbent69786762022-01-21 14:16:23 -080043 std::string testFileName = "testfile_notDivisible";
44 std::ofstream testFile;
45
46 testFile.open(testFileName,
47 std::ios::out | std::ios::binary | std::ios::trunc);
48 testFile.close();
49
John Edward Broadbent4bc8a102021-12-30 16:11:49 -080050 uint64_t size = 4097;
51 // 4097 is not divisible by the block size, and we expect no errors
John Edward Broadbent69786762022-01-21 14:16:23 -080052 Zero pass(testFileName);
53 EXPECT_NO_THROW(pass.writeZero(size));
54 EXPECT_NO_THROW(pass.verifyZero(size));
John Edward Broadbent4bc8a102021-12-30 16:11:49 -080055}
56
57TEST(Zeros, notZeroStart)
58{
John Edward Broadbent69786762022-01-21 14:16:23 -080059 std::string testFileName = "testfile_notZeroStart";
60 std::ofstream testFile;
61
62 // open the file and write none zero to it
Ed Tanous82897c32022-02-21 14:11:59 -080063 uint32_t dummyValue = 0x88776655;
John Edward Broadbent69786762022-01-21 14:16:23 -080064 testFile.open(testFileName, std::ios::binary | std::ios::out);
Ed Tanous82897c32022-02-21 14:11:59 -080065 testFile.write((reinterpret_cast<const char*>(&dummyValue)),
66 sizeof(dummyValue));
John Edward Broadbent69786762022-01-21 14:16:23 -080067 testFile.close();
John Edward Broadbent4bc8a102021-12-30 16:11:49 -080068 uint64_t size = 4096;
John Edward Broadbent69786762022-01-21 14:16:23 -080069 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);
John Edward Broadbent4bc8a102021-12-30 16:11:49 -080078}
79
80TEST(Zeros, notZeroEnd)
81{
John Edward Broadbent69786762022-01-21 14:16:23 -080082 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
John Edward Broadbent4bc8a102021-12-30 16:11:49 -080089 uint64_t size = 4096;
John Edward Broadbent69786762022-01-21 14:16:23 -080090 Zero pass(testFileName);
Ed Tanous82897c32022-02-21 14:11:59 -080091 uint32_t dummyValue = 88;
John Edward Broadbent69786762022-01-21 14:16:23 -080092 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);
John Edward Broadbent4bc8a102021-12-30 16:11:49 -0800100}
101
102} // namespace estoraged_test