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

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

Issue 10824081: Add WebSocketError to indicate decoding failure reason (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed, ready for commit Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/websockets/websocket_frame_parser.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/websockets/websocket_frame_parser.h" 5 #include "net/websockets/websocket_frame_parser.h"
6 6
7 #include <algorithm> 7 #include <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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/websockets/websocket_frame_parser.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698