@@ -69,6 +69,83 @@ TEST(ObjectDescriptor, Basic) {
6969 EXPECT_FALSE (token.valid ());
7070}
7171
72+ TEST (ObjectDescriptor, ReadFromOffset) {
73+ auto mock = std::make_shared<MockAsyncObjectDescriptorConnection>();
74+ EXPECT_CALL (*mock, metadata).WillOnce (Return (absl::nullopt ));
75+ EXPECT_CALL (*mock, Read)
76+ .WillOnce ([](ReadParams p) -> std::unique_ptr<AsyncReaderConnection> {
77+ EXPECT_EQ (p.start , 10 );
78+ EXPECT_EQ (p.limit , 0 );
79+ auto reader = std::make_unique<MockAsyncReaderConnection>();
80+ EXPECT_CALL (*reader, Read)
81+ .WillOnce ([] {
82+ auto response =
83+ std::string (" The quick brown fox jumps over the lazy dog" )
84+ .substr (10 );
85+ return make_ready_future (ReadResponse (ReadPayload (response)));
86+ })
87+ .WillOnce ([] { return make_ready_future (ReadResponse (Status{})); });
88+ return reader;
89+ });
90+
91+ auto tested = ObjectDescriptor (mock);
92+ EXPECT_FALSE (tested.metadata ().has_value ());
93+ AsyncReader reader;
94+ AsyncToken token;
95+ std::tie (reader, token) = tested.ReadFromOffset (10 );
96+ ASSERT_TRUE (token.valid ());
97+
98+ auto r1 = reader.Read (std::move (token)).get ();
99+ ASSERT_STATUS_OK (r1);
100+ ReadPayload payload;
101+ std::tie (payload, token) = *std::move (r1);
102+ EXPECT_THAT (payload.contents (),
103+ ElementsAre (" brown fox jumps over the lazy dog" ));
104+
105+ auto r2 = reader.Read (std::move (token)).get ();
106+ ASSERT_STATUS_OK (r2);
107+ std::tie (payload, token) = *std::move (r2);
108+ EXPECT_FALSE (token.valid ());
109+ }
110+
111+ TEST (ObjectDescriptor, ReadLast) {
112+ auto mock = std::make_shared<MockAsyncObjectDescriptorConnection>();
113+ EXPECT_CALL (*mock, metadata).WillOnce (Return (absl::nullopt ));
114+ EXPECT_CALL (*mock, Read)
115+ .WillOnce ([](ReadParams p) -> std::unique_ptr<AsyncReaderConnection> {
116+ EXPECT_EQ (p.start , -15 );
117+ EXPECT_EQ (p.limit , 0 );
118+ auto reader = std::make_unique<MockAsyncReaderConnection>();
119+ EXPECT_CALL (*reader, Read)
120+ .WillOnce ([] {
121+ std::string full_response (
122+ " The quick brown fox jumps over the lazy dog" );
123+ auto response = full_response.substr (full_response.size () - 15 );
124+ return make_ready_future (ReadResponse (ReadPayload (response)));
125+ })
126+ .WillOnce ([] { return make_ready_future (ReadResponse (Status{})); });
127+ return reader;
128+ });
129+
130+ auto tested = ObjectDescriptor (mock);
131+ EXPECT_FALSE (tested.metadata ().has_value ());
132+ AsyncReader reader;
133+ AsyncToken token;
134+ std::tie (reader, token) = tested.ReadLast (15 );
135+ ASSERT_TRUE (token.valid ());
136+
137+ auto r1 = reader.Read (std::move (token)).get ();
138+ ASSERT_STATUS_OK (r1);
139+ ReadPayload payload;
140+ std::tie (payload, token) = *std::move (r1);
141+ EXPECT_THAT (payload.contents (), ElementsAre (" er the lazy dog" ));
142+
143+ auto r2 = reader.Read (std::move (token)).get ();
144+ ASSERT_STATUS_OK (r2);
145+ std::tie (payload, token) = *std::move (r2);
146+ EXPECT_FALSE (token.valid ());
147+ }
148+
72149GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
73150} // namespace storage_experimental
74151} // namespace cloud
0 commit comments