OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "net/quic/core/quic_stream_send_buffer.h" |
| 6 |
| 7 #include "net/quic/core/quic_data_writer.h" |
| 8 #include "net/quic/core/quic_simple_buffer_allocator.h" |
| 9 #include "net/quic/core/quic_utils.h" |
| 10 #include "net/quic/platform/api/quic_test.h" |
| 11 #include "net/quic/test_tools/quic_test_utils.h" |
| 12 |
| 13 namespace net { |
| 14 namespace test { |
| 15 namespace { |
| 16 |
| 17 struct iovec MakeIovec(QuicStringPiece data) { |
| 18 struct iovec iov = {const_cast<char*>(data.data()), |
| 19 static_cast<size_t>(data.size())}; |
| 20 return iov; |
| 21 } |
| 22 |
| 23 class QuicStreamSendBufferTest : public QuicTest { |
| 24 public: |
| 25 QuicStreamSendBufferTest() : send_buffer_(&allocator_) { |
| 26 EXPECT_EQ(0u, send_buffer_.size()); |
| 27 std::string data1(1536, 'a'); |
| 28 std::string data2(256, 'b'); |
| 29 std::string data3(2048, 'c'); |
| 30 struct iovec iov[3]; |
| 31 iov[0] = MakeIovec(QuicStringPiece(data1)); |
| 32 iov[1] = MakeIovec(QuicStringPiece(data2)); |
| 33 iov[2] = MakeIovec(QuicStringPiece(data3)); |
| 34 QuicIOVector quic_iov(iov, 3, 3840); |
| 35 |
| 36 // Add all data. |
| 37 send_buffer_.SaveStreamData(quic_iov, /*iov_offset=*/0, /*offset=*/0, 1024); |
| 38 send_buffer_.SaveStreamData(quic_iov, /*iov_offset=*/1024, |
| 39 /*offset=*/1024, 1024); |
| 40 send_buffer_.SaveStreamData(quic_iov, /*iov_offset=*/2048, |
| 41 /*offset=*/2048, 1024); |
| 42 send_buffer_.SaveStreamData(quic_iov, /*iov_offset=*/3072, |
| 43 /*offset=*/3072, 768); |
| 44 EXPECT_EQ(4u, send_buffer_.size()); |
| 45 } |
| 46 |
| 47 QuicStreamSendBuffer send_buffer_; |
| 48 SimpleBufferAllocator allocator_; |
| 49 }; |
| 50 |
| 51 TEST_F(QuicStreamSendBufferTest, CopyDataToBuffer) { |
| 52 char buf[4000]; |
| 53 QuicDataWriter writer(4000, buf, Perspective::IS_CLIENT, HOST_BYTE_ORDER); |
| 54 std::string copy1(1024, 'a'); |
| 55 std::string copy2 = |
| 56 std::string(512, 'a') + std::string(256, 'b') + std::string(256, 'c'); |
| 57 std::string copy3(1024, 'c'); |
| 58 std::string copy4(768, 'c'); |
| 59 |
| 60 ASSERT_TRUE(send_buffer_.WriteStreamData(0, 1024, &writer)); |
| 61 EXPECT_EQ(copy1, QuicStringPiece(buf, 1024)); |
| 62 ASSERT_TRUE(send_buffer_.WriteStreamData(1024, 1024, &writer)); |
| 63 EXPECT_EQ(copy2, QuicStringPiece(buf + 1024, 1024)); |
| 64 ASSERT_TRUE(send_buffer_.WriteStreamData(2048, 1024, &writer)); |
| 65 EXPECT_EQ(copy3, QuicStringPiece(buf + 2048, 1024)); |
| 66 ASSERT_TRUE(send_buffer_.WriteStreamData(2048, 768, &writer)); |
| 67 EXPECT_EQ(copy4, QuicStringPiece(buf + 3072, 768)); |
| 68 |
| 69 // Test data piece across boundries. |
| 70 QuicDataWriter writer2(4000, buf, Perspective::IS_CLIENT, HOST_BYTE_ORDER); |
| 71 std::string copy5 = |
| 72 std::string(536, 'a') + std::string(256, 'b') + std::string(232, 'c'); |
| 73 ASSERT_TRUE(send_buffer_.WriteStreamData(1000, 1024, &writer2)); |
| 74 EXPECT_EQ(copy5, QuicStringPiece(buf, 1024)); |
| 75 ASSERT_TRUE(send_buffer_.WriteStreamData(2500, 1024, &writer2)); |
| 76 EXPECT_EQ(copy3, QuicStringPiece(buf + 1024, 1024)); |
| 77 |
| 78 // Invalid data copy. |
| 79 QuicDataWriter writer3(4000, buf, Perspective::IS_CLIENT, HOST_BYTE_ORDER); |
| 80 EXPECT_FALSE(send_buffer_.WriteStreamData(3000, 1024, &writer3)); |
| 81 EXPECT_FALSE(send_buffer_.WriteStreamData(0, 4000, &writer3)); |
| 82 } |
| 83 |
| 84 TEST_F(QuicStreamSendBufferTest, RemoveStreamFrame) { |
| 85 send_buffer_.RemoveStreamFrame(1024, 1024); |
| 86 EXPECT_EQ(4u, send_buffer_.size()); |
| 87 send_buffer_.RemoveStreamFrame(2048, 1024); |
| 88 EXPECT_EQ(4u, send_buffer_.size()); |
| 89 send_buffer_.RemoveStreamFrame(0, 1024); |
| 90 // Send buffer is cleaned up in order. |
| 91 EXPECT_EQ(1u, send_buffer_.size()); |
| 92 send_buffer_.RemoveStreamFrame(3072, 768); |
| 93 EXPECT_EQ(0u, send_buffer_.size()); |
| 94 } |
| 95 |
| 96 TEST_F(QuicStreamSendBufferTest, RemoveStreamFrameAcrossBoundries) { |
| 97 send_buffer_.RemoveStreamFrame(2024, 576); |
| 98 EXPECT_EQ(4u, send_buffer_.size()); |
| 99 send_buffer_.RemoveStreamFrame(0, 1000); |
| 100 EXPECT_EQ(4u, send_buffer_.size()); |
| 101 send_buffer_.RemoveStreamFrame(1000, 1024); |
| 102 // Send buffer is cleaned up in order. |
| 103 EXPECT_EQ(2u, send_buffer_.size()); |
| 104 send_buffer_.RemoveStreamFrame(2600, 1024); |
| 105 EXPECT_EQ(1u, send_buffer_.size()); |
| 106 send_buffer_.RemoveStreamFrame(3624, 216); |
| 107 EXPECT_EQ(0u, send_buffer_.size()); |
| 108 } |
| 109 |
| 110 } // namespace |
| 111 } // namespace test |
| 112 } // namespace net |
OLD | NEW |