Index: net/quic/core/quic_stream_send_buffer_test.cc |
diff --git a/net/quic/core/quic_stream_send_buffer_test.cc b/net/quic/core/quic_stream_send_buffer_test.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a75b7119be6b638d5e1df56cdef8789159a94908 |
--- /dev/null |
+++ b/net/quic/core/quic_stream_send_buffer_test.cc |
@@ -0,0 +1,112 @@ |
+// Copyright (c) 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "net/quic/core/quic_stream_send_buffer.h" |
+ |
+#include "net/quic/core/quic_data_writer.h" |
+#include "net/quic/core/quic_simple_buffer_allocator.h" |
+#include "net/quic/core/quic_utils.h" |
+#include "net/quic/platform/api/quic_test.h" |
+#include "net/quic/test_tools/quic_test_utils.h" |
+ |
+namespace net { |
+namespace test { |
+namespace { |
+ |
+struct iovec MakeIovec(QuicStringPiece data) { |
+ struct iovec iov = {const_cast<char*>(data.data()), |
+ static_cast<size_t>(data.size())}; |
+ return iov; |
+} |
+ |
+class QuicStreamSendBufferTest : public QuicTest { |
+ public: |
+ QuicStreamSendBufferTest() : send_buffer_(&allocator_) { |
+ EXPECT_EQ(0u, send_buffer_.size()); |
+ std::string data1(1536, 'a'); |
+ std::string data2(256, 'b'); |
+ std::string data3(2048, 'c'); |
+ struct iovec iov[3]; |
+ iov[0] = MakeIovec(QuicStringPiece(data1)); |
+ iov[1] = MakeIovec(QuicStringPiece(data2)); |
+ iov[2] = MakeIovec(QuicStringPiece(data3)); |
+ QuicIOVector quic_iov(iov, 3, 3840); |
+ |
+ // Add all data. |
+ send_buffer_.SaveStreamData(quic_iov, /*iov_offset=*/0, /*offset=*/0, 1024); |
+ send_buffer_.SaveStreamData(quic_iov, /*iov_offset=*/1024, |
+ /*offset=*/1024, 1024); |
+ send_buffer_.SaveStreamData(quic_iov, /*iov_offset=*/2048, |
+ /*offset=*/2048, 1024); |
+ send_buffer_.SaveStreamData(quic_iov, /*iov_offset=*/3072, |
+ /*offset=*/3072, 768); |
+ EXPECT_EQ(4u, send_buffer_.size()); |
+ } |
+ |
+ QuicStreamSendBuffer send_buffer_; |
+ SimpleBufferAllocator allocator_; |
+}; |
+ |
+TEST_F(QuicStreamSendBufferTest, CopyDataToBuffer) { |
+ char buf[4000]; |
+ QuicDataWriter writer(4000, buf, Perspective::IS_CLIENT, HOST_BYTE_ORDER); |
+ std::string copy1(1024, 'a'); |
+ std::string copy2 = |
+ std::string(512, 'a') + std::string(256, 'b') + std::string(256, 'c'); |
+ std::string copy3(1024, 'c'); |
+ std::string copy4(768, 'c'); |
+ |
+ ASSERT_TRUE(send_buffer_.WriteStreamData(0, 1024, &writer)); |
+ EXPECT_EQ(copy1, QuicStringPiece(buf, 1024)); |
+ ASSERT_TRUE(send_buffer_.WriteStreamData(1024, 1024, &writer)); |
+ EXPECT_EQ(copy2, QuicStringPiece(buf + 1024, 1024)); |
+ ASSERT_TRUE(send_buffer_.WriteStreamData(2048, 1024, &writer)); |
+ EXPECT_EQ(copy3, QuicStringPiece(buf + 2048, 1024)); |
+ ASSERT_TRUE(send_buffer_.WriteStreamData(2048, 768, &writer)); |
+ EXPECT_EQ(copy4, QuicStringPiece(buf + 3072, 768)); |
+ |
+ // Test data piece across boundries. |
+ QuicDataWriter writer2(4000, buf, Perspective::IS_CLIENT, HOST_BYTE_ORDER); |
+ std::string copy5 = |
+ std::string(536, 'a') + std::string(256, 'b') + std::string(232, 'c'); |
+ ASSERT_TRUE(send_buffer_.WriteStreamData(1000, 1024, &writer2)); |
+ EXPECT_EQ(copy5, QuicStringPiece(buf, 1024)); |
+ ASSERT_TRUE(send_buffer_.WriteStreamData(2500, 1024, &writer2)); |
+ EXPECT_EQ(copy3, QuicStringPiece(buf + 1024, 1024)); |
+ |
+ // Invalid data copy. |
+ QuicDataWriter writer3(4000, buf, Perspective::IS_CLIENT, HOST_BYTE_ORDER); |
+ EXPECT_FALSE(send_buffer_.WriteStreamData(3000, 1024, &writer3)); |
+ EXPECT_FALSE(send_buffer_.WriteStreamData(0, 4000, &writer3)); |
+} |
+ |
+TEST_F(QuicStreamSendBufferTest, RemoveStreamFrame) { |
+ send_buffer_.RemoveStreamFrame(1024, 1024); |
+ EXPECT_EQ(4u, send_buffer_.size()); |
+ send_buffer_.RemoveStreamFrame(2048, 1024); |
+ EXPECT_EQ(4u, send_buffer_.size()); |
+ send_buffer_.RemoveStreamFrame(0, 1024); |
+ // Send buffer is cleaned up in order. |
+ EXPECT_EQ(1u, send_buffer_.size()); |
+ send_buffer_.RemoveStreamFrame(3072, 768); |
+ EXPECT_EQ(0u, send_buffer_.size()); |
+} |
+ |
+TEST_F(QuicStreamSendBufferTest, RemoveStreamFrameAcrossBoundries) { |
+ send_buffer_.RemoveStreamFrame(2024, 576); |
+ EXPECT_EQ(4u, send_buffer_.size()); |
+ send_buffer_.RemoveStreamFrame(0, 1000); |
+ EXPECT_EQ(4u, send_buffer_.size()); |
+ send_buffer_.RemoveStreamFrame(1000, 1024); |
+ // Send buffer is cleaned up in order. |
+ EXPECT_EQ(2u, send_buffer_.size()); |
+ send_buffer_.RemoveStreamFrame(2600, 1024); |
+ EXPECT_EQ(1u, send_buffer_.size()); |
+ send_buffer_.RemoveStreamFrame(3624, 216); |
+ EXPECT_EQ(0u, send_buffer_.size()); |
+} |
+ |
+} // namespace |
+} // namespace test |
+} // namespace net |