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

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

Issue 266243004: Clang format slam. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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_deflate_stream.h" 5 #include "net/websockets/websocket_deflate_stream.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 #include <deque> 8 #include <deque>
9 #include <string> 9 #include <string>
10 10
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 WebSocketFrameHeader::OpCode opcode, 87 WebSocketFrameHeader::OpCode opcode,
88 FrameFlag flag) { 88 FrameFlag flag) {
89 scoped_ptr<WebSocketFrame> frame(new WebSocketFrame(opcode)); 89 scoped_ptr<WebSocketFrame> frame(new WebSocketFrame(opcode));
90 frame->header.final = (flag & kFinal); 90 frame->header.final = (flag & kFinal);
91 frame->header.reserved1 = (flag & kReserved1); 91 frame->header.reserved1 = (flag & kReserved1);
92 frames->push_back(frame.release()); 92 frames->push_back(frame.release());
93 } 93 }
94 94
95 class MockWebSocketStream : public WebSocketStream { 95 class MockWebSocketStream : public WebSocketStream {
96 public: 96 public:
97 MOCK_METHOD2(ReadFrames, int(ScopedVector<WebSocketFrame>*, 97 MOCK_METHOD2(ReadFrames,
98 const CompletionCallback&)); 98 int(ScopedVector<WebSocketFrame>*, const CompletionCallback&));
99 MOCK_METHOD2(WriteFrames, int(ScopedVector<WebSocketFrame>*, 99 MOCK_METHOD2(WriteFrames,
100 const CompletionCallback&)); 100 int(ScopedVector<WebSocketFrame>*, const CompletionCallback&));
101 MOCK_METHOD0(Close, void()); 101 MOCK_METHOD0(Close, void());
102 MOCK_CONST_METHOD0(GetSubProtocol, std::string()); 102 MOCK_CONST_METHOD0(GetSubProtocol, std::string());
103 MOCK_CONST_METHOD0(GetExtensions, std::string()); 103 MOCK_CONST_METHOD0(GetExtensions, std::string());
104 }; 104 };
105 105
106 // This mock class relies on some assumptions. 106 // This mock class relies on some assumptions.
107 // - RecordInputDataFrame is called after the corresponding WriteFrames 107 // - RecordInputDataFrame is called after the corresponding WriteFrames
108 // call. 108 // call.
109 // - RecordWrittenDataFrame is called before writing the frame. 109 // - RecordWrittenDataFrame is called before writing the frame.
110 class WebSocketDeflatePredictorMock : public WebSocketDeflatePredictor { 110 class WebSocketDeflatePredictorMock : public WebSocketDeflatePredictor {
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 // Data frames recorded by |RecordWrittenFrames|. 201 // Data frames recorded by |RecordWrittenFrames|.
202 // Pushed by |RecordWrittenFrames| and popped and verified by 202 // Pushed by |RecordWrittenFrames| and popped and verified by
203 // |VerifySentFrame|. 203 // |VerifySentFrame|.
204 std::deque<const WebSocketFrame*> frames_written_; 204 std::deque<const WebSocketFrame*> frames_written_;
205 205
206 DISALLOW_COPY_AND_ASSIGN(WebSocketDeflatePredictorMock); 206 DISALLOW_COPY_AND_ASSIGN(WebSocketDeflatePredictorMock);
207 }; 207 };
208 208
209 class WebSocketDeflateStreamTest : public ::testing::Test { 209 class WebSocketDeflateStreamTest : public ::testing::Test {
210 public: 210 public:
211 WebSocketDeflateStreamTest() 211 WebSocketDeflateStreamTest() : mock_stream_(NULL), predictor_(NULL) {}
212 : mock_stream_(NULL),
213 predictor_(NULL) {}
214 virtual ~WebSocketDeflateStreamTest() {} 212 virtual ~WebSocketDeflateStreamTest() {}
215 213
216 virtual void SetUp() { 214 virtual void SetUp() {
217 Initialize(WebSocketDeflater::TAKE_OVER_CONTEXT, kWindowBits); 215 Initialize(WebSocketDeflater::TAKE_OVER_CONTEXT, kWindowBits);
218 } 216 }
219 217
220 protected: 218 protected:
221 // Initialize deflate_stream_ with the given parameters. 219 // Initialize deflate_stream_ with the given parameters.
222 void Initialize(WebSocketDeflater::ContextTakeOverMode mode, 220 void Initialize(WebSocketDeflater::ContextTakeOverMode mode,
223 int window_bits) { 221 int window_bits) {
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 const CompletionCallback& callback) { 292 const CompletionCallback& callback) {
295 DCHECK(frames->empty()); 293 DCHECK(frames->empty());
296 frames_passed_ = frames; 294 frames_passed_ = frames;
297 callback_ = callback; 295 callback_ = callback;
298 frames->swap(frames_to_output_); 296 frames->swap(frames_to_output_);
299 return result_; 297 return result_;
300 } 298 }
301 299
302 int result() const { return result_; } 300 int result() const { return result_; }
303 const CompletionCallback callback() const { return callback_; } 301 const CompletionCallback callback() const { return callback_; }
304 ScopedVector<WebSocketFrame>* frames_passed() { 302 ScopedVector<WebSocketFrame>* frames_passed() { return frames_passed_; }
305 return frames_passed_;
306 }
307 303
308 private: 304 private:
309 int result_; 305 int result_;
310 CompletionCallback callback_; 306 CompletionCallback callback_;
311 ScopedVector<WebSocketFrame> frames_to_output_; 307 ScopedVector<WebSocketFrame> frames_to_output_;
312 ScopedVector<WebSocketFrame>* frames_passed_; 308 ScopedVector<WebSocketFrame>* frames_passed_;
313 }; 309 };
314 310
315 // WriteFramesStub is a stub for WebSocketStream::WriteFrames. 311 // WriteFramesStub is a stub for WebSocketStream::WriteFrames.
316 // It returns |result_| and |frames_| to the caller and 312 // It returns |result_| and |frames_| to the caller and
317 // saves |callback| parameter to |callback_|. 313 // saves |callback| parameter to |callback_|.
318 class WriteFramesStub { 314 class WriteFramesStub {
319 public: 315 public:
320 explicit WriteFramesStub(WebSocketDeflatePredictorMock* predictor, 316 explicit WriteFramesStub(WebSocketDeflatePredictorMock* predictor, int result)
321 int result)
322 : result_(result), predictor_(predictor) {} 317 : result_(result), predictor_(predictor) {}
323 318
324 int Call(ScopedVector<WebSocketFrame>* frames, 319 int Call(ScopedVector<WebSocketFrame>* frames,
325 const CompletionCallback& callback) { 320 const CompletionCallback& callback) {
326 frames_.insert(frames_.end(), frames->begin(), frames->end()); 321 frames_.insert(frames_.end(), frames->begin(), frames->end());
327 frames->weak_clear(); 322 frames->weak_clear();
328 callback_ = callback; 323 callback_ = callback;
329 predictor_->VerifySentFrames(frames_); 324 predictor_->VerifySentFrames(frames_);
330 return result_; 325 return result_;
331 } 326 }
(...skipping 15 matching lines...) Expand all
347 { 342 {
348 InSequence s; 343 InSequence s;
349 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _)) 344 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _))
350 .WillOnce(Return(ERR_FAILED)); 345 .WillOnce(Return(ERR_FAILED));
351 } 346 }
352 EXPECT_EQ(ERR_FAILED, deflate_stream_->ReadFrames(&frames, callback)); 347 EXPECT_EQ(ERR_FAILED, deflate_stream_->ReadFrames(&frames, callback));
353 } 348 }
354 349
355 TEST_F(WebSocketDeflateStreamTest, ReadUncompressedFrameImmediately) { 350 TEST_F(WebSocketDeflateStreamTest, ReadUncompressedFrameImmediately) {
356 ScopedVector<WebSocketFrame> frames_to_output; 351 ScopedVector<WebSocketFrame> frames_to_output;
357 AppendTo(&frames_to_output, 352 AppendTo(
358 WebSocketFrameHeader::kOpCodeText, 353 &frames_to_output, WebSocketFrameHeader::kOpCodeText, kFinal, "hello");
359 kFinal,
360 "hello");
361 ReadFramesStub stub(OK, &frames_to_output); 354 ReadFramesStub stub(OK, &frames_to_output);
362 ScopedVector<WebSocketFrame> frames; 355 ScopedVector<WebSocketFrame> frames;
363 356
364 { 357 {
365 InSequence s; 358 InSequence s;
366 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _)) 359 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _))
367 .WillOnce(Invoke(&stub, &ReadFramesStub::Call)); 360 .WillOnce(Invoke(&stub, &ReadFramesStub::Call));
368 } 361 }
369 CompletionCallback callback; 362 CompletionCallback callback;
370 ASSERT_EQ(OK, deflate_stream_->ReadFrames(&frames, callback)); 363 ASSERT_EQ(OK, deflate_stream_->ReadFrames(&frames, callback));
(...skipping 16 matching lines...) Expand all
387 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _)) 380 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _))
388 .WillOnce(Invoke(&stub, &ReadFramesStub::Call)); 381 .WillOnce(Invoke(&stub, &ReadFramesStub::Call));
389 EXPECT_CALL(checkpoint, Call(0)); 382 EXPECT_CALL(checkpoint, Call(0));
390 EXPECT_CALL(mock_callback, Call(OK)); 383 EXPECT_CALL(mock_callback, Call(OK));
391 } 384 }
392 ASSERT_EQ(ERR_IO_PENDING, deflate_stream_->ReadFrames(&frames, callback)); 385 ASSERT_EQ(ERR_IO_PENDING, deflate_stream_->ReadFrames(&frames, callback));
393 ASSERT_EQ(0u, frames.size()); 386 ASSERT_EQ(0u, frames.size());
394 387
395 checkpoint.Call(0); 388 checkpoint.Call(0);
396 389
397 AppendTo(stub.frames_passed(), 390 AppendTo(
398 WebSocketFrameHeader::kOpCodeText, 391 stub.frames_passed(), WebSocketFrameHeader::kOpCodeText, kFinal, "hello");
399 kFinal,
400 "hello");
401 stub.callback().Run(OK); 392 stub.callback().Run(OK);
402 ASSERT_EQ(1u, frames.size()); 393 ASSERT_EQ(1u, frames.size());
403 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, frames[0]->header.opcode); 394 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, frames[0]->header.opcode);
404 EXPECT_TRUE(frames[0]->header.final); 395 EXPECT_TRUE(frames[0]->header.final);
405 EXPECT_FALSE(frames[0]->header.reserved1); 396 EXPECT_FALSE(frames[0]->header.reserved1);
406 EXPECT_EQ("hello", ToString(frames[0])); 397 EXPECT_EQ("hello", ToString(frames[0]));
407 } 398 }
408 399
409 TEST_F(WebSocketDeflateStreamTest, ReadFailedAsync) { 400 TEST_F(WebSocketDeflateStreamTest, ReadFailedAsync) {
410 ReadFramesStub stub(ERR_IO_PENDING); 401 ReadFramesStub stub(ERR_IO_PENDING);
411 ScopedVector<WebSocketFrame> frames; 402 ScopedVector<WebSocketFrame> frames;
412 MockCallback mock_callback, checkpoint; 403 MockCallback mock_callback, checkpoint;
413 CompletionCallback callback = 404 CompletionCallback callback =
414 base::Bind(&MockCallback::Call, base::Unretained(&mock_callback)); 405 base::Bind(&MockCallback::Call, base::Unretained(&mock_callback));
415 406
416 { 407 {
417 InSequence s; 408 InSequence s;
418 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _)) 409 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _))
419 .WillOnce(Invoke(&stub, &ReadFramesStub::Call)); 410 .WillOnce(Invoke(&stub, &ReadFramesStub::Call));
420 EXPECT_CALL(checkpoint, Call(0)); 411 EXPECT_CALL(checkpoint, Call(0));
421 EXPECT_CALL(mock_callback, Call(ERR_FAILED)); 412 EXPECT_CALL(mock_callback, Call(ERR_FAILED));
422 } 413 }
423 ASSERT_EQ(ERR_IO_PENDING, deflate_stream_->ReadFrames(&frames, callback)); 414 ASSERT_EQ(ERR_IO_PENDING, deflate_stream_->ReadFrames(&frames, callback));
424 ASSERT_EQ(0u, frames.size()); 415 ASSERT_EQ(0u, frames.size());
425 416
426 checkpoint.Call(0); 417 checkpoint.Call(0);
427 418
428 AppendTo(stub.frames_passed(), 419 AppendTo(
429 WebSocketFrameHeader::kOpCodeText, 420 stub.frames_passed(), WebSocketFrameHeader::kOpCodeText, kFinal, "hello");
430 kFinal,
431 "hello");
432 stub.callback().Run(ERR_FAILED); 421 stub.callback().Run(ERR_FAILED);
433 ASSERT_EQ(0u, frames.size()); 422 ASSERT_EQ(0u, frames.size());
434 } 423 }
435 424
436 TEST_F(WebSocketDeflateStreamTest, ReadCompressedFrameImmediately) { 425 TEST_F(WebSocketDeflateStreamTest, ReadCompressedFrameImmediately) {
437 ScopedVector<WebSocketFrame> frames_to_output; 426 ScopedVector<WebSocketFrame> frames_to_output;
438 AppendTo(&frames_to_output, 427 AppendTo(&frames_to_output,
439 WebSocketFrameHeader::kOpCodeText, 428 WebSocketFrameHeader::kOpCodeText,
440 kFinal | kReserved1, 429 kFinal | kReserved1,
441 std::string("\xf2\x48\xcd\xc9\xc9\x07\x00", 7)); 430 std::string("\xf2\x48\xcd\xc9\xc9\x07\x00", 7));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 EXPECT_TRUE(frames[0]->header.final); 472 EXPECT_TRUE(frames[0]->header.final);
484 EXPECT_FALSE(frames[0]->header.reserved1); 473 EXPECT_FALSE(frames[0]->header.reserved1);
485 EXPECT_EQ("Hello", ToString(frames[0])); 474 EXPECT_EQ("Hello", ToString(frames[0]));
486 } 475 }
487 476
488 TEST_F(WebSocketDeflateStreamTest, 477 TEST_F(WebSocketDeflateStreamTest,
489 ReadCompressedFrameFragmentImmediatelyButInflaterReturnsPending) { 478 ReadCompressedFrameFragmentImmediatelyButInflaterReturnsPending) {
490 ScopedVector<WebSocketFrame> frames_to_output; 479 ScopedVector<WebSocketFrame> frames_to_output;
491 const std::string data1("\xf2", 1); 480 const std::string data1("\xf2", 1);
492 const std::string data2("\x48\xcd\xc9\xc9\x07\x00", 6); 481 const std::string data2("\x48\xcd\xc9\xc9\x07\x00", 6);
493 AppendTo(&frames_to_output, 482 AppendTo(
494 WebSocketFrameHeader::kOpCodeText, 483 &frames_to_output, WebSocketFrameHeader::kOpCodeText, kReserved1, data1);
495 kReserved1,
496 data1);
497 ReadFramesStub stub1(OK, &frames_to_output), stub2(ERR_IO_PENDING); 484 ReadFramesStub stub1(OK, &frames_to_output), stub2(ERR_IO_PENDING);
498 MockCallback mock_callback, checkpoint; 485 MockCallback mock_callback, checkpoint;
499 CompletionCallback callback = 486 CompletionCallback callback =
500 base::Bind(&MockCallback::Call, base::Unretained(&mock_callback)); 487 base::Bind(&MockCallback::Call, base::Unretained(&mock_callback));
501 ScopedVector<WebSocketFrame> frames; 488 ScopedVector<WebSocketFrame> frames;
502 489
503 { 490 {
504 InSequence s; 491 InSequence s;
505 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _)) 492 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _))
506 .WillOnce(Invoke(&stub1, &ReadFramesStub::Call)) 493 .WillOnce(Invoke(&stub1, &ReadFramesStub::Call))
507 .WillOnce(Invoke(&stub2, &ReadFramesStub::Call)); 494 .WillOnce(Invoke(&stub2, &ReadFramesStub::Call));
508 EXPECT_CALL(checkpoint, Call(0)); 495 EXPECT_CALL(checkpoint, Call(0));
509 EXPECT_CALL(mock_callback, Call(OK)); 496 EXPECT_CALL(mock_callback, Call(OK));
510 } 497 }
511 ASSERT_EQ(ERR_IO_PENDING, deflate_stream_->ReadFrames(&frames, callback)); 498 ASSERT_EQ(ERR_IO_PENDING, deflate_stream_->ReadFrames(&frames, callback));
512 ASSERT_EQ(0u, frames.size()); 499 ASSERT_EQ(0u, frames.size());
513 500
514 AppendTo(stub2.frames_passed(), 501 AppendTo(
515 WebSocketFrameHeader::kOpCodeText, 502 stub2.frames_passed(), WebSocketFrameHeader::kOpCodeText, kFinal, data2);
516 kFinal,
517 data2);
518 503
519 checkpoint.Call(0); 504 checkpoint.Call(0);
520 stub2.callback().Run(OK); 505 stub2.callback().Run(OK);
521 506
522 ASSERT_EQ(1u, frames.size()); 507 ASSERT_EQ(1u, frames.size());
523 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, frames[0]->header.opcode); 508 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, frames[0]->header.opcode);
524 EXPECT_TRUE(frames[0]->header.final); 509 EXPECT_TRUE(frames[0]->header.final);
525 EXPECT_FALSE(frames[0]->header.reserved1); 510 EXPECT_FALSE(frames[0]->header.reserved1);
526 EXPECT_EQ("Hello", ToString(frames[0])); 511 EXPECT_EQ("Hello", ToString(frames[0]));
527 } 512 }
(...skipping 16 matching lines...) Expand all
544 } 529 }
545 ASSERT_EQ(ERR_WS_PROTOCOL_ERROR, 530 ASSERT_EQ(ERR_WS_PROTOCOL_ERROR,
546 deflate_stream_->ReadFrames(&frames, callback)); 531 deflate_stream_->ReadFrames(&frames, callback));
547 ASSERT_EQ(0u, frames.size()); 532 ASSERT_EQ(0u, frames.size());
548 } 533 }
549 534
550 TEST_F(WebSocketDeflateStreamTest, MergeMultipleFramesInReadFrames) { 535 TEST_F(WebSocketDeflateStreamTest, MergeMultipleFramesInReadFrames) {
551 const std::string data1("\xf2\x48\xcd", 3); 536 const std::string data1("\xf2\x48\xcd", 3);
552 const std::string data2("\xc9\xc9\x07\x00", 4); 537 const std::string data2("\xc9\xc9\x07\x00", 4);
553 ScopedVector<WebSocketFrame> frames_to_output; 538 ScopedVector<WebSocketFrame> frames_to_output;
554 AppendTo(&frames_to_output, 539 AppendTo(
555 WebSocketFrameHeader::kOpCodeText, 540 &frames_to_output, WebSocketFrameHeader::kOpCodeText, kReserved1, data1);
556 kReserved1,
557 data1);
558 AppendTo(&frames_to_output, 541 AppendTo(&frames_to_output,
559 WebSocketFrameHeader::kOpCodeContinuation, 542 WebSocketFrameHeader::kOpCodeContinuation,
560 kFinal, 543 kFinal,
561 data2); 544 data2);
562 ReadFramesStub stub(OK, &frames_to_output); 545 ReadFramesStub stub(OK, &frames_to_output);
563 CompletionCallback callback; 546 CompletionCallback callback;
564 ScopedVector<WebSocketFrame> frames; 547 ScopedVector<WebSocketFrame> frames;
565 548
566 { 549 {
567 InSequence s; 550 InSequence s;
568 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _)) 551 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _))
569 .WillOnce(Invoke(&stub, &ReadFramesStub::Call)); 552 .WillOnce(Invoke(&stub, &ReadFramesStub::Call));
570 } 553 }
571 ASSERT_EQ(OK, deflate_stream_->ReadFrames(&frames, callback)); 554 ASSERT_EQ(OK, deflate_stream_->ReadFrames(&frames, callback));
572 ASSERT_EQ(1u, frames.size()); 555 ASSERT_EQ(1u, frames.size());
573 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, frames[0]->header.opcode); 556 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, frames[0]->header.opcode);
574 EXPECT_TRUE(frames[0]->header.final); 557 EXPECT_TRUE(frames[0]->header.final);
575 EXPECT_FALSE(frames[0]->header.reserved1); 558 EXPECT_FALSE(frames[0]->header.reserved1);
576 EXPECT_EQ("Hello", ToString(frames[0])); 559 EXPECT_EQ("Hello", ToString(frames[0]));
577 } 560 }
578 561
579 TEST_F(WebSocketDeflateStreamTest, ReadUncompressedEmptyFrames) { 562 TEST_F(WebSocketDeflateStreamTest, ReadUncompressedEmptyFrames) {
580 ScopedVector<WebSocketFrame> frames_to_output; 563 ScopedVector<WebSocketFrame> frames_to_output;
581 AppendTo(&frames_to_output, 564 AppendTo(&frames_to_output, WebSocketFrameHeader::kOpCodeText, kNoFlag);
582 WebSocketFrameHeader::kOpCodeText, 565 AppendTo(
583 kNoFlag); 566 &frames_to_output, WebSocketFrameHeader::kOpCodeContinuation, kFinal);
584 AppendTo(&frames_to_output,
585 WebSocketFrameHeader::kOpCodeContinuation,
586 kFinal);
587 ReadFramesStub stub(OK, &frames_to_output); 567 ReadFramesStub stub(OK, &frames_to_output);
588 CompletionCallback callback; 568 CompletionCallback callback;
589 ScopedVector<WebSocketFrame> frames; 569 ScopedVector<WebSocketFrame> frames;
590 570
591 { 571 {
592 InSequence s; 572 InSequence s;
593 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _)) 573 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _))
594 .WillOnce(Invoke(&stub, &ReadFramesStub::Call)); 574 .WillOnce(Invoke(&stub, &ReadFramesStub::Call));
595 } 575 }
596 ASSERT_EQ(OK, deflate_stream_->ReadFrames(&frames, callback)); 576 ASSERT_EQ(OK, deflate_stream_->ReadFrames(&frames, callback));
597 ASSERT_EQ(2u, frames.size()); 577 ASSERT_EQ(2u, frames.size());
598 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, frames[0]->header.opcode); 578 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, frames[0]->header.opcode);
599 EXPECT_FALSE(frames[0]->header.final); 579 EXPECT_FALSE(frames[0]->header.final);
600 EXPECT_FALSE(frames[0]->header.reserved1); 580 EXPECT_FALSE(frames[0]->header.reserved1);
601 EXPECT_EQ("", ToString(frames[0])); 581 EXPECT_EQ("", ToString(frames[0]));
602 EXPECT_EQ(WebSocketFrameHeader::kOpCodeContinuation, 582 EXPECT_EQ(WebSocketFrameHeader::kOpCodeContinuation,
603 frames[1]->header.opcode); 583 frames[1]->header.opcode);
604 EXPECT_TRUE(frames[1]->header.final); 584 EXPECT_TRUE(frames[1]->header.final);
605 EXPECT_FALSE(frames[1]->header.reserved1); 585 EXPECT_FALSE(frames[1]->header.reserved1);
606 EXPECT_EQ("", ToString(frames[1])); 586 EXPECT_EQ("", ToString(frames[1]));
607 } 587 }
608 588
609 TEST_F(WebSocketDeflateStreamTest, ReadCompressedEmptyFrames) { 589 TEST_F(WebSocketDeflateStreamTest, ReadCompressedEmptyFrames) {
610 ScopedVector<WebSocketFrame> frames_to_output; 590 ScopedVector<WebSocketFrame> frames_to_output;
611 AppendTo(&frames_to_output, 591 AppendTo(&frames_to_output,
612 WebSocketFrameHeader::kOpCodeText, 592 WebSocketFrameHeader::kOpCodeText,
613 kReserved1, 593 kReserved1,
614 std::string("\x02\x00", 1)); 594 std::string("\x02\x00", 1));
615 AppendTo(&frames_to_output, 595 AppendTo(
616 WebSocketFrameHeader::kOpCodeContinuation, 596 &frames_to_output, WebSocketFrameHeader::kOpCodeContinuation, kFinal);
617 kFinal);
618 ReadFramesStub stub(OK, &frames_to_output); 597 ReadFramesStub stub(OK, &frames_to_output);
619 CompletionCallback callback; 598 CompletionCallback callback;
620 ScopedVector<WebSocketFrame> frames; 599 ScopedVector<WebSocketFrame> frames;
621 600
622 { 601 {
623 InSequence s; 602 InSequence s;
624 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _)) 603 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _))
625 .WillOnce(Invoke(&stub, &ReadFramesStub::Call)); 604 .WillOnce(Invoke(&stub, &ReadFramesStub::Call));
626 } 605 }
627 ASSERT_EQ(OK, deflate_stream_->ReadFrames(&frames, callback)); 606 ASSERT_EQ(OK, deflate_stream_->ReadFrames(&frames, callback));
628 ASSERT_EQ(1u, frames.size()); 607 ASSERT_EQ(1u, frames.size());
629 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, frames[0]->header.opcode); 608 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, frames[0]->header.opcode);
630 EXPECT_TRUE(frames[0]->header.final); 609 EXPECT_TRUE(frames[0]->header.final);
631 EXPECT_FALSE(frames[0]->header.reserved1); 610 EXPECT_FALSE(frames[0]->header.reserved1);
632 EXPECT_EQ("", ToString(frames[0])); 611 EXPECT_EQ("", ToString(frames[0]));
633 } 612 }
634 613
635 TEST_F(WebSocketDeflateStreamTest, 614 TEST_F(WebSocketDeflateStreamTest, ReadCompressedFrameFollowedByEmptyFrame) {
636 ReadCompressedFrameFollowedByEmptyFrame) {
637 const std::string data("\xf2\x48\xcd\xc9\xc9\x07\x00", 7); 615 const std::string data("\xf2\x48\xcd\xc9\xc9\x07\x00", 7);
638 ScopedVector<WebSocketFrame> frames_to_output; 616 ScopedVector<WebSocketFrame> frames_to_output;
639 AppendTo(&frames_to_output, 617 AppendTo(
640 WebSocketFrameHeader::kOpCodeText, 618 &frames_to_output, WebSocketFrameHeader::kOpCodeText, kReserved1, data);
641 kReserved1, 619 AppendTo(
642 data); 620 &frames_to_output, WebSocketFrameHeader::kOpCodeContinuation, kFinal);
643 AppendTo(&frames_to_output,
644 WebSocketFrameHeader::kOpCodeContinuation,
645 kFinal);
646 ReadFramesStub stub(OK, &frames_to_output); 621 ReadFramesStub stub(OK, &frames_to_output);
647 CompletionCallback callback; 622 CompletionCallback callback;
648 ScopedVector<WebSocketFrame> frames; 623 ScopedVector<WebSocketFrame> frames;
649 624
650 { 625 {
651 InSequence s; 626 InSequence s;
652 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _)) 627 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _))
653 .WillOnce(Invoke(&stub, &ReadFramesStub::Call)); 628 .WillOnce(Invoke(&stub, &ReadFramesStub::Call));
654 } 629 }
655 ASSERT_EQ(OK, deflate_stream_->ReadFrames(&frames, callback)); 630 ASSERT_EQ(OK, deflate_stream_->ReadFrames(&frames, callback));
656 ASSERT_EQ(1u, frames.size()); 631 ASSERT_EQ(1u, frames.size());
657 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, frames[0]->header.opcode); 632 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, frames[0]->header.opcode);
658 EXPECT_TRUE(frames[0]->header.final); 633 EXPECT_TRUE(frames[0]->header.final);
659 EXPECT_FALSE(frames[0]->header.reserved1); 634 EXPECT_FALSE(frames[0]->header.reserved1);
660 EXPECT_EQ("Hello", ToString(frames[0])); 635 EXPECT_EQ("Hello", ToString(frames[0]));
661 } 636 }
662 637
663 TEST_F(WebSocketDeflateStreamTest, ReadControlFrameBetweenDataFrames) { 638 TEST_F(WebSocketDeflateStreamTest, ReadControlFrameBetweenDataFrames) {
664 const std::string data1("\xf2\x48\xcd", 3); 639 const std::string data1("\xf2\x48\xcd", 3);
665 const std::string data2("\xc9\xc9\x07\x00", 4); 640 const std::string data2("\xc9\xc9\x07\x00", 4);
666 ScopedVector<WebSocketFrame> frames_to_output; 641 ScopedVector<WebSocketFrame> frames_to_output;
667 AppendTo(&frames_to_output, 642 AppendTo(
668 WebSocketFrameHeader::kOpCodeText, 643 &frames_to_output, WebSocketFrameHeader::kOpCodeText, kReserved1, data1);
669 kReserved1,
670 data1);
671 AppendTo(&frames_to_output, WebSocketFrameHeader::kOpCodePing, kFinal); 644 AppendTo(&frames_to_output, WebSocketFrameHeader::kOpCodePing, kFinal);
672 AppendTo(&frames_to_output, WebSocketFrameHeader::kOpCodeText, kFinal, data2); 645 AppendTo(&frames_to_output, WebSocketFrameHeader::kOpCodeText, kFinal, data2);
673 ReadFramesStub stub(OK, &frames_to_output); 646 ReadFramesStub stub(OK, &frames_to_output);
674 CompletionCallback callback; 647 CompletionCallback callback;
675 ScopedVector<WebSocketFrame> frames; 648 ScopedVector<WebSocketFrame> frames;
676 649
677 { 650 {
678 InSequence s; 651 InSequence s;
679 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _)) 652 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _))
680 .WillOnce(Invoke(&stub, &ReadFramesStub::Call)); 653 .WillOnce(Invoke(&stub, &ReadFramesStub::Call));
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
738 deflater.Initialize(kWindowBits); 711 deflater.Initialize(kWindowBits);
739 const std::string original_data(kChunkSize, 'a'); 712 const std::string original_data(kChunkSize, 'a');
740 deflater.AddBytes(original_data.data(), original_data.size()); 713 deflater.AddBytes(original_data.data(), original_data.size());
741 deflater.Finish(); 714 deflater.Finish();
742 715
743 ScopedVector<WebSocketFrame> frames_to_output; 716 ScopedVector<WebSocketFrame> frames_to_output;
744 AppendTo(&frames_to_output, 717 AppendTo(&frames_to_output,
745 WebSocketFrameHeader::kOpCodeBinary, 718 WebSocketFrameHeader::kOpCodeBinary,
746 kReserved1, 719 kReserved1,
747 ToString(deflater.GetOutput(deflater.CurrentOutputSize()))); 720 ToString(deflater.GetOutput(deflater.CurrentOutputSize())));
748 AppendTo(&frames_to_output, 721 AppendTo(&frames_to_output, WebSocketFrameHeader::kOpCodeBinary, kFinal, "");
749 WebSocketFrameHeader::kOpCodeBinary,
750 kFinal,
751 "");
752 722
753 ReadFramesStub stub(OK, &frames_to_output); 723 ReadFramesStub stub(OK, &frames_to_output);
754 CompletionCallback callback; 724 CompletionCallback callback;
755 ScopedVector<WebSocketFrame> frames; 725 ScopedVector<WebSocketFrame> frames;
756 { 726 {
757 InSequence s; 727 InSequence s;
758 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _)) 728 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _))
759 .WillOnce(Invoke(&stub, &ReadFramesStub::Call)); 729 .WillOnce(Invoke(&stub, &ReadFramesStub::Call));
760 } 730 }
761 731
(...skipping 10 matching lines...) Expand all
772 EXPECT_FALSE(frames[1]->header.reserved1); 742 EXPECT_FALSE(frames[1]->header.reserved1);
773 EXPECT_EQ(0u, static_cast<size_t>(frames[1]->header.payload_length)); 743 EXPECT_EQ(0u, static_cast<size_t>(frames[1]->header.payload_length));
774 EXPECT_EQ(original_data, ToString(frames[0]) + ToString(frames[1])); 744 EXPECT_EQ(original_data, ToString(frames[0]) + ToString(frames[1]));
775 } 745 }
776 746
777 TEST_F(WebSocketDeflateStreamTest, 747 TEST_F(WebSocketDeflateStreamTest,
778 Reserved1TurnsOnDuringReadingCompressedContinuationFrame) { 748 Reserved1TurnsOnDuringReadingCompressedContinuationFrame) {
779 const std::string data1("\xf2\x48\xcd", 3); 749 const std::string data1("\xf2\x48\xcd", 3);
780 const std::string data2("\xc9\xc9\x07\x00", 4); 750 const std::string data2("\xc9\xc9\x07\x00", 4);
781 ScopedVector<WebSocketFrame> frames_to_output; 751 ScopedVector<WebSocketFrame> frames_to_output;
782 AppendTo(&frames_to_output, 752 AppendTo(
783 WebSocketFrameHeader::kOpCodeText, 753 &frames_to_output, WebSocketFrameHeader::kOpCodeText, kReserved1, data1);
784 kReserved1,
785 data1);
786 AppendTo(&frames_to_output, 754 AppendTo(&frames_to_output,
787 WebSocketFrameHeader::kOpCodeContinuation, 755 WebSocketFrameHeader::kOpCodeContinuation,
788 kFinal | kReserved1, 756 kFinal | kReserved1,
789 data2); 757 data2);
790 ReadFramesStub stub(OK, &frames_to_output); 758 ReadFramesStub stub(OK, &frames_to_output);
791 CompletionCallback callback; 759 CompletionCallback callback;
792 ScopedVector<WebSocketFrame> frames; 760 ScopedVector<WebSocketFrame> frames;
793 761
794 { 762 {
795 InSequence s; 763 InSequence s;
796 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _)) 764 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _))
797 .WillOnce(Invoke(&stub, &ReadFramesStub::Call)); 765 .WillOnce(Invoke(&stub, &ReadFramesStub::Call));
798 } 766 }
799 ASSERT_EQ(ERR_WS_PROTOCOL_ERROR, 767 ASSERT_EQ(ERR_WS_PROTOCOL_ERROR,
800 deflate_stream_->ReadFrames(&frames, callback)); 768 deflate_stream_->ReadFrames(&frames, callback));
801 } 769 }
802 770
803 TEST_F(WebSocketDeflateStreamTest, 771 TEST_F(WebSocketDeflateStreamTest,
804 Reserved1TurnsOnDuringReadingUncompressedContinuationFrame) { 772 Reserved1TurnsOnDuringReadingUncompressedContinuationFrame) {
805 ScopedVector<WebSocketFrame> frames_to_output; 773 ScopedVector<WebSocketFrame> frames_to_output;
806 AppendTo(&frames_to_output, 774 AppendTo(
807 WebSocketFrameHeader::kOpCodeText, 775 &frames_to_output, WebSocketFrameHeader::kOpCodeText, kNoFlag, "hello");
808 kNoFlag,
809 "hello");
810 AppendTo(&frames_to_output, 776 AppendTo(&frames_to_output,
811 WebSocketFrameHeader::kOpCodeContinuation, 777 WebSocketFrameHeader::kOpCodeContinuation,
812 kFinal | kReserved1, 778 kFinal | kReserved1,
813 "world"); 779 "world");
814 ReadFramesStub stub(OK, &frames_to_output); 780 ReadFramesStub stub(OK, &frames_to_output);
815 CompletionCallback callback; 781 CompletionCallback callback;
816 ScopedVector<WebSocketFrame> frames; 782 ScopedVector<WebSocketFrame> frames;
817 783
818 { 784 {
819 InSequence s; 785 InSequence s;
820 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _)) 786 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _))
821 .WillOnce(Invoke(&stub, &ReadFramesStub::Call)); 787 .WillOnce(Invoke(&stub, &ReadFramesStub::Call));
822 } 788 }
823 ASSERT_EQ(ERR_WS_PROTOCOL_ERROR, 789 ASSERT_EQ(ERR_WS_PROTOCOL_ERROR,
824 deflate_stream_->ReadFrames(&frames, callback)); 790 deflate_stream_->ReadFrames(&frames, callback));
825 } 791 }
826 792
827 TEST_F(WebSocketDeflateStreamTest, ReadCompressedMessages) { 793 TEST_F(WebSocketDeflateStreamTest, ReadCompressedMessages) {
828 ScopedVector<WebSocketFrame> frames_to_output; 794 ScopedVector<WebSocketFrame> frames_to_output;
795 AppendTo(
796 &frames_to_output,
797 WebSocketFrameHeader::kOpCodeText,
798 kFinal | kReserved1,
799 std::string("\x4a\xce\xcf\x2d\x28\x4a\x2d\x2e\x4e\x4d\x31\x04\x00", 13));
829 AppendTo(&frames_to_output, 800 AppendTo(&frames_to_output,
830 WebSocketFrameHeader::kOpCodeText, 801 WebSocketFrameHeader::kOpCodeText,
831 kFinal | kReserved1, 802 kFinal | kReserved1,
832 std::string(
833 "\x4a\xce\xcf\x2d\x28\x4a\x2d\x2e\x4e\x4d\x31\x04\x00", 13));
834 AppendTo(&frames_to_output,
835 WebSocketFrameHeader::kOpCodeText,
836 kFinal | kReserved1,
837 std::string("\x4a\x86\x33\x8d\x00\x00", 6)); 803 std::string("\x4a\x86\x33\x8d\x00\x00", 6));
838 ReadFramesStub stub(OK, &frames_to_output); 804 ReadFramesStub stub(OK, &frames_to_output);
839 CompletionCallback callback; 805 CompletionCallback callback;
840 ScopedVector<WebSocketFrame> frames; 806 ScopedVector<WebSocketFrame> frames;
841 807
842 { 808 {
843 InSequence s; 809 InSequence s;
844 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _)) 810 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _))
845 .WillOnce(Invoke(&stub, &ReadFramesStub::Call)); 811 .WillOnce(Invoke(&stub, &ReadFramesStub::Call));
846 } 812 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
886 EXPECT_FALSE(frames[1]->header.reserved1); 852 EXPECT_FALSE(frames[1]->header.reserved1);
887 EXPECT_EQ("uncompressed2", ToString(frames[1])); 853 EXPECT_EQ("uncompressed2", ToString(frames[1]));
888 } 854 }
889 855
890 TEST_F(WebSocketDeflateStreamTest, 856 TEST_F(WebSocketDeflateStreamTest,
891 ReadCompressedMessageThenUncompressedMessage) { 857 ReadCompressedMessageThenUncompressedMessage) {
892 ScopedVector<WebSocketFrame> frames_to_output; 858 ScopedVector<WebSocketFrame> frames_to_output;
893 AppendTo(&frames_to_output, 859 AppendTo(&frames_to_output,
894 WebSocketFrameHeader::kOpCodeText, 860 WebSocketFrameHeader::kOpCodeText,
895 kFinal | kReserved1, 861 kFinal | kReserved1,
896 std::string( 862 std::string("\x4a\xce\xcf\x2d\x28\x4a\x2d\x2e\x4e\x4d\x01\x00", 12));
897 "\x4a\xce\xcf\x2d\x28\x4a\x2d\x2e\x4e\x4d\x01\x00", 12));
898 AppendTo(&frames_to_output, 863 AppendTo(&frames_to_output,
899 WebSocketFrameHeader::kOpCodeText, 864 WebSocketFrameHeader::kOpCodeText,
900 kFinal, 865 kFinal,
901 "uncompressed"); 866 "uncompressed");
902 ReadFramesStub stub(OK, &frames_to_output); 867 ReadFramesStub stub(OK, &frames_to_output);
903 CompletionCallback callback; 868 CompletionCallback callback;
904 ScopedVector<WebSocketFrame> frames; 869 ScopedVector<WebSocketFrame> frames;
905 870
906 { 871 {
907 InSequence s; 872 InSequence s;
(...skipping 15 matching lines...) Expand all
923 TEST_F(WebSocketDeflateStreamTest, 888 TEST_F(WebSocketDeflateStreamTest,
924 ReadUncompressedMessageThenCompressedMessage) { 889 ReadUncompressedMessageThenCompressedMessage) {
925 ScopedVector<WebSocketFrame> frames_to_output; 890 ScopedVector<WebSocketFrame> frames_to_output;
926 AppendTo(&frames_to_output, 891 AppendTo(&frames_to_output,
927 WebSocketFrameHeader::kOpCodeText, 892 WebSocketFrameHeader::kOpCodeText,
928 kFinal, 893 kFinal,
929 "uncompressed"); 894 "uncompressed");
930 AppendTo(&frames_to_output, 895 AppendTo(&frames_to_output,
931 WebSocketFrameHeader::kOpCodeText, 896 WebSocketFrameHeader::kOpCodeText,
932 kFinal | kReserved1, 897 kFinal | kReserved1,
933 std::string( 898 std::string("\x4a\xce\xcf\x2d\x28\x4a\x2d\x2e\x4e\x4d\x01\x00", 12));
934 "\x4a\xce\xcf\x2d\x28\x4a\x2d\x2e\x4e\x4d\x01\x00", 12));
935 ReadFramesStub stub(OK, &frames_to_output); 899 ReadFramesStub stub(OK, &frames_to_output);
936 CompletionCallback callback; 900 CompletionCallback callback;
937 ScopedVector<WebSocketFrame> frames; 901 ScopedVector<WebSocketFrame> frames;
938 902
939 { 903 {
940 InSequence s; 904 InSequence s;
941 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _)) 905 EXPECT_CALL(*mock_stream_, ReadFrames(&frames, _))
942 .WillOnce(Invoke(&stub, &ReadFramesStub::Call)); 906 .WillOnce(Invoke(&stub, &ReadFramesStub::Call));
943 } 907 }
944 ASSERT_EQ(OK, deflate_stream_->ReadFrames(&frames, callback)); 908 ASSERT_EQ(OK, deflate_stream_->ReadFrames(&frames, callback));
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after
1312 AddCompressibleFrameString(); 1276 AddCompressibleFrameString();
1313 WriteFramesStub stub(predictor_, OK); 1277 WriteFramesStub stub(predictor_, OK);
1314 { 1278 {
1315 InSequence s; 1279 InSequence s;
1316 EXPECT_CALL(*mock_stream_, WriteFrames(_, _)) 1280 EXPECT_CALL(*mock_stream_, WriteFrames(_, _))
1317 .WillOnce(Invoke(&stub, &WriteFramesStub::Call)); 1281 .WillOnce(Invoke(&stub, &WriteFramesStub::Call));
1318 } 1282 }
1319 ASSERT_EQ(OK, deflate_stream_->WriteFrames(&frames_, callback)); 1283 ASSERT_EQ(OK, deflate_stream_->WriteFrames(&frames_, callback));
1320 const ScopedVector<WebSocketFrame>& frames_passed = *stub.frames(); 1284 const ScopedVector<WebSocketFrame>& frames_passed = *stub.frames();
1321 ASSERT_EQ(1u, frames_passed.size()); 1285 ASSERT_EQ(1u, frames_passed.size());
1322 EXPECT_EQ(std::string("r\xce(\xca\xcf\xcd,\xcdM\x1c\xe1\xc0\x39\xa3" 1286 EXPECT_EQ(std::string(
1323 "(?7\xb3\x34\x17\x00", 21), 1287 "r\xce(\xca\xcf\xcd,\xcdM\x1c\xe1\xc0\x39\xa3"
1288 "(?7\xb3\x34\x17\x00",
1289 21),
1324 ToString(frames_passed[0])); 1290 ToString(frames_passed[0]));
1325 } 1291 }
1326 1292
1327 // The same input with window_bits=10 returns smaller output. 1293 // The same input with window_bits=10 returns smaller output.
1328 TEST_F(WebSocketDeflateStreamWithClientWindowBitsTest, WindowBits10) { 1294 TEST_F(WebSocketDeflateStreamWithClientWindowBitsTest, WindowBits10) {
1329 SetUpWithWindowBits(10); 1295 SetUpWithWindowBits(10);
1330 CompletionCallback callback; 1296 CompletionCallback callback;
1331 AddCompressibleFrameString(); 1297 AddCompressibleFrameString();
1332 WriteFramesStub stub(predictor_, OK); 1298 WriteFramesStub stub(predictor_, OK);
1333 { 1299 {
1334 InSequence s; 1300 InSequence s;
1335 EXPECT_CALL(*mock_stream_, WriteFrames(_, _)) 1301 EXPECT_CALL(*mock_stream_, WriteFrames(_, _))
1336 .WillOnce(Invoke(&stub, &WriteFramesStub::Call)); 1302 .WillOnce(Invoke(&stub, &WriteFramesStub::Call));
1337 } 1303 }
1338 ASSERT_EQ(OK, deflate_stream_->WriteFrames(&frames_, callback)); 1304 ASSERT_EQ(OK, deflate_stream_->WriteFrames(&frames_, callback));
1339 const ScopedVector<WebSocketFrame>& frames_passed = *stub.frames(); 1305 const ScopedVector<WebSocketFrame>& frames_passed = *stub.frames();
1340 ASSERT_EQ(1u, frames_passed.size()); 1306 ASSERT_EQ(1u, frames_passed.size());
1341 EXPECT_EQ( 1307 EXPECT_EQ(
1342 std::string("r\xce(\xca\xcf\xcd,\xcdM\x1c\xe1\xc0\x19\x1a\x0e\0\0", 17), 1308 std::string("r\xce(\xca\xcf\xcd,\xcdM\x1c\xe1\xc0\x19\x1a\x0e\0\0", 17),
1343 ToString(frames_passed[0])); 1309 ToString(frames_passed[0]));
1344 } 1310 }
1345 1311
1346 } // namespace 1312 } // namespace
1347 1313
1348 } // namespace net 1314 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698