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

Side by Side Diff: remoting/protocol/jingle_session_unittest.cc

Issue 7275024: PseudoTcp to expose settings of nagling and ACK delay (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: done Created 9 years, 5 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 (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "base/file_path.h" 5 #include "base/file_path.h"
6 #include "base/file_util.h" 6 #include "base/file_util.h"
7 #include "base/path_service.h" 7 #include "base/path_service.h"
8 #include "base/time.h" 8 #include "base/time.h"
9 #include "base/synchronization/waitable_event.h" 9 #include "base/synchronization/waitable_event.h"
10 #include "base/test/test_timeouts.h" 10 #include "base/test/test_timeouts.h"
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 scoped_refptr<Session> client_session_; 316 scoped_refptr<Session> client_session_;
317 net::Socket* socket_1_; 317 net::Socket* socket_1_;
318 net::Socket* socket_2_; 318 net::Socket* socket_2_;
319 base::WaitableEvent done_event_; 319 base::WaitableEvent done_event_;
320 }; 320 };
321 321
322 class TCPChannelTester : public ChannelTesterBase { 322 class TCPChannelTester : public ChannelTesterBase {
323 public: 323 public:
324 TCPChannelTester(MessageLoop* message_loop, 324 TCPChannelTester(MessageLoop* message_loop,
325 Session* host_session, 325 Session* host_session,
326 Session* client_session) 326 Session* client_session,
327 int message_size, int message_count)
327 : ChannelTesterBase(message_loop, host_session, client_session), 328 : ChannelTesterBase(message_loop, host_session, client_session),
328 ALLOW_THIS_IN_INITIALIZER_LIST( 329 ALLOW_THIS_IN_INITIALIZER_LIST(
329 write_cb_(this, &TCPChannelTester::OnWritten)), 330 write_cb_(this, &TCPChannelTester::OnWritten)),
330 ALLOW_THIS_IN_INITIALIZER_LIST( 331 ALLOW_THIS_IN_INITIALIZER_LIST(
331 read_cb_(this, &TCPChannelTester::OnRead)), 332 read_cb_(this, &TCPChannelTester::OnRead)),
332 write_errors_(0), 333 write_errors_(0),
333 read_errors_(0) { 334 read_errors_(0),
335 message_size_(message_size),
336 message_count_(message_count),
337 test_data_size_(message_size * message_count) {
334 } 338 }
335 339
336 virtual ~TCPChannelTester() { } 340 virtual ~TCPChannelTester() { }
337 341
338 virtual void CheckResults() { 342 virtual void CheckResults() {
339 EXPECT_EQ(0, write_errors_); 343 EXPECT_EQ(0, write_errors_);
340 EXPECT_EQ(0, read_errors_); 344 EXPECT_EQ(0, read_errors_);
341 345
342 ASSERT_EQ(kTestDataSize + kMessageSize, input_buffer_->capacity()); 346 ASSERT_EQ(test_data_size_ + message_size_, input_buffer_->capacity());
343 347
344 output_buffer_->SetOffset(0); 348 output_buffer_->SetOffset(0);
345 ASSERT_EQ(kTestDataSize, output_buffer_->size()); 349 ASSERT_EQ(test_data_size_, output_buffer_->size());
346 350
347 EXPECT_EQ(0, memcmp(output_buffer_->data(), 351 EXPECT_EQ(0, memcmp(output_buffer_->data(),
348 input_buffer_->StartOfBuffer(), kTestDataSize)); 352 input_buffer_->StartOfBuffer(), test_data_size_));
349 } 353 }
350 354
351 protected: 355 protected:
352 virtual void InitBuffers() { 356 virtual void InitBuffers() {
353 output_buffer_ = new net::DrainableIOBuffer( 357 output_buffer_ = new net::DrainableIOBuffer(
354 new net::IOBuffer(kTestDataSize), kTestDataSize); 358 new net::IOBuffer(test_data_size_), test_data_size_);
355 memset(output_buffer_->data(), 123, kTestDataSize); 359 memset(output_buffer_->data(), 123, test_data_size_);
356 360
357 input_buffer_ = new net::GrowableIOBuffer(); 361 input_buffer_ = new net::GrowableIOBuffer();
358 // Always keep kMessageSize bytes available at the end of the input buffer. 362 // Always keep message_size_ bytes available at the end of the input buffer.
359 input_buffer_->SetCapacity(kMessageSize); 363 input_buffer_->SetCapacity(message_size_);
360 } 364 }
361 365
362 virtual void DoWrite() { 366 virtual void DoWrite() {
363 int result = 1; 367 int result = 1;
364 while (result > 0) { 368 while (result > 0) {
365 if (output_buffer_->BytesRemaining() == 0) 369 if (output_buffer_->BytesRemaining() == 0)
366 break; 370 break;
367 371
368 int bytes_to_write = std::min(output_buffer_->BytesRemaining(), 372 int bytes_to_write = std::min(output_buffer_->BytesRemaining(),
369 kMessageSize); 373 message_size_);
370 result = socket_1_->Write(output_buffer_, bytes_to_write, &write_cb_); 374 result = socket_1_->Write(output_buffer_, bytes_to_write, &write_cb_);
371 HandleWriteResult(result); 375 HandleWriteResult(result);
372 }; 376 };
373 } 377 }
374 378
375 void OnWritten(int result) { 379 void OnWritten(int result) {
376 HandleWriteResult(result); 380 HandleWriteResult(result);
377 DoWrite(); 381 DoWrite();
378 } 382 }
379 383
380 void HandleWriteResult(int result) { 384 void HandleWriteResult(int result) {
381 if (result <= 0 && result != net::ERR_IO_PENDING) { 385 if (result <= 0 && result != net::ERR_IO_PENDING) {
382 LOG(ERROR) << "Received error " << result << " when trying to write"; 386 LOG(ERROR) << "Received error " << result << " when trying to write";
383 write_errors_++; 387 write_errors_++;
384 done_event_.Signal(); 388 done_event_.Signal();
385 } else if (result > 0) { 389 } else if (result > 0) {
386 output_buffer_->DidConsume(result); 390 output_buffer_->DidConsume(result);
387 } 391 }
388 } 392 }
389 393
390 virtual void DoRead() { 394 virtual void DoRead() {
391 int result = 1; 395 int result = 1;
392 while (result > 0) { 396 while (result > 0) {
393 input_buffer_->set_offset(input_buffer_->capacity() - kMessageSize); 397 input_buffer_->set_offset(input_buffer_->capacity() - message_size_);
394 398
395 result = socket_2_->Read(input_buffer_, kMessageSize, &read_cb_); 399 result = socket_2_->Read(input_buffer_, message_size_, &read_cb_);
396 HandleReadResult(result); 400 HandleReadResult(result);
397 }; 401 };
398 } 402 }
399 403
400 void OnRead(int result) { 404 void OnRead(int result) {
401 HandleReadResult(result); 405 HandleReadResult(result);
402 if (!done_event_.IsSignaled()) 406 if (!done_event_.IsSignaled())
403 DoRead(); // Don't try to read again when we are done reading. 407 DoRead(); // Don't try to read again when we are done reading.
404 } 408 }
405 409
406 void HandleReadResult(int result) { 410 void HandleReadResult(int result) {
407 if (result <= 0 && result != net::ERR_IO_PENDING) { 411 if (result <= 0 && result != net::ERR_IO_PENDING) {
408 if (!done_event_.IsSignaled()) { 412 if (!done_event_.IsSignaled()) {
409 LOG(ERROR) << "Received error " << result << " when trying to read"; 413 LOG(ERROR) << "Received error " << result << " when trying to read";
410 read_errors_++; 414 read_errors_++;
411 done_event_.Signal(); 415 done_event_.Signal();
412 } 416 }
413 } else if (result > 0) { 417 } else if (result > 0) {
414 // Allocate memory for the next read. 418 // Allocate memory for the next read.
415 input_buffer_->SetCapacity(input_buffer_->capacity() + result); 419 input_buffer_->SetCapacity(input_buffer_->capacity() + result);
416 if (input_buffer_->capacity() == kTestDataSize + kMessageSize) 420 if (input_buffer_->capacity() == test_data_size_ + message_size_)
417 done_event_.Signal(); 421 done_event_.Signal();
418 } 422 }
419 } 423 }
420 424
421 private:
422 scoped_refptr<net::DrainableIOBuffer> output_buffer_; 425 scoped_refptr<net::DrainableIOBuffer> output_buffer_;
423 scoped_refptr<net::GrowableIOBuffer> input_buffer_; 426 scoped_refptr<net::GrowableIOBuffer> input_buffer_;
424 427
425 net::CompletionCallbackImpl<TCPChannelTester> write_cb_; 428 net::CompletionCallbackImpl<TCPChannelTester> write_cb_;
426 net::CompletionCallbackImpl<TCPChannelTester> read_cb_; 429 net::CompletionCallbackImpl<TCPChannelTester> read_cb_;
427 int write_errors_; 430 int write_errors_;
428 int read_errors_; 431 int read_errors_;
432 int message_size_;
433 int message_count_;
434 int test_data_size_;
435 };
436
437 class ChannelLatencyTester : public TCPChannelTester {
438 public:
439 ChannelLatencyTester(MessageLoop* message_loop,
440 Session* host_session,
441 Session* client_session,
442 int message_size)
443 : TCPChannelTester(message_loop, host_session,
444 client_session, message_size, 1) {
445 CHECK(message_size >= 8);
446 }
447
448 virtual ~ChannelLatencyTester() { }
449
450 virtual void CheckResults() {
451 }
452
453 base::TimeDelta GetLatency() {
454 return base::Time::Now() - start_time_;
Wez 2011/06/28 19:27:18 This isn't latency, it's elapsed time.
455 }
456
457 protected:
458 virtual void InitBuffers() {
459 TCPChannelTester::InitBuffers();
460
461 start_time_ = base::Time::Now();
462 }
463
464 base::Time start_time_;
429 }; 465 };
430 466
431 class UDPChannelTester : public ChannelTesterBase { 467 class UDPChannelTester : public ChannelTesterBase {
432 public: 468 public:
433 UDPChannelTester(MessageLoop* message_loop, 469 UDPChannelTester(MessageLoop* message_loop,
434 Session* host_session, 470 Session* host_session,
435 Session* client_session) 471 Session* client_session)
436 : ChannelTesterBase(message_loop, host_session, client_session), 472 : ChannelTesterBase(message_loop, host_session, client_session),
437 ALLOW_THIS_IN_INITIALIZER_LIST( 473 ALLOW_THIS_IN_INITIALIZER_LIST(
438 write_cb_(this, &UDPChannelTester::OnWritten)), 474 write_cb_(this, &UDPChannelTester::OnWritten)),
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 CreateServerPair(); 635 CreateServerPair();
600 ASSERT_TRUE(InitiateConnection()); 636 ASSERT_TRUE(InitiateConnection());
601 } 637 }
602 638
603 // Verify that data can be transmitted over the event channel. 639 // Verify that data can be transmitted over the event channel.
604 TEST_F(JingleSessionTest, TestControlChannel) { 640 TEST_F(JingleSessionTest, TestControlChannel) {
605 CreateServerPair(); 641 CreateServerPair();
606 ASSERT_TRUE(InitiateConnection()); 642 ASSERT_TRUE(InitiateConnection());
607 scoped_refptr<TCPChannelTester> tester( 643 scoped_refptr<TCPChannelTester> tester(
608 new TCPChannelTester(thread_.message_loop(), host_session_, 644 new TCPChannelTester(thread_.message_loop(), host_session_,
609 client_session_)); 645 client_session_, kMessageSize, kMessages));
610 tester->Start(ChannelTesterBase::CONTROL); 646 tester->Start(ChannelTesterBase::CONTROL);
611 ASSERT_TRUE(tester->WaitFinished()); 647 ASSERT_TRUE(tester->WaitFinished());
612 tester->CheckResults(); 648 tester->CheckResults();
613 649
614 // Connections must be closed while |tester| still exists. 650 // Connections must be closed while |tester| still exists.
615 CloseSessions(); 651 CloseSessions();
616 } 652 }
617 653
618 // Verify that data can be transmitted over the video channel. 654 // Verify that data can be transmitted over the video channel.
619 TEST_F(JingleSessionTest, TestVideoChannel) { 655 TEST_F(JingleSessionTest, TestVideoChannel) {
620 CreateServerPair(); 656 CreateServerPair();
621 ASSERT_TRUE(InitiateConnection()); 657 ASSERT_TRUE(InitiateConnection());
622 scoped_refptr<TCPChannelTester> tester( 658 scoped_refptr<TCPChannelTester> tester(
623 new TCPChannelTester(thread_.message_loop(), host_session_, 659 new TCPChannelTester(thread_.message_loop(), host_session_,
624 client_session_)); 660 client_session_, kMessageSize, kMessageSize));
625 tester->Start(ChannelTesterBase::VIDEO); 661 tester->Start(ChannelTesterBase::VIDEO);
626 ASSERT_TRUE(tester->WaitFinished()); 662 ASSERT_TRUE(tester->WaitFinished());
627 tester->CheckResults(); 663 tester->CheckResults();
628 664
629 // Connections must be closed while |tester| still exists. 665 // Connections must be closed while |tester| still exists.
630 CloseSessions(); 666 CloseSessions();
631 } 667 }
632 668
633 // Verify that data can be transmitted over the event channel. 669 // Verify that data can be transmitted over the event channel.
634 TEST_F(JingleSessionTest, TestEventChannel) { 670 TEST_F(JingleSessionTest, TestEventChannel) {
635 CreateServerPair(); 671 CreateServerPair();
636 ASSERT_TRUE(InitiateConnection()); 672 ASSERT_TRUE(InitiateConnection());
637 scoped_refptr<TCPChannelTester> tester( 673 scoped_refptr<TCPChannelTester> tester(
638 new TCPChannelTester(thread_.message_loop(), host_session_, 674 new TCPChannelTester(thread_.message_loop(), host_session_,
639 client_session_)); 675 client_session_, kMessageSize, kMessageSize));
640 tester->Start(ChannelTesterBase::EVENT); 676 tester->Start(ChannelTesterBase::EVENT);
641 ASSERT_TRUE(tester->WaitFinished()); 677 ASSERT_TRUE(tester->WaitFinished());
642 tester->CheckResults(); 678 tester->CheckResults();
643 679
644 // Connections must be closed while |tester| still exists. 680 // Connections must be closed while |tester| still exists.
645 CloseSessions(); 681 CloseSessions();
646 } 682 }
647 683
648 // Verify that data can be transmitted over the video RTP channel. 684 // Verify that data can be transmitted over the video RTP channel.
649 TEST_F(JingleSessionTest, TestVideoRtpChannel) { 685 TEST_F(JingleSessionTest, TestVideoRtpChannel) {
650 CreateServerPair(); 686 CreateServerPair();
651 ASSERT_TRUE(InitiateConnection()); 687 ASSERT_TRUE(InitiateConnection());
652 scoped_refptr<UDPChannelTester> tester( 688 scoped_refptr<UDPChannelTester> tester(
653 new UDPChannelTester(thread_.message_loop(), host_session_, 689 new UDPChannelTester(thread_.message_loop(), host_session_,
654 client_session_)); 690 client_session_));
655 tester->Start(ChannelTesterBase::VIDEO_RTP); 691 tester->Start(ChannelTesterBase::VIDEO_RTP);
656 ASSERT_TRUE(tester->WaitFinished()); 692 ASSERT_TRUE(tester->WaitFinished());
657 tester->CheckResults(); 693 tester->CheckResults();
658 694
659 // Connections must be closed while |tester| still exists. 695 // Connections must be closed while |tester| still exists.
660 CloseSessions(); 696 CloseSessions();
661 } 697 }
662 698
699 // Send packets of different size to get the latency for sending data
700 // using sockets from JingleSession.
701 // Latency numbers are measured to catch regression.
702 TEST_F(JingleSessionTest, TestLatency) {
Wez 2011/06/28 19:27:18 This isn't testing latency, it's testing elapsed t
703 CreateServerPair();
704 ASSERT_TRUE(InitiateConnection());
705 scoped_refptr<ChannelLatencyTester> tester;
706
707 tester = new ChannelLatencyTester(thread_.message_loop(), host_session_,
708 client_session_, 512);
709 tester->Start(ChannelTesterBase::VIDEO);
710 ASSERT_TRUE(tester->WaitFinished());
711 LOG(INFO) << "Latency for 512 bytes "
712 << tester->GetLatency().InMilliseconds() << " ms.";
713
714 tester = new ChannelLatencyTester(thread_.message_loop(), host_session_,
715 client_session_, 1024);
716 tester->Start(ChannelTesterBase::VIDEO);
717 ASSERT_TRUE(tester->WaitFinished());
718 LOG(INFO) << "Latency for 1024 bytes "
719 << tester->GetLatency().InMilliseconds() << " ms.";
720
721 tester = new ChannelLatencyTester(thread_.message_loop(), host_session_,
722 client_session_, 51200);
723 tester->Start(ChannelTesterBase::VIDEO);
724 ASSERT_TRUE(tester->WaitFinished());
725 LOG(INFO) << "Latency for 50k bytes "
726 << tester->GetLatency().InMilliseconds() << " ms.";
727
728 tester = new ChannelLatencyTester(thread_.message_loop(), host_session_,
729 client_session_, 512000);
730 tester->Start(ChannelTesterBase::VIDEO);
731 ASSERT_TRUE(tester->WaitFinished());
732 LOG(INFO) << "Latency for 500k bytes "
733 << tester->GetLatency().InMilliseconds() << " ms.";
734
735 // Connections must be closed while |tester| still exists.
736 CloseSessions();
737 }
738
663 #endif 739 #endif
664 740
665 } // namespace protocol 741 } // namespace protocol
666 } // namespace remoting 742 } // namespace remoting
OLDNEW
« remoting/protocol/jingle_session.cc ('K') | « remoting/protocol/jingle_session.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698