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