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
3 // found in the LICENSE file.
5 #include "base/command_line.h"
6 #include "base/metrics/field_trial.h"
7 #include "chrome/browser/io_thread.h"
8 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
9 #include "net/http/http_network_session.h"
10 #include "net/http/http_server_properties_impl.h"
11 #include "net/quic/quic_protocol.h"
12 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
17 using ::testing::ElementsAre
;
19 class BadEntropyProvider
: public base::FieldTrial::EntropyProvider
{
21 ~BadEntropyProvider() override
{}
23 double GetEntropyForTrial(const std::string
& trial_name
,
24 uint32 randomization_seed
) const override
{
31 static void ConfigureQuicGlobals(
32 const base::CommandLine
& command_line
,
33 base::StringPiece quic_trial_group
,
34 const std::map
<std::string
, std::string
>& quic_trial_params
,
35 IOThread::Globals
* globals
) {
36 IOThread::ConfigureQuicGlobals(command_line
, quic_trial_group
,
37 quic_trial_params
, globals
);
40 static void InitializeNetworkSessionParamsFromGlobals(
41 const IOThread::Globals
& globals
,
42 net::HttpNetworkSession::Params
* params
) {
43 IOThread::InitializeNetworkSessionParamsFromGlobals(globals
, params
);
46 static void ConfigureSpdyFromTrial(const std::string
& trial_group
,
47 IOThread::Globals
* globals
) {
48 IOThread::ConfigureSpdyFromTrial(trial_group
, globals
);
52 class IOThreadTest
: public testing::Test
{
54 IOThreadTest() : command_line_(base::CommandLine::NO_PROGRAM
) {
55 globals_
.http_server_properties
.reset(new net::HttpServerPropertiesImpl());
58 void ConfigureQuicGlobals() {
59 IOThreadPeer::ConfigureQuicGlobals(command_line_
, field_trial_group_
,
60 field_trial_params_
, &globals_
);
63 void InitializeNetworkSessionParams(net::HttpNetworkSession::Params
* params
) {
64 IOThreadPeer::InitializeNetworkSessionParamsFromGlobals(globals_
, params
);
67 base::CommandLine command_line_
;
68 IOThread::Globals globals_
;
69 std::string field_trial_group_
;
70 std::map
<std::string
, std::string
> field_trial_params_
;
73 TEST_F(IOThreadTest
, InitializeNetworkSessionParamsFromGlobals
) {
74 globals_
.quic_connection_options
.push_back(net::kPACE
);
75 globals_
.quic_connection_options
.push_back(net::kTBBR
);
76 globals_
.quic_connection_options
.push_back(net::kTIME
);
78 net::HttpNetworkSession::Params params
;
79 InitializeNetworkSessionParams(¶ms
);
80 EXPECT_EQ(globals_
.quic_connection_options
,
81 params
.quic_connection_options
);
84 TEST_F(IOThreadTest
, SpdyFieldTrialHoldbackEnabled
) {
85 net::HttpStreamFactory::set_spdy_enabled(true);
86 IOThreadPeer::ConfigureSpdyFromTrial("SpdyDisabled", &globals_
);
87 EXPECT_FALSE(net::HttpStreamFactory::spdy_enabled());
90 TEST_F(IOThreadTest
, SpdyFieldTrialHoldbackControl
) {
91 bool use_alternate_protocols
= false;
92 IOThreadPeer::ConfigureSpdyFromTrial("Control", &globals_
);
93 EXPECT_THAT(globals_
.next_protos
,
94 ElementsAre(net::kProtoHTTP11
,
95 net::kProtoQUIC1SPDY3
,
97 globals_
.use_alternate_protocols
.CopyToIfSet(&use_alternate_protocols
);
98 EXPECT_TRUE(use_alternate_protocols
);
101 TEST_F(IOThreadTest
, SpdyFieldTrialSpdy4Enabled
) {
102 bool use_alternate_protocols
= false;
103 IOThreadPeer::ConfigureSpdyFromTrial("Spdy4Enabled", &globals_
);
104 EXPECT_THAT(globals_
.next_protos
,
105 ElementsAre(net::kProtoHTTP11
,
106 net::kProtoQUIC1SPDY3
,
108 net::kProtoSPDY4_14
));
109 globals_
.use_alternate_protocols
.CopyToIfSet(&use_alternate_protocols
);
110 EXPECT_TRUE(use_alternate_protocols
);
113 TEST_F(IOThreadTest
, SpdyFieldTrialSpdy4Control
) {
114 bool use_alternate_protocols
= false;
115 IOThreadPeer::ConfigureSpdyFromTrial("Spdy4Control", &globals_
);
116 EXPECT_THAT(globals_
.next_protos
,
117 ElementsAre(net::kProtoHTTP11
,
118 net::kProtoQUIC1SPDY3
,
120 globals_
.use_alternate_protocols
.CopyToIfSet(&use_alternate_protocols
);
121 EXPECT_TRUE(use_alternate_protocols
);
124 TEST_F(IOThreadTest
, DisableQuicByDefault
) {
125 ConfigureQuicGlobals();
126 net::HttpNetworkSession::Params params
;
127 InitializeNetworkSessionParams(¶ms
);
128 EXPECT_FALSE(params
.enable_quic
);
129 EXPECT_FALSE(params
.enable_quic_for_proxies
);
130 EXPECT_FALSE(IOThread::ShouldEnableQuicForDataReductionProxy());
133 TEST_F(IOThreadTest
, EnableQuicFromFieldTrialGroup
) {
134 field_trial_group_
= "Enabled";
136 ConfigureQuicGlobals();
137 net::HttpNetworkSession::Params default_params
;
138 net::HttpNetworkSession::Params params
;
139 InitializeNetworkSessionParams(¶ms
);
140 EXPECT_TRUE(params
.enable_quic
);
141 EXPECT_TRUE(params
.enable_quic_for_proxies
);
142 EXPECT_EQ(1350u, params
.quic_max_packet_length
);
143 EXPECT_EQ(1.0, params
.alternate_protocol_probability_threshold
);
144 EXPECT_EQ(default_params
.quic_supported_versions
,
145 params
.quic_supported_versions
);
146 EXPECT_EQ(net::QuicTagVector(), params
.quic_connection_options
);
147 EXPECT_FALSE(params
.quic_always_require_handshake_confirmation
);
148 EXPECT_FALSE(params
.quic_disable_connection_pooling
);
149 EXPECT_EQ(0, params
.quic_load_server_info_timeout_ms
);
150 EXPECT_EQ(0.0f
, params
.quic_load_server_info_timeout_srtt_multiplier
);
151 EXPECT_FALSE(params
.quic_enable_truncated_connection_ids
);
152 EXPECT_FALSE(params
.quic_enable_connection_racing
);
153 EXPECT_FALSE(params
.quic_disable_disk_cache
);
154 EXPECT_FALSE(IOThread::ShouldEnableQuicForDataReductionProxy());
157 TEST_F(IOThreadTest
, EnableQuicFromQuicProxyFieldTrialGroup
) {
158 base::FieldTrialList
field_trial_list(new BadEntropyProvider());
159 base::FieldTrialList::CreateFieldTrial(
160 data_reduction_proxy::DataReductionProxyParams::GetQuicFieldTrialName(),
163 ConfigureQuicGlobals();
164 net::HttpNetworkSession::Params params
;
165 InitializeNetworkSessionParams(¶ms
);
166 EXPECT_FALSE(params
.enable_quic
);
167 EXPECT_TRUE(params
.enable_quic_for_proxies
);
168 EXPECT_TRUE(IOThread::ShouldEnableQuicForDataReductionProxy());
171 TEST_F(IOThreadTest
, EnableQuicFromCommandLine
) {
172 command_line_
.AppendSwitch("enable-quic");
174 ConfigureQuicGlobals();
175 net::HttpNetworkSession::Params params
;
176 InitializeNetworkSessionParams(¶ms
);
177 EXPECT_TRUE(params
.enable_quic
);
178 EXPECT_TRUE(params
.enable_quic_for_proxies
);
179 EXPECT_FALSE(IOThread::ShouldEnableQuicForDataReductionProxy());
182 TEST_F(IOThreadTest
, EnablePacingFromCommandLine
) {
183 command_line_
.AppendSwitch("enable-quic");
184 command_line_
.AppendSwitch("enable-quic-pacing");
186 ConfigureQuicGlobals();
187 net::HttpNetworkSession::Params params
;
188 InitializeNetworkSessionParams(¶ms
);
189 net::QuicTagVector options
;
190 options
.push_back(net::kPACE
);
191 EXPECT_EQ(options
, params
.quic_connection_options
);
194 TEST_F(IOThreadTest
, EnablePacingFromFieldTrialParams
) {
195 field_trial_group_
= "Enabled";
196 field_trial_params_
["enable_pacing"] = "true";
198 ConfigureQuicGlobals();
199 net::HttpNetworkSession::Params params
;
200 InitializeNetworkSessionParams(¶ms
);
201 net::QuicTagVector options
;
202 options
.push_back(net::kPACE
);
203 EXPECT_EQ(options
, params
.quic_connection_options
);
206 TEST_F(IOThreadTest
, PacketLengthFromCommandLine
) {
207 command_line_
.AppendSwitch("enable-quic");
208 command_line_
.AppendSwitchASCII("quic-max-packet-length", "1450");
210 ConfigureQuicGlobals();
211 net::HttpNetworkSession::Params params
;
212 InitializeNetworkSessionParams(¶ms
);
213 EXPECT_EQ(1450u, params
.quic_max_packet_length
);
216 TEST_F(IOThreadTest
, PacketLengthFromFieldTrialParams
) {
217 field_trial_group_
= "Enabled";
218 field_trial_params_
["max_packet_length"] = "1450";
220 ConfigureQuicGlobals();
221 net::HttpNetworkSession::Params params
;
222 InitializeNetworkSessionParams(¶ms
);
223 EXPECT_EQ(1450u, params
.quic_max_packet_length
);
226 TEST_F(IOThreadTest
, QuicVersionFromCommandLine
) {
227 command_line_
.AppendSwitch("enable-quic");
228 std::string version
=
229 net::QuicVersionToString(net::QuicSupportedVersions().back());
230 command_line_
.AppendSwitchASCII("quic-version", version
);
232 ConfigureQuicGlobals();
233 net::HttpNetworkSession::Params params
;
234 InitializeNetworkSessionParams(¶ms
);
235 net::QuicVersionVector supported_versions
;
236 supported_versions
.push_back(net::QuicSupportedVersions().back());
237 EXPECT_EQ(supported_versions
, params
.quic_supported_versions
);
240 TEST_F(IOThreadTest
, QuicVersionFromFieldTrialParams
) {
241 field_trial_group_
= "Enabled";
242 field_trial_params_
["quic_version"] =
243 net::QuicVersionToString(net::QuicSupportedVersions().back());
245 ConfigureQuicGlobals();
246 net::HttpNetworkSession::Params params
;
247 InitializeNetworkSessionParams(¶ms
);
248 net::QuicVersionVector supported_versions
;
249 supported_versions
.push_back(net::QuicSupportedVersions().back());
250 EXPECT_EQ(supported_versions
, params
.quic_supported_versions
);
253 TEST_F(IOThreadTest
, QuicConnectionOptionsFromCommandLine
) {
254 command_line_
.AppendSwitch("enable-quic");
255 command_line_
.AppendSwitchASCII("quic-connection-options",
256 "PACE,TIME,TBBR,REJ");
258 ConfigureQuicGlobals();
259 net::HttpNetworkSession::Params params
;
260 InitializeNetworkSessionParams(¶ms
);
262 net::QuicTagVector options
;
263 options
.push_back(net::kPACE
);
264 options
.push_back(net::kTIME
);
265 options
.push_back(net::kTBBR
);
266 options
.push_back(net::kREJ
);
267 EXPECT_EQ(options
, params
.quic_connection_options
);
270 TEST_F(IOThreadTest
, QuicConnectionOptionsFromFieldTrialParams
) {
271 field_trial_group_
= "Enabled";
272 field_trial_params_
["connection_options"] = "PACE,TIME,TBBR,REJ";
274 ConfigureQuicGlobals();
275 net::HttpNetworkSession::Params params
;
276 InitializeNetworkSessionParams(¶ms
);
278 net::QuicTagVector options
;
279 options
.push_back(net::kPACE
);
280 options
.push_back(net::kTIME
);
281 options
.push_back(net::kTBBR
);
282 options
.push_back(net::kREJ
);
283 EXPECT_EQ(options
, params
.quic_connection_options
);
287 QuicAlwaysRequireHandshakeConfirmationFromFieldTrialParams
) {
288 field_trial_group_
= "Enabled";
289 field_trial_params_
["always_require_handshake_confirmation"] = "true";
290 ConfigureQuicGlobals();
291 net::HttpNetworkSession::Params params
;
292 InitializeNetworkSessionParams(¶ms
);
293 EXPECT_TRUE(params
.quic_always_require_handshake_confirmation
);
297 QuicDisableConnectionPoolingFromFieldTrialParams
) {
298 field_trial_group_
= "Enabled";
299 field_trial_params_
["disable_connection_pooling"] = "true";
300 ConfigureQuicGlobals();
301 net::HttpNetworkSession::Params params
;
302 InitializeNetworkSessionParams(¶ms
);
303 EXPECT_TRUE(params
.quic_disable_connection_pooling
);
306 TEST_F(IOThreadTest
, QuicLoadServerInfoTimeoutFromFieldTrialParams
) {
307 field_trial_group_
= "Enabled";
308 field_trial_params_
["load_server_info_timeout"] = "50";
309 ConfigureQuicGlobals();
310 net::HttpNetworkSession::Params params
;
311 InitializeNetworkSessionParams(¶ms
);
312 EXPECT_EQ(50, params
.quic_load_server_info_timeout_ms
);
315 TEST_F(IOThreadTest
, QuicLoadServerInfoTimeToSmoothedRttFromFieldTrialParams
) {
316 field_trial_group_
= "Enabled";
317 field_trial_params_
["load_server_info_time_to_srtt"] = "0.5";
318 ConfigureQuicGlobals();
319 net::HttpNetworkSession::Params params
;
320 InitializeNetworkSessionParams(¶ms
);
321 EXPECT_EQ(0.5f
, params
.quic_load_server_info_timeout_srtt_multiplier
);
324 TEST_F(IOThreadTest
, QuicEnableTruncatedConnectionIds
) {
325 field_trial_group_
= "Enabled";
326 field_trial_params_
["enable_truncated_connection_ids"] = "true";
327 ConfigureQuicGlobals();
328 net::HttpNetworkSession::Params params
;
329 InitializeNetworkSessionParams(¶ms
);
330 EXPECT_TRUE(params
.quic_enable_truncated_connection_ids
);
333 TEST_F(IOThreadTest
, QuicEnableConnectionRacing
) {
334 field_trial_group_
= "Enabled";
335 field_trial_params_
["enable_connection_racing"] = "true";
336 ConfigureQuicGlobals();
337 net::HttpNetworkSession::Params params
;
338 InitializeNetworkSessionParams(¶ms
);
339 EXPECT_TRUE(params
.quic_enable_connection_racing
);
342 TEST_F(IOThreadTest
, QuicDisableDiskCache
) {
343 field_trial_group_
= "Enabled";
344 field_trial_params_
["disable_disk_cache"] = "true";
345 ConfigureQuicGlobals();
346 net::HttpNetworkSession::Params params
;
347 InitializeNetworkSessionParams(¶ms
);
348 EXPECT_TRUE(params
.quic_disable_disk_cache
);
352 AlternateProtocolProbabilityThresholdFromFlag
) {
353 command_line_
.AppendSwitchASCII("alternate-protocol-probability-threshold",
356 ConfigureQuicGlobals();
357 net::HttpNetworkSession::Params params
;
358 InitializeNetworkSessionParams(¶ms
);
359 EXPECT_EQ(.5, params
.alternate_protocol_probability_threshold
);
363 AlternateProtocolProbabilityThresholdFromEnableQuicFlag
) {
364 command_line_
.AppendSwitch("enable-quic");
366 ConfigureQuicGlobals();
367 net::HttpNetworkSession::Params params
;
368 InitializeNetworkSessionParams(¶ms
);
369 EXPECT_EQ(0, params
.alternate_protocol_probability_threshold
);
373 AlternateProtocolProbabilityThresholdFromParams
) {
374 field_trial_group_
= "Enabled";
375 field_trial_params_
["alternate_protocol_probability_threshold"] = ".5";
377 ConfigureQuicGlobals();
378 net::HttpNetworkSession::Params params
;
379 InitializeNetworkSessionParams(¶ms
);
380 EXPECT_EQ(.5, params
.alternate_protocol_probability_threshold
);