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