OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <numeric> | 5 #include <numeric> |
6 #include <utility> | 6 #include <utility> |
7 | 7 |
8 #include "base/base64.h" | 8 #include "base/base64.h" |
9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 | 53 |
54 namespace { | 54 namespace { |
55 | 55 |
56 const char kHostJid[] = "host_jid@example.com/host"; | 56 const char kHostJid[] = "host_jid@example.com/host"; |
57 const char kHostOwner[] = "jane.doe@example.com"; | 57 const char kHostOwner[] = "jane.doe@example.com"; |
58 const char kClientJid[] = "jane.doe@example.com/client"; | 58 const char kClientJid[] = "jane.doe@example.com/client"; |
59 const char kHostId[] = "ABC123"; | 59 const char kHostId[] = "ABC123"; |
60 const char kHostPin[] = "123456"; | 60 const char kHostPin[] = "123456"; |
61 | 61 |
62 struct NetworkPerformanceParams { | 62 struct NetworkPerformanceParams { |
63 NetworkPerformanceParams(int bandwidth, | 63 // |buffer_s| defines buffer size in seconds. actual buffer size is calculated |
64 int max_buffers, | 64 // based on bandwidth_kbps |
| 65 NetworkPerformanceParams(int bandwidth_kbps, |
| 66 double buffer_s, |
65 double latency_average_ms, | 67 double latency_average_ms, |
66 double latency_stddev_ms, | 68 double latency_stddev_ms, |
67 double out_of_order_rate) | 69 double out_of_order_rate, |
68 : bandwidth(bandwidth), | 70 double signaling_latency_ms) |
69 max_buffers(max_buffers), | 71 : bandwidth_kbps(bandwidth_kbps), |
| 72 max_buffers(buffer_s * bandwidth_kbps * 1000 / 8), |
70 latency_average(base::TimeDelta::FromMillisecondsD(latency_average_ms)), | 73 latency_average(base::TimeDelta::FromMillisecondsD(latency_average_ms)), |
71 latency_stddev(base::TimeDelta::FromMillisecondsD(latency_stddev_ms)), | 74 latency_stddev(base::TimeDelta::FromMillisecondsD(latency_stddev_ms)), |
72 out_of_order_rate(out_of_order_rate) {} | 75 out_of_order_rate(out_of_order_rate), |
| 76 signaling_latency( |
| 77 base::TimeDelta::FromMillisecondsD(signaling_latency_ms)) {} |
73 | 78 |
74 int bandwidth; | 79 int bandwidth_kbps; |
75 int max_buffers; | 80 int max_buffers; |
76 base::TimeDelta latency_average; | 81 base::TimeDelta latency_average; |
77 base::TimeDelta latency_stddev; | 82 base::TimeDelta latency_stddev; |
78 double out_of_order_rate; | 83 double out_of_order_rate; |
| 84 base::TimeDelta signaling_latency; |
79 }; | 85 }; |
80 | 86 |
81 class FakeCursorShapeStub : public protocol::CursorShapeStub { | 87 class FakeCursorShapeStub : public protocol::CursorShapeStub { |
82 public: | 88 public: |
83 FakeCursorShapeStub() {} | 89 FakeCursorShapeStub() {} |
84 ~FakeCursorShapeStub() override {} | 90 ~FakeCursorShapeStub() override {} |
85 | 91 |
86 // protocol::CursorShapeStub interface. | 92 // protocol::CursorShapeStub interface. |
87 void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override{}; | 93 void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override{}; |
88 }; | 94 }; |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 FROM_HERE, | 255 FROM_HERE, |
250 base::Bind(&ProtocolPerfTest::StartHost, base::Unretained(this))); | 256 base::Bind(&ProtocolPerfTest::StartHost, base::Unretained(this))); |
251 } | 257 } |
252 | 258 |
253 void StartHost() { | 259 void StartHost() { |
254 DCHECK(host_thread_.task_runner()->BelongsToCurrentThread()); | 260 DCHECK(host_thread_.task_runner()->BelongsToCurrentThread()); |
255 | 261 |
256 jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); | 262 jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); |
257 | 263 |
258 host_signaling_.reset(new FakeSignalStrategy(kHostJid)); | 264 host_signaling_.reset(new FakeSignalStrategy(kHostJid)); |
| 265 host_signaling_->set_send_delay(GetParam().signaling_latency); |
259 host_signaling_->ConnectTo(client_signaling_.get()); | 266 host_signaling_->ConnectTo(client_signaling_.get()); |
260 | 267 |
261 protocol::NetworkSettings network_settings( | 268 protocol::NetworkSettings network_settings( |
262 protocol::NetworkSettings::NAT_TRAVERSAL_OUTGOING); | 269 protocol::NetworkSettings::NAT_TRAVERSAL_OUTGOING); |
263 | 270 |
264 std::unique_ptr<FakePortAllocatorFactory> port_allocator_factory( | 271 std::unique_ptr<FakePortAllocatorFactory> port_allocator_factory( |
265 new FakePortAllocatorFactory(fake_network_dispatcher_)); | 272 new FakePortAllocatorFactory(fake_network_dispatcher_)); |
266 port_allocator_factory->socket_factory()->SetBandwidth( | 273 port_allocator_factory->socket_factory()->SetBandwidth( |
267 GetParam().bandwidth, GetParam().max_buffers); | 274 GetParam().bandwidth_kbps * 1000 / 8, GetParam().max_buffers); |
268 port_allocator_factory->socket_factory()->SetLatency( | 275 port_allocator_factory->socket_factory()->SetLatency( |
269 GetParam().latency_average, GetParam().latency_stddev); | 276 GetParam().latency_average, GetParam().latency_stddev); |
270 port_allocator_factory->socket_factory()->set_out_of_order_rate( | 277 port_allocator_factory->socket_factory()->set_out_of_order_rate( |
271 GetParam().out_of_order_rate); | 278 GetParam().out_of_order_rate); |
272 scoped_refptr<protocol::TransportContext> transport_context( | 279 scoped_refptr<protocol::TransportContext> transport_context( |
273 new protocol::TransportContext( | 280 new protocol::TransportContext( |
274 host_signaling_.get(), std::move(port_allocator_factory), nullptr, | 281 host_signaling_.get(), std::move(port_allocator_factory), nullptr, |
275 network_settings, protocol::TransportRole::SERVER)); | 282 network_settings, protocol::TransportRole::SERVER)); |
276 std::unique_ptr<protocol::SessionManager> session_manager( | 283 std::unique_ptr<protocol::SessionManager> session_manager( |
277 new protocol::JingleSessionManager(host_signaling_.get())); | 284 new protocol::JingleSessionManager(host_signaling_.get())); |
(...skipping 29 matching lines...) Expand all Loading... |
307 | 314 |
308 host_->AddStatusObserver(this); | 315 host_->AddStatusObserver(this); |
309 host_->Start(kHostOwner); | 316 host_->Start(kHostOwner); |
310 | 317 |
311 message_loop_.task_runner()->PostTask( | 318 message_loop_.task_runner()->PostTask( |
312 FROM_HERE, base::Bind(&ProtocolPerfTest::StartClientAfterHost, | 319 FROM_HERE, base::Bind(&ProtocolPerfTest::StartClientAfterHost, |
313 base::Unretained(this))); | 320 base::Unretained(this))); |
314 } | 321 } |
315 | 322 |
316 void StartClientAfterHost() { | 323 void StartClientAfterHost() { |
| 324 client_signaling_->set_send_delay(GetParam().signaling_latency); |
317 client_signaling_->ConnectTo(host_signaling_.get()); | 325 client_signaling_->ConnectTo(host_signaling_.get()); |
318 | 326 |
319 protocol::NetworkSettings network_settings( | 327 protocol::NetworkSettings network_settings( |
320 protocol::NetworkSettings::NAT_TRAVERSAL_OUTGOING); | 328 protocol::NetworkSettings::NAT_TRAVERSAL_OUTGOING); |
321 | 329 |
322 // Initialize client. | 330 // Initialize client. |
323 client_context_.reset( | 331 client_context_.reset( |
324 new ClientContext(base::ThreadTaskRunnerHandle::Get())); | 332 new ClientContext(base::ThreadTaskRunnerHandle::Get())); |
325 client_context_->Start(); | 333 client_context_->Start(); |
326 | 334 |
327 std::unique_ptr<FakePortAllocatorFactory> port_allocator_factory( | 335 std::unique_ptr<FakePortAllocatorFactory> port_allocator_factory( |
328 new FakePortAllocatorFactory(fake_network_dispatcher_)); | 336 new FakePortAllocatorFactory(fake_network_dispatcher_)); |
329 client_socket_factory_ = port_allocator_factory->socket_factory(); | 337 client_socket_factory_ = port_allocator_factory->socket_factory(); |
330 port_allocator_factory->socket_factory()->SetBandwidth( | 338 port_allocator_factory->socket_factory()->SetBandwidth( |
331 GetParam().bandwidth, GetParam().max_buffers); | 339 GetParam().bandwidth_kbps * 1000 / 8, GetParam().max_buffers); |
332 port_allocator_factory->socket_factory()->SetLatency( | 340 port_allocator_factory->socket_factory()->SetLatency( |
333 GetParam().latency_average, GetParam().latency_stddev); | 341 GetParam().latency_average, GetParam().latency_stddev); |
334 port_allocator_factory->socket_factory()->set_out_of_order_rate( | 342 port_allocator_factory->socket_factory()->set_out_of_order_rate( |
335 GetParam().out_of_order_rate); | 343 GetParam().out_of_order_rate); |
336 scoped_refptr<protocol::TransportContext> transport_context( | 344 scoped_refptr<protocol::TransportContext> transport_context( |
337 new protocol::TransportContext( | 345 new protocol::TransportContext( |
338 host_signaling_.get(), std::move(port_allocator_factory), nullptr, | 346 host_signaling_.get(), std::move(port_allocator_factory), nullptr, |
339 network_settings, protocol::TransportRole::CLIENT)); | 347 network_settings, protocol::TransportRole::CLIENT)); |
340 | 348 |
341 protocol::ClientAuthenticationConfig client_auth_config; | 349 protocol::ClientAuthenticationConfig client_auth_config; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 std::unique_ptr<webrtc::DesktopFrame> last_video_frame_; | 411 std::unique_ptr<webrtc::DesktopFrame> last_video_frame_; |
404 std::vector<protocol::FrameStats> frame_stats_; | 412 std::vector<protocol::FrameStats> frame_stats_; |
405 | 413 |
406 private: | 414 private: |
407 DISALLOW_COPY_AND_ASSIGN(ProtocolPerfTest); | 415 DISALLOW_COPY_AND_ASSIGN(ProtocolPerfTest); |
408 }; | 416 }; |
409 | 417 |
410 INSTANTIATE_TEST_CASE_P( | 418 INSTANTIATE_TEST_CASE_P( |
411 NoDelay, | 419 NoDelay, |
412 ProtocolPerfTest, | 420 ProtocolPerfTest, |
413 ::testing::Values(NetworkPerformanceParams(0, 0, 0, 0, 0.0))); | 421 ::testing::Values(NetworkPerformanceParams(0, 0, 0, 0, 0.0, 0))); |
414 | 422 |
415 INSTANTIATE_TEST_CASE_P( | 423 INSTANTIATE_TEST_CASE_P( |
416 HighLatency, | 424 HighLatency, |
417 ProtocolPerfTest, | 425 ProtocolPerfTest, |
418 ::testing::Values(NetworkPerformanceParams(0, 0, 300, 30, 0.0), | 426 ::testing::Values(NetworkPerformanceParams(0, 0, 300, 30, 0.0, 0), |
419 NetworkPerformanceParams(0, 0, 30, 10, 0.0))); | 427 NetworkPerformanceParams(0, 0, 30, 10, 0.0, 0))); |
420 | 428 |
421 INSTANTIATE_TEST_CASE_P( | 429 INSTANTIATE_TEST_CASE_P( |
422 OutOfOrder, | 430 OutOfOrder, |
423 ProtocolPerfTest, | 431 ProtocolPerfTest, |
424 ::testing::Values(NetworkPerformanceParams(0, 0, 2, 0, 0.01), | 432 ::testing::Values(NetworkPerformanceParams(0, 0, 2, 0, 0.01, 0), |
425 NetworkPerformanceParams(0, 0, 30, 1, 0.01), | 433 NetworkPerformanceParams(0, 0, 30, 1, 0.01, 0), |
426 NetworkPerformanceParams(0, 0, 30, 1, 0.1), | 434 NetworkPerformanceParams(0, 0, 30, 1, 0.1, 0), |
427 NetworkPerformanceParams(0, 0, 300, 20, 0.01), | 435 NetworkPerformanceParams(0, 0, 300, 20, 0.01, 0), |
428 NetworkPerformanceParams(0, 0, 300, 20, 0.1))); | 436 NetworkPerformanceParams(0, 0, 300, 20, 0.1, 0))); |
429 | 437 |
430 INSTANTIATE_TEST_CASE_P( | 438 INSTANTIATE_TEST_CASE_P( |
431 LimitedBandwidth, | 439 LimitedBandwidth, |
432 ProtocolPerfTest, | 440 ProtocolPerfTest, |
433 ::testing::Values( | 441 ::testing::Values( |
434 // 100 Mbps | 442 // 100 Mbps |
435 NetworkPerformanceParams(12500000, 12500000, 2, 1, 0.0), | 443 NetworkPerformanceParams(100000, 0.25, 2, 1, 0.0, 0), |
| 444 NetworkPerformanceParams(100000, 1.0, 2, 1, 0.0, 0), |
436 // 8 Mbps | 445 // 8 Mbps |
437 NetworkPerformanceParams(1000000, 300000, 30, 5, 0.01), | 446 NetworkPerformanceParams(8000, 0.25, 30, 5, 0.01, 0), |
438 NetworkPerformanceParams(1000000, 2000000, 30, 5, 0.01), | 447 NetworkPerformanceParams(8000, 1.0, 30, 5, 0.01, 0), |
439 // 2 Mbps | 448 // 2 Mbps |
440 NetworkPerformanceParams(250000, 300000, 30, 5, 0.01), | 449 NetworkPerformanceParams(2000, 0.25, 30, 5, 0.01, 0), |
441 NetworkPerformanceParams(250000, 2000000, 30, 5, 0.01), | 450 NetworkPerformanceParams(2000, 1.0, 30, 5, 0.01, 0), |
442 // 800 kBps | 451 // 800 kbps |
443 NetworkPerformanceParams(100000, 30000, 130, 5, 0.00), | 452 NetworkPerformanceParams(800, 0.25, 130, 5, 0.00, 0), |
444 NetworkPerformanceParams(100000, 200000, 130, 5, 0.00))); | 453 NetworkPerformanceParams(800, 1.0, 130, 5, 0.00, 0))); |
| 454 |
| 455 INSTANTIATE_TEST_CASE_P( |
| 456 SlowSignaling, |
| 457 ProtocolPerfTest, |
| 458 ::testing::Values(NetworkPerformanceParams(8000, 0.25, 30, 0, 0.0, 50), |
| 459 NetworkPerformanceParams(8000, 0.25, 30, 0, 0.0, 500))); |
445 | 460 |
446 // TotalLatency[Ice|Webrtc] tests measure video latency in the case when the | 461 // TotalLatency[Ice|Webrtc] tests measure video latency in the case when the |
447 // whole screen is updated occasionally. It's intended to simulate the case when | 462 // whole screen is updated occasionally. It's intended to simulate the case when |
448 // user actions (e.g. Alt-Tab, click on the task bar) cause whole screen to be | 463 // user actions (e.g. Alt-Tab, click on the task bar) cause whole screen to be |
449 // updated. | 464 // updated. |
450 void ProtocolPerfTest::MeasureTotalLatency(bool use_webrtc) { | 465 void ProtocolPerfTest::MeasureTotalLatency(bool use_webrtc) { |
451 scoped_refptr<test::CyclicFrameGenerator> frame_generator = | 466 scoped_refptr<test::CyclicFrameGenerator> frame_generator = |
452 test::CyclicFrameGenerator::Create(); | 467 test::CyclicFrameGenerator::Create(); |
453 desktop_environment_factory_->set_frame_generator( | 468 desktop_environment_factory_->set_frame_generator( |
454 base::Bind(&test::CyclicFrameGenerator::GenerateFrame, frame_generator)); | 469 base::Bind(&test::CyclicFrameGenerator::GenerateFrame, frame_generator)); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
505 ++big_update_count; | 520 ++big_update_count; |
506 break; | 521 break; |
507 case test::CyclicFrameGenerator::ChangeType::CURSOR: | 522 case test::CyclicFrameGenerator::ChangeType::CURSOR: |
508 total_latency_small_updates += latency; | 523 total_latency_small_updates += latency; |
509 ++small_update_count; | 524 ++small_update_count; |
510 break; | 525 break; |
511 } | 526 } |
512 } | 527 } |
513 } | 528 } |
514 | 529 |
| 530 WaitFrameStats(total_frames); |
| 531 |
515 CHECK(big_update_count); | 532 CHECK(big_update_count); |
516 VLOG(0) << "Average latency for big updates: " | 533 VLOG(0) << "Average latency for big updates: " |
517 << (total_latency_big_updates / big_update_count).InMillisecondsF(); | 534 << (total_latency_big_updates / big_update_count).InMillisecondsF(); |
518 | 535 |
519 if (small_update_count) { | 536 if (small_update_count) { |
520 VLOG(0) | 537 VLOG(0) |
521 << "Average latency for small updates: " | 538 << "Average latency for small updates: " |
522 << (total_latency_small_updates / small_update_count).InMillisecondsF(); | 539 << (total_latency_small_updates / small_update_count).InMillisecondsF(); |
523 } | 540 } |
| 541 |
| 542 double average_bwe = |
| 543 std::accumulate(frame_stats_.begin() + warm_up_frames, |
| 544 frame_stats_.begin() + total_frames, 0.0, |
| 545 [](double sum, const protocol::FrameStats& stats) { |
| 546 return sum + stats.host_stats.bandwidth_estimate_kbps; |
| 547 }) / |
| 548 (total_frames - warm_up_frames); |
| 549 VLOG(0) << "Average BW estimate: " << average_bwe |
| 550 << " (actual: " << GetParam().bandwidth_kbps << ")"; |
524 } | 551 } |
525 | 552 |
526 TEST_P(ProtocolPerfTest, TotalLatencyIce) { | 553 TEST_P(ProtocolPerfTest, TotalLatencyIce) { |
527 MeasureTotalLatency(false); | 554 MeasureTotalLatency(false); |
528 } | 555 } |
529 | 556 |
530 TEST_P(ProtocolPerfTest, TotalLatencyWebrtc) { | 557 TEST_P(ProtocolPerfTest, TotalLatencyWebrtc) { |
531 MeasureTotalLatency(true); | 558 MeasureTotalLatency(true); |
532 } | 559 } |
533 | 560 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 }); | 600 }); |
574 | 601 |
575 base::TimeDelta latency_sum = std::accumulate( | 602 base::TimeDelta latency_sum = std::accumulate( |
576 frame_stats_.begin() + warm_up_frames, | 603 frame_stats_.begin() + warm_up_frames, |
577 frame_stats_.begin() + warm_up_frames + num_frames, base::TimeDelta(), | 604 frame_stats_.begin() + warm_up_frames + num_frames, base::TimeDelta(), |
578 [](base::TimeDelta sum, const protocol::FrameStats& stats) { | 605 [](base::TimeDelta sum, const protocol::FrameStats& stats) { |
579 return sum + (stats.client_stats.time_rendered - | 606 return sum + (stats.client_stats.time_rendered - |
580 stats.host_stats.latest_event_timestamp); | 607 stats.host_stats.latest_event_timestamp); |
581 }); | 608 }); |
582 | 609 |
| 610 double average_bwe = |
| 611 std::accumulate(frame_stats_.begin() + warm_up_frames, |
| 612 frame_stats_.begin() + warm_up_frames + num_frames, 0.0, |
| 613 [](double sum, const protocol::FrameStats& stats) { |
| 614 return sum + stats.host_stats.bandwidth_estimate_kbps; |
| 615 }) / |
| 616 num_frames; |
| 617 |
583 VLOG(0) << "FPS: " << num_frames / total_time.InSecondsF(); | 618 VLOG(0) << "FPS: " << num_frames / total_time.InSecondsF(); |
584 VLOG(0) << "Average latency: " << latency_sum.InMillisecondsF() / num_frames | 619 VLOG(0) << "Average latency: " << latency_sum.InMillisecondsF() / num_frames |
585 << " ms"; | 620 << " ms"; |
586 VLOG(0) << "Total size: " << total_size << " bytes"; | 621 VLOG(0) << "Total size: " << total_size << " bytes"; |
587 VLOG(0) << "Bandwidth utilization: " | 622 VLOG(0) << "Bandwidth utilization: " |
588 << 100 * total_size / (total_time.InSecondsF() * GetParam().bandwidth) | 623 << 100 * total_size / (total_time.InSecondsF() * |
| 624 GetParam().bandwidth_kbps * 1000 / 8) |
589 << "%"; | 625 << "%"; |
590 VLOG(0) << "Network buffer delay (bufferbloat), average: " | 626 VLOG(0) << "Network buffer delay (bufferbloat), average: " |
591 << client_socket_factory_->average_buffer_delay().InMilliseconds() | 627 << client_socket_factory_->average_buffer_delay().InMilliseconds() |
592 << " ms, max:" | 628 << " ms, max:" |
593 << client_socket_factory_->max_buffer_delay().InMilliseconds() | 629 << client_socket_factory_->max_buffer_delay().InMilliseconds() |
594 << " ms"; | 630 << " ms"; |
595 VLOG(0) << "Packet drop rate: " << client_socket_factory_->drop_rate(); | 631 VLOG(0) << "Packet drop rate: " << client_socket_factory_->drop_rate(); |
| 632 VLOG(0) << "Average BW estimate: " << average_bwe |
| 633 << " (actual: " << GetParam().bandwidth_kbps << ")"; |
596 } | 634 } |
597 | 635 |
598 TEST_P(ProtocolPerfTest, ScrollPerformanceIce) { | 636 TEST_P(ProtocolPerfTest, ScrollPerformanceIce) { |
599 MeasureScrollPerformance(false); | 637 MeasureScrollPerformance(false); |
600 } | 638 } |
601 | 639 |
602 TEST_P(ProtocolPerfTest, ScrollPerformanceWebrtc) { | 640 TEST_P(ProtocolPerfTest, ScrollPerformanceWebrtc) { |
603 MeasureScrollPerformance(true); | 641 MeasureScrollPerformance(true); |
604 } | 642 } |
605 | 643 |
606 } // namespace remoting | 644 } // namespace remoting |
OLD | NEW |