blob: 253d02ce9ee10126fa287adf323586e8f935e108 [file] [log] [blame]
Kun Yi1a25e0d2020-05-11 12:28:53 -07001#include "handler_unittest.hpp"
2
3#include <gtest/gtest.h>
4
5using ::testing::_;
6using ::testing::ElementsAre;
7using ::testing::IsEmpty;
8using ::testing::Return;
9using ::testing::StartsWith;
10
11using namespace std::string_literals;
12
13namespace blobs
14{
15
16class BinaryStoreBlobHandlerStatTest : public BinaryStoreBlobHandlerTest
17{
18 protected:
19 BinaryStoreBlobHandlerStatTest()
20 {
21 addDefaultStore(statTestBaseId);
22 }
23
24 static inline std::string statTestBaseId = "/test/"s;
25 static inline std::string statTestBlobId = "/test/blob0"s;
26 static inline std::vector<uint8_t> statTestData = {0, 1, 2, 3};
27 static inline std::vector<uint8_t> statTestDataToOverwrite = {
28 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
29 static inline std::vector<uint8_t> commitMetaUnused;
30
31 static inline uint16_t statTestSessionId = 0;
32 static inline uint16_t statTestNewSessionId = 1;
33 static inline uint32_t statTestOffset = 0;
34
35 void openAndWriteTestData(
36 const std::vector<uint8_t>& testData = statTestData)
37 {
38 uint16_t flags = OpenFlags::read | OpenFlags::write;
39 EXPECT_TRUE(handler.open(statTestSessionId, flags, statTestBlobId));
40 EXPECT_TRUE(handler.write(statTestSessionId, statTestOffset, testData));
41 }
42
43 void commitData()
44 {
45 EXPECT_TRUE(handler.commit(statTestSessionId, commitMetaUnused));
46 }
47};
48
49TEST_F(BinaryStoreBlobHandlerStatTest, InitialStatIsValidQueriedWithBlobId)
50{
51 BlobMeta meta;
52
53 /* Querying stat fails if there is no open session */
54 EXPECT_FALSE(handler.stat(statTestSessionId, &meta));
55 /* However stat completes if queried using blobId. Returning default. */
56 EXPECT_TRUE(handler.stat(statTestBlobId, &meta));
57 EXPECT_EQ(meta.size, 0);
58};
59
60TEST_F(BinaryStoreBlobHandlerStatTest, StatShowsCommittedState)
61{
62 BlobMeta meta;
63 const int testIter = 2;
64
65 openAndWriteTestData();
66 for (int i = 0; i < testIter; ++i)
67 {
68 EXPECT_TRUE(handler.stat(statTestSessionId, &meta));
69 EXPECT_EQ(meta.size, statTestData.size());
70 EXPECT_TRUE(meta.blobState & OpenFlags::read);
71 EXPECT_TRUE(meta.blobState & OpenFlags::write);
72 EXPECT_FALSE(meta.blobState & StateFlags::committed);
73 EXPECT_TRUE(meta.blobState & BinaryStore::CommitState::Dirty);
74 }
75
76 commitData();
77 for (int i = 0; i < testIter; ++i)
78 {
79 EXPECT_TRUE(handler.stat(statTestSessionId, &meta));
80 EXPECT_EQ(meta.size, statTestData.size());
81 EXPECT_TRUE(meta.blobState & OpenFlags::read);
82 EXPECT_TRUE(meta.blobState & OpenFlags::write);
83 EXPECT_TRUE(meta.blobState & StateFlags::committed);
84 EXPECT_TRUE(meta.blobState & BinaryStore::CommitState::Clean);
85 }
86}
87
88TEST_F(BinaryStoreBlobHandlerStatTest, StatChangedWhenOverwriting)
89{
90 BlobMeta meta;
91 const int testIter = 2;
92
93 openAndWriteTestData();
94 commitData();
95 // Overwrite with different data.
96 EXPECT_TRUE(handler.write(statTestSessionId, statTestOffset,
97 statTestDataToOverwrite));
98 for (int i = 0; i < testIter; ++i)
99 {
100 EXPECT_TRUE(handler.stat(statTestSessionId, &meta));
101 EXPECT_EQ(meta.size, statTestDataToOverwrite.size());
102 EXPECT_TRUE(meta.blobState & OpenFlags::read);
103 EXPECT_TRUE(meta.blobState & OpenFlags::write);
104 EXPECT_FALSE(meta.blobState & StateFlags::committed);
105 EXPECT_TRUE(meta.blobState & BinaryStore::CommitState::Dirty);
106 }
107
108 commitData();
109 for (int i = 0; i < testIter; ++i)
110 {
111 EXPECT_TRUE(handler.stat(statTestSessionId, &meta));
112 EXPECT_EQ(meta.size, statTestDataToOverwrite.size());
113 EXPECT_TRUE(meta.blobState & OpenFlags::read);
114 EXPECT_TRUE(meta.blobState & OpenFlags::write);
115 EXPECT_TRUE(meta.blobState & StateFlags::committed);
116 EXPECT_TRUE(meta.blobState & BinaryStore::CommitState::Clean);
117 }
118}
119
120} // namespace blobs