#include "net/http/http_stream_factory_job_controller.h"
#include <list>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/containers/contains.h"
#include "base/memory/ptr_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/run_loop.h"
#include "base/strings/stringprintf.h"
#include "base/test/bind.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/task_environment.h"
#include "base/test/test_mock_time_task_runner.h"
#include "base/threading/platform_thread.h"
#include "base/values.h"
#include "net/base/completion_once_callback.h"
#include "net/base/features.h"
#include "net/base/host_port_pair.h"
#include "net/base/proxy_chain.h"
#include "net/base/proxy_server.h"
#include "net/base/proxy_string_util.h"
#include "net/base/schemeful_site.h"
#include "net/base/session_usage.h"
#include "net/base/test_proxy_delegate.h"
#include "net/dns/mock_host_resolver.h"
#include "net/dns/public/secure_dns_policy.h"
#include "net/http/alternative_service.h"
#include "net/http/http_basic_stream.h"
#include "net/http/http_network_session_peer.h"
#include "net/http/http_response_headers.h"
#include "net/http/http_server_properties.h"
#include "net/http/http_server_properties_manager.h"
#include "net/http/http_stream_factory.h"
#include "net/http/http_stream_factory_job.h"
#include "net/http/http_stream_factory_test_util.h"
#include "net/http/http_stream_key.h"
#include "net/http/http_stream_pool.h"
#include "net/http/http_stream_pool_group.h"
#include "net/http/http_stream_pool_test_util.h"
#include "net/log/net_log.h"
#include "net/log/net_log_with_source.h"
#include "net/log/test_net_log.h"
#include "net/log/test_net_log_util.h"
#include "net/proxy_resolution/configured_proxy_resolution_service.h"
#include "net/proxy_resolution/mock_proxy_resolver.h"
#include "net/proxy_resolution/proxy_config_service_fixed.h"
#include "net/proxy_resolution/proxy_info.h"
#include "net/proxy_resolution/proxy_list.h"
#include "net/proxy_resolution/proxy_resolution_service.h"
#include "net/quic/address_utils.h"
#include "net/quic/crypto/proof_verifier_chromium.h"
#include "net/quic/mock_crypto_client_stream_factory.h"
#include "net/quic/mock_quic_context.h"
#include "net/quic/mock_quic_data.h"
#include "net/quic/quic_chromium_connection_helper.h"
#include "net/quic/quic_http_stream.h"
#include "net/quic/quic_server_info.h"
#include "net/quic/quic_session_pool.h"
#include "net/quic/quic_session_pool_peer.h"
#include "net/quic/quic_test_packet_maker.h"
#include "net/quic/test_quic_crypto_client_config_handle.h"
#include "net/socket/socket_test_util.h"
#include "net/spdy/spdy_session_key.h"
#include "net/spdy/spdy_test_util_common.h"
#include "net/test/cert_test_util.h"
#include "net/test/test_data_directory.h"
#include "net/test/test_with_task_environment.h"
#include "net/third_party/quiche/src/quiche/quic/core/quic_utils.h"
#include "net/third_party/quiche/src/quiche/quic/core/quic_versions.h"
#include "net/third_party/quiche/src/quiche/quic/test_tools/crypto_test_utils.h"
#include "net/third_party/quiche/src/quiche/quic/test_tools/mock_connection_id_generator.h"
#include "net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h"
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "net/url_request/static_http_user_agent_settings.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
#include "url/scheme_host_port.h"
_;
Contains;
ElementsAre;
Invoke;
IsEmpty;
Key;
SizeIs;
namespace net::test {
namespace {
const char kServerHostname[] = …;
const int kDefaultDelayMilliSecsForWaitingJob = …;
class FailingProxyResolverFactory : public ProxyResolverFactory { … };
class MockQuicChromiumClientSession : public QuicChromiumClientSession { … };
class MockPrefDelegate : public HttpServerProperties::PrefDelegate { … };
class TestProxyDelegateForIpProtection : public TestProxyDelegate { … };
}
class HttpStreamFactoryJobPeer { … };
class JobControllerPeer { … };
class HttpStreamFactoryJobControllerTestBase : public TestWithTaskEnvironment { … };
class HttpStreamFactoryJobControllerTest
: public HttpStreamFactoryJobControllerTestBase,
public ::testing::WithParamInterface<bool> { … };
INSTANTIATE_TEST_SUITE_P(…);
TEST_P(HttpStreamFactoryJobControllerTest, ProxyResolutionFailsSync) { … }
TEST_P(HttpStreamFactoryJobControllerTest, ProxyResolutionFailsAsync) { … }
TEST_P(HttpStreamFactoryJobControllerTest, NoSupportedProxies) { … }
class JobControllerReconsiderProxyAfterErrorTest
: public HttpStreamFactoryJobControllerTestBase { … };
TEST_F(JobControllerReconsiderProxyAfterErrorTest,
ReconsiderProxyAfterErrorHttpProxy) { … }
TEST_F(JobControllerReconsiderProxyAfterErrorTest,
ReconsiderProxyAfterErrorHttpsProxy) { … }
TEST_F(JobControllerReconsiderProxyAfterErrorTest,
ReconsiderProxyAfterFirstNestedProxyErrorHttps) { … }
TEST_F(JobControllerReconsiderProxyAfterErrorTest,
ReconsiderProxyAfterSecondNestedProxyErrorHttps) { … }
TEST_F(JobControllerReconsiderProxyAfterErrorTest,
ReconsiderProxyForIpProtection) { … }
TEST_F(JobControllerReconsiderProxyAfterErrorTest,
ReconsiderProxyAfterErrorSocks5Proxy) { … }
TEST_F(JobControllerReconsiderProxyAfterErrorTest, ReconsiderErrMsgTooBig) { … }
TEST_F(JobControllerReconsiderProxyAfterErrorTest,
ReconsiderProxyAfterErrorQuicProxy) { … }
TEST_F(JobControllerReconsiderProxyAfterErrorTest,
DoNotReconsiderErrMsgTooBig) { … }
TEST_P(HttpStreamFactoryJobControllerTest, OnStreamFailedWithNoAlternativeJob) { … }
TEST_P(HttpStreamFactoryJobControllerTest, OnStreamReadyWithNoAlternativeJob) { … }
TEST_P(HttpStreamFactoryJobControllerTest, CancelJobsBeforeBinding) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
DoNotCreateAltJobIfQuicVersionsUnsupported) { … }
void HttpStreamFactoryJobControllerTestBase::
TestDoNotDelayMainJobIfQuicWasRecentlyBroken(bool async_quic_session) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
DoNotDelayMainJobIfQuicWasRecentlyBroken) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
DoNotDelayMainJobIfQuicWasRecentlyBrokenAsyncQuicSession) { … }
void HttpStreamFactoryJobControllerTestBase::
TestDelayMainJobAfterRecentlyBrokenQuicWasConfirmed(
bool async_quic_session) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
DelayMainJobAfterRecentlyBrokenQuicWasConfirmed) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
DelayMainJobAfterRecentlyBrokenQuicWasConfirmedAsyncQuicSession) { … }
void HttpStreamFactoryJobControllerTestBase::TestOnStreamFailedForBothJobs(
bool alt_job_retried_on_non_default_network,
bool async_quic_session) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
OnStreamFailedForBothJobsWithoutQuicRetry) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
OnStreamFailedForBothJobsWithQuicRetriedOnAlternateNetwork) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
OnStreamFailedForBothJobsWithoutQuicRetryAsyncQuicSession) { … }
TEST_P(
HttpStreamFactoryJobControllerTest,
OnStreamFailedForBothJobsWithQuicRetriedOnAlternateNetworkAsyncQuicSession) { … }
void HttpStreamFactoryJobControllerTestBase::
TestAltJobFailsAfterMainJobSucceeded(
bool alt_job_retried_on_non_default_network,
bool async_quic_session) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltJobFailsOnDefaultNetworkAfterMainJobSucceeded) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltJobFailsOnBothNetworksAfterMainJobSucceeded) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltJobFailsOnDefaultNetworkAfterMainJobSucceededAsyncQuicSession) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltJobFailsOnBothNetworksAfterMainJobSucceededAsyncQuicSession) { … }
void HttpStreamFactoryJobControllerTestBase::TestAltJobSucceedsMainJobDestroyed(
bool async_quic_session) { … }
TEST_P(HttpStreamFactoryJobControllerTest, AltJobSucceedsMainJobDestroyed) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltJobSucceedsMainJobDestroyedAsyncQuicSession) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltJobSucceedsMainJobBlockedControllerDestroyed) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
SpdySessionKeyHasOriginHostPortPair) { … }
void HttpStreamFactoryJobControllerTestBase::
TestOrphanedJobCompletesControllerDestroyed(bool async_quic_session) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
OrphanedJobCompletesControllerDestroyed) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
OrphanedJobCompletesControllerDestroyedAsyncQuicSession) { … }
void HttpStreamFactoryJobControllerTestBase::
TestAltJobSucceedsAfterMainJobFailed(
bool alt_job_retried_on_non_default_network,
bool async_quic_session) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltJobSucceedsOnDefaultNetworkAfterMainJobFailed) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltJobSucceedsOnAlternateNetworkAfterMainJobFailed) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltJobSucceedsOnDefaultNetworkAfterMainJobFailedAsyncQuicSession) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltJobSucceedsOnAlternateNetworkAfterMainJobFailedAsyncQuicSession) { … }
void HttpStreamFactoryJobControllerTestBase::
TestAltJobSucceedsAfterMainJobSucceeded(
bool alt_job_retried_on_non_default_network,
bool async_quic_session) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltJobSucceedsOnDefaultNetworkAfterMainJobSucceeded) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltJobSucceedsOnAlternateNetworkAfterMainJobSucceeded) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltJobSucceedsOnDefaultNetworkAfterMainJobSucceededAsyncQuicSession) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltJobSucceedsOnAlternateNetworkAfterMainJobSucceededAsyncQuicSession) { … }
void HttpStreamFactoryJobControllerTestBase::
TestMainJobSucceedsAfterAltJobSucceeded(
bool alt_job_retried_on_non_default_network,
bool async_quic_session) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterAltJobSucceededOnDefaultNetwork) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterAltJobSucceededOnAlternateNetwork) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterAltJobSucceededOnDefaultNetworkAsyncQuicSession) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterAltJobSucceededOnAlternateNetworkAsyncQuicSession) { … }
void HttpStreamFactoryJobControllerTestBase::
TestMainJobFailsAfterAltJobSucceeded(
bool alt_job_retried_on_non_default_network,
bool async_quic_session) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobFailsAfterAltJobSucceededOnDefaultNetwork) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobFailsAfterAltJobSucceededOnAlternateNetwork) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobFailsAfterAltJobSucceededOnDefaultNetworkAsyncQuicSession) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobFailsAfterAltJobSucceededOnAlternateNetworkAsyncQuicSession) { … }
void HttpStreamFactoryJobControllerTestBase::
TestMainJobSucceedsAfterAltJobFailed(
bool alt_job_retried_on_non_default_network,
bool async_quic_session) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterAltJobFailedOnDefaultNetwork) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterAltJobFailedOnBothNetworks) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterAltJobFailedOnDefaultNetworkAsyncQuicSession) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterAltJobFailedOnBothNetworksAsyncQuicSession) { … }
void HttpStreamFactoryJobControllerTestBase::
TestMainJobSucceedsAfterIgnoredError(int net_error,
bool async_quic_session,
bool expect_broken,
std::string alternate_host) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterConnectionChanged) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterInternetDisconnected) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterConnectionChangedAsyncQuicSession) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterInternetDisconnectedAsyncQuicSession) { … }
TEST_P(HttpStreamFactoryJobControllerTest, MainJobSucceedsAfterDnsFailure) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterDnsFailureAsyncQuicSession) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterDnsFailureWithAlternateName) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterDnsFailureWithAlternateNameAsyncQuicSession) { … }
TEST_P(HttpStreamFactoryJobControllerTest, GetLoadStateAfterMainJobFailed) { … }
void HttpStreamFactoryJobControllerTestBase::TestResumeMainJobWhenAltJobStalls(
bool async_quic_session) { … }
TEST_P(HttpStreamFactoryJobControllerTest, ResumeMainJobWhenAltJobStalls) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
ResumeMainJobWhenAltJobStallsAsyncQuicSession) { … }
TEST_P(HttpStreamFactoryJobControllerTest, InvalidPortForQuic) { … }
TEST_P(HttpStreamFactoryJobControllerTest, HostResolutionHang) { … }
TEST_P(HttpStreamFactoryJobControllerTest, ResumeMainJobLaterCanceled) { … }
TEST_P(HttpStreamFactoryJobControllerTest, DelayedTCPWithLargeSrtt) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
DISABLED_ResumeMainJobImmediatelyOnStreamFailed) { … }
TEST_P(HttpStreamFactoryJobControllerTest, PreconnectToHostWithValidAltSvc) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
PreconnectMultipleStreamsToH2Server) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
PreconnectMultipleStreamsToH2ServerWithNetworkIsolationKey) { … }
void HttpStreamFactoryJobControllerTestBase::
TestDoNotDelayMainJobIfHasAvailableSpdySession(bool async_quic_session) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
DoNotDelayMainJobIfHasAvailableSpdySession) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
DoNotDelayMainJobIfHasAvailableSpdySessionAsyncQuicSession) { … }
TEST_P(HttpStreamFactoryJobControllerTest, SpdySessionInterruptsPreconnect) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
PreconnectJobDoesntBlockIpBasedPooling) { … }
class JobControllerLimitMultipleH2Requests
: public HttpStreamFactoryJobControllerTestBase { … };
TEST_F(JobControllerLimitMultipleH2Requests, MultipleRequests) { … }
TEST_F(JobControllerLimitMultipleH2Requests,
MultipleRequestsNetworkIsolationKey) { … }
TEST_F(JobControllerLimitMultipleH2Requests, MultipleRequestsFirstRequestHang) { … }
TEST_F(JobControllerLimitMultipleH2Requests,
MultipleRequestsFirstRequestCanceled) { … }
TEST_F(JobControllerLimitMultipleH2Requests, MultiplePreconnects) { … }
TEST_F(JobControllerLimitMultipleH2Requests, H1NegotiatedForFirstRequest) { … }
TEST_F(JobControllerLimitMultipleH2Requests, QuicJobNotThrottled) { … }
class HttpStreamFactoryJobControllerMisdirectedRequestRetry
: public HttpStreamFactoryJobControllerTestBase,
public ::testing::WithParamInterface<::testing::tuple<bool, bool>> { … };
INSTANTIATE_TEST_SUITE_P(…);
TEST_P(HttpStreamFactoryJobControllerMisdirectedRequestRetry,
DisableIPBasedPoolingAndAlternativeServices) { … }
class HttpStreamFactoryJobControllerPreconnectTest
: public HttpStreamFactoryJobControllerTestBase,
public ::testing::WithParamInterface<bool> { … };
INSTANTIATE_TEST_SUITE_P(…);
TEST_P(HttpStreamFactoryJobControllerPreconnectTest, LimitEarlyPreconnects) { … }
TEST_P(HttpStreamFactoryJobControllerTest, GetAlternativeServiceInfoFor) { … }
void HttpStreamFactoryJobControllerTestBase::TestAltSvcVersionSelection(
const std::string& alt_svc_header,
const quic::ParsedQuicVersion& expected_version,
const quic::ParsedQuicVersionVector& supported_versions) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltSvcVersionSelectionFindsFirstMatch) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltSvcVersionSelectionFindsFirstMatchInverse) { … }
TEST_P(HttpStreamFactoryJobControllerTest,
AltSvcVersionSelectionWithInverseOrderingNewFormat) { … }
TEST_P(HttpStreamFactoryJobControllerTest, QuicHostAllowlist) { … }
class HttpStreamFactoryJobControllerDnsHttpsAlpnTest
: public HttpStreamFactoryJobControllerTestBase { … };
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
NoHttpsRecordSyncHostResolve) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
NoHttpsRecordAsyncHostResolveResumeMainWithoutDelay) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
NoHttpsRecordAsyncHostResolveResumeMainWithoutDelayQuicWorkedNetwork) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
MainJobNoDelayOnQuicNotWorkedNetworkSyncHostResolve) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
MainJobNoDelayOnQuicNotWorkedNetworkAsyncHostResolve) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
MainJobDelayOnQuicWorkedNetwork) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
NoDnsAlpnH3JobForProxiedSession) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
MainJobSucceedsDnsAlpnH3JobSucceeds) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
ActiveSessionAvailableForMainJob) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest, MainJobHasActiveSocket) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
MainJobHasActiveSocketAltSvcRegistered) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
ActiveSessionAvailableForAltSvcJob) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
ActiveSessionAvailableForDnsAlpnH3Job) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
ActiveSessionAvailableForMainJobAndDnsAlpnH3Job) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
DoNotStartDnsAlpnH3JobWhenSameHostDefaultPortAltJobCreated) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
AllJobsCreatedMainJobSucceedAltJobSucceedDnsJobSucceed) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
AllJobsCreatedAltJobSucceedDnsJobSucceedMainJobSucceed) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
AllJobsCreatedDnsJobSucceedAltJobSucceedMainJobSucceed) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
DnsJobFailOnDefaultNetworkDnsJobFailMainJobSucceed) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
DnsJobFailOnDefaultNetworkMainJobSucceedDnsJobSucceed) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
DnsJobSucceedMainJobCanceled) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
DnsJobFailOnDefaultNetworkDnsJobSucceedMainJobSucceed) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest, PreconnectDnsAlpnH3) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
PreconnectAltSvcAvailableActiveSessionAvailable) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest, PreconnectNoDnsAlpnH3) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
PreconnectAlternateNoDnsAlpn) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
DnsResolutionTimeOverridesFromAlpnH3Job) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
DnsResolutionTimeOverridesFromAlternativeJob) { … }
TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
DnsResolutionTimeOverridesNotFromDifferentAlternativeJob) { … }
class HttpStreamFactoryJobControllerPoolTest
: public HttpStreamFactoryJobControllerTestBase { … };
TEST_F(HttpStreamFactoryJobControllerPoolTest, Preconnect) { … }
TEST_F(HttpStreamFactoryJobControllerPoolTest, PreconnectSync) { … }
}