| 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 |