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

Side by Side Diff: remoting/test/protocol_perftest.cc

Issue 2464613002: Update remoting_perftest to evaluate bandwidth estimation. (Closed)
Patch Set: Created 4 years, 1 month 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 | « remoting/test/fake_socket_factory.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « remoting/test/fake_socket_factory.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698