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/websockets/websocket_frame_parser.h" | 5 #include "net/websockets/websocket_frame_parser.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 12 matching lines...) Expand all Loading... | |
23 const char kMaskedHelloFrame[] = | 23 const char kMaskedHelloFrame[] = |
24 "\x81\x8D\xDE\xAD\xBE\xEF" | 24 "\x81\x8D\xDE\xAD\xBE\xEF" |
25 "\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"; |
26 const uint64 kMaskedHelloFrameLength = arraysize(kMaskedHelloFrame) - 1; | 26 const uint64 kMaskedHelloFrameLength = arraysize(kMaskedHelloFrame) - 1; |
27 | 27 |
28 struct FrameHeaderTestCase { | 28 struct FrameHeaderTestCase { |
29 const char* frame_header; | 29 const char* frame_header; |
30 size_t frame_header_length; | 30 size_t frame_header_length; |
31 uint64 frame_length; | 31 uint64 frame_length; |
32 bool failed; | 32 bool failed; |
33 net::WebSocketError error_code; | |
33 }; | 34 }; |
34 | 35 |
35 // TODO(toyoshim): Provide error code and check if the reason is correct. | |
36 const FrameHeaderTestCase kFrameHeaderTests[] = { | |
37 { "\x81\x00", 2, GG_UINT64_C(0), false }, | |
38 { "\x81\x7D", 2, GG_UINT64_C(125), false }, | |
39 { "\x81\x7E\x00\x7E", 4, GG_UINT64_C(126), false }, | |
40 { "\x81\x7E\xFF\xFF", 4, GG_UINT64_C(0xFFFF), false }, | |
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 }, | |
47 { "\x81\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 10, | |
48 GG_UINT64_C(0x7FFFFFFFFFFFFFFF), true } | |
49 }; | |
50 const int kNumFrameHeaderTests = arraysize(kFrameHeaderTests); | |
51 | |
52 } // Unnamed namespace | 36 } // Unnamed namespace |
53 | 37 |
54 namespace net { | 38 namespace net { |
55 | 39 |
40 static const FrameHeaderTestCase kFrameHeaderTests[] = { | |
41 { "\x81\x00", 2, GG_UINT64_C(0), false, WEB_SOCKET_OK }, | |
42 { "\x81\x7D", 2, GG_UINT64_C(125), false, WEB_SOCKET_OK }, | |
43 { "\x81\x7E\x00\x7E", 4, GG_UINT64_C(126), false, WEB_SOCKET_OK }, | |
44 { "\x81\x7E\xFF\xFF", 4, GG_UINT64_C(0xFFFF), false, WEB_SOCKET_OK }, | |
45 { "\x81\x7F\x00\x00\x00\x00\x00\x01\x00\x00", 10, GG_UINT64_C(0x10000), | |
46 false, WEB_SOCKET_OK }, | |
47 { "\x81\x7F\x00\x00\x00\x00\x7F\xFF\xFF\xFF", 10, GG_UINT64_C(0x7FFFFFFF), | |
48 false, WEB_SOCKET_OK }, | |
49 { "\x81\x7F\x00\x00\x00\x00\x80\x00\x00\x00", 10, GG_UINT64_C(0x80000000), | |
50 true, WEB_SOCKET_ERR_MESSAGE_TOO_BIG }, | |
51 { "\x81\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 10, | |
52 GG_UINT64_C(0x7FFFFFFFFFFFFFFF), true, WEB_SOCKET_ERR_MESSAGE_TOO_BIG } | |
53 }; | |
54 const int kNumFrameHeaderTests = arraysize(kFrameHeaderTests); | |
mmenke
2012/08/02 14:08:22
These should still be in the anonymous namespace.
Takashi Toyoshima
2012/08/03 05:53:14
Ah, sorry. I misunderstand your first comment.
Do
mmenke
2012/08/03 14:22:02
Yes, that's exactly what I meant.
Come to think o
| |
55 | |
56 | |
56 TEST(WebSocketFrameParserTest, DecodeNormalFrame) { | 57 TEST(WebSocketFrameParserTest, DecodeNormalFrame) { |
57 WebSocketFrameParser parser; | 58 WebSocketFrameParser parser; |
58 | 59 |
59 ScopedVector<WebSocketFrameChunk> frames; | 60 ScopedVector<WebSocketFrameChunk> frames; |
60 EXPECT_TRUE(parser.Decode(kHelloFrame, kHelloFrameLength, &frames)); | 61 EXPECT_TRUE(parser.Decode(kHelloFrame, kHelloFrameLength, &frames)); |
61 EXPECT_FALSE(parser.failed()); | 62 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); |
62 ASSERT_EQ(1u, frames.size()); | 63 ASSERT_EQ(1u, frames.size()); |
63 WebSocketFrameChunk* frame = frames[0]; | 64 WebSocketFrameChunk* frame = frames[0]; |
64 ASSERT_TRUE(frame != NULL); | 65 ASSERT_TRUE(frame != NULL); |
65 const WebSocketFrameHeader* header = frame->header.get(); | 66 const WebSocketFrameHeader* header = frame->header.get(); |
66 EXPECT_TRUE(header != NULL); | 67 EXPECT_TRUE(header != NULL); |
67 if (header) { | 68 if (header) { |
68 EXPECT_TRUE(header->final); | 69 EXPECT_TRUE(header->final); |
69 EXPECT_FALSE(header->reserved1); | 70 EXPECT_FALSE(header->reserved1); |
70 EXPECT_FALSE(header->reserved2); | 71 EXPECT_FALSE(header->reserved2); |
71 EXPECT_FALSE(header->reserved3); | 72 EXPECT_FALSE(header->reserved3); |
72 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); | 73 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); |
73 EXPECT_FALSE(header->masked); | 74 EXPECT_FALSE(header->masked); |
74 EXPECT_EQ(kHelloLength, header->payload_length); | 75 EXPECT_EQ(kHelloLength, header->payload_length); |
75 } | 76 } |
76 EXPECT_TRUE(frame->final_chunk); | 77 EXPECT_TRUE(frame->final_chunk); |
77 | 78 |
78 ASSERT_EQ(static_cast<int>(kHelloLength), frame->data->size()); | 79 ASSERT_EQ(static_cast<int>(kHelloLength), frame->data->size()); |
79 EXPECT_TRUE(std::equal(kHello, kHello + kHelloLength, frame->data->data())); | 80 EXPECT_TRUE(std::equal(kHello, kHello + kHelloLength, frame->data->data())); |
80 } | 81 } |
81 | 82 |
82 TEST(WebSocketFrameParserTest, DecodeMaskedFrame) { | 83 TEST(WebSocketFrameParserTest, DecodeMaskedFrame) { |
83 WebSocketFrameParser parser; | 84 WebSocketFrameParser parser; |
84 | 85 |
85 ScopedVector<WebSocketFrameChunk> frames; | 86 ScopedVector<WebSocketFrameChunk> frames; |
86 EXPECT_TRUE(parser.Decode(kMaskedHelloFrame, kMaskedHelloFrameLength, | 87 EXPECT_TRUE(parser.Decode(kMaskedHelloFrame, kMaskedHelloFrameLength, |
87 &frames)); | 88 &frames)); |
88 EXPECT_FALSE(parser.failed()); | 89 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); |
89 ASSERT_EQ(1u, frames.size()); | 90 ASSERT_EQ(1u, frames.size()); |
90 WebSocketFrameChunk* frame = frames[0]; | 91 WebSocketFrameChunk* frame = frames[0]; |
91 ASSERT_TRUE(frame != NULL); | 92 ASSERT_TRUE(frame != NULL); |
92 const WebSocketFrameHeader* header = frame->header.get(); | 93 const WebSocketFrameHeader* header = frame->header.get(); |
93 EXPECT_TRUE(header != NULL); | 94 EXPECT_TRUE(header != NULL); |
94 if (header) { | 95 if (header) { |
95 EXPECT_TRUE(header->final); | 96 EXPECT_TRUE(header->final); |
96 EXPECT_FALSE(header->reserved1); | 97 EXPECT_FALSE(header->reserved1); |
97 EXPECT_FALSE(header->reserved2); | 98 EXPECT_FALSE(header->reserved2); |
98 EXPECT_FALSE(header->reserved3); | 99 EXPECT_FALSE(header->reserved3); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
136 for (int i = 0; i < kNumInputs; ++i) { | 137 for (int i = 0; i < kNumInputs; ++i) { |
137 input.insert(input.end(), | 138 input.insert(input.end(), |
138 kInputs[i].frame, | 139 kInputs[i].frame, |
139 kInputs[i].frame + kInputs[i].frame_length); | 140 kInputs[i].frame + kInputs[i].frame_length); |
140 } | 141 } |
141 | 142 |
142 WebSocketFrameParser parser; | 143 WebSocketFrameParser parser; |
143 | 144 |
144 ScopedVector<WebSocketFrameChunk> frames; | 145 ScopedVector<WebSocketFrameChunk> frames; |
145 EXPECT_TRUE(parser.Decode(&input.front(), input.size(), &frames)); | 146 EXPECT_TRUE(parser.Decode(&input.front(), input.size(), &frames)); |
146 EXPECT_FALSE(parser.failed()); | 147 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); |
147 ASSERT_EQ(static_cast<size_t>(kNumInputs), frames.size()); | 148 ASSERT_EQ(static_cast<size_t>(kNumInputs), frames.size()); |
148 | 149 |
149 for (int i = 0; i < kNumInputs; ++i) { | 150 for (int i = 0; i < kNumInputs; ++i) { |
150 WebSocketFrameChunk* frame = frames[i]; | 151 WebSocketFrameChunk* frame = frames[i]; |
151 EXPECT_TRUE(frame != NULL); | 152 EXPECT_TRUE(frame != NULL); |
152 if (!frame) | 153 if (!frame) |
153 continue; | 154 continue; |
154 EXPECT_TRUE(frame->final_chunk); | 155 EXPECT_TRUE(frame->final_chunk); |
155 ASSERT_EQ(kInputs[i].expected_payload_length, | 156 ASSERT_EQ(kInputs[i].expected_payload_length, |
156 static_cast<uint64>(frame->data->size())); | 157 static_cast<uint64>(frame->data->size())); |
(...skipping 25 matching lines...) Expand all Loading... | |
182 std::vector<char> input2(kHelloFrame + input1.size(), | 183 std::vector<char> input2(kHelloFrame + input1.size(), |
183 kHelloFrame + kHelloFrameLength); | 184 kHelloFrame + kHelloFrameLength); |
184 | 185 |
185 std::vector<char> expected1(kHello, kHello + cutting_pos); | 186 std::vector<char> expected1(kHello, kHello + cutting_pos); |
186 std::vector<char> expected2(kHello + cutting_pos, kHello + kHelloLength); | 187 std::vector<char> expected2(kHello + cutting_pos, kHello + kHelloLength); |
187 | 188 |
188 WebSocketFrameParser parser; | 189 WebSocketFrameParser parser; |
189 | 190 |
190 ScopedVector<WebSocketFrameChunk> frames1; | 191 ScopedVector<WebSocketFrameChunk> frames1; |
191 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1)); | 192 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1)); |
192 EXPECT_FALSE(parser.failed()); | 193 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); |
193 EXPECT_EQ(1u, frames1.size()); | 194 EXPECT_EQ(1u, frames1.size()); |
194 if (frames1.size() != 1u) | 195 if (frames1.size() != 1u) |
195 continue; | 196 continue; |
196 WebSocketFrameChunk* frame1 = frames1[0]; | 197 WebSocketFrameChunk* frame1 = frames1[0]; |
197 EXPECT_TRUE(frame1 != NULL); | 198 EXPECT_TRUE(frame1 != NULL); |
198 if (!frame1) | 199 if (!frame1) |
199 continue; | 200 continue; |
200 EXPECT_FALSE(frame1->final_chunk); | 201 EXPECT_FALSE(frame1->final_chunk); |
201 if (expected1.size() == 0) { | 202 if (expected1.size() == 0) { |
202 EXPECT_EQ(NULL, frame1->data.get()); | 203 EXPECT_EQ(NULL, frame1->data.get()); |
(...skipping 10 matching lines...) Expand all Loading... | |
213 EXPECT_TRUE(header1->final); | 214 EXPECT_TRUE(header1->final); |
214 EXPECT_FALSE(header1->reserved1); | 215 EXPECT_FALSE(header1->reserved1); |
215 EXPECT_FALSE(header1->reserved2); | 216 EXPECT_FALSE(header1->reserved2); |
216 EXPECT_FALSE(header1->reserved3); | 217 EXPECT_FALSE(header1->reserved3); |
217 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode); | 218 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode); |
218 EXPECT_FALSE(header1->masked); | 219 EXPECT_FALSE(header1->masked); |
219 EXPECT_EQ(kHelloLength, header1->payload_length); | 220 EXPECT_EQ(kHelloLength, header1->payload_length); |
220 | 221 |
221 ScopedVector<WebSocketFrameChunk> frames2; | 222 ScopedVector<WebSocketFrameChunk> frames2; |
222 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2)); | 223 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2)); |
223 EXPECT_FALSE(parser.failed()); | 224 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); |
224 EXPECT_EQ(1u, frames2.size()); | 225 EXPECT_EQ(1u, frames2.size()); |
225 if (frames2.size() != 1u) | 226 if (frames2.size() != 1u) |
226 continue; | 227 continue; |
227 WebSocketFrameChunk* frame2 = frames2[0]; | 228 WebSocketFrameChunk* frame2 = frames2[0]; |
228 EXPECT_TRUE(frame2 != NULL); | 229 EXPECT_TRUE(frame2 != NULL); |
229 if (!frame2) | 230 if (!frame2) |
230 continue; | 231 continue; |
231 EXPECT_TRUE(frame2->final_chunk); | 232 EXPECT_TRUE(frame2->final_chunk); |
232 if (expected2.size() == 0) { | 233 if (expected2.size() == 0) { |
233 EXPECT_EQ(NULL, frame2->data.get()); | 234 EXPECT_EQ(NULL, frame2->data.get()); |
(...skipping 18 matching lines...) Expand all Loading... | |
252 std::vector<char> input2(kMaskedHelloFrame + input1.size(), | 253 std::vector<char> input2(kMaskedHelloFrame + input1.size(), |
253 kMaskedHelloFrame + kMaskedHelloFrameLength); | 254 kMaskedHelloFrame + kMaskedHelloFrameLength); |
254 | 255 |
255 std::vector<char> expected1(kHello, kHello + cutting_pos); | 256 std::vector<char> expected1(kHello, kHello + cutting_pos); |
256 std::vector<char> expected2(kHello + cutting_pos, kHello + kHelloLength); | 257 std::vector<char> expected2(kHello + cutting_pos, kHello + kHelloLength); |
257 | 258 |
258 WebSocketFrameParser parser; | 259 WebSocketFrameParser parser; |
259 | 260 |
260 ScopedVector<WebSocketFrameChunk> frames1; | 261 ScopedVector<WebSocketFrameChunk> frames1; |
261 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1)); | 262 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1)); |
262 EXPECT_FALSE(parser.failed()); | 263 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); |
263 EXPECT_EQ(1u, frames1.size()); | 264 EXPECT_EQ(1u, frames1.size()); |
264 if (frames1.size() != 1u) | 265 if (frames1.size() != 1u) |
265 continue; | 266 continue; |
266 WebSocketFrameChunk* frame1 = frames1[0]; | 267 WebSocketFrameChunk* frame1 = frames1[0]; |
267 EXPECT_TRUE(frame1 != NULL); | 268 EXPECT_TRUE(frame1 != NULL); |
268 if (!frame1) | 269 if (!frame1) |
269 continue; | 270 continue; |
270 EXPECT_FALSE(frame1->final_chunk); | 271 EXPECT_FALSE(frame1->final_chunk); |
271 if (expected1.size() == 0) { | 272 if (expected1.size() == 0) { |
272 EXPECT_EQ(NULL, frame1->data.get()); | 273 EXPECT_EQ(NULL, frame1->data.get()); |
(...skipping 10 matching lines...) Expand all Loading... | |
283 EXPECT_TRUE(header1->final); | 284 EXPECT_TRUE(header1->final); |
284 EXPECT_FALSE(header1->reserved1); | 285 EXPECT_FALSE(header1->reserved1); |
285 EXPECT_FALSE(header1->reserved2); | 286 EXPECT_FALSE(header1->reserved2); |
286 EXPECT_FALSE(header1->reserved3); | 287 EXPECT_FALSE(header1->reserved3); |
287 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode); | 288 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode); |
288 EXPECT_TRUE(header1->masked); | 289 EXPECT_TRUE(header1->masked); |
289 EXPECT_EQ(kHelloLength, header1->payload_length); | 290 EXPECT_EQ(kHelloLength, header1->payload_length); |
290 | 291 |
291 ScopedVector<WebSocketFrameChunk> frames2; | 292 ScopedVector<WebSocketFrameChunk> frames2; |
292 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2)); | 293 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2)); |
293 EXPECT_FALSE(parser.failed()); | 294 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); |
294 EXPECT_EQ(1u, frames2.size()); | 295 EXPECT_EQ(1u, frames2.size()); |
295 if (frames2.size() != 1u) | 296 if (frames2.size() != 1u) |
296 continue; | 297 continue; |
297 WebSocketFrameChunk* frame2 = frames2[0]; | 298 WebSocketFrameChunk* frame2 = frames2[0]; |
298 EXPECT_TRUE(frame2 != NULL); | 299 EXPECT_TRUE(frame2 != NULL); |
299 if (!frame2) | 300 if (!frame2) |
300 continue; | 301 continue; |
301 EXPECT_TRUE(frame2->final_chunk); | 302 EXPECT_TRUE(frame2->final_chunk); |
302 if (expected2.size() == 0) { | 303 if (expected2.size() == 0) { |
303 EXPECT_EQ(NULL, frame2->data.get()); | 304 EXPECT_EQ(NULL, frame2->data.get()); |
(...skipping 18 matching lines...) Expand all Loading... | |
322 // Limit the payload size not to flood the console on failure. | 323 // Limit the payload size not to flood the console on failure. |
323 static const uint64 kMaxPayloadSize = 200; | 324 static const uint64 kMaxPayloadSize = 200; |
324 uint64 input_payload_size = std::min(frame_length, kMaxPayloadSize); | 325 uint64 input_payload_size = std::min(frame_length, kMaxPayloadSize); |
325 input.insert(input.end(), input_payload_size, 'a'); | 326 input.insert(input.end(), input_payload_size, 'a'); |
326 | 327 |
327 WebSocketFrameParser parser; | 328 WebSocketFrameParser parser; |
328 | 329 |
329 ScopedVector<WebSocketFrameChunk> frames; | 330 ScopedVector<WebSocketFrameChunk> frames; |
330 EXPECT_EQ(!kFrameHeaderTests[i].failed, | 331 EXPECT_EQ(!kFrameHeaderTests[i].failed, |
331 parser.Decode(&input.front(), input.size(), &frames)); | 332 parser.Decode(&input.front(), input.size(), &frames)); |
332 EXPECT_EQ(kFrameHeaderTests[i].failed, parser.failed()); | 333 EXPECT_EQ(kFrameHeaderTests[i].error_code, parser.websocket_error()); |
333 if (kFrameHeaderTests[i].failed) { | 334 if (kFrameHeaderTests[i].failed) { |
334 EXPECT_EQ(0u, frames.size()); | 335 EXPECT_EQ(0u, frames.size()); |
335 } else { | 336 } else { |
336 EXPECT_EQ(1u, frames.size()); | 337 EXPECT_EQ(1u, frames.size()); |
337 } | 338 } |
338 if (frames.size() != 1u) | 339 if (frames.size() != 1u) |
339 continue; | 340 continue; |
340 WebSocketFrameChunk* frame = frames[0]; | 341 WebSocketFrameChunk* frame = frames[0]; |
341 EXPECT_TRUE(frame != NULL); | 342 EXPECT_TRUE(frame != NULL); |
342 if (!frame) | 343 if (!frame) |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
379 | 380 |
380 WebSocketFrameParser parser; | 381 WebSocketFrameParser parser; |
381 | 382 |
382 ScopedVector<WebSocketFrameChunk> frames; | 383 ScopedVector<WebSocketFrameChunk> frames; |
383 // Feed each byte to the parser to see if the parser behaves correctly | 384 // Feed each byte to the parser to see if the parser behaves correctly |
384 // when it receives partial frame header. | 385 // when it receives partial frame header. |
385 size_t last_byte_offset = frame_header_length - 1; | 386 size_t last_byte_offset = frame_header_length - 1; |
386 for (size_t j = 0; j < frame_header_length; ++j) { | 387 for (size_t j = 0; j < frame_header_length; ++j) { |
387 bool failed = kFrameHeaderTests[i].failed && j == last_byte_offset; | 388 bool failed = kFrameHeaderTests[i].failed && j == last_byte_offset; |
388 EXPECT_EQ(!failed, parser.Decode(frame_header + j, 1, &frames)); | 389 EXPECT_EQ(!failed, parser.Decode(frame_header + j, 1, &frames)); |
389 EXPECT_EQ(failed, parser.failed()); | 390 if (failed) { |
390 if (!kFrameHeaderTests[i].failed && j == last_byte_offset) | 391 EXPECT_EQ(kFrameHeaderTests[i].error_code, parser.websocket_error()); |
392 } else { | |
393 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); | |
394 } | |
395 if (!kFrameHeaderTests[i].failed && j == last_byte_offset) { | |
391 EXPECT_EQ(1u, frames.size()); | 396 EXPECT_EQ(1u, frames.size()); |
392 else | 397 } else { |
393 EXPECT_EQ(0u, frames.size()); | 398 EXPECT_EQ(0u, frames.size()); |
399 } | |
394 } | 400 } |
395 if (frames.size() != 1u) | 401 if (frames.size() != 1u) |
396 continue; | 402 continue; |
397 WebSocketFrameChunk* frame = frames[0]; | 403 WebSocketFrameChunk* frame = frames[0]; |
398 EXPECT_TRUE(frame != NULL); | 404 EXPECT_TRUE(frame != NULL); |
399 if (!frame) | 405 if (!frame) |
400 continue; | 406 continue; |
401 if (frame_length == 0u) { | 407 if (frame_length == 0u) { |
402 EXPECT_TRUE(frame->final_chunk); | 408 EXPECT_TRUE(frame->final_chunk); |
403 } else { | 409 } else { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
435 }; | 441 }; |
436 static const int kNumTests = ARRAYSIZE_UNSAFE(kTests); | 442 static const int kNumTests = ARRAYSIZE_UNSAFE(kTests); |
437 | 443 |
438 for (int i = 0; i < kNumTests; ++i) { | 444 for (int i = 0; i < kNumTests; ++i) { |
439 const char* frame_header = kTests[i].frame_header; | 445 const char* frame_header = kTests[i].frame_header; |
440 size_t frame_header_length = kTests[i].frame_header_length; | 446 size_t frame_header_length = kTests[i].frame_header_length; |
441 | 447 |
442 WebSocketFrameParser parser; | 448 WebSocketFrameParser parser; |
443 | 449 |
444 ScopedVector<WebSocketFrameChunk> frames; | 450 ScopedVector<WebSocketFrameChunk> frames; |
445 EXPECT_FALSE(parser.failed()); | 451 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); |
446 EXPECT_FALSE(parser.Decode(frame_header, frame_header_length, &frames)); | 452 EXPECT_FALSE(parser.Decode(frame_header, frame_header_length, &frames)); |
447 EXPECT_TRUE(parser.failed()); | 453 EXPECT_EQ(WEB_SOCKET_ERR_PROTOCOL_ERROR, parser.websocket_error()); |
448 EXPECT_EQ(0u, frames.size()); | 454 EXPECT_EQ(0u, frames.size()); |
449 | 455 |
450 // Once the parser has failed, it no longer accepts any input (even if | 456 // Once the parser has failed, it no longer accepts any input (even if |
451 // the input is empty). | 457 // the input is empty). |
452 EXPECT_FALSE(parser.Decode("", 0, &frames)); | 458 EXPECT_FALSE(parser.Decode("", 0, &frames)); |
453 EXPECT_TRUE(parser.failed()); | 459 EXPECT_EQ(WEB_SOCKET_ERR_PROTOCOL_ERROR, parser.websocket_error()); |
454 EXPECT_EQ(0u, frames.size()); | 460 EXPECT_EQ(0u, frames.size()); |
455 } | 461 } |
456 } | 462 } |
457 | 463 |
458 TEST(WebSocketFrameParserTest, FrameTypes) { | 464 TEST(WebSocketFrameParserTest, FrameTypes) { |
459 struct TestCase { | 465 struct TestCase { |
460 const char* frame_header; | 466 const char* frame_header; |
461 size_t frame_header_length; | 467 size_t frame_header_length; |
462 WebSocketFrameHeader::OpCode opcode; | 468 WebSocketFrameHeader::OpCode opcode; |
463 }; | 469 }; |
(...skipping 21 matching lines...) Expand all Loading... | |
485 | 491 |
486 for (int i = 0; i < kNumTests; ++i) { | 492 for (int i = 0; i < kNumTests; ++i) { |
487 const char* frame_header = kTests[i].frame_header; | 493 const char* frame_header = kTests[i].frame_header; |
488 size_t frame_header_length = kTests[i].frame_header_length; | 494 size_t frame_header_length = kTests[i].frame_header_length; |
489 WebSocketFrameHeader::OpCode opcode = kTests[i].opcode; | 495 WebSocketFrameHeader::OpCode opcode = kTests[i].opcode; |
490 | 496 |
491 WebSocketFrameParser parser; | 497 WebSocketFrameParser parser; |
492 | 498 |
493 ScopedVector<WebSocketFrameChunk> frames; | 499 ScopedVector<WebSocketFrameChunk> frames; |
494 EXPECT_TRUE(parser.Decode(frame_header, frame_header_length, &frames)); | 500 EXPECT_TRUE(parser.Decode(frame_header, frame_header_length, &frames)); |
495 EXPECT_FALSE(parser.failed()); | 501 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); |
496 EXPECT_EQ(1u, frames.size()); | 502 EXPECT_EQ(1u, frames.size()); |
497 if (frames.size() != 1u) | 503 if (frames.size() != 1u) |
498 continue; | 504 continue; |
499 WebSocketFrameChunk* frame = frames[0]; | 505 WebSocketFrameChunk* frame = frames[0]; |
500 EXPECT_TRUE(frame != NULL); | 506 EXPECT_TRUE(frame != NULL); |
501 if (!frame) | 507 if (!frame) |
502 continue; | 508 continue; |
503 EXPECT_TRUE(frame->final_chunk); | 509 EXPECT_TRUE(frame->final_chunk); |
504 EXPECT_EQ(NULL, frame->data.get()); | 510 EXPECT_EQ(NULL, frame->data.get()); |
505 const WebSocketFrameHeader* header = frame->header.get(); | 511 const WebSocketFrameHeader* header = frame->header.get(); |
506 EXPECT_TRUE(header != NULL); | 512 EXPECT_TRUE(header != NULL); |
507 if (!header) | 513 if (!header) |
508 continue; | 514 continue; |
509 EXPECT_TRUE(header->final); | 515 EXPECT_TRUE(header->final); |
510 EXPECT_FALSE(header->reserved1); | 516 EXPECT_FALSE(header->reserved1); |
511 EXPECT_FALSE(header->reserved2); | 517 EXPECT_FALSE(header->reserved2); |
512 EXPECT_FALSE(header->reserved3); | 518 EXPECT_FALSE(header->reserved3); |
513 EXPECT_EQ(opcode, header->opcode); | 519 EXPECT_EQ(opcode, header->opcode); |
514 EXPECT_FALSE(header->masked); | 520 EXPECT_FALSE(header->masked); |
515 EXPECT_EQ(0u, header->payload_length); | 521 EXPECT_EQ(0u, header->payload_length); |
516 }; | 522 } |
517 } | 523 } |
518 | 524 |
519 TEST(WebSocketFrameParserTest, FinalBitAndReservedBits) { | 525 TEST(WebSocketFrameParserTest, FinalBitAndReservedBits) { |
520 struct TestCase { | 526 struct TestCase { |
521 const char* frame_header; | 527 const char* frame_header; |
522 size_t frame_header_length; | 528 size_t frame_header_length; |
523 bool final; | 529 bool final; |
524 bool reserved1; | 530 bool reserved1; |
525 bool reserved2; | 531 bool reserved2; |
526 bool reserved3; | 532 bool reserved3; |
(...skipping 14 matching lines...) Expand all Loading... | |
541 size_t frame_header_length = kTests[i].frame_header_length; | 547 size_t frame_header_length = kTests[i].frame_header_length; |
542 bool final = kTests[i].final; | 548 bool final = kTests[i].final; |
543 bool reserved1 = kTests[i].reserved1; | 549 bool reserved1 = kTests[i].reserved1; |
544 bool reserved2 = kTests[i].reserved2; | 550 bool reserved2 = kTests[i].reserved2; |
545 bool reserved3 = kTests[i].reserved3; | 551 bool reserved3 = kTests[i].reserved3; |
546 | 552 |
547 WebSocketFrameParser parser; | 553 WebSocketFrameParser parser; |
548 | 554 |
549 ScopedVector<WebSocketFrameChunk> frames; | 555 ScopedVector<WebSocketFrameChunk> frames; |
550 EXPECT_TRUE(parser.Decode(frame_header, frame_header_length, &frames)); | 556 EXPECT_TRUE(parser.Decode(frame_header, frame_header_length, &frames)); |
551 EXPECT_FALSE(parser.failed()); | 557 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); |
552 EXPECT_EQ(1u, frames.size()); | 558 EXPECT_EQ(1u, frames.size()); |
553 if (frames.size() != 1u) | 559 if (frames.size() != 1u) |
554 continue; | 560 continue; |
555 WebSocketFrameChunk* frame = frames[0]; | 561 WebSocketFrameChunk* frame = frames[0]; |
556 EXPECT_TRUE(frame != NULL); | 562 EXPECT_TRUE(frame != NULL); |
557 if (!frame) | 563 if (!frame) |
558 continue; | 564 continue; |
559 EXPECT_TRUE(frame->final_chunk); | 565 EXPECT_TRUE(frame->final_chunk); |
560 EXPECT_EQ(NULL, frame->data.get()); | 566 EXPECT_EQ(NULL, frame->data.get()); |
561 const WebSocketFrameHeader* header = frame->header.get(); | 567 const WebSocketFrameHeader* header = frame->header.get(); |
562 EXPECT_TRUE(header != NULL); | 568 EXPECT_TRUE(header != NULL); |
563 if (!header) | 569 if (!header) |
564 continue; | 570 continue; |
565 EXPECT_EQ(final, header->final); | 571 EXPECT_EQ(final, header->final); |
566 EXPECT_EQ(reserved1, header->reserved1); | 572 EXPECT_EQ(reserved1, header->reserved1); |
567 EXPECT_EQ(reserved2, header->reserved2); | 573 EXPECT_EQ(reserved2, header->reserved2); |
568 EXPECT_EQ(reserved3, header->reserved3); | 574 EXPECT_EQ(reserved3, header->reserved3); |
569 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); | 575 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); |
570 EXPECT_FALSE(header->masked); | 576 EXPECT_FALSE(header->masked); |
571 EXPECT_EQ(0u, header->payload_length); | 577 EXPECT_EQ(0u, header->payload_length); |
572 } | 578 } |
573 } | 579 } |
574 | 580 |
575 } // namespace net | 581 } // namespace net |
OLD | NEW |