| 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 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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( |
| 84 &frames)); | 84 parser.Decode(kMaskedHelloFrame, kMaskedHelloFrameLength, &frames)); |
| 85 EXPECT_EQ(kWebSocketNormalClosure, 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); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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()); |
| 200 } else { | 200 } else { |
| 201 ASSERT_EQ(cutting_pos, static_cast<size_t>(frame1->data->size())); | 201 ASSERT_EQ(cutting_pos, static_cast<size_t>(frame1->data->size())); |
| 202 EXPECT_TRUE(std::equal(expected1.begin(), | 202 EXPECT_TRUE( |
| 203 expected1.end(), | 203 std::equal(expected1.begin(), expected1.end(), frame1->data->data())); |
| 204 frame1->data->data())); | |
| 205 } | 204 } |
| 206 const WebSocketFrameHeader* header1 = frame1->header.get(); | 205 const WebSocketFrameHeader* header1 = frame1->header.get(); |
| 207 EXPECT_TRUE(header1 != NULL); | 206 EXPECT_TRUE(header1 != NULL); |
| 208 if (!header1) | 207 if (!header1) |
| 209 continue; | 208 continue; |
| 210 EXPECT_TRUE(header1->final); | 209 EXPECT_TRUE(header1->final); |
| 211 EXPECT_FALSE(header1->reserved1); | 210 EXPECT_FALSE(header1->reserved1); |
| 212 EXPECT_FALSE(header1->reserved2); | 211 EXPECT_FALSE(header1->reserved2); |
| 213 EXPECT_FALSE(header1->reserved3); | 212 EXPECT_FALSE(header1->reserved3); |
| 214 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode); | 213 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode); |
| 215 EXPECT_FALSE(header1->masked); | 214 EXPECT_FALSE(header1->masked); |
| 216 EXPECT_EQ(kHelloLength, header1->payload_length); | 215 EXPECT_EQ(kHelloLength, header1->payload_length); |
| 217 | 216 |
| 218 ScopedVector<WebSocketFrameChunk> frames2; | 217 ScopedVector<WebSocketFrameChunk> frames2; |
| 219 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2)); | 218 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2)); |
| 220 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); | 219 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); |
| 221 EXPECT_EQ(1u, frames2.size()); | 220 EXPECT_EQ(1u, frames2.size()); |
| 222 if (frames2.size() != 1u) | 221 if (frames2.size() != 1u) |
| 223 continue; | 222 continue; |
| 224 WebSocketFrameChunk* frame2 = frames2[0]; | 223 WebSocketFrameChunk* frame2 = frames2[0]; |
| 225 EXPECT_TRUE(frame2 != NULL); | 224 EXPECT_TRUE(frame2 != NULL); |
| 226 if (!frame2) | 225 if (!frame2) |
| 227 continue; | 226 continue; |
| 228 EXPECT_TRUE(frame2->final_chunk); | 227 EXPECT_TRUE(frame2->final_chunk); |
| 229 if (expected2.size() == 0) { | 228 if (expected2.size() == 0) { |
| 230 EXPECT_EQ(NULL, frame2->data.get()); | 229 EXPECT_EQ(NULL, frame2->data.get()); |
| 231 } else { | 230 } else { |
| 232 ASSERT_EQ(expected2.size(), static_cast<uint64>(frame2->data->size())); | 231 ASSERT_EQ(expected2.size(), static_cast<uint64>(frame2->data->size())); |
| 233 EXPECT_TRUE(std::equal(expected2.begin(), | 232 EXPECT_TRUE( |
| 234 expected2.end(), | 233 std::equal(expected2.begin(), expected2.end(), frame2->data->data())); |
| 235 frame2->data->data())); | |
| 236 } | 234 } |
| 237 const WebSocketFrameHeader* header2 = frame2->header.get(); | 235 const WebSocketFrameHeader* header2 = frame2->header.get(); |
| 238 EXPECT_TRUE(header2 == NULL); | 236 EXPECT_TRUE(header2 == NULL); |
| 239 } | 237 } |
| 240 } | 238 } |
| 241 | 239 |
| 242 TEST(WebSocketFrameParserTest, DecodePartialMaskedFrame) { | 240 TEST(WebSocketFrameParserTest, DecodePartialMaskedFrame) { |
| 243 static const size_t kFrameHeaderSize = 6; | 241 static const size_t kFrameHeaderSize = 6; |
| 244 | 242 |
| 245 for (size_t cutting_pos = 0; cutting_pos < kHelloLength; ++cutting_pos) { | 243 for (size_t cutting_pos = 0; cutting_pos < kHelloLength; ++cutting_pos) { |
| 246 std::vector<char> input1( | 244 std::vector<char> input1( |
| 247 kMaskedHelloFrame, | 245 kMaskedHelloFrame, kMaskedHelloFrame + kFrameHeaderSize + cutting_pos); |
| 248 kMaskedHelloFrame + kFrameHeaderSize + cutting_pos); | |
| 249 std::vector<char> input2(kMaskedHelloFrame + input1.size(), | 246 std::vector<char> input2(kMaskedHelloFrame + input1.size(), |
| 250 kMaskedHelloFrame + kMaskedHelloFrameLength); | 247 kMaskedHelloFrame + kMaskedHelloFrameLength); |
| 251 | 248 |
| 252 std::vector<char> expected1(kHello, kHello + cutting_pos); | 249 std::vector<char> expected1(kHello, kHello + cutting_pos); |
| 253 std::vector<char> expected2(kHello + cutting_pos, kHello + kHelloLength); | 250 std::vector<char> expected2(kHello + cutting_pos, kHello + kHelloLength); |
| 254 | 251 |
| 255 WebSocketFrameParser parser; | 252 WebSocketFrameParser parser; |
| 256 | 253 |
| 257 ScopedVector<WebSocketFrameChunk> frames1; | 254 ScopedVector<WebSocketFrameChunk> frames1; |
| 258 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1)); | 255 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1)); |
| 259 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); | 256 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); |
| 260 EXPECT_EQ(1u, frames1.size()); | 257 EXPECT_EQ(1u, frames1.size()); |
| 261 if (frames1.size() != 1u) | 258 if (frames1.size() != 1u) |
| 262 continue; | 259 continue; |
| 263 WebSocketFrameChunk* frame1 = frames1[0]; | 260 WebSocketFrameChunk* frame1 = frames1[0]; |
| 264 EXPECT_TRUE(frame1 != NULL); | 261 EXPECT_TRUE(frame1 != NULL); |
| 265 if (!frame1) | 262 if (!frame1) |
| 266 continue; | 263 continue; |
| 267 EXPECT_FALSE(frame1->final_chunk); | 264 EXPECT_FALSE(frame1->final_chunk); |
| 268 if (expected1.size() == 0) { | 265 if (expected1.size() == 0) { |
| 269 EXPECT_EQ(NULL, frame1->data.get()); | 266 EXPECT_EQ(NULL, frame1->data.get()); |
| 270 } else { | 267 } else { |
| 271 ASSERT_EQ(expected1.size(), static_cast<uint64>(frame1->data->size())); | 268 ASSERT_EQ(expected1.size(), static_cast<uint64>(frame1->data->size())); |
| 272 EXPECT_TRUE(std::equal(expected1.begin(), | 269 EXPECT_TRUE( |
| 273 expected1.end(), | 270 std::equal(expected1.begin(), expected1.end(), frame1->data->data())); |
| 274 frame1->data->data())); | |
| 275 } | 271 } |
| 276 const WebSocketFrameHeader* header1 = frame1->header.get(); | 272 const WebSocketFrameHeader* header1 = frame1->header.get(); |
| 277 EXPECT_TRUE(header1 != NULL); | 273 EXPECT_TRUE(header1 != NULL); |
| 278 if (!header1) | 274 if (!header1) |
| 279 continue; | 275 continue; |
| 280 EXPECT_TRUE(header1->final); | 276 EXPECT_TRUE(header1->final); |
| 281 EXPECT_FALSE(header1->reserved1); | 277 EXPECT_FALSE(header1->reserved1); |
| 282 EXPECT_FALSE(header1->reserved2); | 278 EXPECT_FALSE(header1->reserved2); |
| 283 EXPECT_FALSE(header1->reserved3); | 279 EXPECT_FALSE(header1->reserved3); |
| 284 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode); | 280 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode); |
| 285 EXPECT_TRUE(header1->masked); | 281 EXPECT_TRUE(header1->masked); |
| 286 EXPECT_EQ(kHelloLength, header1->payload_length); | 282 EXPECT_EQ(kHelloLength, header1->payload_length); |
| 287 | 283 |
| 288 ScopedVector<WebSocketFrameChunk> frames2; | 284 ScopedVector<WebSocketFrameChunk> frames2; |
| 289 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2)); | 285 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2)); |
| 290 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); | 286 EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error()); |
| 291 EXPECT_EQ(1u, frames2.size()); | 287 EXPECT_EQ(1u, frames2.size()); |
| 292 if (frames2.size() != 1u) | 288 if (frames2.size() != 1u) |
| 293 continue; | 289 continue; |
| 294 WebSocketFrameChunk* frame2 = frames2[0]; | 290 WebSocketFrameChunk* frame2 = frames2[0]; |
| 295 EXPECT_TRUE(frame2 != NULL); | 291 EXPECT_TRUE(frame2 != NULL); |
| 296 if (!frame2) | 292 if (!frame2) |
| 297 continue; | 293 continue; |
| 298 EXPECT_TRUE(frame2->final_chunk); | 294 EXPECT_TRUE(frame2->final_chunk); |
| 299 if (expected2.size() == 0) { | 295 if (expected2.size() == 0) { |
| 300 EXPECT_EQ(NULL, frame2->data.get()); | 296 EXPECT_EQ(NULL, frame2->data.get()); |
| 301 } else { | 297 } else { |
| 302 ASSERT_EQ(expected2.size(), static_cast<uint64>(frame2->data->size())); | 298 ASSERT_EQ(expected2.size(), static_cast<uint64>(frame2->data->size())); |
| 303 EXPECT_TRUE(std::equal(expected2.begin(), | 299 EXPECT_TRUE( |
| 304 expected2.end(), | 300 std::equal(expected2.begin(), expected2.end(), frame2->data->data())); |
| 305 frame2->data->data())); | |
| 306 } | 301 } |
| 307 const WebSocketFrameHeader* header2 = frame2->header.get(); | 302 const WebSocketFrameHeader* header2 = frame2->header.get(); |
| 308 EXPECT_TRUE(header2 == NULL); | 303 EXPECT_TRUE(header2 == NULL); |
| 309 } | 304 } |
| 310 } | 305 } |
| 311 | 306 |
| 312 TEST(WebSocketFrameParserTest, DecodeFramesOfVariousLengths) { | 307 TEST(WebSocketFrameParserTest, DecodeFramesOfVariousLengths) { |
| 313 for (int i = 0; i < kNumFrameHeaderTests; ++i) { | 308 for (int i = 0; i < kNumFrameHeaderTests; ++i) { |
| 314 const char* frame_header = kFrameHeaderTests[i].frame_header; | 309 const char* frame_header = kFrameHeaderTests[i].frame_header; |
| 315 size_t frame_header_length = kFrameHeaderTests[i].frame_header_length; | 310 size_t frame_header_length = kFrameHeaderTests[i].frame_header_length; |
| 316 uint64 frame_length = kFrameHeaderTests[i].frame_length; | 311 uint64 frame_length = kFrameHeaderTests[i].frame_length; |
| 317 | 312 |
| 318 std::vector<char> input(frame_header, frame_header + frame_header_length); | 313 std::vector<char> input(frame_header, frame_header + frame_header_length); |
| 319 // Limit the payload size not to flood the console on failure. | 314 // Limit the payload size not to flood the console on failure. |
| 320 static const uint64 kMaxPayloadSize = 200; | 315 static const uint64 kMaxPayloadSize = 200; |
| 321 uint64 input_payload_size = std::min(frame_length, kMaxPayloadSize); | 316 uint64 input_payload_size = std::min(frame_length, kMaxPayloadSize); |
| 322 input.insert(input.end(), input_payload_size, 'a'); | 317 input.insert(input.end(), input_payload_size, 'a'); |
| 323 | 318 |
| 324 WebSocketFrameParser parser; | 319 WebSocketFrameParser parser; |
| 325 | 320 |
| 326 ScopedVector<WebSocketFrameChunk> frames; | 321 ScopedVector<WebSocketFrameChunk> frames; |
| 327 EXPECT_EQ(kFrameHeaderTests[i].error_code == kWebSocketNormalClosure, | 322 EXPECT_EQ(kFrameHeaderTests[i].error_code == kWebSocketNormalClosure, |
| 328 parser.Decode(&input.front(), input.size(), &frames)); | 323 parser.Decode(&input.front(), input.size(), &frames)); |
| 329 EXPECT_EQ(kFrameHeaderTests[i].error_code, parser.websocket_error()); | 324 EXPECT_EQ(kFrameHeaderTests[i].error_code, parser.websocket_error()); |
| 330 if (kFrameHeaderTests[i].error_code != kWebSocketNormalClosure) { | 325 if (kFrameHeaderTests[i].error_code != kWebSocketNormalClosure) { |
| 331 EXPECT_EQ(0u, frames.size()); | 326 EXPECT_EQ(0u, frames.size()); |
| 332 } else { | 327 } else { |
| 333 EXPECT_EQ(1u, frames.size()); | 328 EXPECT_EQ(1u, frames.size()); |
| 334 } | 329 } |
| 335 if (frames.size() != 1u) | 330 if (frames.size() != 1u) |
| 336 continue; | 331 continue; |
| 337 WebSocketFrameChunk* frame = frames[0]; | 332 WebSocketFrameChunk* frame = frames[0]; |
| 338 EXPECT_TRUE(frame != NULL); | 333 EXPECT_TRUE(frame != NULL); |
| 339 if (!frame) | 334 if (!frame) |
| 340 continue; | 335 continue; |
| 341 if (frame_length == input_payload_size) { | 336 if (frame_length == input_payload_size) { |
| 342 EXPECT_TRUE(frame->final_chunk); | 337 EXPECT_TRUE(frame->final_chunk); |
| 343 } else { | 338 } else { |
| 344 EXPECT_FALSE(frame->final_chunk); | 339 EXPECT_FALSE(frame->final_chunk); |
| 345 } | 340 } |
| 346 std::vector<char> expected_payload(input_payload_size, 'a'); | 341 std::vector<char> expected_payload(input_payload_size, 'a'); |
| 347 if (expected_payload.size() == 0) { | 342 if (expected_payload.size() == 0) { |
| 348 EXPECT_EQ(NULL, frame->data.get()); | 343 EXPECT_EQ(NULL, frame->data.get()); |
| 349 } else { | 344 } else { |
| 350 ASSERT_EQ(expected_payload.size(), | 345 ASSERT_EQ(expected_payload.size(), |
| 351 static_cast<uint64>(frame->data->size())); | 346 static_cast<uint64>(frame->data->size())); |
| 352 EXPECT_TRUE(std::equal( | 347 EXPECT_TRUE(std::equal(expected_payload.begin(), |
| 353 expected_payload.begin(), | 348 expected_payload.end(), |
| 354 expected_payload.end(), | 349 frame->data->data())); |
| 355 frame->data->data())); | |
| 356 } | 350 } |
| 357 const WebSocketFrameHeader* header = frame->header.get(); | 351 const WebSocketFrameHeader* header = frame->header.get(); |
| 358 EXPECT_TRUE(header != NULL); | 352 EXPECT_TRUE(header != NULL); |
| 359 if (!header) | 353 if (!header) |
| 360 continue; | 354 continue; |
| 361 EXPECT_TRUE(header->final); | 355 EXPECT_TRUE(header->final); |
| 362 EXPECT_FALSE(header->reserved1); | 356 EXPECT_FALSE(header->reserved1); |
| 363 EXPECT_FALSE(header->reserved2); | 357 EXPECT_FALSE(header->reserved2); |
| 364 EXPECT_FALSE(header->reserved3); | 358 EXPECT_FALSE(header->reserved3); |
| 365 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); | 359 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 573 EXPECT_EQ(reserved3, header->reserved3); | 567 EXPECT_EQ(reserved3, header->reserved3); |
| 574 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); | 568 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); |
| 575 EXPECT_FALSE(header->masked); | 569 EXPECT_FALSE(header->masked); |
| 576 EXPECT_EQ(0u, header->payload_length); | 570 EXPECT_EQ(0u, header->payload_length); |
| 577 } | 571 } |
| 578 } | 572 } |
| 579 | 573 |
| 580 } // Unnamed namespace | 574 } // Unnamed namespace |
| 581 | 575 |
| 582 } // namespace net | 576 } // namespace net |
| OLD | NEW |