blob: 397ce69e5283db9e302e33f8fdabe4ca830a1bcd [file] [log] [blame]
Kun Yic0adbc32018-12-18 22:35:29 -08001#include "handler_unittest.hpp"
2
Kun Yi64dc05c2018-12-19 13:19:03 -08003#include <cstdint>
4#include <memory>
5#include <string>
6#include <vector>
7
Kun Yic0adbc32018-12-18 22:35:29 -08008using ::testing::_;
Kun Yi6967b772019-02-22 13:48:12 -08009using ::testing::ElementsAre;
10using ::testing::IsEmpty;
Kun Yic0adbc32018-12-18 22:35:29 -080011using ::testing::Return;
Kun Yic0adbc32018-12-18 22:35:29 -080012
13using namespace std::string_literals;
14using namespace binstore;
15
16namespace blobs
17{
18
19class BinaryStoreBlobHandlerReadWriteTest : public BinaryStoreBlobHandlerTest
20{
21 protected:
Kun Yi6967b772019-02-22 13:48:12 -080022 BinaryStoreBlobHandlerReadWriteTest()
23 {
24 addDefaultStore(rwTestBaseId);
25 }
26
Kun Yic0adbc32018-12-18 22:35:29 -080027 static inline std::string rwTestBaseId = "/test/"s;
28 static inline std::string rwTestBlobId = "/test/blob0"s;
29 static inline std::vector<uint8_t> rwTestData = {0, 1, 2, 3, 4,
30 5, 6, 7, 8, 9};
Kun Yi6967b772019-02-22 13:48:12 -080031 static inline uint16_t rwTestROFlags = OpenFlags::read;
32 static inline uint16_t rwTestRWFlags = OpenFlags::read | OpenFlags::write;
Kun Yic0adbc32018-12-18 22:35:29 -080033 static inline uint16_t rwTestSessionId = 0;
34 static inline uint32_t rwTestOffset = 0;
Kun Yi6967b772019-02-22 13:48:12 -080035
36 void openAndWriteTestData()
37 {
38 EXPECT_TRUE(handler.open(rwTestSessionId, rwTestRWFlags, rwTestBlobId));
39 EXPECT_TRUE(handler.write(rwTestSessionId, rwTestOffset, rwTestData));
40 }
Kun Yic0adbc32018-12-18 22:35:29 -080041};
42
43TEST_F(BinaryStoreBlobHandlerReadWriteTest, ReadWriteReturnsWhatStoreReturns)
44{
Kun Yic0adbc32018-12-18 22:35:29 -080045 const std::vector<uint8_t> emptyData;
Kun Yi64dc05c2018-12-19 13:19:03 -080046 auto store = defaultMockStore(rwTestBaseId);
Kun Yic0adbc32018-12-18 22:35:29 -080047
Kun Yi6967b772019-02-22 13:48:12 -080048 EXPECT_CALL(*store, openOrCreateBlob(_, rwTestRWFlags))
49 .WillOnce(Return(true));
Kun Yi64dc05c2018-12-19 13:19:03 -080050 EXPECT_CALL(*store, read(rwTestOffset, _))
Kun Yic0adbc32018-12-18 22:35:29 -080051 .WillOnce(Return(emptyData))
52 .WillOnce(Return(rwTestData));
53
Kun Yi64dc05c2018-12-19 13:19:03 -080054 EXPECT_CALL(*store, write(rwTestOffset, emptyData)).WillOnce(Return(false));
55 EXPECT_CALL(*store, write(rwTestOffset, rwTestData)).WillOnce(Return(true));
Kun Yic0adbc32018-12-18 22:35:29 -080056
Kun Yi64dc05c2018-12-19 13:19:03 -080057 handler.addNewBinaryStore(std::move(store));
Kun Yic0adbc32018-12-18 22:35:29 -080058
Kun Yi6967b772019-02-22 13:48:12 -080059 EXPECT_TRUE(handler.open(rwTestSessionId, rwTestRWFlags, rwTestBlobId));
Kun Yic0adbc32018-12-18 22:35:29 -080060 EXPECT_EQ(emptyData, handler.read(rwTestSessionId, rwTestOffset, 1));
61 EXPECT_EQ(rwTestData, handler.read(rwTestSessionId, rwTestOffset, 1));
62 EXPECT_FALSE(handler.write(rwTestSessionId, rwTestOffset, emptyData));
63 EXPECT_TRUE(handler.write(rwTestSessionId, rwTestOffset, rwTestData));
64}
65
Kun Yi6967b772019-02-22 13:48:12 -080066TEST_F(BinaryStoreBlobHandlerReadWriteTest, WriteFailForWrongSession)
67{
68 uint16_t wrongSessionId = 1;
69 EXPECT_TRUE(handler.open(rwTestSessionId, rwTestRWFlags, rwTestBlobId));
70 EXPECT_FALSE(handler.write(wrongSessionId, rwTestOffset, rwTestData));
71}
72
73TEST_F(BinaryStoreBlobHandlerReadWriteTest, WriteFailForWrongFlag)
74{
75 EXPECT_TRUE(handler.open(rwTestSessionId, rwTestROFlags, rwTestBlobId));
76 EXPECT_FALSE(handler.write(rwTestSessionId, rwTestOffset, rwTestData));
77}
78
79TEST_F(BinaryStoreBlobHandlerReadWriteTest, ReadReturnEmptyForWrongSession)
80{
81 uint16_t wrongSessionId = 1;
82 EXPECT_TRUE(handler.open(rwTestSessionId, rwTestROFlags, rwTestBlobId));
83 EXPECT_THAT(handler.read(wrongSessionId, rwTestOffset, rwTestData.size()),
84 IsEmpty());
85}
86
87TEST_F(BinaryStoreBlobHandlerReadWriteTest, AbleToReadDataWritten)
88{
89 openAndWriteTestData();
90 EXPECT_EQ(rwTestData,
91 handler.read(rwTestSessionId, rwTestOffset, rwTestData.size()));
92}
93
94TEST_F(BinaryStoreBlobHandlerReadWriteTest, ReadBeyondEndReturnsEmpty)
95{
96 openAndWriteTestData();
97 const size_t offsetBeyondEnd = rwTestData.size();
98 EXPECT_THAT(
99 handler.read(rwTestSessionId, offsetBeyondEnd, rwTestData.size()),
100 IsEmpty());
101}
102
103TEST_F(BinaryStoreBlobHandlerReadWriteTest, ReadAtOffset)
104{
105 openAndWriteTestData();
106 EXPECT_EQ(rwTestData,
107 handler.read(rwTestSessionId, rwTestOffset, rwTestData.size()));
108
109 // Now read over the entire offset range for 1 byte
110 for (size_t i = 0; i < rwTestData.size(); ++i)
111 {
112 EXPECT_THAT(handler.read(rwTestSessionId, i, 1),
113 ElementsAre(rwTestData[i]));
114 }
115}
116
117TEST_F(BinaryStoreBlobHandlerReadWriteTest, PartialOverwriteDataWorks)
118{
119 // Construct a partially overwritten vector
120 const size_t overwritePos = 8;
121 std::vector<uint8_t> overwriteData = {8, 9, 10, 11, 12};
122 std::vector<uint8_t> expectedOverWrittenData(
123 rwTestData.begin(), rwTestData.begin() + overwritePos);
124 expectedOverWrittenData.insert(expectedOverWrittenData.end(),
125 overwriteData.begin(), overwriteData.end());
126
127 openAndWriteTestData();
128 EXPECT_EQ(rwTestData,
129 handler.read(rwTestSessionId, rwTestOffset, rwTestData.size()));
130 EXPECT_TRUE(handler.write(rwTestSessionId, overwritePos, overwriteData));
131
132 EXPECT_EQ(expectedOverWrittenData,
133 handler.read(rwTestSessionId, 0, expectedOverWrittenData.size()));
134
135 EXPECT_THAT(
136 handler.read(rwTestSessionId, expectedOverWrittenData.size(), 1),
137 IsEmpty());
138}
139
140TEST_F(BinaryStoreBlobHandlerReadWriteTest, WriteWithGapShouldFail)
141{
142 const auto gapOffset = 10;
143 EXPECT_TRUE(handler.open(rwTestSessionId, rwTestRWFlags, rwTestBlobId));
144 EXPECT_FALSE(handler.write(rwTestSessionId, gapOffset, rwTestData));
145}
146
Kun Yic0adbc32018-12-18 22:35:29 -0800147} // namespace blobs