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