blob: 0f0d770ecc56c42ef7babedf32c03ac4292fd230 [file] [log] [blame]
vasilvv312e3a52019-10-18 15:06:14 -07001// Copyright (c) 2019 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/third_party/quiche/src/quic/quic_transport/quic_transport_stream.h"
vasilvvd88f1622019-11-04 13:50:53 -08006
vasilvv312e3a52019-10-18 15:06:14 -07007#include <memory>
8
9#include "net/third_party/quiche/src/quic/core/frames/quic_window_update_frame.h"
10#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
11#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
12#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
13#include "net/third_party/quiche/src/quic/quic_transport/quic_transport_session_interface.h"
14#include "net/third_party/quiche/src/quic/test_tools/quic_config_peer.h"
15#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
vasilvvd88f1622019-11-04 13:50:53 -080016#include "net/third_party/quiche/src/quic/test_tools/quic_transport_test_tools.h"
dmcardle1ec11192019-12-12 10:36:42 -080017#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"
vasilvv312e3a52019-10-18 15:06:14 -070018
19namespace quic {
20namespace test {
21namespace {
22
vasilvv54deda72020-01-07 11:19:36 -080023using testing::_;
vasilvv312e3a52019-10-18 15:06:14 -070024using testing::Return;
25
26ParsedQuicVersionVector GetVersions() {
vasilvv7e5e6092020-03-02 15:52:33 -080027 return {DefaultVersionForQuicTransport()};
vasilvv312e3a52019-10-18 15:06:14 -070028}
29
30class MockQuicTransportSessionInterface : public QuicTransportSessionInterface {
31 public:
wub713afae2020-04-27 07:48:31 -070032 MOCK_METHOD(bool, IsSessionReady, (), (const, override));
vasilvv312e3a52019-10-18 15:06:14 -070033};
34
vasilvv312e3a52019-10-18 15:06:14 -070035class QuicTransportStreamTest : public QuicTest {
36 public:
37 QuicTransportStreamTest()
38 : connection_(new MockQuicConnection(&helper_,
39 &alarm_factory_,
40 Perspective::IS_CLIENT,
41 GetVersions())),
42 session_(connection_) {
vasilvv7e5e6092020-03-02 15:52:33 -080043 QuicEnableVersion(DefaultVersionForQuicTransport());
vasilvv312e3a52019-10-18 15:06:14 -070044 session_.Initialize();
45
46 stream_ = new QuicTransportStream(0, &session_, &interface_);
47 session_.ActivateStream(QuicWrapUnique(stream_));
vasilvvd88f1622019-11-04 13:50:53 -080048
49 auto visitor = std::make_unique<MockStreamVisitor>();
50 visitor_ = visitor.get();
51 stream_->set_visitor(std::move(visitor));
vasilvv312e3a52019-10-18 15:06:14 -070052 }
53
dmcardle1ec11192019-12-12 10:36:42 -080054 void ReceiveStreamData(quiche::QuicheStringPiece data,
55 QuicStreamOffset offset) {
vasilvv312e3a52019-10-18 15:06:14 -070056 QuicStreamFrame frame(0, false, offset, data);
57 stream_->OnStreamFrame(frame);
58 }
59
60 protected:
61 MockAlarmFactory alarm_factory_;
62 MockQuicConnectionHelper helper_;
63
64 MockQuicConnection* connection_; // Owned by |session_|.
65 MockQuicSession session_;
66 MockQuicTransportSessionInterface interface_;
vasilvv312e3a52019-10-18 15:06:14 -070067 QuicTransportStream* stream_; // Owned by |session_|.
vasilvvd88f1622019-11-04 13:50:53 -080068 MockStreamVisitor* visitor_; // Owned by |stream_|.
vasilvv312e3a52019-10-18 15:06:14 -070069};
70
71TEST_F(QuicTransportStreamTest, NotReady) {
72 EXPECT_CALL(interface_, IsSessionReady()).WillRepeatedly(Return(false));
73 ReceiveStreamData("test", 0);
74 EXPECT_EQ(stream_->ReadableBytes(), 0u);
75 EXPECT_FALSE(stream_->CanWrite());
76}
77
78TEST_F(QuicTransportStreamTest, ReadWhenNotReady) {
79 EXPECT_CALL(interface_, IsSessionReady()).WillRepeatedly(Return(false));
80 ReceiveStreamData("test", 0);
81 char buffer[4];
82 QuicByteCount bytes_read = stream_->Read(buffer, sizeof(buffer));
83 EXPECT_EQ(bytes_read, 0u);
84}
85
86TEST_F(QuicTransportStreamTest, WriteWhenNotReady) {
87 EXPECT_CALL(interface_, IsSessionReady()).WillRepeatedly(Return(false));
88 EXPECT_FALSE(stream_->Write("test"));
89}
90
91TEST_F(QuicTransportStreamTest, Ready) {
92 EXPECT_CALL(interface_, IsSessionReady()).WillRepeatedly(Return(true));
93 ReceiveStreamData("test", 0);
94 EXPECT_EQ(stream_->ReadableBytes(), 4u);
95 EXPECT_TRUE(stream_->CanWrite());
96 EXPECT_TRUE(stream_->Write("test"));
97}
98
99TEST_F(QuicTransportStreamTest, ReceiveData) {
100 EXPECT_CALL(interface_, IsSessionReady()).WillRepeatedly(Return(true));
vasilvvd88f1622019-11-04 13:50:53 -0800101 EXPECT_CALL(*visitor_, OnCanRead());
vasilvv312e3a52019-10-18 15:06:14 -0700102 ReceiveStreamData("test", 0);
103}
104
vasilvvd88f1622019-11-04 13:50:53 -0800105TEST_F(QuicTransportStreamTest, FinReadWithNoDataPending) {
106 EXPECT_CALL(interface_, IsSessionReady()).WillRepeatedly(Return(true));
107 EXPECT_CALL(*visitor_, OnFinRead());
108 QuicStreamFrame frame(0, true, 0, "");
109 stream_->OnStreamFrame(frame);
110}
111
112TEST_F(QuicTransportStreamTest, FinReadWithDataPending) {
113 EXPECT_CALL(interface_, IsSessionReady()).WillRepeatedly(Return(true));
114
115 EXPECT_CALL(*visitor_, OnCanRead());
116 EXPECT_CALL(*visitor_, OnFinRead()).Times(0);
117 QuicStreamFrame frame(0, true, 0, "test");
118 stream_->OnStreamFrame(frame);
119
120 EXPECT_CALL(*visitor_, OnFinRead()).Times(1);
121 std::string buffer;
122 ASSERT_EQ(stream_->Read(&buffer), 4u);
123}
124
vasilvv4e6ab332020-01-07 07:54:07 -0800125TEST_F(QuicTransportStreamTest, WritingTooMuchData) {
126 EXPECT_CALL(interface_, IsSessionReady()).WillRepeatedly(Return(true));
127 ASSERT_TRUE(stream_->CanWrite());
128
129 std::string a_little_bit_of_data(128, 'A');
130 std::string a_lot_of_data(GetQuicFlag(FLAGS_quic_buffered_data_threshold) * 2,
131 'a');
132
133 EXPECT_TRUE(stream_->Write(a_little_bit_of_data));
134 EXPECT_TRUE(stream_->Write(a_little_bit_of_data));
135 EXPECT_TRUE(stream_->Write(a_little_bit_of_data));
136
137 EXPECT_TRUE(stream_->Write(a_lot_of_data));
138 EXPECT_FALSE(stream_->Write(a_lot_of_data));
139}
140
vasilvv54deda72020-01-07 11:19:36 -0800141TEST_F(QuicTransportStreamTest, CannotSendFinTwice) {
142 EXPECT_CALL(interface_, IsSessionReady()).WillRepeatedly(Return(true));
143 ASSERT_TRUE(stream_->CanWrite());
144
renjietang41a1b412020-02-27 15:05:14 -0800145 EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, _, _))
vasilvv54deda72020-01-07 11:19:36 -0800146 .WillOnce(Return(QuicConsumedData(0, /*fin_consumed=*/true)));
147 EXPECT_TRUE(stream_->SendFin());
148 EXPECT_FALSE(stream_->CanWrite());
149}
150
vasilvv312e3a52019-10-18 15:06:14 -0700151} // namespace
152} // namespace test
153} // namespace quic