Cleanup of network controller handling in Scenario tests.

Removing functionality to choose congestion controller implementation,
using injection instead. Also cleaning up some related functionality
that's no longer needed, such as the injection of event logs into the
factory.

Bug: webrtc:9883
Change-Id: Ia528005625430ae31a15bc88881e2d4ac6ad1d42
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/133890
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27768}
This commit is contained in:
Sebastian Jansson
2019-04-24 15:13:26 +02:00
committed by Commit Bot
parent 5e3d0f88c8
commit 7ccaf8969d
12 changed files with 87 additions and 137 deletions

View File

@ -43,9 +43,10 @@ class GoogCcNetworkControllerFactory
GoogCcFactoryConfig factory_config_; GoogCcFactoryConfig factory_config_;
}; };
// Deprecated, use GoogCcFactoryConfig to enable feedback only mode instead.
// Factory to create packet feedback only GoogCC, this can be used for // Factory to create packet feedback only GoogCC, this can be used for
// connections providing packet receive time feedback but no other reports. // connections providing packet receive time feedback but no other reports.
class GoogCcFeedbackNetworkControllerFactory class RTC_DEPRECATED GoogCcFeedbackNetworkControllerFactory
: public GoogCcNetworkControllerFactory { : public GoogCcNetworkControllerFactory {
public: public:
explicit GoogCcFeedbackNetworkControllerFactory(RtcEventLog* event_log); explicit GoogCcFeedbackNetworkControllerFactory(RtcEventLog* event_log);

View File

@ -119,8 +119,6 @@ TEST_F(BbrNetworkControllerTest, UpdatesTargetSendRate) {
BbrNetworkControllerFactory factory; BbrNetworkControllerFactory factory;
Scenario s("bbr_unit/updates_rate", false); Scenario s("bbr_unit/updates_rate", false);
CallClientConfig config; CallClientConfig config;
config.transport.cc =
TransportControllerConfig::CongestionController::kInjected;
config.transport.cc_factory = &factory; config.transport.cc_factory = &factory;
config.transport.rates.min_rate = DataRate::kbps(10); config.transport.rates.min_rate = DataRate::kbps(10);
config.transport.rates.max_rate = DataRate::kbps(1500); config.transport.rates.max_rate = DataRate::kbps(1500);

View File

@ -49,16 +49,21 @@ int CountBandwidthDips(std::queue<DataRate> bandwidth_history,
} }
return dips; return dips;
} }
GoogCcNetworkControllerFactory CreateFeedbackOnlyFactory() {
GoogCcFactoryConfig config;
config.feedback_only = true;
return GoogCcNetworkControllerFactory(std::move(config));
}
const uint32_t kInitialBitrateKbps = 60; const uint32_t kInitialBitrateKbps = 60;
const DataRate kInitialBitrate = DataRate::kbps(kInitialBitrateKbps); const DataRate kInitialBitrate = DataRate::kbps(kInitialBitrateKbps);
const float kDefaultPacingRate = 2.5f; const float kDefaultPacingRate = 2.5f;
void UpdatesTargetRateBasedOnLinkCapacity(std::string test_name = "") { void UpdatesTargetRateBasedOnLinkCapacity(std::string test_name = "") {
auto factory = CreateFeedbackOnlyFactory();
Scenario s("googcc_unit/target_capacity" + test_name, false); Scenario s("googcc_unit/target_capacity" + test_name, false);
SimulatedTimeClientConfig config; SimulatedTimeClientConfig config;
config.transport.cc = config.transport.cc_factory = &factory;
TransportControllerConfig::CongestionController::kGoogCcFeedback;
config.transport.rates.min_rate = DataRate::kbps(10); config.transport.rates.min_rate = DataRate::kbps(10);
config.transport.rates.max_rate = DataRate::kbps(1500); config.transport.rates.max_rate = DataRate::kbps(1500);
config.transport.rates.start_rate = DataRate::kbps(300); config.transport.rates.start_rate = DataRate::kbps(300);
@ -235,6 +240,7 @@ TEST_F(GoogCcNetworkControllerTest, ReactsToChangedNetworkConditions) {
// Test congestion window pushback on network delay happens. // Test congestion window pushback on network delay happens.
TEST_F(GoogCcNetworkControllerTest, CongestionWindowPushbackOnNetworkDelay) { TEST_F(GoogCcNetworkControllerTest, CongestionWindowPushbackOnNetworkDelay) {
auto factory = CreateFeedbackOnlyFactory();
ScopedFieldTrials trial( ScopedFieldTrials trial(
"WebRTC-CongestionWindow/QueueSize:800,MinBitrate:30000/"); "WebRTC-CongestionWindow/QueueSize:800,MinBitrate:30000/");
Scenario s("googcc_unit/cwnd_on_delay", false); Scenario s("googcc_unit/cwnd_on_delay", false);
@ -246,8 +252,7 @@ TEST_F(GoogCcNetworkControllerTest, CongestionWindowPushbackOnNetworkDelay) {
auto ret_net = s.CreateSimulationNode( auto ret_net = s.CreateSimulationNode(
[](NetworkSimulationConfig* c) { c->delay = TimeDelta::ms(100); }); [](NetworkSimulationConfig* c) { c->delay = TimeDelta::ms(100); });
SimulatedTimeClientConfig config; SimulatedTimeClientConfig config;
config.transport.cc = config.transport.cc_factory = &factory;
TransportControllerConfig::CongestionController::kGoogCcFeedback;
// Start high so bandwidth drop has max effect. // Start high so bandwidth drop has max effect.
config.transport.rates.start_rate = DataRate::kbps(300); config.transport.rates.start_rate = DataRate::kbps(300);
config.transport.rates.max_rate = DataRate::kbps(2000); config.transport.rates.max_rate = DataRate::kbps(2000);
@ -333,8 +338,6 @@ TEST_F(GoogCcNetworkControllerTest,
auto ret_net = s.CreateSimulationNode( auto ret_net = s.CreateSimulationNode(
[](NetworkSimulationConfig* c) { c->delay = TimeDelta::ms(100); }); [](NetworkSimulationConfig* c) { c->delay = TimeDelta::ms(100); });
SimulatedTimeClientConfig config; SimulatedTimeClientConfig config;
config.transport.cc =
TransportControllerConfig::CongestionController::kGoogCc;
// Start high so bandwidth drop has max effect. // Start high so bandwidth drop has max effect.
config.transport.rates.start_rate = DataRate::kbps(1000); config.transport.rates.start_rate = DataRate::kbps(1000);
config.transport.rates.max_rate = DataRate::kbps(2000); config.transport.rates.max_rate = DataRate::kbps(2000);
@ -373,8 +376,6 @@ TEST_F(GoogCcNetworkControllerTest, LimitsToFloorIfRttIsHighInTrial) {
auto ret_net = s.CreateSimulationNode( auto ret_net = s.CreateSimulationNode(
[](NetworkSimulationConfig* c) { c->delay = TimeDelta::ms(100); }); [](NetworkSimulationConfig* c) { c->delay = TimeDelta::ms(100); });
SimulatedTimeClientConfig config; SimulatedTimeClientConfig config;
config.transport.cc =
TransportControllerConfig::CongestionController::kGoogCc;
config.transport.rates.start_rate = kLinkCapacity; config.transport.rates.start_rate = kLinkCapacity;
SimulatedTimeClient* client = s.CreateSimulatedTimeClient( SimulatedTimeClient* client = s.CreateSimulatedTimeClient(
"send", config, {PacketStreamConfig()}, {send_net}, {ret_net}); "send", config, {PacketStreamConfig()}, {send_net}, {ret_net});
@ -396,11 +397,11 @@ TEST_F(GoogCcNetworkControllerTest, UpdatesTargetRateBasedOnLinkCapacity) {
} }
TEST_F(GoogCcNetworkControllerTest, DefaultEstimateVariesInSteadyState) { TEST_F(GoogCcNetworkControllerTest, DefaultEstimateVariesInSteadyState) {
auto factory = CreateFeedbackOnlyFactory();
ScopedFieldTrials trial("WebRTC-Bwe-StableBandwidthEstimate/Disabled/"); ScopedFieldTrials trial("WebRTC-Bwe-StableBandwidthEstimate/Disabled/");
Scenario s("googcc_unit/no_stable_varies", false); Scenario s("googcc_unit/no_stable_varies", false);
SimulatedTimeClientConfig config; SimulatedTimeClientConfig config;
config.transport.cc = config.transport.cc_factory = &factory;
TransportControllerConfig::CongestionController::kGoogCcFeedback;
NetworkSimulationConfig net_conf; NetworkSimulationConfig net_conf;
net_conf.bandwidth = DataRate::kbps(500); net_conf.bandwidth = DataRate::kbps(500);
net_conf.delay = TimeDelta::ms(100); net_conf.delay = TimeDelta::ms(100);
@ -423,11 +424,11 @@ TEST_F(GoogCcNetworkControllerTest, DefaultEstimateVariesInSteadyState) {
} }
TEST_F(GoogCcNetworkControllerTest, StableEstimateDoesNotVaryInSteadyState) { TEST_F(GoogCcNetworkControllerTest, StableEstimateDoesNotVaryInSteadyState) {
auto factory = CreateFeedbackOnlyFactory();
ScopedFieldTrials trial("WebRTC-Bwe-StableBandwidthEstimate/Enabled/"); ScopedFieldTrials trial("WebRTC-Bwe-StableBandwidthEstimate/Enabled/");
Scenario s("googcc_unit/stable_is_stable", false); Scenario s("googcc_unit/stable_is_stable", false);
SimulatedTimeClientConfig config; SimulatedTimeClientConfig config;
config.transport.cc = config.transport.cc_factory = &factory;
TransportControllerConfig::CongestionController::kGoogCcFeedback;
NetworkSimulationConfig net_conf; NetworkSimulationConfig net_conf;
net_conf.bandwidth = DataRate::kbps(500); net_conf.bandwidth = DataRate::kbps(500);
net_conf.delay = TimeDelta::ms(100); net_conf.delay = TimeDelta::ms(100);
@ -458,11 +459,11 @@ TEST_F(GoogCcNetworkControllerTest,
TEST_F(GoogCcNetworkControllerTest, TEST_F(GoogCcNetworkControllerTest,
LossBasedControlDoesModestBackoffToHighLoss) { LossBasedControlDoesModestBackoffToHighLoss) {
auto factory = CreateFeedbackOnlyFactory();
ScopedFieldTrials trial("WebRTC-Bwe-LossBasedControl/Enabled/"); ScopedFieldTrials trial("WebRTC-Bwe-LossBasedControl/Enabled/");
Scenario s("googcc_unit/high_loss_channel", false); Scenario s("googcc_unit/high_loss_channel", false);
SimulatedTimeClientConfig config; SimulatedTimeClientConfig config;
config.transport.cc = config.transport.cc_factory = &factory;
TransportControllerConfig::CongestionController::kGoogCcFeedback;
config.transport.rates.min_rate = DataRate::kbps(10); config.transport.rates.min_rate = DataRate::kbps(10);
config.transport.rates.max_rate = DataRate::kbps(1500); config.transport.rates.max_rate = DataRate::kbps(1500);
config.transport.rates.start_rate = DataRate::kbps(300); config.transport.rates.start_rate = DataRate::kbps(300);
@ -482,11 +483,11 @@ TEST_F(GoogCcNetworkControllerTest,
} }
TEST_F(GoogCcNetworkControllerTest, LossBasedEstimatorCapsRateAtModerateLoss) { TEST_F(GoogCcNetworkControllerTest, LossBasedEstimatorCapsRateAtModerateLoss) {
auto factory = CreateFeedbackOnlyFactory();
ScopedFieldTrials trial("WebRTC-Bwe-LossBasedControl/Enabled/"); ScopedFieldTrials trial("WebRTC-Bwe-LossBasedControl/Enabled/");
Scenario s("googcc_unit/moderate_loss_channel", false); Scenario s("googcc_unit/moderate_loss_channel", false);
SimulatedTimeClientConfig config; SimulatedTimeClientConfig config;
config.transport.cc = config.transport.cc_factory = &factory;
TransportControllerConfig::CongestionController::kGoogCcFeedback;
config.transport.rates.min_rate = DataRate::kbps(10); config.transport.rates.min_rate = DataRate::kbps(10);
config.transport.rates.max_rate = DataRate::kbps(5000); config.transport.rates.max_rate = DataRate::kbps(5000);
config.transport.rates.start_rate = DataRate::kbps(300); config.transport.rates.start_rate = DataRate::kbps(300);
@ -517,9 +518,7 @@ TEST_F(GoogCcNetworkControllerTest, MaintainsLowRateInSafeResetTrial) {
c->bandwidth = kLinkCapacity; c->bandwidth = kLinkCapacity;
c->delay = TimeDelta::ms(10); c->delay = TimeDelta::ms(10);
}); });
// TODO(srte): replace with SimulatedTimeClient when it supports probing.
auto* client = s.CreateClient("send", [&](CallClientConfig* c) { auto* client = s.CreateClient("send", [&](CallClientConfig* c) {
c->transport.cc = TransportControllerConfig::CongestionController::kGoogCc;
c->transport.rates.start_rate = kStartRate; c->transport.rates.start_rate = kStartRate;
}); });
auto* route = s.CreateRoutes( auto* route = s.CreateRoutes(
@ -546,9 +545,7 @@ TEST_F(GoogCcNetworkControllerTest, CutsHighRateInSafeResetTrial) {
c->bandwidth = kLinkCapacity; c->bandwidth = kLinkCapacity;
c->delay = TimeDelta::ms(50); c->delay = TimeDelta::ms(50);
}); });
// TODO(srte): replace with SimulatedTimeClient when it supports probing.
auto* client = s.CreateClient("send", [&](CallClientConfig* c) { auto* client = s.CreateClient("send", [&](CallClientConfig* c) {
c->transport.cc = TransportControllerConfig::CongestionController::kGoogCc;
c->transport.rates.start_rate = kStartRate; c->transport.rates.start_rate = kStartRate;
}); });
auto* route = s.CreateRoutes( auto* route = s.CreateRoutes(
@ -582,9 +579,7 @@ TEST_F(GoogCcNetworkControllerTest, DetectsHighRateInSafeResetTrial) {
c->bandwidth = kNewLinkCapacity; c->bandwidth = kNewLinkCapacity;
c->delay = TimeDelta::ms(50); c->delay = TimeDelta::ms(50);
}); });
// TODO(srte): replace with SimulatedTimeClient when it supports probing.
auto* client = s.CreateClient("send", [&](CallClientConfig* c) { auto* client = s.CreateClient("send", [&](CallClientConfig* c) {
c->transport.cc = TransportControllerConfig::CongestionController::kGoogCc;
c->transport.rates.start_rate = kStartRate; c->transport.rates.start_rate = kStartRate;
}); });
auto* route = s.CreateRoutes( auto* route = s.CreateRoutes(
@ -621,9 +616,7 @@ TEST_F(GoogCcNetworkControllerTest,
c->bandwidth = kLinkCapacity; c->bandwidth = kLinkCapacity;
c->delay = TimeDelta::ms(50); c->delay = TimeDelta::ms(50);
}); });
// TODO(srte): replace with SimulatedTimeClient when it supports pacing.
auto* client = s.CreateClient("send", [&](CallClientConfig* c) { auto* client = s.CreateClient("send", [&](CallClientConfig* c) {
c->transport.cc = TransportControllerConfig::CongestionController::kGoogCc;
c->transport.rates.start_rate = kStartRate; c->transport.rates.start_rate = kStartRate;
}); });
auto* route = s.CreateRoutes( auto* route = s.CreateRoutes(
@ -646,9 +639,7 @@ TEST_F(GoogCcNetworkControllerTest, NoBandwidthTogglingInLossControlTrial) {
c->delay = TimeDelta::ms(10); c->delay = TimeDelta::ms(10);
}); });
// TODO(srte): replace with SimulatedTimeClient when it supports probing.
auto* client = s.CreateClient("send", [&](CallClientConfig* c) { auto* client = s.CreateClient("send", [&](CallClientConfig* c) {
c->transport.cc = TransportControllerConfig::CongestionController::kGoogCc;
c->transport.rates.start_rate = DataRate::kbps(300); c->transport.rates.start_rate = DataRate::kbps(300);
}); });
auto* route = s.CreateRoutes( auto* route = s.CreateRoutes(
@ -680,7 +671,6 @@ TEST_F(GoogCcNetworkControllerTest, NoRttBackoffCollapseWhenVideoStops) {
}); });
auto* client = s.CreateClient("send", [&](CallClientConfig* c) { auto* client = s.CreateClient("send", [&](CallClientConfig* c) {
c->transport.cc = TransportControllerConfig::CongestionController::kGoogCc;
c->transport.rates.start_rate = DataRate::kbps(1000); c->transport.rates.start_rate = DataRate::kbps(1000);
}); });
auto* route = s.CreateRoutes( auto* route = s.CreateRoutes(

View File

@ -58,9 +58,9 @@ NetworkControlUpdate GoogCcStatePrinter::GetState(Timestamp at_time) const {
return controller_->GetNetworkState(at_time); return controller_->GetNetworkState(at_time);
} }
GoogCcDebugFactory::GoogCcDebugFactory(RtcEventLog* event_log, GoogCcDebugFactory::GoogCcDebugFactory(GoogCcStatePrinter* printer)
GoogCcStatePrinter* printer) : GoogCcNetworkControllerFactory(GoogCcFactoryConfig()),
: GoogCcNetworkControllerFactory(event_log), printer_(printer) {} printer_(printer) {}
std::unique_ptr<NetworkControllerInterface> GoogCcDebugFactory::Create( std::unique_ptr<NetworkControllerInterface> GoogCcDebugFactory::Create(
NetworkControllerConfig config) { NetworkControllerConfig config) {
@ -71,18 +71,4 @@ std::unique_ptr<NetworkControllerInterface> GoogCcDebugFactory::Create(
return controller; return controller;
} }
GoogCcFeedbackDebugFactory::GoogCcFeedbackDebugFactory(
RtcEventLog* event_log,
GoogCcStatePrinter* printer)
: GoogCcFeedbackNetworkControllerFactory(event_log), printer_(printer) {}
std::unique_ptr<NetworkControllerInterface> GoogCcFeedbackDebugFactory::Create(
NetworkControllerConfig config) {
RTC_CHECK(controller_ == nullptr);
auto controller = GoogCcFeedbackNetworkControllerFactory::Create(config);
controller_ = static_cast<GoogCcNetworkController*>(controller.get());
printer_->Attach(controller_);
return controller;
}
} // namespace webrtc } // namespace webrtc

View File

@ -40,7 +40,7 @@ class GoogCcStatePrinter : public DebugStatePrinter {
class GoogCcDebugFactory : public GoogCcNetworkControllerFactory { class GoogCcDebugFactory : public GoogCcNetworkControllerFactory {
public: public:
GoogCcDebugFactory(RtcEventLog* event_log, GoogCcStatePrinter* printer); explicit GoogCcDebugFactory(GoogCcStatePrinter* printer);
std::unique_ptr<NetworkControllerInterface> Create( std::unique_ptr<NetworkControllerInterface> Create(
NetworkControllerConfig config) override; NetworkControllerConfig config) override;
@ -49,18 +49,6 @@ class GoogCcDebugFactory : public GoogCcNetworkControllerFactory {
GoogCcNetworkController* controller_ = nullptr; GoogCcNetworkController* controller_ = nullptr;
}; };
class GoogCcFeedbackDebugFactory
: public GoogCcFeedbackNetworkControllerFactory {
public:
GoogCcFeedbackDebugFactory(RtcEventLog* event_log,
GoogCcStatePrinter* printer);
std::unique_ptr<NetworkControllerInterface> Create(
NetworkControllerConfig config) override;
private:
GoogCcStatePrinter* printer_;
GoogCcNetworkController* controller_ = nullptr;
};
} // namespace webrtc } // namespace webrtc
#endif // MODULES_CONGESTION_CONTROLLER_GOOG_CC_TEST_GOOG_CC_PRINTER_H_ #endif // MODULES_CONGESTION_CONTROLLER_GOOG_CC_TEST_GOOG_CC_PRINTER_H_

View File

@ -76,8 +76,6 @@ TEST(PccNetworkControllerTest, UpdatesTargetSendRate) {
PccNetworkControllerFactory factory; PccNetworkControllerFactory factory;
Scenario s("pcc_unit/updates_rate", false); Scenario s("pcc_unit/updates_rate", false);
SimulatedTimeClientConfig config; SimulatedTimeClientConfig config;
config.transport.cc =
TransportControllerConfig::CongestionController::kInjected;
config.transport.cc_factory = &factory; config.transport.cc_factory = &factory;
config.transport.rates.min_rate = DataRate::kbps(10); config.transport.rates.min_rate = DataRate::kbps(10);
config.transport.rates.max_rate = DataRate::kbps(1500); config.transport.rates.max_rate = DataRate::kbps(1500);

View File

@ -30,6 +30,8 @@ const uint32_t kReceiverLocalAudioSsrc = 0x1234567;
const char* kPriorityStreamId = "priority-track"; const char* kPriorityStreamId = "priority-track";
constexpr int kEventLogOutputIntervalMs = 5000;
CallClientFakeAudio InitAudio(TimeController* time_controller) { CallClientFakeAudio InitAudio(TimeController* time_controller) {
CallClientFakeAudio setup; CallClientFakeAudio setup;
auto capturer = TestAudioDeviceModule::CreatePulsedNoiseCapturer(256, 48000); auto capturer = TestAudioDeviceModule::CreatePulsedNoiseCapturer(256, 48000);
@ -50,10 +52,11 @@ CallClientFakeAudio InitAudio(TimeController* time_controller) {
} }
Call* CreateCall(TimeController* time_controller, Call* CreateCall(TimeController* time_controller,
RtcEventLog* event_log,
CallClientConfig config, CallClientConfig config,
LoggingNetworkControllerFactory* network_controller_factory, LoggingNetworkControllerFactory* network_controller_factory,
rtc::scoped_refptr<AudioState> audio_state) { rtc::scoped_refptr<AudioState> audio_state) {
CallConfig call_config(network_controller_factory->GetEventLog()); CallConfig call_config(event_log);
call_config.bitrate_config.max_bitrate_bps = call_config.bitrate_config.max_bitrate_bps =
config.transport.rates.max_rate.bps_or(-1); config.transport.rates.max_rate.bps_or(-1);
call_config.bitrate_config.min_bitrate_bps = call_config.bitrate_config.min_bitrate_bps =
@ -67,66 +70,48 @@ Call* CreateCall(TimeController* time_controller,
time_controller->CreateProcessThread("CallModules"), time_controller->CreateProcessThread("CallModules"),
time_controller->CreateProcessThread("Pacer")); time_controller->CreateProcessThread("Pacer"));
} }
std::unique_ptr<RtcEventLog> CreateEventLog(
TaskQueueFactory* task_queue_factory,
LogWriterFactoryInterface* log_writer_factory) {
if (!log_writer_factory) {
return RtcEventLog::CreateNull();
}
auto event_log = RtcEventLog::Create(RtcEventLog::EncodingType::NewFormat,
task_queue_factory);
bool success = event_log->StartLogging(log_writer_factory->Create(".rtc.dat"),
kEventLogOutputIntervalMs);
RTC_CHECK(success);
return event_log;
}
} }
LoggingNetworkControllerFactory::LoggingNetworkControllerFactory( LoggingNetworkControllerFactory::LoggingNetworkControllerFactory(
TimeController* time_controller,
LogWriterFactoryInterface* log_writer_factory, LogWriterFactoryInterface* log_writer_factory,
TransportControllerConfig config) TransportControllerConfig config) {
: time_controller_(time_controller) { if (config.cc_factory) {
std::unique_ptr<RtcEventLogOutput> cc_out; cc_factory_ = config.cc_factory;
if (!log_writer_factory) { if (log_writer_factory)
event_log_ = RtcEventLog::CreateNull(); RTC_LOG(LS_WARNING)
<< "Can't log controller state for injected network controllers";
} else { } else {
event_log_ = RtcEventLog::Create(RtcEventLog::EncodingType::Legacy, if (log_writer_factory) {
time_controller->GetTaskQueueFactory()); auto goog_printer = absl::make_unique<GoogCcStatePrinter>();
bool success = event_log_->StartLogging( owned_cc_factory_.reset(new GoogCcDebugFactory(goog_printer.get()));
log_writer_factory->Create(".rtc.dat"), RtcEventLog::kImmediateOutput); cc_factory_ = owned_cc_factory_.get();
RTC_CHECK(success); cc_printer_.reset(
cc_out = log_writer_factory->Create(".cc_state.txt"); new ControlStatePrinter(log_writer_factory->Create(".cc_state.txt"),
} std::move(goog_printer)));
switch (config.cc) { cc_printer_->PrintHeaders();
case TransportControllerConfig::CongestionController::kGoogCc: } else {
if (cc_out) { owned_cc_factory_.reset(
auto goog_printer = absl::make_unique<GoogCcStatePrinter>(); new GoogCcNetworkControllerFactory(GoogCcFactoryConfig()));
owned_cc_factory_.reset( cc_factory_ = owned_cc_factory_.get();
new GoogCcDebugFactory(event_log_.get(), goog_printer.get())); }
cc_printer_.reset(new ControlStatePrinter(std::move(cc_out),
std::move(goog_printer)));
} else {
owned_cc_factory_.reset(
new GoogCcNetworkControllerFactory(event_log_.get()));
}
break;
case TransportControllerConfig::CongestionController::kGoogCcFeedback:
if (cc_out) {
auto goog_printer = absl::make_unique<GoogCcStatePrinter>();
owned_cc_factory_.reset(new GoogCcFeedbackDebugFactory(
event_log_.get(), goog_printer.get()));
cc_printer_.reset(new ControlStatePrinter(std::move(cc_out),
std::move(goog_printer)));
} else {
owned_cc_factory_.reset(
new GoogCcFeedbackNetworkControllerFactory(event_log_.get()));
}
break;
case TransportControllerConfig::CongestionController::kInjected:
cc_factory_ = config.cc_factory;
if (cc_out)
RTC_LOG(LS_WARNING)
<< "Can't log controller state for injected network controllers";
break;
}
if (cc_printer_)
cc_printer_->PrintHeaders();
if (owned_cc_factory_) {
RTC_DCHECK(!cc_factory_);
cc_factory_ = owned_cc_factory_.get();
} }
} }
LoggingNetworkControllerFactory::~LoggingNetworkControllerFactory() { LoggingNetworkControllerFactory::~LoggingNetworkControllerFactory() {
time_controller_->InvokeWithControlledYield([this]() { event_log_.reset(); });
} }
void LoggingNetworkControllerFactory::LogCongestionControllerStats( void LoggingNetworkControllerFactory::LogCongestionControllerStats(
@ -135,10 +120,6 @@ void LoggingNetworkControllerFactory::LogCongestionControllerStats(
cc_printer_->PrintState(at_time); cc_printer_->PrintState(at_time);
} }
RtcEventLog* LoggingNetworkControllerFactory::GetEventLog() const {
return event_log_.get();
}
std::unique_ptr<NetworkControllerInterface> std::unique_ptr<NetworkControllerInterface>
LoggingNetworkControllerFactory::Create(NetworkControllerConfig config) { LoggingNetworkControllerFactory::Create(NetworkControllerConfig config) {
return cc_factory_->Create(config); return cc_factory_->Create(config);
@ -155,16 +136,16 @@ CallClient::CallClient(
: time_controller_(time_controller), : time_controller_(time_controller),
clock_(time_controller->GetClock()), clock_(time_controller->GetClock()),
log_writer_factory_(std::move(log_writer_factory)), log_writer_factory_(std::move(log_writer_factory)),
network_controller_factory_(time_controller, network_controller_factory_(log_writer_factory_.get(), config.transport),
log_writer_factory_.get(),
config.transport),
header_parser_(RtpHeaderParser::Create()), header_parser_(RtpHeaderParser::Create()),
task_queue_(time_controller->GetTaskQueueFactory()->CreateTaskQueue( task_queue_(time_controller->GetTaskQueueFactory()->CreateTaskQueue(
"CallClient", "CallClient",
TaskQueueFactory::Priority::NORMAL)) { TaskQueueFactory::Priority::NORMAL)) {
SendTask([this, config] { SendTask([this, config] {
event_log_ = CreateEventLog(time_controller_->GetTaskQueueFactory(),
log_writer_factory_.get());
fake_audio_setup_ = InitAudio(time_controller_); fake_audio_setup_ = InitAudio(time_controller_);
call_.reset(CreateCall(time_controller_, config, call_.reset(CreateCall(time_controller_, event_log_.get(), config,
&network_controller_factory_, &network_controller_factory_,
fake_audio_setup_.audio_state)); fake_audio_setup_.audio_state));
transport_ = absl::make_unique<NetworkNodeTransport>(clock_, call_.get()); transport_ = absl::make_unique<NetworkNodeTransport>(clock_, call_.get());
@ -175,6 +156,7 @@ CallClient::~CallClient() {
SendTask([&] { SendTask([&] {
call_.reset(); call_.reset();
fake_audio_setup_ = {}; fake_audio_setup_ = {};
event_log_.reset();
}); });
} }

View File

@ -36,8 +36,7 @@ namespace test {
class LoggingNetworkControllerFactory class LoggingNetworkControllerFactory
: public NetworkControllerFactoryInterface { : public NetworkControllerFactoryInterface {
public: public:
LoggingNetworkControllerFactory(TimeController* time_controller, LoggingNetworkControllerFactory(LogWriterFactoryInterface* log_writer_factory,
LogWriterFactoryInterface* log_writer_factory,
TransportControllerConfig config); TransportControllerConfig config);
RTC_DISALLOW_COPY_AND_ASSIGN(LoggingNetworkControllerFactory); RTC_DISALLOW_COPY_AND_ASSIGN(LoggingNetworkControllerFactory);
~LoggingNetworkControllerFactory(); ~LoggingNetworkControllerFactory();
@ -46,11 +45,8 @@ class LoggingNetworkControllerFactory
TimeDelta GetProcessInterval() const override; TimeDelta GetProcessInterval() const override;
// TODO(srte): Consider using the Columnprinter interface for this. // TODO(srte): Consider using the Columnprinter interface for this.
void LogCongestionControllerStats(Timestamp at_time); void LogCongestionControllerStats(Timestamp at_time);
RtcEventLog* GetEventLog() const;
private: private:
TimeController* time_controller_;
std::unique_ptr<RtcEventLog> event_log_;
std::unique_ptr<NetworkControllerFactoryInterface> owned_cc_factory_; std::unique_ptr<NetworkControllerFactoryInterface> owned_cc_factory_;
NetworkControllerFactoryInterface* cc_factory_ = nullptr; NetworkControllerFactoryInterface* cc_factory_ = nullptr;
std::unique_ptr<ControlStatePrinter> cc_printer_; std::unique_ptr<ControlStatePrinter> cc_printer_;
@ -103,6 +99,7 @@ class CallClient : public EmulatedNetworkReceiverInterface {
TimeController* const time_controller_; TimeController* const time_controller_;
Clock* clock_; Clock* clock_;
const std::unique_ptr<LogWriterFactoryInterface> log_writer_factory_; const std::unique_ptr<LogWriterFactoryInterface> log_writer_factory_;
std::unique_ptr<RtcEventLog> event_log_;
LoggingNetworkControllerFactory network_controller_factory_; LoggingNetworkControllerFactory network_controller_factory_;
CallClientFakeAudio fake_audio_setup_; CallClientFakeAudio fake_audio_setup_;
std::unique_ptr<Call> call_; std::unique_ptr<Call> call_;

View File

@ -49,11 +49,6 @@ struct TransportControllerConfig {
DataRate start_rate = DataRate::kbps(300); DataRate start_rate = DataRate::kbps(300);
DataRate max_padding_rate = DataRate::Zero(); DataRate max_padding_rate = DataRate::Zero();
} rates; } rates;
enum CongestionController {
kGoogCc,
kGoogCcFeedback,
kInjected
} cc = kGoogCc;
NetworkControllerFactoryInterface* cc_factory = nullptr; NetworkControllerFactoryInterface* cc_factory = nullptr;
TimeDelta state_log_interval = TimeDelta::ms(100); TimeDelta state_log_interval = TimeDelta::ms(100);
}; };

View File

@ -148,8 +148,6 @@ TEST_P(BbrScenarioTest, ReceivesVideo) {
Scenario s("bbr_test_gen/bbr__" + conf_.Name()); Scenario s("bbr_test_gen/bbr__" + conf_.Name());
CallClientConfig call_config; CallClientConfig call_config;
if (conf_.tuning.use_bbr) { if (conf_.tuning.use_bbr) {
call_config.transport.cc =
TransportControllerConfig::CongestionController::kInjected;
call_config.transport.cc_factory = &bbr_factory; call_config.transport.cc_factory = &bbr_factory;
} }
call_config.transport.rates.min_rate = DataRate::kbps(30); call_config.transport.rates.min_rate = DataRate::kbps(30);

View File

@ -22,6 +22,7 @@
namespace webrtc { namespace webrtc {
namespace test { namespace test {
namespace { namespace {
constexpr int kEventLogOutputIntervalMs = 5000;
struct RawFeedbackReportPacket { struct RawFeedbackReportPacket {
static constexpr int MAX_FEEDBACKS = 10; static constexpr int MAX_FEEDBACKS = 10;
struct Feedback { struct Feedback {
@ -33,6 +34,20 @@ struct RawFeedbackReportPacket {
int64_t first_recv_time_ms; int64_t first_recv_time_ms;
Feedback feedbacks[MAX_FEEDBACKS - 1]; Feedback feedbacks[MAX_FEEDBACKS - 1];
}; };
std::unique_ptr<RtcEventLog> CreateEventLog(
TaskQueueFactory* task_queue_factory,
LogWriterFactoryInterface* log_writer_factory) {
if (!log_writer_factory) {
return RtcEventLog::CreateNull();
}
auto event_log = RtcEventLog::Create(RtcEventLog::EncodingType::NewFormat,
task_queue_factory);
bool success = event_log->StartLogging(log_writer_factory->Create(".rtc.dat"),
kEventLogOutputIntervalMs);
RTC_CHECK(success);
return event_log;
}
} // namespace } // namespace
PacketStream::PacketStream(PacketStreamConfig config) : config_(config) {} PacketStream::PacketStream(PacketStreamConfig config) : config_(config) {}
@ -255,9 +270,9 @@ SimulatedTimeClient::SimulatedTimeClient(
rtc::IPAddress return_receiver_ip, rtc::IPAddress return_receiver_ip,
Timestamp at_time) Timestamp at_time)
: log_writer_factory_(std::move(log_writer_factory)), : log_writer_factory_(std::move(log_writer_factory)),
network_controller_factory_(time_controller, event_log_(CreateEventLog(time_controller->GetTaskQueueFactory(),
log_writer_factory_.get(), log_writer_factory_.get())),
config.transport), network_controller_factory_(log_writer_factory_.get(), config.transport),
send_link_(send_link), send_link_(send_link),
return_link_(return_link), return_link_(return_link),
sender_(send_link.front(), send_receiver_ip), sender_(send_link.front(), send_receiver_ip),
@ -270,6 +285,7 @@ SimulatedTimeClient::SimulatedTimeClient(
initial_config.constraints = current_contraints_; initial_config.constraints = current_contraints_;
initial_config.stream_based_config.max_padding_rate = initial_config.stream_based_config.max_padding_rate =
config.transport.rates.max_padding_rate; config.transport.rates.max_padding_rate;
initial_config.event_log = event_log_.get();
congestion_controller_ = network_controller_factory_.Create(initial_config); congestion_controller_ = network_controller_factory_.Create(initial_config);
for (auto& stream_config : stream_configs) for (auto& stream_config : stream_configs)
packet_streams_.emplace_back(new PacketStream(stream_config)); packet_streams_.emplace_back(new PacketStream(stream_config));

View File

@ -148,6 +148,7 @@ class SimulatedTimeClient : EmulatedNetworkReceiverInterface {
private: private:
friend class Scenario; friend class Scenario;
std::unique_ptr<LogWriterFactoryInterface> log_writer_factory_; std::unique_ptr<LogWriterFactoryInterface> log_writer_factory_;
std::unique_ptr<RtcEventLog> event_log_;
LoggingNetworkControllerFactory network_controller_factory_; LoggingNetworkControllerFactory network_controller_factory_;
std::unique_ptr<NetworkControllerInterface> congestion_controller_; std::unique_ptr<NetworkControllerInterface> congestion_controller_;
std::vector<EmulatedNetworkNode*> send_link_; std::vector<EmulatedNetworkNode*> send_link_;