blob: 73e198b4830428890a05e9eb69310f14aea2b122 [file] [log] [blame]
Patrick Venturecd8dab42019-01-15 19:57:38 -08001#include "blob_mock.hpp"
2#include "manager.hpp"
3
Patrick Ventureef3aead2018-09-12 08:53:29 -07004#include <vector>
5
6#include <gtest/gtest.h>
7
8namespace blobs
9{
10
11using ::testing::_;
12using ::testing::Return;
13
14TEST(ManagerReadTest, ReadNoSessionReturnsFalse)
15{
16 // Calling Read on a session that doesn't exist should return false.
17
18 BlobManager mgr;
19 uint16_t sess = 1;
20 uint32_t ofs = 0x54;
21 uint32_t requested = 0x100;
22
23 std::vector<uint8_t> result = mgr.read(sess, ofs, requested);
24 EXPECT_EQ(0, result.size());
25}
26
27TEST(ManagerReadTest, ReadFromWriteOnlyFails)
28{
29 // The session manager will not route a Read call to a blob if the session
30 // was opened as write-only.
31
32 BlobManager mgr;
33 std::unique_ptr<BlobMock> m1 = std::make_unique<BlobMock>();
34 auto m1ptr = m1.get();
35 EXPECT_TRUE(mgr.registerHandler(std::move(m1)));
36
37 uint16_t sess = 1;
38 uint32_t ofs = 0x54;
39 uint32_t requested = 0x100;
40 uint16_t flags = OpenFlags::write;
41 std::string path = "/asdf/asdf";
42
43 EXPECT_CALL(*m1ptr, canHandleBlob(path)).WillOnce(Return(true));
44 EXPECT_CALL(*m1ptr, open(_, flags, path)).WillOnce(Return(true));
45 EXPECT_TRUE(mgr.open(flags, path, &sess));
46
47 std::vector<uint8_t> result = mgr.read(sess, ofs, requested);
48 EXPECT_EQ(0, result.size());
49}
50
51TEST(ManagerReadTest, ReadFromHandlerReturnsData)
52{
53 // There is no logic in this as it's just as a pass-thru command, however
54 // we want to verify this behavior doesn't change.
55
56 BlobManager mgr;
57 std::unique_ptr<BlobMock> m1 = std::make_unique<BlobMock>();
58 auto m1ptr = m1.get();
59 EXPECT_TRUE(mgr.registerHandler(std::move(m1)));
60
61 uint16_t sess = 1;
62 uint32_t ofs = 0x54;
Patrick Venture86c87f52019-02-01 14:44:15 -080063 uint32_t requested = 0x10;
Patrick Ventureef3aead2018-09-12 08:53:29 -070064 uint16_t flags = OpenFlags::read;
65 std::string path = "/asdf/asdf";
66 std::vector<uint8_t> data = {0x12, 0x14, 0x15, 0x16};
67
68 EXPECT_CALL(*m1ptr, canHandleBlob(path)).WillOnce(Return(true));
69 EXPECT_CALL(*m1ptr, open(_, flags, path)).WillOnce(Return(true));
70 EXPECT_TRUE(mgr.open(flags, path, &sess));
71
72 EXPECT_CALL(*m1ptr, read(sess, ofs, requested)).WillOnce(Return(data));
73
74 std::vector<uint8_t> result = mgr.read(sess, ofs, requested);
75 EXPECT_EQ(data.size(), result.size());
76 EXPECT_EQ(result, data);
77}
Patrick Venture86c87f52019-02-01 14:44:15 -080078
79TEST(ManagerReadTest, ReadTooManyBytesTruncates)
80{
81 // For now, the hard-coded maximum transfer size is 64 bytes on read
82 // commands, due to a hard-coded buffer in ipmid among other future
83 // challenges.
84
85 BlobManager mgr;
86 std::unique_ptr<BlobMock> m1 = std::make_unique<BlobMock>();
87 auto m1ptr = m1.get();
88 EXPECT_TRUE(mgr.registerHandler(std::move(m1)));
89
90 uint16_t sess = 1;
91 uint32_t ofs = 0x54;
92 uint32_t requested = 0x100;
93 uint16_t flags = OpenFlags::read;
94 std::string path = "/asdf/asdf";
95 std::vector<uint8_t> data = {0x12, 0x14, 0x15, 0x16};
96
97 EXPECT_CALL(*m1ptr, canHandleBlob(path)).WillOnce(Return(true));
98 EXPECT_CALL(*m1ptr, open(_, flags, path)).WillOnce(Return(true));
99 EXPECT_TRUE(mgr.open(flags, path, &sess));
100
101 EXPECT_CALL(*m1ptr, read(sess, ofs, maximumReadSize))
102 .WillOnce(Return(data));
103
104 std::vector<uint8_t> result = mgr.read(sess, ofs, requested);
105 EXPECT_EQ(data.size(), result.size());
106 EXPECT_EQ(result, data);
107}
108
Patrick Ventureef3aead2018-09-12 08:53:29 -0700109} // namespace blobs