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

Side by Side Diff: net/quic/core/quic_packet_creator_test.cc

Issue 2963763003: In QUIC, send data is copied to streams rather than frames. Protected by FLAGS_quic_reloadable_flag… (Closed)
Patch Set: Rebase Created 3 years, 5 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
« no previous file with comments | « net/quic/core/quic_packet_creator.cc ('k') | net/quic/core/quic_packet_generator.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/core/quic_packet_creator.h" 5 #include "net/quic/core/quic_packet_creator.h"
6 6
7 #include <cstdint> 7 #include <cstdint>
8 #include <memory> 8 #include <memory>
9 #include <ostream> 9 #include <ostream>
10 #include <string> 10 #include <string>
11 11
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "net/quic/core/crypto/null_encrypter.h" 13 #include "net/quic/core/crypto/null_encrypter.h"
14 #include "net/quic/core/crypto/quic_decrypter.h" 14 #include "net/quic/core/crypto/quic_decrypter.h"
15 #include "net/quic/core/crypto/quic_encrypter.h" 15 #include "net/quic/core/crypto/quic_encrypter.h"
16 #include "net/quic/core/quic_data_writer.h"
16 #include "net/quic/core/quic_pending_retransmission.h" 17 #include "net/quic/core/quic_pending_retransmission.h"
17 #include "net/quic/core/quic_simple_buffer_allocator.h" 18 #include "net/quic/core/quic_simple_buffer_allocator.h"
18 #include "net/quic/core/quic_utils.h" 19 #include "net/quic/core/quic_utils.h"
19 #include "net/quic/platform/api/quic_socket_address.h" 20 #include "net/quic/platform/api/quic_socket_address.h"
20 #include "net/quic/platform/api/quic_string_piece.h" 21 #include "net/quic/platform/api/quic_string_piece.h"
21 #include "net/quic/platform/api/quic_test.h" 22 #include "net/quic/platform/api/quic_test.h"
22 #include "net/quic/test_tools/quic_framer_peer.h" 23 #include "net/quic/test_tools/quic_framer_peer.h"
23 #include "net/quic/test_tools/quic_packet_creator_peer.h" 24 #include "net/quic/test_tools/quic_packet_creator_peer.h"
24 #include "net/quic/test_tools/quic_test_utils.h" 25 #include "net/quic/test_tools/quic_test_utils.h"
26 #include "net/quic/test_tools/simple_data_producer.h"
25 27
26 using std::string; 28 using std::string;
27 using testing::DoAll; 29 using testing::DoAll;
28 using testing::InSequence; 30 using testing::InSequence;
29 using testing::Return; 31 using testing::Return;
30 using testing::SaveArg; 32 using testing::SaveArg;
31 using testing::StrictMock; 33 using testing::StrictMock;
32 using testing::_; 34 using testing::_;
33 35
34 namespace net { 36 namespace net {
35 namespace test { 37 namespace test {
36 namespace { 38 namespace {
37 39
38 const QuicStreamId kGetNthClientInitiatedStreamId1 = kHeadersStreamId + 2; 40 const QuicStreamId kGetNthClientInitiatedStreamId1 = kHeadersStreamId + 2;
39 41
40 // Run tests with combinations of {QuicVersion, ToggleVersionSerialization}. 42 // Run tests with combinations of {QuicVersion, ToggleVersionSerialization}.
41 struct TestParams { 43 struct TestParams {
42 TestParams(QuicVersion version, 44 TestParams(QuicVersion version,
43 bool version_serialization, 45 bool version_serialization,
44 QuicConnectionIdLength length) 46 QuicConnectionIdLength length,
47 bool delegate_saves_data)
45 : version(version), 48 : version(version),
46 connection_id_length(length), 49 connection_id_length(length),
47 version_serialization(version_serialization) {} 50 version_serialization(version_serialization),
51 delegate_saves_data(delegate_saves_data) {}
48 52
49 friend std::ostream& operator<<(std::ostream& os, const TestParams& p) { 53 friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
50 os << "{ client_version: " << QuicVersionToString(p.version) 54 os << "{ client_version: " << QuicVersionToString(p.version)
51 << " connection id length: " << p.connection_id_length 55 << " connection id length: " << p.connection_id_length
52 << " include version: " << p.version_serialization << " }"; 56 << " include version: " << p.version_serialization
57 << " delegate_saves_data: " << p.delegate_saves_data << " }";
53 return os; 58 return os;
54 } 59 }
55 60
56 QuicVersion version; 61 QuicVersion version;
57 QuicConnectionIdLength connection_id_length; 62 QuicConnectionIdLength connection_id_length;
58 bool version_serialization; 63 bool version_serialization;
64 bool delegate_saves_data;
59 }; 65 };
60 66
61 // Constructs various test permutations. 67 // Constructs various test permutations.
62 std::vector<TestParams> GetTestParams() { 68 std::vector<TestParams> GetTestParams() {
63 std::vector<TestParams> params; 69 std::vector<TestParams> params;
64 constexpr QuicConnectionIdLength kMax = PACKET_8BYTE_CONNECTION_ID; 70 constexpr QuicConnectionIdLength kMax = PACKET_8BYTE_CONNECTION_ID;
65 QuicVersionVector all_supported_versions = AllSupportedVersions(); 71 QuicVersionVector all_supported_versions = AllSupportedVersions();
66 for (size_t i = 0; i < all_supported_versions.size(); ++i) { 72 for (bool delegate_saves_data : {true, false}) {
67 params.push_back(TestParams(all_supported_versions[i], true, kMax)); 73 for (size_t i = 0; i < all_supported_versions.size(); ++i) {
68 params.push_back(TestParams(all_supported_versions[i], false, kMax)); 74 params.push_back(TestParams(all_supported_versions[i], true, kMax,
75 delegate_saves_data));
76 params.push_back(TestParams(all_supported_versions[i], false, kMax,
77 delegate_saves_data));
78 }
79 params.push_back(TestParams(all_supported_versions[0], true,
80 PACKET_0BYTE_CONNECTION_ID,
81 delegate_saves_data));
82 params.push_back(
83 TestParams(all_supported_versions[0], true, kMax, delegate_saves_data));
69 } 84 }
70 params.push_back(
71 TestParams(all_supported_versions[0], true, PACKET_0BYTE_CONNECTION_ID));
72 params.push_back(TestParams(all_supported_versions[0], true, kMax));
73 return params; 85 return params;
74 } 86 }
75 87
76 class MockDelegate : public QuicPacketCreator::DelegateInterface {
77 public:
78 MockDelegate() {}
79 ~MockDelegate() override {}
80
81 MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet));
82 MOCK_METHOD3(OnUnrecoverableError,
83 void(QuicErrorCode,
84 const string&,
85 ConnectionCloseSource source));
86
87 private:
88 DISALLOW_COPY_AND_ASSIGN(MockDelegate);
89 };
90
91 class QuicPacketCreatorTest : public QuicTestWithParam<TestParams> { 88 class QuicPacketCreatorTest : public QuicTestWithParam<TestParams> {
92 public: 89 public:
93 void ClearSerializedPacketForTests(SerializedPacket* serialized_packet) { 90 void ClearSerializedPacketForTests(SerializedPacket* serialized_packet) {
94 if (serialized_packet == nullptr) { 91 if (serialized_packet == nullptr) {
95 return; 92 return;
96 } 93 }
97 ClearSerializedPacket(serialized_packet); 94 ClearSerializedPacket(serialized_packet);
98 } 95 }
99 96
100 void SaveSerializedPacket(SerializedPacket* serialized_packet) { 97 void SaveSerializedPacket(SerializedPacket* serialized_packet) {
(...skipping 28 matching lines...) Expand all
129 &delegate_), 126 &delegate_),
130 serialized_packet_(creator_.NoPacket()) { 127 serialized_packet_(creator_.NoPacket()) {
131 creator_.set_connection_id_length(GetParam().connection_id_length); 128 creator_.set_connection_id_length(GetParam().connection_id_length);
132 129
133 creator_.SetEncrypter(ENCRYPTION_INITIAL, 130 creator_.SetEncrypter(ENCRYPTION_INITIAL,
134 new NullEncrypter(Perspective::IS_CLIENT)); 131 new NullEncrypter(Perspective::IS_CLIENT));
135 creator_.SetEncrypter(ENCRYPTION_FORWARD_SECURE, 132 creator_.SetEncrypter(ENCRYPTION_FORWARD_SECURE,
136 new NullEncrypter(Perspective::IS_CLIENT)); 133 new NullEncrypter(Perspective::IS_CLIENT));
137 client_framer_.set_visitor(&framer_visitor_); 134 client_framer_.set_visitor(&framer_visitor_);
138 server_framer_.set_visitor(&framer_visitor_); 135 server_framer_.set_visitor(&framer_visitor_);
136 if (GetParam().delegate_saves_data) {
137 creator_.set_delegate_saves_data(true);
138 }
139 } 139 }
140 140
141 ~QuicPacketCreatorTest() override { 141 ~QuicPacketCreatorTest() override {
142 delete[] serialized_packet_.encrypted_buffer; 142 delete[] serialized_packet_.encrypted_buffer;
143 ClearSerializedPacket(&serialized_packet_); 143 ClearSerializedPacket(&serialized_packet_);
144 } 144 }
145 145
146 SerializedPacket SerializeAllFrames(const QuicFrames& frames) { 146 SerializedPacket SerializeAllFrames(const QuicFrames& frames) {
147 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames( 147 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames(
148 &creator_, frames, buffer_, kMaxPacketSize); 148 &creator_, frames, buffer_, kMaxPacketSize);
149 EXPECT_EQ(QuicPacketCreatorPeer::GetEncryptionLevel(&creator_), 149 EXPECT_EQ(QuicPacketCreatorPeer::GetEncryptionLevel(&creator_),
150 packet.encryption_level); 150 packet.encryption_level);
151 return packet; 151 return packet;
152 } 152 }
153 153
154 void ProcessPacket(const SerializedPacket& packet) { 154 void ProcessPacket(const SerializedPacket& packet) {
155 QuicEncryptedPacket encrypted_packet(packet.encrypted_buffer, 155 QuicEncryptedPacket encrypted_packet(packet.encrypted_buffer,
156 packet.encrypted_length); 156 packet.encrypted_length);
157 server_framer_.ProcessPacket(encrypted_packet); 157 server_framer_.ProcessPacket(encrypted_packet);
158 } 158 }
159 159
160 void CheckStreamFrame(const QuicFrame& frame, 160 void CheckStreamFrame(const QuicFrame& frame,
161 QuicStreamId stream_id, 161 QuicStreamId stream_id,
162 const string& data, 162 const string& data,
163 QuicStreamOffset offset, 163 QuicStreamOffset offset,
164 bool fin) { 164 bool fin) {
165 EXPECT_EQ(STREAM_FRAME, frame.type); 165 EXPECT_EQ(STREAM_FRAME, frame.type);
166 ASSERT_TRUE(frame.stream_frame); 166 ASSERT_TRUE(frame.stream_frame);
167 EXPECT_EQ(stream_id, frame.stream_frame->stream_id); 167 EXPECT_EQ(stream_id, frame.stream_frame->stream_id);
168 EXPECT_EQ(data, QuicStringPiece(frame.stream_frame->data_buffer, 168 if (GetParam().delegate_saves_data) {
169 frame.stream_frame->data_length)); 169 char buf[kMaxPacketSize];
170 QuicDataWriter writer(kMaxPacketSize, buf, Perspective::IS_CLIENT,
171 HOST_BYTE_ORDER);
172 if (frame.stream_frame->data_length > 0) {
173 delegate_.WriteStreamData(stream_id, frame.stream_frame->offset,
174 frame.stream_frame->data_length, &writer);
175 }
176 EXPECT_EQ(data, QuicStringPiece(buf, frame.stream_frame->data_length));
177 } else {
178 EXPECT_EQ(data, QuicStringPiece(frame.stream_frame->data_buffer,
179 frame.stream_frame->data_length));
180 }
170 EXPECT_EQ(offset, frame.stream_frame->offset); 181 EXPECT_EQ(offset, frame.stream_frame->offset);
171 EXPECT_EQ(fin, frame.stream_frame->fin); 182 EXPECT_EQ(fin, frame.stream_frame->fin);
172 } 183 }
173 184
174 // Returns the number of bytes consumed by the header of packet, including 185 // Returns the number of bytes consumed by the header of packet, including
175 // the version. 186 // the version.
176 size_t GetPacketHeaderOverhead(QuicVersion version) { 187 size_t GetPacketHeaderOverhead(QuicVersion version) {
177 return GetPacketHeaderSize( 188 return GetPacketHeaderSize(
178 version, creator_.connection_id_length(), kIncludeVersion, 189 version, creator_.connection_id_length(), kIncludeVersion,
179 !kIncludeDiversificationNonce, 190 !kIncludeDiversificationNonce,
(...skipping 29 matching lines...) Expand all
209 num_padding_bytes, encryption_level, packet_number_length); 220 num_padding_bytes, encryption_level, packet_number_length);
210 } 221 }
211 222
212 static const QuicStreamOffset kOffset = 1u; 223 static const QuicStreamOffset kOffset = 1u;
213 224
214 char buffer_[kMaxPacketSize]; 225 char buffer_[kMaxPacketSize];
215 QuicFrames frames_; 226 QuicFrames frames_;
216 QuicFramer server_framer_; 227 QuicFramer server_framer_;
217 QuicFramer client_framer_; 228 QuicFramer client_framer_;
218 StrictMock<MockFramerVisitor> framer_visitor_; 229 StrictMock<MockFramerVisitor> framer_visitor_;
219 StrictMock<MockDelegate> delegate_; 230 StrictMock<MockPacketCreatorDelegate> delegate_;
220 QuicConnectionId connection_id_; 231 QuicConnectionId connection_id_;
221 string data_; 232 string data_;
222 struct iovec iov_; 233 struct iovec iov_;
223 SimpleBufferAllocator buffer_allocator_; 234 SimpleBufferAllocator buffer_allocator_;
224 QuicPacketCreator creator_; 235 QuicPacketCreator creator_;
225 SerializedPacket serialized_packet_; 236 SerializedPacket serialized_packet_;
237 SimpleDataProducer producer_;
226 }; 238 };
227 239
228 // Run all packet creator tests with all supported versions of QUIC, and with 240 // Run all packet creator tests with all supported versions of QUIC, and with
229 // and without version in the packet header, as well as doing a run for each 241 // and without version in the packet header, as well as doing a run for each
230 // length of truncated connection id. 242 // length of truncated connection id.
231 INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests, 243 INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests,
232 QuicPacketCreatorTest, 244 QuicPacketCreatorTest,
233 ::testing::ValuesIn(GetTestParams())); 245 ::testing::ValuesIn(GetTestParams()));
234 246
235 TEST_P(QuicPacketCreatorTest, SerializeFrames) { 247 TEST_P(QuicPacketCreatorTest, SerializeFrames) {
(...skipping 790 matching lines...) Expand 10 before | Expand all | Expand 10 after
1026 // Flush all paddings. 1038 // Flush all paddings.
1027 while (creator_.pending_padding_bytes() > 0) { 1039 while (creator_.pending_padding_bytes() > 0) {
1028 creator_.Flush(); 1040 creator_.Flush();
1029 } 1041 }
1030 EXPECT_EQ(0u, creator_.pending_padding_bytes()); 1042 EXPECT_EQ(0u, creator_.pending_padding_bytes());
1031 } 1043 }
1032 1044
1033 } // namespace 1045 } // namespace
1034 } // namespace test 1046 } // namespace test
1035 } // namespace net 1047 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_packet_creator.cc ('k') | net/quic/core/quic_packet_generator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698