1 #include "blob_mock.hpp"
2 #include "manager.hpp"
3
4 #include <string>
5
6 #include <gtest/gtest.h>
7
8 namespace blobs
9 {
10
11 using namespace std::chrono_literals;
12
13 using ::testing::_;
14 using ::testing::Return;
15
TEST(ManagerExpireTest,OpenWithLongTimeoutSucceeds)16 TEST(ManagerExpireTest, OpenWithLongTimeoutSucceeds)
17 {
18 // With a long timeout, open should succeed without calling expire.
19 BlobManager mgr(2min);
20 std::unique_ptr<BlobMock> m1 = std::make_unique<BlobMock>();
21 auto m1ptr = m1.get();
22 EXPECT_TRUE(mgr.registerHandler(std::move(m1)));
23
24 uint16_t flags = OpenFlags::read, sess;
25 std::string path = "/asdf/asdf";
26
27 EXPECT_CALL(*m1ptr, canHandleBlob(path)).WillOnce(Return(true));
28 EXPECT_CALL(*m1ptr, open(_, flags, path)).WillOnce(Return(true));
29 EXPECT_TRUE(mgr.open(flags, path, &sess));
30 // Do not expect the open session to expire
31 EXPECT_CALL(*m1ptr, expire(sess)).Times(0);
32 }
33
TEST(ManagerExpireTest,ZeroTimeoutWillCauseExpiration)34 TEST(ManagerExpireTest, ZeroTimeoutWillCauseExpiration)
35 {
36 // With timeout being zero, every open will cause all previous opened
37 // sessions to expire.
38 BlobManager mgr(0min);
39 std::unique_ptr<BlobMock> m1 = std::make_unique<BlobMock>();
40 auto m1ptr = m1.get();
41 EXPECT_TRUE(mgr.registerHandler(std::move(m1)));
42
43 uint16_t flags = OpenFlags::read, sess;
44 std::string path = "/asdf/asdf";
45 const int testIterations = 10;
46
47 EXPECT_CALL(*m1ptr, canHandleBlob(path)).WillRepeatedly(Return(true));
48 EXPECT_CALL(*m1ptr, open(_, flags, path)).WillRepeatedly(Return(true));
49 for (int i = 0; i < testIterations; ++i)
50 {
51 if (i != 0)
52 {
53 // Here 'sess' is the session ID obtained in previous loop
54 EXPECT_CALL(*m1ptr, expire(sess)).WillOnce(Return(true));
55 }
56 EXPECT_TRUE(mgr.open(flags, path, &sess));
57 }
58 }
59 } // namespace blobs
60