Fixes pacing interval dependency and race in BandwidthEndToEndTest

BandwidthEndToEndTest failed when I tested it with the new task-queue
based paced sender. This turned out to be issues with this test.
Problems fixed by this CL:

1. Send-side BWE not set up correctly. Caused probing to fail.
2. Test waited for non-zero pacer delay, but the new pacer will not
   generate any delay in this scenario.
3. Race condition during shutdown of test.

1) Is just a matter of configiuring the right header extension.
2) Set up test with high encoder bitrate to trigger pacer delay.
3) TaskQueue outlives the Call instances used in test, so make sure
   they are not referenced from lambda during teardown.

Bug: webrtc:10809
Change-Id: I6393975691dfa05eb5b25d9283e476062e23a876
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/158722
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Commit-Queue: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29669}
This commit is contained in:
Erik Språng 2019-10-30 16:48:28 +01:00 committed by Commit Bot
parent caaa9e73d7
commit 8d65e9ab98

View File

@ -33,6 +33,7 @@ namespace webrtc {
namespace {
enum : int { // The first valid value is 1.
kAbsSendTimeExtensionId = 1,
kTransportSequenceNumberId,
};
} // namespace
@ -94,12 +95,28 @@ class BandwidthStatsTest : public test::EndToEndTest {
VideoSendStream::Config* send_config,
std::vector<VideoReceiveStream::Config>* receive_configs,
VideoEncoderConfig* encoder_config) override {
send_config->rtp.extensions.clear();
if (!send_side_bwe_) {
send_config->rtp.extensions.clear();
send_config->rtp.extensions.push_back(
RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeExtensionId));
(*receive_configs)[0].rtp.transport_cc = false;
} else {
send_config->rtp.extensions.push_back(
RtpExtension(RtpExtension::kTransportSequenceNumberUri,
kTransportSequenceNumberId));
(*receive_configs)[0].rtp.transport_cc = true;
}
// Force a too high encoder bitrate to make sure we get pacer delay.
encoder_config->number_of_streams = 1;
encoder_config->max_bitrate_bps = kMaxBitrateBps * 2;
encoder_config->simulcast_layers[0].min_bitrate_bps = kMaxBitrateBps * 2;
encoder_config->simulcast_layers[0].target_bitrate_bps = kMaxBitrateBps * 2;
encoder_config->simulcast_layers[0].max_bitrate_bps = kMaxBitrateBps * 2;
}
void ModifySenderBitrateConfig(BitrateConstraints* bitrate_config) override {
bitrate_config->max_bitrate_bps = kMaxBitrateBps;
}
// Called on the pacer thread.
@ -107,14 +124,20 @@ class BandwidthStatsTest : public test::EndToEndTest {
// Stats need to be fetched on the thread where the caller objects were
// constructed.
task_queue_->PostTask(ToQueuedTask([this]() {
if (!sender_call_ || !receiver_call_) {
return;
}
Call::Stats sender_stats = sender_call_->GetStats();
if (!has_seen_pacer_delay_)
if (!has_seen_pacer_delay_) {
has_seen_pacer_delay_ = sender_stats.pacer_delay_ms > 0;
}
if (sender_stats.send_bandwidth_bps > 0 && has_seen_pacer_delay_) {
Call::Stats receiver_stats = receiver_call_->GetStats();
if (send_side_bwe_ || receiver_stats.recv_bandwidth_bps > 0)
if (send_side_bwe_ || receiver_stats.recv_bandwidth_bps > 0) {
observation_complete_.Set();
}
}
}));
@ -126,12 +149,18 @@ class BandwidthStatsTest : public test::EndToEndTest {
receiver_call_ = receiver_call;
}
void OnStreamsStopped() override {
sender_call_ = nullptr;
receiver_call_ = nullptr;
}
void PerformTest() override {
EXPECT_TRUE(Wait()) << "Timed out while waiting for "
"non-zero bandwidth stats.";
}
private:
static const int kMaxBitrateBps = 3000000;
Call* sender_call_;
Call* receiver_call_;
bool has_seen_pacer_delay_;