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

Side by Side Diff: net/websockets/websocket_frame_parser_unittest.cc

Issue 10796107: WebSocketFrameChunk should use IOBuffer to hold data (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: style nits Created 8 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « net/websockets/websocket_frame_parser.cc ('k') | no next file » | 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/websockets/websocket_frame_parser.h" 5 #include "net/websockets/websocket_frame_parser.h"
6 6
7 #include <algorithm>
7 #include <vector> 8 #include <vector>
8 9
9 #include "base/basictypes.h" 10 #include "base/basictypes.h"
10 #include "base/memory/scoped_vector.h" 11 #include "base/memory/scoped_vector.h"
11 #include "base/port.h" 12 #include "base/port.h"
13 #include "net/base/io_buffer.h"
12 #include "net/websockets/websocket_frame.h" 14 #include "net/websockets/websocket_frame.h"
13 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
14 16
15 namespace { 17 namespace {
16 18
17 const char kHello[] = "Hello, world!"; 19 const char kHello[] = "Hello, world!";
18 const uint64 kHelloLength = arraysize(kHello) - 1; 20 const uint64 kHelloLength = arraysize(kHello) - 1;
19 const char kHelloFrame[] = "\x81\x0DHello, world!"; 21 const char kHelloFrame[] = "\x81\x0DHello, world!";
20 const uint64 kHelloFrameLength = arraysize(kHelloFrame) - 1; 22 const uint64 kHelloFrameLength = arraysize(kHelloFrame) - 1;
21 const char kMaskedHelloFrame[] = 23 const char kMaskedHelloFrame[] =
22 "\x81\x8D\xDE\xAD\xBE\xEF" 24 "\x81\x8D\xDE\xAD\xBE\xEF"
23 "\x96\xC8\xD2\x83\xB1\x81\x9E\x98\xB1\xDF\xD2\x8B\xFF"; 25 "\x96\xC8\xD2\x83\xB1\x81\x9E\x98\xB1\xDF\xD2\x8B\xFF";
24 const uint64 kMaskedHelloFrameLength = arraysize(kMaskedHelloFrame) - 1; 26 const uint64 kMaskedHelloFrameLength = arraysize(kMaskedHelloFrame) - 1;
25 27
26 struct FrameHeaderTestCase { 28 struct FrameHeaderTestCase {
27 const char* frame_header; 29 const char* frame_header;
28 size_t frame_header_length; 30 size_t frame_header_length;
29 uint64 frame_length; 31 uint64 frame_length;
32 bool failed;
30 }; 33 };
31 34
35 // TODO(toyoshim): Provide error code and check if the reason is correct.
32 const FrameHeaderTestCase kFrameHeaderTests[] = { 36 const FrameHeaderTestCase kFrameHeaderTests[] = {
33 { "\x81\x00", 2, GG_UINT64_C(0) }, 37 { "\x81\x00", 2, GG_UINT64_C(0), false },
34 { "\x81\x7D", 2, GG_UINT64_C(125) }, 38 { "\x81\x7D", 2, GG_UINT64_C(125), false },
35 { "\x81\x7E\x00\x7E", 4, GG_UINT64_C(126) }, 39 { "\x81\x7E\x00\x7E", 4, GG_UINT64_C(126), false },
36 { "\x81\x7E\xFF\xFF", 4, GG_UINT64_C(0xFFFF) }, 40 { "\x81\x7E\xFF\xFF", 4, GG_UINT64_C(0xFFFF), false },
37 { "\x81\x7F\x00\x00\x00\x00\x00\x01\x00\x00", 10, GG_UINT64_C(0x10000) }, 41 { "\x81\x7F\x00\x00\x00\x00\x00\x01\x00\x00", 10, GG_UINT64_C(0x10000),
42 false },
43 { "\x81\x7F\x00\x00\x00\x00\x7F\xFF\xFF\xFF", 10, GG_UINT64_C(0x7FFFFFFF),
44 false },
45 { "\x81\x7F\x00\x00\x00\x00\x80\x00\x00\x00", 10, GG_UINT64_C(0x80000000),
46 true },
38 { "\x81\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 10, 47 { "\x81\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 10,
39 GG_UINT64_C(0x7FFFFFFFFFFFFFFF) } 48 GG_UINT64_C(0x7FFFFFFFFFFFFFFF), true }
40 }; 49 };
41 const int kNumFrameHeaderTests = arraysize(kFrameHeaderTests); 50 const int kNumFrameHeaderTests = arraysize(kFrameHeaderTests);
42 51
43 } // Unnamed namespace 52 } // Unnamed namespace
44 53
45 namespace net { 54 namespace net {
46 55
47 TEST(WebSocketFrameParserTest, DecodeNormalFrame) { 56 TEST(WebSocketFrameParserTest, DecodeNormalFrame) {
48 WebSocketFrameParser parser; 57 WebSocketFrameParser parser;
49 58
50 ScopedVector<WebSocketFrameChunk> frames; 59 ScopedVector<WebSocketFrameChunk> frames;
51 EXPECT_TRUE(parser.Decode(kHelloFrame, kHelloFrameLength, &frames)); 60 EXPECT_TRUE(parser.Decode(kHelloFrame, kHelloFrameLength, &frames));
52 EXPECT_FALSE(parser.failed()); 61 EXPECT_FALSE(parser.failed());
53 ASSERT_EQ(1u, frames.size()); 62 ASSERT_EQ(1u, frames.size());
54 WebSocketFrameChunk* frame = frames[0]; 63 WebSocketFrameChunk* frame = frames[0];
55 ASSERT_TRUE(frame != NULL); 64 ASSERT_TRUE(frame != NULL);
56 const WebSocketFrameHeader* header = frame->header.get(); 65 const WebSocketFrameHeader* header = frame->header.get();
57 EXPECT_TRUE(header != NULL); 66 EXPECT_TRUE(header != NULL);
58 if (header) { 67 if (header) {
59 EXPECT_TRUE(header->final); 68 EXPECT_TRUE(header->final);
60 EXPECT_FALSE(header->reserved1); 69 EXPECT_FALSE(header->reserved1);
61 EXPECT_FALSE(header->reserved2); 70 EXPECT_FALSE(header->reserved2);
62 EXPECT_FALSE(header->reserved3); 71 EXPECT_FALSE(header->reserved3);
63 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); 72 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode);
64 EXPECT_FALSE(header->masked); 73 EXPECT_FALSE(header->masked);
65 EXPECT_EQ(kHelloLength, header->payload_length); 74 EXPECT_EQ(kHelloLength, header->payload_length);
66 } 75 }
67 EXPECT_TRUE(frame->final_chunk); 76 EXPECT_TRUE(frame->final_chunk);
68 77
69 std::vector<char> expected_data(kHello, kHello + kHelloLength); 78 ASSERT_EQ(static_cast<int>(kHelloLength), frame->data->size());
70 EXPECT_EQ(expected_data, frame->data); 79 EXPECT_TRUE(std::equal(kHello, kHello + kHelloLength, frame->data->data()));
71 } 80 }
72 81
73 TEST(WebSocketFrameParserTest, DecodeMaskedFrame) { 82 TEST(WebSocketFrameParserTest, DecodeMaskedFrame) {
74 WebSocketFrameParser parser; 83 WebSocketFrameParser parser;
75 84
76 ScopedVector<WebSocketFrameChunk> frames; 85 ScopedVector<WebSocketFrameChunk> frames;
77 EXPECT_TRUE(parser.Decode(kMaskedHelloFrame, kMaskedHelloFrameLength, 86 EXPECT_TRUE(parser.Decode(kMaskedHelloFrame, kMaskedHelloFrameLength,
78 &frames)); 87 &frames));
79 EXPECT_FALSE(parser.failed()); 88 EXPECT_FALSE(parser.failed());
80 ASSERT_EQ(1u, frames.size()); 89 ASSERT_EQ(1u, frames.size());
81 WebSocketFrameChunk* frame = frames[0]; 90 WebSocketFrameChunk* frame = frames[0];
82 ASSERT_TRUE(frame != NULL); 91 ASSERT_TRUE(frame != NULL);
83 const WebSocketFrameHeader* header = frame->header.get(); 92 const WebSocketFrameHeader* header = frame->header.get();
84 EXPECT_TRUE(header != NULL); 93 EXPECT_TRUE(header != NULL);
85 if (header) { 94 if (header) {
86 EXPECT_TRUE(header->final); 95 EXPECT_TRUE(header->final);
87 EXPECT_FALSE(header->reserved1); 96 EXPECT_FALSE(header->reserved1);
88 EXPECT_FALSE(header->reserved2); 97 EXPECT_FALSE(header->reserved2);
89 EXPECT_FALSE(header->reserved3); 98 EXPECT_FALSE(header->reserved3);
90 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); 99 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode);
91 EXPECT_TRUE(header->masked); 100 EXPECT_TRUE(header->masked);
92 EXPECT_EQ(kHelloLength, header->payload_length); 101 EXPECT_EQ(kHelloLength, header->payload_length);
93 } 102 }
94 EXPECT_TRUE(frame->final_chunk); 103 EXPECT_TRUE(frame->final_chunk);
95 104
96 std::vector<char> expected_data(kHello, kHello + kHelloLength); 105 ASSERT_EQ(static_cast<int>(kHelloLength), frame->data->size());
97 EXPECT_EQ(expected_data, frame->data); 106 EXPECT_TRUE(std::equal(kHello, kHello + kHelloLength, frame->data->data()));
98 } 107 }
99 108
100 TEST(WebSocketFrameParserTest, DecodeManyFrames) { 109 TEST(WebSocketFrameParserTest, DecodeManyFrames) {
101 struct Input { 110 struct Input {
102 const char* frame; 111 const char* frame;
103 size_t frame_length; 112 size_t frame_length;
104 const char* expected_payload; 113 const char* expected_payload;
105 size_t expected_payload_length; 114 size_t expected_payload_length;
106 }; 115 };
107 static const Input kInputs[] = { 116 static const Input kInputs[] = {
(...skipping 28 matching lines...) Expand all
136 EXPECT_TRUE(parser.Decode(&input.front(), input.size(), &frames)); 145 EXPECT_TRUE(parser.Decode(&input.front(), input.size(), &frames));
137 EXPECT_FALSE(parser.failed()); 146 EXPECT_FALSE(parser.failed());
138 ASSERT_EQ(static_cast<size_t>(kNumInputs), frames.size()); 147 ASSERT_EQ(static_cast<size_t>(kNumInputs), frames.size());
139 148
140 for (int i = 0; i < kNumInputs; ++i) { 149 for (int i = 0; i < kNumInputs; ++i) {
141 WebSocketFrameChunk* frame = frames[i]; 150 WebSocketFrameChunk* frame = frames[i];
142 EXPECT_TRUE(frame != NULL); 151 EXPECT_TRUE(frame != NULL);
143 if (!frame) 152 if (!frame)
144 continue; 153 continue;
145 EXPECT_TRUE(frame->final_chunk); 154 EXPECT_TRUE(frame->final_chunk);
146 std::vector<char> expected_data( 155 ASSERT_EQ(kInputs[i].expected_payload_length,
156 static_cast<uint64>(frame->data->size()));
157 EXPECT_TRUE(std::equal(
147 kInputs[i].expected_payload, 158 kInputs[i].expected_payload,
148 kInputs[i].expected_payload + kInputs[i].expected_payload_length); 159 kInputs[i].expected_payload + kInputs[i].expected_payload_length,
149 EXPECT_EQ(expected_data, frame->data); 160 frame->data->data()));
150 161
151 const WebSocketFrameHeader* header = frame->header.get(); 162 const WebSocketFrameHeader* header = frame->header.get();
152 EXPECT_TRUE(header != NULL); 163 EXPECT_TRUE(header != NULL);
153 if (!header) 164 if (!header)
154 continue; 165 continue;
155 EXPECT_TRUE(header->final); 166 EXPECT_TRUE(header->final);
156 EXPECT_FALSE(header->reserved1); 167 EXPECT_FALSE(header->reserved1);
157 EXPECT_FALSE(header->reserved2); 168 EXPECT_FALSE(header->reserved2);
158 EXPECT_FALSE(header->reserved3); 169 EXPECT_FALSE(header->reserved3);
159 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); 170 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode);
(...skipping 20 matching lines...) Expand all
180 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1)); 191 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1));
181 EXPECT_FALSE(parser.failed()); 192 EXPECT_FALSE(parser.failed());
182 EXPECT_EQ(1u, frames1.size()); 193 EXPECT_EQ(1u, frames1.size());
183 if (frames1.size() != 1u) 194 if (frames1.size() != 1u)
184 continue; 195 continue;
185 WebSocketFrameChunk* frame1 = frames1[0]; 196 WebSocketFrameChunk* frame1 = frames1[0];
186 EXPECT_TRUE(frame1 != NULL); 197 EXPECT_TRUE(frame1 != NULL);
187 if (!frame1) 198 if (!frame1)
188 continue; 199 continue;
189 EXPECT_FALSE(frame1->final_chunk); 200 EXPECT_FALSE(frame1->final_chunk);
190 EXPECT_EQ(expected1, frame1->data); 201 if (expected1.size() == 0) {
202 EXPECT_EQ(NULL, frame1->data.get());
203 } else {
204 ASSERT_EQ(cutting_pos, static_cast<size_t>(frame1->data->size()));
205 EXPECT_TRUE(std::equal(expected1.begin(),
206 expected1.end(),
207 frame1->data->data()));
208 }
191 const WebSocketFrameHeader* header1 = frame1->header.get(); 209 const WebSocketFrameHeader* header1 = frame1->header.get();
192 EXPECT_TRUE(header1 != NULL); 210 EXPECT_TRUE(header1 != NULL);
193 if (!header1) 211 if (!header1)
194 continue; 212 continue;
195 EXPECT_TRUE(header1->final); 213 EXPECT_TRUE(header1->final);
196 EXPECT_FALSE(header1->reserved1); 214 EXPECT_FALSE(header1->reserved1);
197 EXPECT_FALSE(header1->reserved2); 215 EXPECT_FALSE(header1->reserved2);
198 EXPECT_FALSE(header1->reserved3); 216 EXPECT_FALSE(header1->reserved3);
199 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode); 217 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode);
200 EXPECT_FALSE(header1->masked); 218 EXPECT_FALSE(header1->masked);
201 EXPECT_EQ(kHelloLength, header1->payload_length); 219 EXPECT_EQ(kHelloLength, header1->payload_length);
202 220
203 ScopedVector<WebSocketFrameChunk> frames2; 221 ScopedVector<WebSocketFrameChunk> frames2;
204 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2)); 222 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2));
205 EXPECT_FALSE(parser.failed()); 223 EXPECT_FALSE(parser.failed());
206 EXPECT_EQ(1u, frames2.size()); 224 EXPECT_EQ(1u, frames2.size());
207 if (frames2.size() != 1u) 225 if (frames2.size() != 1u)
208 continue; 226 continue;
209 WebSocketFrameChunk* frame2 = frames2[0]; 227 WebSocketFrameChunk* frame2 = frames2[0];
210 EXPECT_TRUE(frame2 != NULL); 228 EXPECT_TRUE(frame2 != NULL);
211 if (!frame2) 229 if (!frame2)
212 continue; 230 continue;
213 EXPECT_TRUE(frame2->final_chunk); 231 EXPECT_TRUE(frame2->final_chunk);
214 EXPECT_EQ(expected2, frame2->data); 232 if (expected2.size() == 0) {
233 EXPECT_EQ(NULL, frame2->data.get());
234 } else {
235 ASSERT_EQ(expected2.size(), static_cast<uint64>(frame2->data->size()));
236 EXPECT_TRUE(std::equal(expected2.begin(),
237 expected2.end(),
238 frame2->data->data()));
239 }
215 const WebSocketFrameHeader* header2 = frame2->header.get(); 240 const WebSocketFrameHeader* header2 = frame2->header.get();
216 EXPECT_TRUE(header2 == NULL); 241 EXPECT_TRUE(header2 == NULL);
217 } 242 }
218 } 243 }
219 244
220 TEST(WebSocketFrameParserTest, DecodePartialMaskedFrame) { 245 TEST(WebSocketFrameParserTest, DecodePartialMaskedFrame) {
221 static const size_t kFrameHeaderSize = 6; 246 static const size_t kFrameHeaderSize = 6;
222 247
223 for (size_t cutting_pos = 0; cutting_pos < kHelloLength; ++cutting_pos) { 248 for (size_t cutting_pos = 0; cutting_pos < kHelloLength; ++cutting_pos) {
224 std::vector<char> input1( 249 std::vector<char> input1(
(...skipping 11 matching lines...) Expand all
236 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1)); 261 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1));
237 EXPECT_FALSE(parser.failed()); 262 EXPECT_FALSE(parser.failed());
238 EXPECT_EQ(1u, frames1.size()); 263 EXPECT_EQ(1u, frames1.size());
239 if (frames1.size() != 1u) 264 if (frames1.size() != 1u)
240 continue; 265 continue;
241 WebSocketFrameChunk* frame1 = frames1[0]; 266 WebSocketFrameChunk* frame1 = frames1[0];
242 EXPECT_TRUE(frame1 != NULL); 267 EXPECT_TRUE(frame1 != NULL);
243 if (!frame1) 268 if (!frame1)
244 continue; 269 continue;
245 EXPECT_FALSE(frame1->final_chunk); 270 EXPECT_FALSE(frame1->final_chunk);
246 EXPECT_EQ(expected1, frame1->data); 271 if (expected1.size() == 0) {
272 EXPECT_EQ(NULL, frame1->data.get());
273 } else {
274 ASSERT_EQ(expected1.size(), static_cast<uint64>(frame1->data->size()));
275 EXPECT_TRUE(std::equal(expected1.begin(),
276 expected1.end(),
277 frame1->data->data()));
278 }
247 const WebSocketFrameHeader* header1 = frame1->header.get(); 279 const WebSocketFrameHeader* header1 = frame1->header.get();
248 EXPECT_TRUE(header1 != NULL); 280 EXPECT_TRUE(header1 != NULL);
249 if (!header1) 281 if (!header1)
250 continue; 282 continue;
251 EXPECT_TRUE(header1->final); 283 EXPECT_TRUE(header1->final);
252 EXPECT_FALSE(header1->reserved1); 284 EXPECT_FALSE(header1->reserved1);
253 EXPECT_FALSE(header1->reserved2); 285 EXPECT_FALSE(header1->reserved2);
254 EXPECT_FALSE(header1->reserved3); 286 EXPECT_FALSE(header1->reserved3);
255 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode); 287 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode);
256 EXPECT_TRUE(header1->masked); 288 EXPECT_TRUE(header1->masked);
257 EXPECT_EQ(kHelloLength, header1->payload_length); 289 EXPECT_EQ(kHelloLength, header1->payload_length);
258 290
259 ScopedVector<WebSocketFrameChunk> frames2; 291 ScopedVector<WebSocketFrameChunk> frames2;
260 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2)); 292 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2));
261 EXPECT_FALSE(parser.failed()); 293 EXPECT_FALSE(parser.failed());
262 EXPECT_EQ(1u, frames2.size()); 294 EXPECT_EQ(1u, frames2.size());
263 if (frames2.size() != 1u) 295 if (frames2.size() != 1u)
264 continue; 296 continue;
265 WebSocketFrameChunk* frame2 = frames2[0]; 297 WebSocketFrameChunk* frame2 = frames2[0];
266 EXPECT_TRUE(frame2 != NULL); 298 EXPECT_TRUE(frame2 != NULL);
267 if (!frame2) 299 if (!frame2)
268 continue; 300 continue;
269 EXPECT_TRUE(frame2->final_chunk); 301 EXPECT_TRUE(frame2->final_chunk);
270 EXPECT_EQ(expected2, frame2->data); 302 if (expected2.size() == 0) {
303 EXPECT_EQ(NULL, frame2->data.get());
304 } else {
305 ASSERT_EQ(expected2.size(), static_cast<uint64>(frame2->data->size()));
306 EXPECT_TRUE(std::equal(expected2.begin(),
307 expected2.end(),
308 frame2->data->data()));
309 }
271 const WebSocketFrameHeader* header2 = frame2->header.get(); 310 const WebSocketFrameHeader* header2 = frame2->header.get();
272 EXPECT_TRUE(header2 == NULL); 311 EXPECT_TRUE(header2 == NULL);
273 } 312 }
274 } 313 }
275 314
276 TEST(WebSocketFrameParserTest, DecodeFramesOfVariousLengths) { 315 TEST(WebSocketFrameParserTest, DecodeFramesOfVariousLengths) {
277 for (int i = 0; i < kNumFrameHeaderTests; ++i) { 316 for (int i = 0; i < kNumFrameHeaderTests; ++i) {
278 const char* frame_header = kFrameHeaderTests[i].frame_header; 317 const char* frame_header = kFrameHeaderTests[i].frame_header;
279 size_t frame_header_length = kFrameHeaderTests[i].frame_header_length; 318 size_t frame_header_length = kFrameHeaderTests[i].frame_header_length;
280 uint64 frame_length = kFrameHeaderTests[i].frame_length; 319 uint64 frame_length = kFrameHeaderTests[i].frame_length;
281 320
282 std::vector<char> input(frame_header, frame_header + frame_header_length); 321 std::vector<char> input(frame_header, frame_header + frame_header_length);
283 // Limit the payload size not to flood the console on failure. 322 // Limit the payload size not to flood the console on failure.
284 static const uint64 kMaxPayloadSize = 200; 323 static const uint64 kMaxPayloadSize = 200;
285 uint64 input_payload_size = std::min(frame_length, kMaxPayloadSize); 324 uint64 input_payload_size = std::min(frame_length, kMaxPayloadSize);
286 input.insert(input.end(), input_payload_size, 'a'); 325 input.insert(input.end(), input_payload_size, 'a');
287 326
288 WebSocketFrameParser parser; 327 WebSocketFrameParser parser;
289 328
290 ScopedVector<WebSocketFrameChunk> frames; 329 ScopedVector<WebSocketFrameChunk> frames;
291 EXPECT_TRUE(parser.Decode(&input.front(), input.size(), &frames)); 330 EXPECT_EQ(!kFrameHeaderTests[i].failed,
292 EXPECT_FALSE(parser.failed()); 331 parser.Decode(&input.front(), input.size(), &frames));
293 EXPECT_EQ(1u, frames.size()); 332 EXPECT_EQ(kFrameHeaderTests[i].failed, parser.failed());
333 if (kFrameHeaderTests[i].failed) {
334 EXPECT_EQ(0u, frames.size());
335 } else {
336 EXPECT_EQ(1u, frames.size());
337 }
294 if (frames.size() != 1u) 338 if (frames.size() != 1u)
295 continue; 339 continue;
296 WebSocketFrameChunk* frame = frames[0]; 340 WebSocketFrameChunk* frame = frames[0];
297 EXPECT_TRUE(frame != NULL); 341 EXPECT_TRUE(frame != NULL);
298 if (!frame) 342 if (!frame)
299 continue; 343 continue;
300 if (frame_length == input_payload_size) 344 if (frame_length == input_payload_size) {
301 EXPECT_TRUE(frame->final_chunk); 345 EXPECT_TRUE(frame->final_chunk);
302 else 346 } else {
303 EXPECT_FALSE(frame->final_chunk); 347 EXPECT_FALSE(frame->final_chunk);
348 }
304 std::vector<char> expected_payload(input_payload_size, 'a'); 349 std::vector<char> expected_payload(input_payload_size, 'a');
305 EXPECT_EQ(expected_payload, frame->data); 350 if (expected_payload.size() == 0) {
351 EXPECT_EQ(NULL, frame->data.get());
352 } else {
353 ASSERT_EQ(expected_payload.size(),
354 static_cast<uint64>(frame->data->size()));
355 EXPECT_TRUE(std::equal(
356 expected_payload.begin(),
357 expected_payload.end(),
358 frame->data->data()));
359 }
306 const WebSocketFrameHeader* header = frame->header.get(); 360 const WebSocketFrameHeader* header = frame->header.get();
307 EXPECT_TRUE(header != NULL); 361 EXPECT_TRUE(header != NULL);
308 if (!header) 362 if (!header)
309 continue; 363 continue;
310 EXPECT_TRUE(header->final); 364 EXPECT_TRUE(header->final);
311 EXPECT_FALSE(header->reserved1); 365 EXPECT_FALSE(header->reserved1);
312 EXPECT_FALSE(header->reserved2); 366 EXPECT_FALSE(header->reserved2);
313 EXPECT_FALSE(header->reserved3); 367 EXPECT_FALSE(header->reserved3);
314 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); 368 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode);
315 EXPECT_FALSE(header->masked); 369 EXPECT_FALSE(header->masked);
316 EXPECT_EQ(frame_length, header->payload_length); 370 EXPECT_EQ(frame_length, header->payload_length);
317 } 371 }
318 } 372 }
319 373
320 TEST(WebSocketFrameParserTest, DecodePartialHeader) { 374 TEST(WebSocketFrameParserTest, DecodePartialHeader) {
321 for (int i = 0; i < kNumFrameHeaderTests; ++i) { 375 for (int i = 0; i < kNumFrameHeaderTests; ++i) {
322 const char* frame_header = kFrameHeaderTests[i].frame_header; 376 const char* frame_header = kFrameHeaderTests[i].frame_header;
323 size_t frame_header_length = kFrameHeaderTests[i].frame_header_length; 377 size_t frame_header_length = kFrameHeaderTests[i].frame_header_length;
324 uint64 frame_length = kFrameHeaderTests[i].frame_length; 378 uint64 frame_length = kFrameHeaderTests[i].frame_length;
325 379
326 WebSocketFrameParser parser; 380 WebSocketFrameParser parser;
327 381
328 ScopedVector<WebSocketFrameChunk> frames; 382 ScopedVector<WebSocketFrameChunk> frames;
329 // Feed each byte to the parser to see if the parser behaves correctly 383 // Feed each byte to the parser to see if the parser behaves correctly
330 // when it receives partial frame header. 384 // when it receives partial frame header.
385 size_t last_byte_offset = frame_header_length - 1;
331 for (size_t j = 0; j < frame_header_length; ++j) { 386 for (size_t j = 0; j < frame_header_length; ++j) {
332 EXPECT_TRUE(parser.Decode(frame_header + j, 1, &frames)); 387 bool failed = kFrameHeaderTests[i].failed && j == last_byte_offset;
333 EXPECT_FALSE(parser.failed()); 388 EXPECT_EQ(!failed, parser.Decode(frame_header + j, 1, &frames));
334 if (j == frame_header_length - 1) 389 EXPECT_EQ(failed, parser.failed());
390 if (!kFrameHeaderTests[i].failed && j == last_byte_offset)
335 EXPECT_EQ(1u, frames.size()); 391 EXPECT_EQ(1u, frames.size());
336 else 392 else
337 EXPECT_EQ(0u, frames.size()); 393 EXPECT_EQ(0u, frames.size());
338 } 394 }
339 if (frames.size() != 1u) 395 if (frames.size() != 1u)
340 continue; 396 continue;
341 WebSocketFrameChunk* frame = frames[0]; 397 WebSocketFrameChunk* frame = frames[0];
342 EXPECT_TRUE(frame != NULL); 398 EXPECT_TRUE(frame != NULL);
343 if (!frame) 399 if (!frame)
344 continue; 400 continue;
345 if (frame_length == 0u) 401 if (frame_length == 0u) {
346 EXPECT_TRUE(frame->final_chunk); 402 EXPECT_TRUE(frame->final_chunk);
347 else 403 } else {
348 EXPECT_FALSE(frame->final_chunk); 404 EXPECT_FALSE(frame->final_chunk);
349 EXPECT_EQ(std::vector<char>(), frame->data); 405 }
406 EXPECT_EQ(NULL, frame->data.get());
350 const WebSocketFrameHeader* header = frame->header.get(); 407 const WebSocketFrameHeader* header = frame->header.get();
351 EXPECT_TRUE(header != NULL); 408 EXPECT_TRUE(header != NULL);
352 if (!header) 409 if (!header)
353 continue; 410 continue;
354 EXPECT_TRUE(header->final); 411 EXPECT_TRUE(header->final);
355 EXPECT_FALSE(header->reserved1); 412 EXPECT_FALSE(header->reserved1);
356 EXPECT_FALSE(header->reserved2); 413 EXPECT_FALSE(header->reserved2);
357 EXPECT_FALSE(header->reserved3); 414 EXPECT_FALSE(header->reserved3);
358 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); 415 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode);
359 EXPECT_FALSE(header->masked); 416 EXPECT_FALSE(header->masked);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 EXPECT_TRUE(parser.Decode(frame_header, frame_header_length, &frames)); 494 EXPECT_TRUE(parser.Decode(frame_header, frame_header_length, &frames));
438 EXPECT_FALSE(parser.failed()); 495 EXPECT_FALSE(parser.failed());
439 EXPECT_EQ(1u, frames.size()); 496 EXPECT_EQ(1u, frames.size());
440 if (frames.size() != 1u) 497 if (frames.size() != 1u)
441 continue; 498 continue;
442 WebSocketFrameChunk* frame = frames[0]; 499 WebSocketFrameChunk* frame = frames[0];
443 EXPECT_TRUE(frame != NULL); 500 EXPECT_TRUE(frame != NULL);
444 if (!frame) 501 if (!frame)
445 continue; 502 continue;
446 EXPECT_TRUE(frame->final_chunk); 503 EXPECT_TRUE(frame->final_chunk);
447 EXPECT_EQ(std::vector<char>(), frame->data); 504 EXPECT_EQ(NULL, frame->data.get());
448 const WebSocketFrameHeader* header = frame->header.get(); 505 const WebSocketFrameHeader* header = frame->header.get();
449 EXPECT_TRUE(header != NULL); 506 EXPECT_TRUE(header != NULL);
450 if (!header) 507 if (!header)
451 continue; 508 continue;
452 EXPECT_TRUE(header->final); 509 EXPECT_TRUE(header->final);
453 EXPECT_FALSE(header->reserved1); 510 EXPECT_FALSE(header->reserved1);
454 EXPECT_FALSE(header->reserved2); 511 EXPECT_FALSE(header->reserved2);
455 EXPECT_FALSE(header->reserved3); 512 EXPECT_FALSE(header->reserved3);
456 EXPECT_EQ(opcode, header->opcode); 513 EXPECT_EQ(opcode, header->opcode);
457 EXPECT_FALSE(header->masked); 514 EXPECT_FALSE(header->masked);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 EXPECT_TRUE(parser.Decode(frame_header, frame_header_length, &frames)); 550 EXPECT_TRUE(parser.Decode(frame_header, frame_header_length, &frames));
494 EXPECT_FALSE(parser.failed()); 551 EXPECT_FALSE(parser.failed());
495 EXPECT_EQ(1u, frames.size()); 552 EXPECT_EQ(1u, frames.size());
496 if (frames.size() != 1u) 553 if (frames.size() != 1u)
497 continue; 554 continue;
498 WebSocketFrameChunk* frame = frames[0]; 555 WebSocketFrameChunk* frame = frames[0];
499 EXPECT_TRUE(frame != NULL); 556 EXPECT_TRUE(frame != NULL);
500 if (!frame) 557 if (!frame)
501 continue; 558 continue;
502 EXPECT_TRUE(frame->final_chunk); 559 EXPECT_TRUE(frame->final_chunk);
503 EXPECT_EQ(std::vector<char>(), frame->data); 560 EXPECT_EQ(NULL, frame->data.get());
504 const WebSocketFrameHeader* header = frame->header.get(); 561 const WebSocketFrameHeader* header = frame->header.get();
505 EXPECT_TRUE(header != NULL); 562 EXPECT_TRUE(header != NULL);
506 if (!header) 563 if (!header)
507 continue; 564 continue;
508 EXPECT_EQ(final, header->final); 565 EXPECT_EQ(final, header->final);
509 EXPECT_EQ(reserved1, header->reserved1); 566 EXPECT_EQ(reserved1, header->reserved1);
510 EXPECT_EQ(reserved2, header->reserved2); 567 EXPECT_EQ(reserved2, header->reserved2);
511 EXPECT_EQ(reserved3, header->reserved3); 568 EXPECT_EQ(reserved3, header->reserved3);
512 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); 569 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode);
513 EXPECT_FALSE(header->masked); 570 EXPECT_FALSE(header->masked);
514 EXPECT_EQ(0u, header->payload_length); 571 EXPECT_EQ(0u, header->payload_length);
515 } 572 }
516 } 573 }
517 574
518 } // namespace net 575 } // namespace net
OLDNEW
« no previous file with comments | « net/websockets/websocket_frame_parser.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698