1*fbe1b68cSJie Yang #include "handler_unittest.hpp"
2*fbe1b68cSJie Yang 
3*fbe1b68cSJie Yang #include <blobs-ipmid/blobs.hpp>
4*fbe1b68cSJie Yang 
5*fbe1b68cSJie Yang #include <cstdint>
6*fbe1b68cSJie Yang #include <vector>
7*fbe1b68cSJie Yang 
8*fbe1b68cSJie Yang #include <gmock/gmock.h>
9*fbe1b68cSJie Yang #include <gtest/gtest.h>
10*fbe1b68cSJie Yang 
11*fbe1b68cSJie Yang using ::testing::IsEmpty;
12*fbe1b68cSJie Yang 
13*fbe1b68cSJie Yang namespace blobs
14*fbe1b68cSJie Yang {
15*fbe1b68cSJie Yang 
16*fbe1b68cSJie Yang class SmbiosBlobHandlerReadWriteTest : public SmbiosBlobHandlerTest
17*fbe1b68cSJie Yang {};
18*fbe1b68cSJie Yang 
TEST_F(SmbiosBlobHandlerReadWriteTest,InvalidSessionWriteIsRejected)19*fbe1b68cSJie Yang TEST_F(SmbiosBlobHandlerReadWriteTest, InvalidSessionWriteIsRejected)
20*fbe1b68cSJie Yang {
21*fbe1b68cSJie Yang     // Verify the handler checks for a valid session.
22*fbe1b68cSJie Yang 
23*fbe1b68cSJie Yang     std::vector<uint8_t> data = {0x1, 0x2};
24*fbe1b68cSJie Yang     EXPECT_FALSE(handler.write(session, 0, data));
25*fbe1b68cSJie Yang }
26*fbe1b68cSJie Yang 
TEST_F(SmbiosBlobHandlerReadWriteTest,NoWriteFlagRejected)27*fbe1b68cSJie Yang TEST_F(SmbiosBlobHandlerReadWriteTest, NoWriteFlagRejected)
28*fbe1b68cSJie Yang {
29*fbe1b68cSJie Yang     // Verify the handler checks the write flag;
30*fbe1b68cSJie Yang 
31*fbe1b68cSJie Yang     EXPECT_TRUE(handler.open(session, 0, expectedBlobId));
32*fbe1b68cSJie Yang 
33*fbe1b68cSJie Yang     std::vector<uint8_t> data = {0x1, 0x2};
34*fbe1b68cSJie Yang     EXPECT_FALSE(handler.write(session, 0, data));
35*fbe1b68cSJie Yang }
36*fbe1b68cSJie Yang 
TEST_F(SmbiosBlobHandlerReadWriteTest,WritingTooMuchByOneByteFails)37*fbe1b68cSJie Yang TEST_F(SmbiosBlobHandlerReadWriteTest, WritingTooMuchByOneByteFails)
38*fbe1b68cSJie Yang {
39*fbe1b68cSJie Yang     int bytes = handlerMaxBufferSize + 1;
40*fbe1b68cSJie Yang     std::vector<uint8_t> data(bytes, 0x11);
41*fbe1b68cSJie Yang 
42*fbe1b68cSJie Yang     EXPECT_TRUE(handler.open(session, blobs::OpenFlags::write, expectedBlobId));
43*fbe1b68cSJie Yang     EXPECT_FALSE(handler.write(session, 0, data));
44*fbe1b68cSJie Yang }
45*fbe1b68cSJie Yang 
TEST_F(SmbiosBlobHandlerReadWriteTest,WritingTooMuchByOffsetOfOne)46*fbe1b68cSJie Yang TEST_F(SmbiosBlobHandlerReadWriteTest, WritingTooMuchByOffsetOfOne)
47*fbe1b68cSJie Yang {
48*fbe1b68cSJie Yang     std::vector<uint8_t> data(handlerMaxBufferSize, 0x11);
49*fbe1b68cSJie Yang 
50*fbe1b68cSJie Yang     EXPECT_TRUE(handler.open(session, blobs::OpenFlags::write, expectedBlobId));
51*fbe1b68cSJie Yang     EXPECT_FALSE(handler.write(session, 1, data));
52*fbe1b68cSJie Yang }
53*fbe1b68cSJie Yang 
TEST_F(SmbiosBlobHandlerReadWriteTest,WritingOneByteBeyondEndFromOffsetFails)54*fbe1b68cSJie Yang TEST_F(SmbiosBlobHandlerReadWriteTest, WritingOneByteBeyondEndFromOffsetFails)
55*fbe1b68cSJie Yang {
56*fbe1b68cSJie Yang     std::vector<uint8_t> data = {0x01, 0x02};
57*fbe1b68cSJie Yang 
58*fbe1b68cSJie Yang     EXPECT_TRUE(handler.open(session, blobs::OpenFlags::write, expectedBlobId));
59*fbe1b68cSJie Yang     EXPECT_FALSE(handler.write(session, handlerMaxBufferSize - 1, data));
60*fbe1b68cSJie Yang }
61*fbe1b68cSJie Yang 
TEST_F(SmbiosBlobHandlerReadWriteTest,WritingOneByteAtOffsetBeyondEndFails)62*fbe1b68cSJie Yang TEST_F(SmbiosBlobHandlerReadWriteTest, WritingOneByteAtOffsetBeyondEndFails)
63*fbe1b68cSJie Yang {
64*fbe1b68cSJie Yang     std::vector<uint8_t> data = {0x01};
65*fbe1b68cSJie Yang 
66*fbe1b68cSJie Yang     EXPECT_TRUE(handler.open(session, blobs::OpenFlags::write, expectedBlobId));
67*fbe1b68cSJie Yang     EXPECT_FALSE(handler.write(session, handlerMaxBufferSize, data));
68*fbe1b68cSJie Yang }
69*fbe1b68cSJie Yang 
TEST_F(SmbiosBlobHandlerReadWriteTest,WritingFullBufferAtOffsetZeroSucceeds)70*fbe1b68cSJie Yang TEST_F(SmbiosBlobHandlerReadWriteTest, WritingFullBufferAtOffsetZeroSucceeds)
71*fbe1b68cSJie Yang {
72*fbe1b68cSJie Yang     std::vector<uint8_t> data(handlerMaxBufferSize, 0x01);
73*fbe1b68cSJie Yang 
74*fbe1b68cSJie Yang     EXPECT_TRUE(handler.open(session, blobs::OpenFlags::write, expectedBlobId));
75*fbe1b68cSJie Yang     EXPECT_TRUE(handler.write(session, 0, data));
76*fbe1b68cSJie Yang }
77*fbe1b68cSJie Yang 
TEST_F(SmbiosBlobHandlerReadWriteTest,WritingOneByteToTheLastOffsetSucceeds)78*fbe1b68cSJie Yang TEST_F(SmbiosBlobHandlerReadWriteTest, WritingOneByteToTheLastOffsetSucceeds)
79*fbe1b68cSJie Yang {
80*fbe1b68cSJie Yang     std::vector<uint8_t> data = {0x01};
81*fbe1b68cSJie Yang 
82*fbe1b68cSJie Yang     EXPECT_TRUE(handler.open(session, blobs::OpenFlags::write, expectedBlobId));
83*fbe1b68cSJie Yang     EXPECT_TRUE(handler.write(session, handlerMaxBufferSize - 1, data));
84*fbe1b68cSJie Yang }
85*fbe1b68cSJie Yang 
TEST_F(SmbiosBlobHandlerReadWriteTest,ReadAlwaysReturnsEmpty)86*fbe1b68cSJie Yang TEST_F(SmbiosBlobHandlerReadWriteTest, ReadAlwaysReturnsEmpty)
87*fbe1b68cSJie Yang {
88*fbe1b68cSJie Yang     const uint32_t testOffset = 0;
89*fbe1b68cSJie Yang     const std::vector<uint8_t> testData = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
90*fbe1b68cSJie Yang 
91*fbe1b68cSJie Yang     EXPECT_TRUE(handler.open(session, blobs::OpenFlags::write, expectedBlobId));
92*fbe1b68cSJie Yang     EXPECT_TRUE(handler.write(session, testOffset, testData));
93*fbe1b68cSJie Yang 
94*fbe1b68cSJie Yang     EXPECT_THAT(handler.read(session, testOffset, testData.size()), IsEmpty());
95*fbe1b68cSJie Yang 
96*fbe1b68cSJie Yang     for (size_t i = 0; i < testData.size(); ++i)
97*fbe1b68cSJie Yang     {
98*fbe1b68cSJie Yang         EXPECT_THAT(handler.read(session, i, 1), IsEmpty());
99*fbe1b68cSJie Yang     }
100*fbe1b68cSJie Yang }
101*fbe1b68cSJie Yang 
102*fbe1b68cSJie Yang } // namespace blobs
103