1 #include <blobs-ipmid/manager.hpp>
2 #include <blobs-ipmid/test/blob_mock.hpp>
3 #include <string>
4 
5 #include <gtest/gtest.h>
6 
7 namespace blobs
8 {
9 
10 using ::testing::_;
11 using ::testing::Return;
12 
13 TEST(ManagerOpenTest, OpenButNoHandler)
14 {
15     // No handler claims to be able to open the file.
16 
17     BlobManager mgr;
18     std::unique_ptr<BlobMock> m1 = std::make_unique<BlobMock>();
19     auto m1ptr = m1.get();
20     EXPECT_TRUE(mgr.registerHandler(std::move(m1)));
21 
22     uint16_t flags = OpenFlags::read, sess;
23     std::string path = "/asdf/asdf";
24 
25     EXPECT_CALL(*m1ptr, canHandleBlob(path)).WillOnce(Return(false));
26     EXPECT_FALSE(mgr.open(flags, path, &sess));
27 }
28 
29 TEST(ManagerOpenTest, OpenButHandlerFailsOpen)
30 {
31     // The handler is found but Open fails.
32 
33     BlobManager mgr;
34     std::unique_ptr<BlobMock> m1 = std::make_unique<BlobMock>();
35     auto m1ptr = m1.get();
36     EXPECT_TRUE(mgr.registerHandler(std::move(m1)));
37 
38     uint16_t flags = OpenFlags::read, sess;
39     std::string path = "/asdf/asdf";
40 
41     EXPECT_CALL(*m1ptr, canHandleBlob(path)).WillOnce(Return(true));
42     EXPECT_CALL(*m1ptr, open(_, flags, path)).WillOnce(Return(false));
43     EXPECT_FALSE(mgr.open(flags, path, &sess));
44 }
45 
46 TEST(ManagerOpenTest, OpenFailsMustSupplyAtLeastReadOrWriteFlag)
47 {
48     // One must supply either read or write in the flags for the session to
49     // open.
50 
51     BlobManager mgr;
52     std::unique_ptr<BlobMock> m1 = std::make_unique<BlobMock>();
53     auto m1ptr = m1.get();
54     EXPECT_TRUE(mgr.registerHandler(std::move(m1)));
55 
56     uint16_t flags = 0, sess;
57     std::string path = "/asdf/asdf";
58 
59     /* It checks if someone can handle the blob before it checks the flags. */
60     EXPECT_CALL(*m1ptr, canHandleBlob(path)).WillOnce(Return(true));
61 
62     EXPECT_FALSE(mgr.open(flags, path, &sess));
63 }
64 
65 TEST(ManagerOpenTest, OpenSucceeds)
66 {
67     // The handler is found and Open succeeds.
68 
69     BlobManager mgr;
70     std::unique_ptr<BlobMock> m1 = std::make_unique<BlobMock>();
71     auto m1ptr = m1.get();
72     EXPECT_TRUE(mgr.registerHandler(std::move(m1)));
73 
74     uint16_t flags = OpenFlags::read, sess;
75     std::string path = "/asdf/asdf";
76 
77     EXPECT_CALL(*m1ptr, canHandleBlob(path)).WillOnce(Return(true));
78     EXPECT_CALL(*m1ptr, open(_, flags, path)).WillOnce(Return(true));
79     EXPECT_TRUE(mgr.open(flags, path, &sess));
80 
81     // TODO(venture): Need a way to verify the session is associated with it,
82     // maybe just call Read() or SessionStat()
83 }
84 } // namespace blobs
85