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 17 matching lines...) Expand all Loading... |
28 const uint64 kMaskedHelloFrameLength = arraysize(kMaskedHelloFrame) - 1; | 28 const uint64 kMaskedHelloFrameLength = arraysize(kMaskedHelloFrame) - 1; |
29 | 29 |
30 struct FrameHeaderTestCase { | 30 struct FrameHeaderTestCase { |
31 const char* frame_header; | 31 const char* frame_header; |
32 size_t frame_header_length; | 32 size_t frame_header_length; |
33 uint64 frame_length; | 33 uint64 frame_length; |
34 WebSocketError error_code; | 34 WebSocketError error_code; |
35 }; | 35 }; |
36 | 36 |
37 const FrameHeaderTestCase kFrameHeaderTests[] = { | 37 const FrameHeaderTestCase kFrameHeaderTests[] = { |
38 { "\x81\x00", 2, GG_UINT64_C(0), WEB_SOCKET_OK }, | 38 { "\x81\x00", 2, GG_UINT64_C(0), kWebSocketNormalClosure }, |
39 { "\x81\x7D", 2, GG_UINT64_C(125), WEB_SOCKET_OK }, | 39 { "\x81\x7D", 2, GG_UINT64_C(125), kWebSocketNormalClosure }, |
40 { "\x81\x7E\x00\x7E", 4, GG_UINT64_C(126), WEB_SOCKET_OK }, | 40 { "\x81\x7E\x00\x7E", 4, GG_UINT64_C(126), kWebSocketNormalClosure }, |
41 { "\x81\x7E\xFF\xFF", 4, GG_UINT64_C(0xFFFF), WEB_SOCKET_OK }, | 41 { "\x81\x7E\xFF\xFF", 4, GG_UINT64_C(0xFFFF), kWebSocketNormalClosure }, |
42 { "\x81\x7F\x00\x00\x00\x00\x00\x01\x00\x00", 10, GG_UINT64_C(0x10000), | 42 { "\x81\x7F\x00\x00\x00\x00\x00\x01\x00\x00", 10, GG_UINT64_C(0x10000), |
43 WEB_SOCKET_OK }, | 43 kWebSocketNormalClosure }, |
44 { "\x81\x7F\x00\x00\x00\x00\x7F\xFF\xFF\xFF", 10, GG_UINT64_C(0x7FFFFFFF), | 44 { "\x81\x7F\x00\x00\x00\x00\x7F\xFF\xFF\xFF", 10, GG_UINT64_C(0x7FFFFFFF), |
45 WEB_SOCKET_OK }, | 45 kWebSocketNormalClosure }, |
46 { "\x81\x7F\x00\x00\x00\x00\x80\x00\x00\x00", 10, GG_UINT64_C(0x80000000), | 46 { "\x81\x7F\x00\x00\x00\x00\x80\x00\x00\x00", 10, GG_UINT64_C(0x80000000), |
47 WEB_SOCKET_ERR_MESSAGE_TOO_BIG }, | 47 kWebSocketErrorMessageTooBig }, |
48 { "\x81\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 10, | 48 { "\x81\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 10, |
49 GG_UINT64_C(0x7FFFFFFFFFFFFFFF), WEB_SOCKET_ERR_MESSAGE_TOO_BIG } | 49 GG_UINT64_C(0x7FFFFFFFFFFFFFFF), kWebSocketErrorMessageTooBig } |
50 }; | 50 }; |
51 const int kNumFrameHeaderTests = arraysize(kFrameHeaderTests); | 51 const int kNumFrameHeaderTests = arraysize(kFrameHeaderTests); |
52 | 52 |
53 TEST(WebSocketFrameParserTest, DecodeNormalFrame) { | 53 TEST(WebSocketFrameParserTest, DecodeNormalFrame) { |
54 WebSocketFrameParser parser; | 54 WebSocketFrameParser parser; |
55 | 55 |
56 ScopedVector<WebSocketFrameChunk> frames; | 56 ScopedVector<WebSocketFrameChunk> frames; |
57 EXPECT_TRUE(parser.Decode(kHelloFrame, kHelloFrameLength, &frames)); | 57 EXPECT_TRUE(parser.Decode(kHelloFrame, kHelloFrameLength, &frames)); |
58 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); | 58 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); |
59 ASSERT_EQ(1u, frames.size()); | 59 ASSERT_EQ(1u, frames.size()); |
60 WebSocketFrameChunk* frame = frames[0]; | 60 WebSocketFrameChunk* frame = frames[0]; |
61 ASSERT_TRUE(frame != NULL); | 61 ASSERT_TRUE(frame != NULL); |
62 const WebSocketFrameHeader* header = frame->header.get(); | 62 const WebSocketFrameHeader* header = frame->header.get(); |
63 EXPECT_TRUE(header != NULL); | 63 EXPECT_TRUE(header != NULL); |
64 if (header) { | 64 if (header) { |
65 EXPECT_TRUE(header->final); | 65 EXPECT_TRUE(header->final); |
66 EXPECT_FALSE(header->reserved1); | 66 EXPECT_FALSE(header->reserved1); |
67 EXPECT_FALSE(header->reserved2); | 67 EXPECT_FALSE(header->reserved2); |
68 EXPECT_FALSE(header->reserved3); | 68 EXPECT_FALSE(header->reserved3); |
69 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); | 69 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); |
70 EXPECT_FALSE(header->masked); | 70 EXPECT_FALSE(header->masked); |
71 EXPECT_EQ(kHelloLength, header->payload_length); | 71 EXPECT_EQ(kHelloLength, header->payload_length); |
72 } | 72 } |
73 EXPECT_TRUE(frame->final_chunk); | 73 EXPECT_TRUE(frame->final_chunk); |
74 | 74 |
75 ASSERT_EQ(static_cast<int>(kHelloLength), frame->data->size()); | 75 ASSERT_EQ(static_cast<int>(kHelloLength), frame->data->size()); |
76 EXPECT_TRUE(std::equal(kHello, kHello + kHelloLength, frame->data->data())); | 76 EXPECT_TRUE(std::equal(kHello, kHello + kHelloLength, frame->data->data())); |
77 } | 77 } |
78 | 78 |
79 TEST(WebSocketFrameParserTest, DecodeMaskedFrame) { | 79 TEST(WebSocketFrameParserTest, DecodeMaskedFrame) { |
80 WebSocketFrameParser parser; | 80 WebSocketFrameParser parser; |
81 | 81 |
82 ScopedVector<WebSocketFrameChunk> frames; | 82 ScopedVector<WebSocketFrameChunk> frames; |
83 EXPECT_TRUE(parser.Decode(kMaskedHelloFrame, kMaskedHelloFrameLength, | 83 EXPECT_TRUE(parser.Decode(kMaskedHelloFrame, kMaskedHelloFrameLength, |
84 &frames)); | 84 &frames)); |
85 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); | 85 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); |
86 ASSERT_EQ(1u, frames.size()); | 86 ASSERT_EQ(1u, frames.size()); |
87 WebSocketFrameChunk* frame = frames[0]; | 87 WebSocketFrameChunk* frame = frames[0]; |
88 ASSERT_TRUE(frame != NULL); | 88 ASSERT_TRUE(frame != NULL); |
89 const WebSocketFrameHeader* header = frame->header.get(); | 89 const WebSocketFrameHeader* header = frame->header.get(); |
90 EXPECT_TRUE(header != NULL); | 90 EXPECT_TRUE(header != NULL); |
91 if (header) { | 91 if (header) { |
92 EXPECT_TRUE(header->final); | 92 EXPECT_TRUE(header->final); |
93 EXPECT_FALSE(header->reserved1); | 93 EXPECT_FALSE(header->reserved1); |
94 EXPECT_FALSE(header->reserved2); | 94 EXPECT_FALSE(header->reserved2); |
95 EXPECT_FALSE(header->reserved3); | 95 EXPECT_FALSE(header->reserved3); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 for (int i = 0; i < kNumInputs; ++i) { | 133 for (int i = 0; i < kNumInputs; ++i) { |
134 input.insert(input.end(), | 134 input.insert(input.end(), |
135 kInputs[i].frame, | 135 kInputs[i].frame, |
136 kInputs[i].frame + kInputs[i].frame_length); | 136 kInputs[i].frame + kInputs[i].frame_length); |
137 } | 137 } |
138 | 138 |
139 WebSocketFrameParser parser; | 139 WebSocketFrameParser parser; |
140 | 140 |
141 ScopedVector<WebSocketFrameChunk> frames; | 141 ScopedVector<WebSocketFrameChunk> frames; |
142 EXPECT_TRUE(parser.Decode(&input.front(), input.size(), &frames)); | 142 EXPECT_TRUE(parser.Decode(&input.front(), input.size(), &frames)); |
143 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); | 143 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); |
144 ASSERT_EQ(static_cast<size_t>(kNumInputs), frames.size()); | 144 ASSERT_EQ(static_cast<size_t>(kNumInputs), frames.size()); |
145 | 145 |
146 for (int i = 0; i < kNumInputs; ++i) { | 146 for (int i = 0; i < kNumInputs; ++i) { |
147 WebSocketFrameChunk* frame = frames[i]; | 147 WebSocketFrameChunk* frame = frames[i]; |
148 EXPECT_TRUE(frame != NULL); | 148 EXPECT_TRUE(frame != NULL); |
149 if (!frame) | 149 if (!frame) |
150 continue; | 150 continue; |
151 EXPECT_TRUE(frame->final_chunk); | 151 EXPECT_TRUE(frame->final_chunk); |
152 ASSERT_EQ(kInputs[i].expected_payload_length, | 152 ASSERT_EQ(kInputs[i].expected_payload_length, |
153 static_cast<uint64>(frame->data->size())); | 153 static_cast<uint64>(frame->data->size())); |
(...skipping 25 matching lines...) Expand all Loading... |
179 std::vector<char> input2(kHelloFrame + input1.size(), | 179 std::vector<char> input2(kHelloFrame + input1.size(), |
180 kHelloFrame + kHelloFrameLength); | 180 kHelloFrame + kHelloFrameLength); |
181 | 181 |
182 std::vector<char> expected1(kHello, kHello + cutting_pos); | 182 std::vector<char> expected1(kHello, kHello + cutting_pos); |
183 std::vector<char> expected2(kHello + cutting_pos, kHello + kHelloLength); | 183 std::vector<char> expected2(kHello + cutting_pos, kHello + kHelloLength); |
184 | 184 |
185 WebSocketFrameParser parser; | 185 WebSocketFrameParser parser; |
186 | 186 |
187 ScopedVector<WebSocketFrameChunk> frames1; | 187 ScopedVector<WebSocketFrameChunk> frames1; |
188 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1)); | 188 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1)); |
189 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); | 189 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); |
190 EXPECT_EQ(1u, frames1.size()); | 190 EXPECT_EQ(1u, frames1.size()); |
191 if (frames1.size() != 1u) | 191 if (frames1.size() != 1u) |
192 continue; | 192 continue; |
193 WebSocketFrameChunk* frame1 = frames1[0]; | 193 WebSocketFrameChunk* frame1 = frames1[0]; |
194 EXPECT_TRUE(frame1 != NULL); | 194 EXPECT_TRUE(frame1 != NULL); |
195 if (!frame1) | 195 if (!frame1) |
196 continue; | 196 continue; |
197 EXPECT_FALSE(frame1->final_chunk); | 197 EXPECT_FALSE(frame1->final_chunk); |
198 if (expected1.size() == 0) { | 198 if (expected1.size() == 0) { |
199 EXPECT_EQ(NULL, frame1->data.get()); | 199 EXPECT_EQ(NULL, frame1->data.get()); |
(...skipping 10 matching lines...) Expand all Loading... |
210 EXPECT_TRUE(header1->final); | 210 EXPECT_TRUE(header1->final); |
211 EXPECT_FALSE(header1->reserved1); | 211 EXPECT_FALSE(header1->reserved1); |
212 EXPECT_FALSE(header1->reserved2); | 212 EXPECT_FALSE(header1->reserved2); |
213 EXPECT_FALSE(header1->reserved3); | 213 EXPECT_FALSE(header1->reserved3); |
214 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode); | 214 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode); |
215 EXPECT_FALSE(header1->masked); | 215 EXPECT_FALSE(header1->masked); |
216 EXPECT_EQ(kHelloLength, header1->payload_length); | 216 EXPECT_EQ(kHelloLength, header1->payload_length); |
217 | 217 |
218 ScopedVector<WebSocketFrameChunk> frames2; | 218 ScopedVector<WebSocketFrameChunk> frames2; |
219 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2)); | 219 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2)); |
220 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); | 220 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); |
221 EXPECT_EQ(1u, frames2.size()); | 221 EXPECT_EQ(1u, frames2.size()); |
222 if (frames2.size() != 1u) | 222 if (frames2.size() != 1u) |
223 continue; | 223 continue; |
224 WebSocketFrameChunk* frame2 = frames2[0]; | 224 WebSocketFrameChunk* frame2 = frames2[0]; |
225 EXPECT_TRUE(frame2 != NULL); | 225 EXPECT_TRUE(frame2 != NULL); |
226 if (!frame2) | 226 if (!frame2) |
227 continue; | 227 continue; |
228 EXPECT_TRUE(frame2->final_chunk); | 228 EXPECT_TRUE(frame2->final_chunk); |
229 if (expected2.size() == 0) { | 229 if (expected2.size() == 0) { |
230 EXPECT_EQ(NULL, frame2->data.get()); | 230 EXPECT_EQ(NULL, frame2->data.get()); |
(...skipping 18 matching lines...) Expand all Loading... |
249 std::vector<char> input2(kMaskedHelloFrame + input1.size(), | 249 std::vector<char> input2(kMaskedHelloFrame + input1.size(), |
250 kMaskedHelloFrame + kMaskedHelloFrameLength); | 250 kMaskedHelloFrame + kMaskedHelloFrameLength); |
251 | 251 |
252 std::vector<char> expected1(kHello, kHello + cutting_pos); | 252 std::vector<char> expected1(kHello, kHello + cutting_pos); |
253 std::vector<char> expected2(kHello + cutting_pos, kHello + kHelloLength); | 253 std::vector<char> expected2(kHello + cutting_pos, kHello + kHelloLength); |
254 | 254 |
255 WebSocketFrameParser parser; | 255 WebSocketFrameParser parser; |
256 | 256 |
257 ScopedVector<WebSocketFrameChunk> frames1; | 257 ScopedVector<WebSocketFrameChunk> frames1; |
258 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1)); | 258 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1)); |
259 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); | 259 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); |
260 EXPECT_EQ(1u, frames1.size()); | 260 EXPECT_EQ(1u, frames1.size()); |
261 if (frames1.size() != 1u) | 261 if (frames1.size() != 1u) |
262 continue; | 262 continue; |
263 WebSocketFrameChunk* frame1 = frames1[0]; | 263 WebSocketFrameChunk* frame1 = frames1[0]; |
264 EXPECT_TRUE(frame1 != NULL); | 264 EXPECT_TRUE(frame1 != NULL); |
265 if (!frame1) | 265 if (!frame1) |
266 continue; | 266 continue; |
267 EXPECT_FALSE(frame1->final_chunk); | 267 EXPECT_FALSE(frame1->final_chunk); |
268 if (expected1.size() == 0) { | 268 if (expected1.size() == 0) { |
269 EXPECT_EQ(NULL, frame1->data.get()); | 269 EXPECT_EQ(NULL, frame1->data.get()); |
(...skipping 10 matching lines...) Expand all Loading... |
280 EXPECT_TRUE(header1->final); | 280 EXPECT_TRUE(header1->final); |
281 EXPECT_FALSE(header1->reserved1); | 281 EXPECT_FALSE(header1->reserved1); |
282 EXPECT_FALSE(header1->reserved2); | 282 EXPECT_FALSE(header1->reserved2); |
283 EXPECT_FALSE(header1->reserved3); | 283 EXPECT_FALSE(header1->reserved3); |
284 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode); | 284 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode); |
285 EXPECT_TRUE(header1->masked); | 285 EXPECT_TRUE(header1->masked); |
286 EXPECT_EQ(kHelloLength, header1->payload_length); | 286 EXPECT_EQ(kHelloLength, header1->payload_length); |
287 | 287 |
288 ScopedVector<WebSocketFrameChunk> frames2; | 288 ScopedVector<WebSocketFrameChunk> frames2; |
289 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2)); | 289 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2)); |
290 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); | 290 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); |
291 EXPECT_EQ(1u, frames2.size()); | 291 EXPECT_EQ(1u, frames2.size()); |
292 if (frames2.size() != 1u) | 292 if (frames2.size() != 1u) |
293 continue; | 293 continue; |
294 WebSocketFrameChunk* frame2 = frames2[0]; | 294 WebSocketFrameChunk* frame2 = frames2[0]; |
295 EXPECT_TRUE(frame2 != NULL); | 295 EXPECT_TRUE(frame2 != NULL); |
296 if (!frame2) | 296 if (!frame2) |
297 continue; | 297 continue; |
298 EXPECT_TRUE(frame2->final_chunk); | 298 EXPECT_TRUE(frame2->final_chunk); |
299 if (expected2.size() == 0) { | 299 if (expected2.size() == 0) { |
300 EXPECT_EQ(NULL, frame2->data.get()); | 300 EXPECT_EQ(NULL, frame2->data.get()); |
(...skipping 16 matching lines...) Expand all Loading... |
317 | 317 |
318 std::vector<char> input(frame_header, frame_header + frame_header_length); | 318 std::vector<char> input(frame_header, frame_header + frame_header_length); |
319 // Limit the payload size not to flood the console on failure. | 319 // Limit the payload size not to flood the console on failure. |
320 static const uint64 kMaxPayloadSize = 200; | 320 static const uint64 kMaxPayloadSize = 200; |
321 uint64 input_payload_size = std::min(frame_length, kMaxPayloadSize); | 321 uint64 input_payload_size = std::min(frame_length, kMaxPayloadSize); |
322 input.insert(input.end(), input_payload_size, 'a'); | 322 input.insert(input.end(), input_payload_size, 'a'); |
323 | 323 |
324 WebSocketFrameParser parser; | 324 WebSocketFrameParser parser; |
325 | 325 |
326 ScopedVector<WebSocketFrameChunk> frames; | 326 ScopedVector<WebSocketFrameChunk> frames; |
327 EXPECT_EQ(kFrameHeaderTests[i].error_code == WEB_SOCKET_OK, | 327 EXPECT_EQ(kFrameHeaderTests[i].error_code == kWebSocketNormalClosure, |
328 parser.Decode(&input.front(), input.size(), &frames)); | 328 parser.Decode(&input.front(), input.size(), &frames)); |
329 EXPECT_EQ(kFrameHeaderTests[i].error_code, parser.websocket_error()); | 329 EXPECT_EQ(kFrameHeaderTests[i].error_code, parser.websocket_error()); |
330 if (kFrameHeaderTests[i].error_code != WEB_SOCKET_OK) { | 330 if (kFrameHeaderTests[i].error_code != kWebSocketNormalClosure) { |
331 EXPECT_EQ(0u, frames.size()); | 331 EXPECT_EQ(0u, frames.size()); |
332 } else { | 332 } else { |
333 EXPECT_EQ(1u, frames.size()); | 333 EXPECT_EQ(1u, frames.size()); |
334 } | 334 } |
335 if (frames.size() != 1u) | 335 if (frames.size() != 1u) |
336 continue; | 336 continue; |
337 WebSocketFrameChunk* frame = frames[0]; | 337 WebSocketFrameChunk* frame = frames[0]; |
338 EXPECT_TRUE(frame != NULL); | 338 EXPECT_TRUE(frame != NULL); |
339 if (!frame) | 339 if (!frame) |
340 continue; | 340 continue; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 size_t frame_header_length = kFrameHeaderTests[i].frame_header_length; | 374 size_t frame_header_length = kFrameHeaderTests[i].frame_header_length; |
375 uint64 frame_length = kFrameHeaderTests[i].frame_length; | 375 uint64 frame_length = kFrameHeaderTests[i].frame_length; |
376 | 376 |
377 WebSocketFrameParser parser; | 377 WebSocketFrameParser parser; |
378 | 378 |
379 ScopedVector<WebSocketFrameChunk> frames; | 379 ScopedVector<WebSocketFrameChunk> frames; |
380 // Feed each byte to the parser to see if the parser behaves correctly | 380 // Feed each byte to the parser to see if the parser behaves correctly |
381 // when it receives partial frame header. | 381 // when it receives partial frame header. |
382 size_t last_byte_offset = frame_header_length - 1; | 382 size_t last_byte_offset = frame_header_length - 1; |
383 for (size_t j = 0; j < frame_header_length; ++j) { | 383 for (size_t j = 0; j < frame_header_length; ++j) { |
384 bool failed = kFrameHeaderTests[i].error_code != WEB_SOCKET_OK && | 384 bool failed = |
| 385 kFrameHeaderTests[i].error_code != kWebSocketNormalClosure && |
385 j == last_byte_offset; | 386 j == last_byte_offset; |
386 EXPECT_EQ(!failed, parser.Decode(frame_header + j, 1, &frames)); | 387 EXPECT_EQ(!failed, parser.Decode(frame_header + j, 1, &frames)); |
387 if (failed) { | 388 if (failed) { |
388 EXPECT_EQ(kFrameHeaderTests[i].error_code, parser.websocket_error()); | 389 EXPECT_EQ(kFrameHeaderTests[i].error_code, parser.websocket_error()); |
389 } else { | 390 } else { |
390 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); | 391 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); |
391 } | 392 } |
392 if (kFrameHeaderTests[i].error_code == WEB_SOCKET_OK && | 393 if (kFrameHeaderTests[i].error_code == kWebSocketNormalClosure && |
393 j == last_byte_offset) { | 394 j == last_byte_offset) { |
394 EXPECT_EQ(1u, frames.size()); | 395 EXPECT_EQ(1u, frames.size()); |
395 } else { | 396 } else { |
396 EXPECT_EQ(0u, frames.size()); | 397 EXPECT_EQ(0u, frames.size()); |
397 } | 398 } |
398 } | 399 } |
399 if (frames.size() != 1u) | 400 if (frames.size() != 1u) |
400 continue; | 401 continue; |
401 WebSocketFrameChunk* frame = frames[0]; | 402 WebSocketFrameChunk* frame = frames[0]; |
402 EXPECT_TRUE(frame != NULL); | 403 EXPECT_TRUE(frame != NULL); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 }; | 440 }; |
440 static const int kNumTests = ARRAYSIZE_UNSAFE(kTests); | 441 static const int kNumTests = ARRAYSIZE_UNSAFE(kTests); |
441 | 442 |
442 for (int i = 0; i < kNumTests; ++i) { | 443 for (int i = 0; i < kNumTests; ++i) { |
443 const char* frame_header = kTests[i].frame_header; | 444 const char* frame_header = kTests[i].frame_header; |
444 size_t frame_header_length = kTests[i].frame_header_length; | 445 size_t frame_header_length = kTests[i].frame_header_length; |
445 | 446 |
446 WebSocketFrameParser parser; | 447 WebSocketFrameParser parser; |
447 | 448 |
448 ScopedVector<WebSocketFrameChunk> frames; | 449 ScopedVector<WebSocketFrameChunk> frames; |
449 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); | 450 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); |
450 EXPECT_FALSE(parser.Decode(frame_header, frame_header_length, &frames)); | 451 EXPECT_FALSE(parser.Decode(frame_header, frame_header_length, &frames)); |
451 EXPECT_EQ(WEB_SOCKET_ERR_PROTOCOL_ERROR, parser.websocket_error()); | 452 EXPECT_EQ(kWebSocketErrorProtocolError, parser.websocket_error()); |
452 EXPECT_EQ(0u, frames.size()); | 453 EXPECT_EQ(0u, frames.size()); |
453 | 454 |
454 // Once the parser has failed, it no longer accepts any input (even if | 455 // Once the parser has failed, it no longer accepts any input (even if |
455 // the input is empty). | 456 // the input is empty). |
456 EXPECT_FALSE(parser.Decode("", 0, &frames)); | 457 EXPECT_FALSE(parser.Decode("", 0, &frames)); |
457 EXPECT_EQ(WEB_SOCKET_ERR_PROTOCOL_ERROR, parser.websocket_error()); | 458 EXPECT_EQ(kWebSocketErrorProtocolError, parser.websocket_error()); |
458 EXPECT_EQ(0u, frames.size()); | 459 EXPECT_EQ(0u, frames.size()); |
459 } | 460 } |
460 } | 461 } |
461 | 462 |
462 TEST(WebSocketFrameParserTest, FrameTypes) { | 463 TEST(WebSocketFrameParserTest, FrameTypes) { |
463 struct TestCase { | 464 struct TestCase { |
464 const char* frame_header; | 465 const char* frame_header; |
465 size_t frame_header_length; | 466 size_t frame_header_length; |
466 WebSocketFrameHeader::OpCode opcode; | 467 WebSocketFrameHeader::OpCode opcode; |
467 }; | 468 }; |
(...skipping 21 matching lines...) Expand all Loading... |
489 | 490 |
490 for (int i = 0; i < kNumTests; ++i) { | 491 for (int i = 0; i < kNumTests; ++i) { |
491 const char* frame_header = kTests[i].frame_header; | 492 const char* frame_header = kTests[i].frame_header; |
492 size_t frame_header_length = kTests[i].frame_header_length; | 493 size_t frame_header_length = kTests[i].frame_header_length; |
493 WebSocketFrameHeader::OpCode opcode = kTests[i].opcode; | 494 WebSocketFrameHeader::OpCode opcode = kTests[i].opcode; |
494 | 495 |
495 WebSocketFrameParser parser; | 496 WebSocketFrameParser parser; |
496 | 497 |
497 ScopedVector<WebSocketFrameChunk> frames; | 498 ScopedVector<WebSocketFrameChunk> frames; |
498 EXPECT_TRUE(parser.Decode(frame_header, frame_header_length, &frames)); | 499 EXPECT_TRUE(parser.Decode(frame_header, frame_header_length, &frames)); |
499 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); | 500 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); |
500 EXPECT_EQ(1u, frames.size()); | 501 EXPECT_EQ(1u, frames.size()); |
501 if (frames.size() != 1u) | 502 if (frames.size() != 1u) |
502 continue; | 503 continue; |
503 WebSocketFrameChunk* frame = frames[0]; | 504 WebSocketFrameChunk* frame = frames[0]; |
504 EXPECT_TRUE(frame != NULL); | 505 EXPECT_TRUE(frame != NULL); |
505 if (!frame) | 506 if (!frame) |
506 continue; | 507 continue; |
507 EXPECT_TRUE(frame->final_chunk); | 508 EXPECT_TRUE(frame->final_chunk); |
508 EXPECT_EQ(NULL, frame->data.get()); | 509 EXPECT_EQ(NULL, frame->data.get()); |
509 const WebSocketFrameHeader* header = frame->header.get(); | 510 const WebSocketFrameHeader* header = frame->header.get(); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 size_t frame_header_length = kTests[i].frame_header_length; | 546 size_t frame_header_length = kTests[i].frame_header_length; |
546 bool final = kTests[i].final; | 547 bool final = kTests[i].final; |
547 bool reserved1 = kTests[i].reserved1; | 548 bool reserved1 = kTests[i].reserved1; |
548 bool reserved2 = kTests[i].reserved2; | 549 bool reserved2 = kTests[i].reserved2; |
549 bool reserved3 = kTests[i].reserved3; | 550 bool reserved3 = kTests[i].reserved3; |
550 | 551 |
551 WebSocketFrameParser parser; | 552 WebSocketFrameParser parser; |
552 | 553 |
553 ScopedVector<WebSocketFrameChunk> frames; | 554 ScopedVector<WebSocketFrameChunk> frames; |
554 EXPECT_TRUE(parser.Decode(frame_header, frame_header_length, &frames)); | 555 EXPECT_TRUE(parser.Decode(frame_header, frame_header_length, &frames)); |
555 EXPECT_EQ(WEB_SOCKET_OK, parser.websocket_error()); | 556 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); |
556 EXPECT_EQ(1u, frames.size()); | 557 EXPECT_EQ(1u, frames.size()); |
557 if (frames.size() != 1u) | 558 if (frames.size() != 1u) |
558 continue; | 559 continue; |
559 WebSocketFrameChunk* frame = frames[0]; | 560 WebSocketFrameChunk* frame = frames[0]; |
560 EXPECT_TRUE(frame != NULL); | 561 EXPECT_TRUE(frame != NULL); |
561 if (!frame) | 562 if (!frame) |
562 continue; | 563 continue; |
563 EXPECT_TRUE(frame->final_chunk); | 564 EXPECT_TRUE(frame->final_chunk); |
564 EXPECT_EQ(NULL, frame->data.get()); | 565 EXPECT_EQ(NULL, frame->data.get()); |
565 const WebSocketFrameHeader* header = frame->header.get(); | 566 const WebSocketFrameHeader* header = frame->header.get(); |
566 EXPECT_TRUE(header != NULL); | 567 EXPECT_TRUE(header != NULL); |
567 if (!header) | 568 if (!header) |
568 continue; | 569 continue; |
569 EXPECT_EQ(final, header->final); | 570 EXPECT_EQ(final, header->final); |
570 EXPECT_EQ(reserved1, header->reserved1); | 571 EXPECT_EQ(reserved1, header->reserved1); |
571 EXPECT_EQ(reserved2, header->reserved2); | 572 EXPECT_EQ(reserved2, header->reserved2); |
572 EXPECT_EQ(reserved3, header->reserved3); | 573 EXPECT_EQ(reserved3, header->reserved3); |
573 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); | 574 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); |
574 EXPECT_FALSE(header->masked); | 575 EXPECT_FALSE(header->masked); |
575 EXPECT_EQ(0u, header->payload_length); | 576 EXPECT_EQ(0u, header->payload_length); |
576 } | 577 } |
577 } | 578 } |
578 | 579 |
579 } // Unnamed namespace | 580 } // Unnamed namespace |
580 | 581 |
581 } // namespace net | 582 } // namespace net |
OLD | NEW |