OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/quic_reliable_client_stream.h" | 5 #include "net/quic/quic_reliable_client_stream.h" |
6 | 6 |
7 #include "net/base/net_errors.h" | 7 #include "net/base/net_errors.h" |
8 #include "net/base/test_completion_callback.h" | 8 #include "net/base/test_completion_callback.h" |
9 #include "net/quic/quic_client_session.h" | 9 #include "net/quic/quic_client_session.h" |
10 #include "net/quic/quic_utils.h" | 10 #include "net/quic/quic_utils.h" |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 "JBCScs_ejbKaqBDoB7ZGxTvqlrB__2ZmnHHjCr8RgMRtKNtIeuZAo "; | 78 "JBCScs_ejbKaqBDoB7ZGxTvqlrB__2ZmnHHjCr8RgMRtKNtIeuZAo "; |
79 } | 79 } |
80 | 80 |
81 testing::StrictMock<MockDelegate> delegate_; | 81 testing::StrictMock<MockDelegate> delegate_; |
82 MockSession session_; | 82 MockSession session_; |
83 QuicReliableClientStream* stream_; | 83 QuicReliableClientStream* stream_; |
84 QuicCryptoClientConfig crypto_config_; | 84 QuicCryptoClientConfig crypto_config_; |
85 SpdyHeaderBlock headers_; | 85 SpdyHeaderBlock headers_; |
86 }; | 86 }; |
87 | 87 |
88 INSTANTIATE_TEST_CASE_P(Version, QuicReliableClientStreamTest, | 88 INSTANTIATE_TEST_CASE_P(Version, |
| 89 QuicReliableClientStreamTest, |
89 ::testing::ValuesIn(QuicSupportedVersions())); | 90 ::testing::ValuesIn(QuicSupportedVersions())); |
90 | 91 |
91 TEST_P(QuicReliableClientStreamTest, OnFinRead) { | 92 TEST_P(QuicReliableClientStreamTest, OnFinRead) { |
92 InitializeHeaders(); | 93 InitializeHeaders(); |
93 string uncompressed_headers = | 94 string uncompressed_headers = |
94 SpdyUtils::SerializeUncompressedHeaders(headers_); | 95 SpdyUtils::SerializeUncompressedHeaders(headers_); |
95 EXPECT_CALL(delegate_, OnDataReceived(StrEq(uncompressed_headers.data()), | 96 EXPECT_CALL(delegate_, |
96 uncompressed_headers.size())); | 97 OnDataReceived(StrEq(uncompressed_headers.data()), |
| 98 uncompressed_headers.size())); |
97 QuicStreamOffset offset = 0; | 99 QuicStreamOffset offset = 0; |
98 stream_->OnStreamHeaders(uncompressed_headers); | 100 stream_->OnStreamHeaders(uncompressed_headers); |
99 stream_->OnStreamHeadersComplete(false, uncompressed_headers.length()); | 101 stream_->OnStreamHeadersComplete(false, uncompressed_headers.length()); |
100 | 102 |
101 IOVector iov; | 103 IOVector iov; |
102 QuicStreamFrame frame2(kStreamId, true, offset, iov); | 104 QuicStreamFrame frame2(kStreamId, true, offset, iov); |
103 EXPECT_CALL(delegate_, OnClose(QUIC_NO_ERROR)); | 105 EXPECT_CALL(delegate_, OnClose(QUIC_NO_ERROR)); |
104 stream_->OnStreamFrame(frame2); | 106 stream_->OnStreamFrame(frame2); |
105 } | 107 } |
106 | 108 |
107 TEST_P(QuicReliableClientStreamTest, ProcessData) { | 109 TEST_P(QuicReliableClientStreamTest, ProcessData) { |
108 const char data[] = "hello world!"; | 110 const char data[] = "hello world!"; |
109 EXPECT_CALL(delegate_, OnDataReceived(StrEq(data), arraysize(data))); | 111 EXPECT_CALL(delegate_, OnDataReceived(StrEq(data), arraysize(data))); |
110 EXPECT_CALL(delegate_, OnClose(QUIC_NO_ERROR)); | 112 EXPECT_CALL(delegate_, OnClose(QUIC_NO_ERROR)); |
111 | 113 |
112 EXPECT_EQ(arraysize(data), stream_->ProcessData(data, arraysize(data))); | 114 EXPECT_EQ(arraysize(data), stream_->ProcessData(data, arraysize(data))); |
113 } | 115 } |
114 | 116 |
115 TEST_P(QuicReliableClientStreamTest, ProcessDataWithError) { | 117 TEST_P(QuicReliableClientStreamTest, ProcessDataWithError) { |
116 const char data[] = "hello world!"; | 118 const char data[] = "hello world!"; |
117 EXPECT_CALL(delegate_, | 119 EXPECT_CALL(delegate_, OnDataReceived(StrEq(data), arraysize(data))) |
118 OnDataReceived(StrEq(data), | 120 .WillOnce(Return(ERR_UNEXPECTED)); |
119 arraysize(data))).WillOnce(Return(ERR_UNEXPECTED)); | |
120 EXPECT_CALL(delegate_, OnClose(QUIC_NO_ERROR)); | 121 EXPECT_CALL(delegate_, OnClose(QUIC_NO_ERROR)); |
121 | 122 |
122 | |
123 EXPECT_EQ(0u, stream_->ProcessData(data, arraysize(data))); | 123 EXPECT_EQ(0u, stream_->ProcessData(data, arraysize(data))); |
124 } | 124 } |
125 | 125 |
126 TEST_P(QuicReliableClientStreamTest, OnError) { | 126 TEST_P(QuicReliableClientStreamTest, OnError) { |
127 EXPECT_CALL(delegate_, OnError(ERR_INTERNET_DISCONNECTED)); | 127 EXPECT_CALL(delegate_, OnError(ERR_INTERNET_DISCONNECTED)); |
128 | 128 |
129 stream_->OnError(ERR_INTERNET_DISCONNECTED); | 129 stream_->OnError(ERR_INTERNET_DISCONNECTED); |
130 EXPECT_FALSE(stream_->GetDelegate()); | 130 EXPECT_FALSE(stream_->GetDelegate()); |
131 } | 131 } |
132 | 132 |
133 TEST_P(QuicReliableClientStreamTest, WriteStreamData) { | 133 TEST_P(QuicReliableClientStreamTest, WriteStreamData) { |
134 EXPECT_CALL(delegate_, OnClose(QUIC_NO_ERROR)); | 134 EXPECT_CALL(delegate_, OnClose(QUIC_NO_ERROR)); |
135 | 135 |
136 const char kData1[] = "hello world"; | 136 const char kData1[] = "hello world"; |
137 const size_t kDataLen = arraysize(kData1); | 137 const size_t kDataLen = arraysize(kData1); |
138 | 138 |
139 // All data written. | 139 // All data written. |
140 EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, _)).WillOnce( | 140 EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, _)) |
141 Return(QuicConsumedData(kDataLen, true))); | 141 .WillOnce(Return(QuicConsumedData(kDataLen, true))); |
142 TestCompletionCallback callback; | 142 TestCompletionCallback callback; |
143 EXPECT_EQ(OK, stream_->WriteStreamData(base::StringPiece(kData1, kDataLen), | 143 EXPECT_EQ( |
144 true, callback.callback())); | 144 OK, |
| 145 stream_->WriteStreamData( |
| 146 base::StringPiece(kData1, kDataLen), true, callback.callback())); |
145 } | 147 } |
146 | 148 |
147 TEST_P(QuicReliableClientStreamTest, WriteStreamDataAsync) { | 149 TEST_P(QuicReliableClientStreamTest, WriteStreamDataAsync) { |
148 EXPECT_CALL(delegate_, HasSendHeadersComplete()).Times(AnyNumber()); | 150 EXPECT_CALL(delegate_, HasSendHeadersComplete()).Times(AnyNumber()); |
149 EXPECT_CALL(delegate_, OnClose(QUIC_NO_ERROR)); | 151 EXPECT_CALL(delegate_, OnClose(QUIC_NO_ERROR)); |
150 | 152 |
151 const char kData1[] = "hello world"; | 153 const char kData1[] = "hello world"; |
152 const size_t kDataLen = arraysize(kData1); | 154 const size_t kDataLen = arraysize(kData1); |
153 | 155 |
154 // No data written. | 156 // No data written. |
155 EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, _)).WillOnce( | 157 EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, _)) |
156 Return(QuicConsumedData(0, false))); | 158 .WillOnce(Return(QuicConsumedData(0, false))); |
157 TestCompletionCallback callback; | 159 TestCompletionCallback callback; |
158 EXPECT_EQ(ERR_IO_PENDING, | 160 EXPECT_EQ( |
159 stream_->WriteStreamData(base::StringPiece(kData1, kDataLen), | 161 ERR_IO_PENDING, |
160 true, callback.callback())); | 162 stream_->WriteStreamData( |
| 163 base::StringPiece(kData1, kDataLen), true, callback.callback())); |
161 ASSERT_FALSE(callback.have_result()); | 164 ASSERT_FALSE(callback.have_result()); |
162 | 165 |
163 // All data written. | 166 // All data written. |
164 EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, _)).WillOnce( | 167 EXPECT_CALL(session_, WritevData(stream_->id(), _, _, _, _)) |
165 Return(QuicConsumedData(kDataLen, true))); | 168 .WillOnce(Return(QuicConsumedData(kDataLen, true))); |
166 stream_->OnCanWrite(); | 169 stream_->OnCanWrite(); |
167 ASSERT_TRUE(callback.have_result()); | 170 ASSERT_TRUE(callback.have_result()); |
168 EXPECT_EQ(OK, callback.WaitForResult()); | 171 EXPECT_EQ(OK, callback.WaitForResult()); |
169 } | 172 } |
170 | 173 |
171 } // namespace | 174 } // namespace |
172 } // namespace test | 175 } // namespace test |
173 } // namespace net | 176 } // namespace net |
OLD | NEW |