|
21 | 21 | #include <istream> |
22 | 22 | #include <map> |
23 | 23 | #include <memory> |
| 24 | +#include <sstream> |
24 | 25 | #include <streambuf> |
25 | 26 | #include <string> |
26 | 27 | #include <utility> |
@@ -218,17 +219,20 @@ TEST(StreamSerializationTest, SequentialDeserializeFromSingleStream) { |
218 | 219 | auto first = fory.deserialize<int32_t>(stream); |
219 | 220 | ASSERT_TRUE(first.ok()) << first.error().to_string(); |
220 | 221 | EXPECT_EQ(first.value(), 12345); |
221 | | - EXPECT_EQ(stream.get_buffer().reader_index(), 0U); |
| 222 | + const uint32_t first_reader_index = stream.get_buffer().reader_index(); |
| 223 | + EXPECT_GT(first_reader_index, 0U); |
222 | 224 |
|
223 | 225 | auto second = fory.deserialize<std::string>(stream); |
224 | 226 | ASSERT_TRUE(second.ok()) << second.error().to_string(); |
225 | 227 | EXPECT_EQ(second.value(), "next-value"); |
226 | | - EXPECT_EQ(stream.get_buffer().reader_index(), 0U); |
| 228 | + const uint32_t second_reader_index = stream.get_buffer().reader_index(); |
| 229 | + EXPECT_GT(second_reader_index, first_reader_index); |
227 | 230 |
|
228 | 231 | auto third = fory.deserialize<StreamEnvelope>(stream); |
229 | 232 | ASSERT_TRUE(third.ok()) << third.error().to_string(); |
230 | 233 | EXPECT_EQ(third.value(), envelope); |
231 | | - EXPECT_EQ(stream.get_buffer().reader_index(), 0U); |
| 234 | + const uint32_t third_reader_index = stream.get_buffer().reader_index(); |
| 235 | + EXPECT_GT(third_reader_index, second_reader_index); |
232 | 236 |
|
233 | 237 | EXPECT_EQ(stream.get_buffer().remaining_size(), 0U); |
234 | 238 | } |
@@ -310,6 +314,49 @@ TEST(StreamSerializationTest, SerializeToOStreamOverloadParity) { |
310 | 314 | EXPECT_EQ(out.data(), expected.value()); |
311 | 315 | } |
312 | 316 |
|
| 317 | +TEST(StreamSerializationTest, |
| 318 | + StructDeserializeFromStreamBackedBufferShrinksAfterEachStruct) { |
| 319 | + auto fory = Fory::builder().xlang(true).track_ref(true).build(); |
| 320 | + register_stream_types(fory); |
| 321 | + |
| 322 | + std::vector<int32_t> first_values; |
| 323 | + std::vector<int32_t> second_values; |
| 324 | + first_values.reserve(6000); |
| 325 | + second_values.reserve(6000); |
| 326 | + for (int32_t i = 0; i < 6000; ++i) { |
| 327 | + first_values.push_back(i); |
| 328 | + second_values.push_back(6000 - i); |
| 329 | + } |
| 330 | + |
| 331 | + StreamEnvelope first{ |
| 332 | + "first", std::move(first_values), {{"a", 11}, {"b", 22}}, {7, 8}, true, |
| 333 | + }; |
| 334 | + StreamEnvelope second{ |
| 335 | + "second", std::move(second_values), {{"c", 33}, {"d", 44}}, {9, 10}, |
| 336 | + false, |
| 337 | + }; |
| 338 | + |
| 339 | + std::vector<uint8_t> bytes; |
| 340 | + ASSERT_TRUE(fory.serialize_to(bytes, first).ok()); |
| 341 | + ASSERT_TRUE(fory.serialize_to(bytes, second).ok()); |
| 342 | + |
| 343 | + std::string payload(reinterpret_cast<const char *>(bytes.data()), |
| 344 | + bytes.size()); |
| 345 | + std::istringstream source(payload); |
| 346 | + StdInputStream stream(source, 4096); |
| 347 | + Buffer &buffer = stream.get_buffer(); |
| 348 | + |
| 349 | + auto first_result = fory.deserialize<StreamEnvelope>(buffer); |
| 350 | + ASSERT_TRUE(first_result.ok()) << first_result.error().to_string(); |
| 351 | + EXPECT_EQ(first_result.value(), first); |
| 352 | + EXPECT_EQ(buffer.reader_index(), 0U); |
| 353 | + |
| 354 | + auto second_result = fory.deserialize<StreamEnvelope>(buffer); |
| 355 | + ASSERT_TRUE(second_result.ok()) << second_result.error().to_string(); |
| 356 | + EXPECT_EQ(second_result.value(), second); |
| 357 | + EXPECT_EQ(buffer.reader_index(), 0U); |
| 358 | +} |
| 359 | + |
313 | 360 | } // namespace test |
314 | 361 | } // namespace serialization |
315 | 362 | } // namespace fory |
0 commit comments