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

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

Issue 15298012: Change the WebSocket OpCode constants to an enum (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Amend comments for IsKnown*OpCode. Created 7 years, 7 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
« no previous file with comments | « net/websockets/websocket_frame_parser.cc ('k') | net/websockets/websocket_frame_unittest.cc » ('j') | 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"
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW
« no previous file with comments | « net/websockets/websocket_frame_parser.cc ('k') | net/websockets/websocket_frame_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698