Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(789)

Side by Side Diff: webrtc/p2p/quic/reliablequicstream_unittest.cc

Issue 1648763002: Create QuicSession (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Improve unit tests Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright 2016 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include <string>
12 #include <vector>
13
14 #include "webrtc/p2p/quic/reliablequicstream.h"
15
16 #include "webrtc/base/buffer.h"
17 #include "webrtc/base/gunit.h"
18 #include "webrtc/p2p/quic/quicconnectionhelper.h"
19
20 #include "net/base/ip_address_number.h"
21 #include "net/quic/quic_connection.h"
22 #include "net/quic/quic_protocol.h"
23 #include "net/quic/quic_session.h"
24
25 #include "webrtc/base/sigslot.h"
26 #include "webrtc/base/stream.h"
27
28 using cricket::QuicConnectionHelper;
29 using cricket::ReliableQuicStream;
30
31 using net::FecProtection;
32 using net::IPAddressNumber;
33 using net::IPEndPoint;
34 using net::Perspective;
35 using net::QuicAckListenerInterface;
36 using net::QuicConfig;
37 using net::QuicConnection;
38 using net::QuicConsumedData;
39 using net::QuicCryptoStream;
40 using net::QuicErrorCode;
41 using net::QuicIOVector;
42 using net::QuicPacketWriter;
43 using net::QuicRstStreamErrorCode;
44 using net::QuicSession;
45 using net::QuicStreamId;
46 using net::QuicStreamOffset;
47 using net::SpdyPriority;
48
49 using rtc::SR_SUCCESS;
50 using rtc::SR_BLOCK;
51
52 // QuicSession that does not create streams and writes data from
53 // ReliableQuicStream to a string buffer.
54 class MockQuicSession : public QuicSession {
55 public:
56 MockQuicSession(QuicConnection* connection,
57 const QuicConfig& config,
58 rtc::Buffer* write_buffer)
59 : QuicSession(connection, config), write_buffer_(write_buffer) {}
60
61 ~MockQuicSession() override {}
62
63 // Writes outgoing data from ReliableQuicStream to a string buffer.
64 QuicConsumedData WritevData(
65 QuicStreamId id,
66 QuicIOVector iovector,
67 QuicStreamOffset offset,
68 bool fin,
69 FecProtection fec_protection,
70 QuicAckListenerInterface* ack_notifier_delegate) override {
71 if (!writable_) {
72 return QuicConsumedData(0, false);
73 }
74
75 const char* data = reinterpret_cast<const char*>(iovector.iov->iov_base);
76 size_t len = iovector.total_length;
77 write_buffer_->AppendData<char>(data, len);
78 return QuicConsumedData(len, false);
79 }
80
81 net::ReliableQuicStream* CreateIncomingDynamicStream(
82 QuicStreamId id) override {
83 return nullptr;
84 }
85
86 net::ReliableQuicStream* CreateOutgoingDynamicStream(
87 SpdyPriority priority) override {
88 return nullptr;
89 }
90
91 QuicCryptoStream* GetCryptoStream() override { return nullptr; }
92
93 // Called by ReliableQuicStream when they want to close stream.
94 void SendRstStream(QuicStreamId id,
95 QuicRstStreamErrorCode error,
96 QuicStreamOffset bytes_written) override {}
97
98 // Sets whether data is written to buffer, or else if this is write blocked.
99 void set_writable(bool writable) { writable_ = writable; }
100
101 // Tracks whether the stream is write blocked and its priority.
102 void register_write_blocked_stream(QuicStreamId stream_id,
103 SpdyPriority priority) {
104 write_blocked_streams()->RegisterStream(stream_id, priority);
105 }
106
107 private:
108 // Stores written data from ReliableQuicStream.
109 rtc::Buffer* write_buffer_;
110 // Whether data is written to write_buffer_
111 bool writable_ = true;
112 };
113
114 // Packet writer that does nothing. This is required for QuicConnection but
115 // isn't used for writing data.
116 class DummyPacketWriter : public QuicPacketWriter {
117 public:
118 DummyPacketWriter() {}
119 ~DummyPacketWriter() override {}
120
121 // QuicPacketWriter overrides.
122 virtual net::WriteResult WritePacket(const char* buffer,
123 size_t buf_len,
124 const IPAddressNumber& self_address,
125 const IPEndPoint& peer_address) {
126 return net::WriteResult(net::WRITE_STATUS_ERROR, 0);
127 }
128
129 bool IsWriteBlockedDataBuffered() const override { return false; }
130
131 bool IsWriteBlocked() const override { return false; };
132
133 void SetWritable() override {}
134
135 net::QuicByteCount GetMaxPacketSize(
136 const net::IPEndPoint& peer_address) const override {
137 return 0;
138 }
139 };
140
141 // QuicPacketWriter is not necessary, so this creates a packet writer that
142 // doesn't do anything.
143 class DummyPacketWriterFactory : public QuicConnection::PacketWriterFactory {
144 public:
145 DummyPacketWriterFactory() {}
146 ~DummyPacketWriterFactory() override {}
147
148 QuicPacketWriter* Create(QuicConnection* connection) const override {
149 return new DummyPacketWriter();
150 }
151 };
152
153 class ReliableQuicStreamTest : public ::testing::Test,
154 public sigslot::has_slots<> {
155 public:
156 ReliableQuicStreamTest() {}
157
158 ~ReliableQuicStreamTest() override {}
159
160 void CreateReliableQuicStream() {
161 const net::QuicStreamId kStreamId = 5;
162
163 // Arbitrary values for QuicConnection
164 QuicConnectionHelper* quic_helper =
165 new QuicConnectionHelper(rtc::Thread::Current());
166 Perspective perspective = Perspective::IS_SERVER;
167 net::IPAddressNumber ip(net::kIPv4AddressSize, 0);
168
169 bool owns_writer = false;
170
171 QuicConnection* connection = new QuicConnection(
172 0, IPEndPoint(ip, 0), quic_helper, DummyPacketWriterFactory(),
173 owns_writer, perspective, net::QuicSupportedVersions());
174
175 session_.reset(
176 new MockQuicSession(connection, QuicConfig(), &write_buffer_));
177 stream_.reset(new ReliableQuicStream(kStreamId, session_.get()));
178 stream_->SignalDataReceived.connect(
179 this, &ReliableQuicStreamTest::OnDataReceived);
180 stream_->SignalClosed.connect(this, &ReliableQuicStreamTest::OnClosed);
181
182 session_->register_write_blocked_stream(stream_->id(), stream_->Priority());
183 }
184
185 void OnDataReceived(QuicStreamId id, const char* data, size_t length) {
186 ASSERT_EQ(id, stream_->id());
187 read_buffer_.AppendData<char>(data, length);
188 }
189
190 void OnClosed(QuicStreamId id, QuicErrorCode err) { closed_ = true; }
191
192 // Check that buffer contents match the string.
193 void AssertBufferHas(const rtc::Buffer& buffer, const std::string& str) {
194 ASSERT_EQ(str.size(), buffer.size());
195 EXPECT_EQ(str, std::string(buffer.data<char>(), str.size()));
196 }
197
198 protected:
199 scoped_ptr<ReliableQuicStream> stream_;
200 scoped_ptr<MockQuicSession> session_;
201
202 // Data written by the ReliableQuicStream
203 rtc::Buffer write_buffer_;
204 // Data read by the ReliableQuicStream
205 rtc::Buffer read_buffer_;
206 // Whether the ReliableQuicStream is closed
207 bool closed_ = false;
208 };
209
210 // Write an entire string.
211 TEST_F(ReliableQuicStreamTest, WriteDataWhole) {
212 CreateReliableQuicStream();
213 EXPECT_EQ(SR_SUCCESS, stream_->Write("Foo bar", 7));
214
215 AssertBufferHas(write_buffer_, "Foo bar");
216 }
217
218 // Write part of a string
219 TEST_F(ReliableQuicStreamTest, WriteDataPartial) {
220 CreateReliableQuicStream();
221 EXPECT_EQ(SR_SUCCESS, stream_->Write("Hello, World!", 8));
222
223 AssertBufferHas(write_buffer_, "Hello, W");
224 }
225
226 // Test that strings are buffered correctly.
227 TEST_F(ReliableQuicStreamTest, BufferData) {
228 CreateReliableQuicStream();
229
230 session_->set_writable(false);
231 EXPECT_EQ(SR_BLOCK, stream_->Write("Foo bar", 7));
232
233 ASSERT_EQ(0ul, write_buffer_.size());
234 ASSERT_TRUE(stream_->HasBufferedData());
235
236 session_->set_writable(true);
237 stream_->OnCanWrite();
238
239 ASSERT_FALSE(stream_->HasBufferedData());
240 AssertBufferHas(write_buffer_, "Foo bar");
241
242 EXPECT_EQ(SR_SUCCESS, stream_->Write("xyzzy", 5));
243 AssertBufferHas(write_buffer_, "Foo barxyzzy");
244 }
245
246 // Read an entire string.
247 TEST_F(ReliableQuicStreamTest, ReadDataWhole) {
248 CreateReliableQuicStream();
249 net::QuicStreamFrame frame(-1, false, 0, "Hello, World!");
250 stream_->OnStreamFrame(frame);
251
252 AssertBufferHas(read_buffer_, "Hello, World!");
253 }
254
255 // Read part of a string.
256 TEST_F(ReliableQuicStreamTest, ReadDataPartial) {
257 CreateReliableQuicStream();
258 net::QuicStreamFrame frame(-1, false, 0, "Hello, World!");
259 frame.frame_length = 5;
260 stream_->OnStreamFrame(frame);
261
262 AssertBufferHas(read_buffer_, "Hello");
263 }
264
265 // Test that closing the stream results in a callback.
266 TEST_F(ReliableQuicStreamTest, CloseStream) {
267 CreateReliableQuicStream();
268 ASSERT_FALSE(closed_);
269 stream_->OnClose();
270 ASSERT_TRUE(closed_);
271 }
OLDNEW
« webrtc/p2p/quic/quicconnectionhelper.cc ('K') | « webrtc/p2p/quic/reliablequicstream.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698