Chromium Code Reviews| Index: chrome/browser/net/chrome_network_delegate_unittest.cc |
| diff --git a/chrome/browser/net/chrome_network_delegate_unittest.cc b/chrome/browser/net/chrome_network_delegate_unittest.cc |
| index 3ca7bbe09a078acaab591f43fdcdc47c065fa020..063cf23c743696972dd6efbf6a636da0fc4cde4b 100644 |
| --- a/chrome/browser/net/chrome_network_delegate_unittest.cc |
| +++ b/chrome/browser/net/chrome_network_delegate_unittest.cc |
| @@ -9,6 +9,8 @@ |
| #include "base/memory/scoped_ptr.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/prefs/pref_member.h" |
| +#include "base/run_loop.h" |
| +#include "base/test/histogram_tester.h" |
| #include "chrome/browser/content_settings/cookie_settings_factory.h" |
| #include "chrome/browser/net/safe_search_util.h" |
| #include "chrome/common/pref_names.h" |
| @@ -16,45 +18,240 @@ |
| #include "chrome/test/base/testing_profile.h" |
| #include "components/content_settings/core/browser/cookie_settings.h" |
| #include "components/content_settings/core/common/pref_names.h" |
| +#include "content/public/browser/resource_request_info.h" |
| #include "content/public/common/content_switches.h" |
| +#include "content/public/common/resource_type.h" |
| #include "content/public/test/test_browser_thread_bundle.h" |
| #include "net/base/request_priority.h" |
| +#include "net/socket/socket_test_util.h" |
| #include "net/url_request/url_request.h" |
| #include "net/url_request/url_request_test_util.h" |
| +#include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #if defined(ENABLE_EXTENSIONS) |
| #include "chrome/browser/extensions/event_router_forwarder.h" |
| #endif |
| -TEST(ChromeNetworkDelegateTest, DisableFirstPartyOnlyCookiesIffFlagDisabled) { |
| - BooleanPrefMember pref_member_; |
| - scoped_ptr<ChromeNetworkDelegate> delegate; |
| +#if !defined(OS_IOS) |
| +#include "components/data_use_measurement/core/data_use_user_data.h" |
| +#endif |
| + |
| +namespace { |
| + |
| +// This function requests a URL, and makes it return a known response. If |
| +// |from_user| is true, it attaches a ResourceRequestInfo to the URLRequest, |
| +// because requests from users have this info. If |from_user| is false, the |
| +// request is presumed to be from a service, and the service name is set in the |
| +// request's user data. (As an example suggestions service tag is attached). if |
| +// |redirect| is true, it adds necessary socket data to have it follow redirect |
| +// before getting the final response. |
| +void RequestURL(net::URLRequestContext* context, |
| + net::MockClientSocketFactory* socket_factory, |
| + bool from_user, |
| + bool redirect) { |
| + net::MockRead redirect_mock_reads[] = { |
| + net::MockRead("HTTP/1.1 302 Found\r\n" |
| + "Location: http://bar.com/\r\n\r\n"), |
| + net::MockRead(""), |
|
mmenke
2015/09/04 20:51:45
This isn't needed (And is redundant with the next
amohammadkhan
2015/09/05 00:58:02
Done.
|
| + net::MockRead(net::SYNCHRONOUS, net::OK), |
| + }; |
| + net::StaticSocketDataProvider redirect_socket_data_provider( |
| + redirect_mock_reads, arraysize(redirect_mock_reads), nullptr, 0); |
| + if (redirect) { |
| + socket_factory->AddSocketDataProvider(&redirect_socket_data_provider); |
| + } |
|
mmenke
2015/09/04 20:51:45
nit: Don't use braces on single-line if.
amohammadkhan
2015/09/05 00:58:01
Done.
|
| + |
| + net::MockRead response_mock_reads[] = { |
| + net::MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| + net::MockRead("response body"), |
| + net::MockRead(net::SYNCHRONOUS, net::OK), |
| + }; |
| + net::StaticSocketDataProvider response_socket_data_provider( |
| + response_mock_reads, arraysize(response_mock_reads), nullptr, 0); |
| + socket_factory->AddSocketDataProvider(&response_socket_data_provider); |
| + |
| + net::TestDelegate test_delegate; |
| + test_delegate.set_quit_on_complete(true); |
| + |
| + scoped_ptr<net::URLRequest> request(context->CreateRequest( |
| + GURL("http://example.com"), net::DEFAULT_PRIORITY, &test_delegate)); |
|
mmenke
2015/09/04 20:51:45
nit: include "url/gurl.h"
amohammadkhan
2015/09/05 00:58:01
Done.
|
| + if (from_user) { |
| + content::ResourceRequestInfo::AllocateForTesting( |
| + request.get(), content::RESOURCE_TYPE_MAIN_FRAME, nullptr, -2, -2, -2, |
| + true, false, true, true); |
| + } else { |
| + request->SetUserData( |
| + data_use_measurement::DataUseUserData::kUserDataKey, |
| + new data_use_measurement::DataUseUserData( |
| + data_use_measurement::DataUseUserData::SUGGESTIONS)); |
| + } |
| + request->Start(); |
| + base::RunLoop().RunUntilIdle(); |
| +} |
| +} // namespace |
| + |
| +class ChromeNetworkDelegateTest : public testing::Test { |
| + public: |
| + ChromeNetworkDelegateTest() |
| + : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), |
| + context_(new net::TestURLRequestContext(true)) { |
| #if defined(ENABLE_EXTENSIONS) |
| - scoped_refptr<extensions::EventRouterForwarder> forwarder = |
| - new extensions::EventRouterForwarder(); |
| - delegate.reset(new ChromeNetworkDelegate(forwarder.get(), &pref_member_)); |
| -#else |
| - delegate.reset(new ChromeNetworkDelegate(nullptr, &pref_member_)); |
| + forwarder_ = new extensions::EventRouterForwarder(); |
| #endif |
| - EXPECT_FALSE(delegate->FirstPartyOnlyCookieExperimentEnabled()); |
| -} |
| + } |
| -TEST(ChromeNetworkDelegateTest, EnableFirstPartyOnlyCookiesIffFlagEnabled) { |
| - base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| - switches::kEnableExperimentalWebPlatformFeatures); |
| - BooleanPrefMember pref_member_; |
| - scoped_ptr<ChromeNetworkDelegate> delegate; |
| + void SetUp() override { |
| + ChromeNetworkDelegate::InitializePrefsOnUIThread( |
| + &enable_referrers_, nullptr, nullptr, nullptr, |
| + profile_.GetTestingPrefService()); |
| + } |
| + |
| + scoped_ptr<net::NetworkDelegate> CreateNetworkDelegate() { |
|
mmenke
2015/09/04 20:51:45
Should get rid of this method and SetDelegate, and
amohammadkhan
2015/09/05 00:58:01
Done.
|
| + scoped_ptr<ChromeNetworkDelegate> network_delegate( |
| + new ChromeNetworkDelegate(forwarder(), &enable_referrers_)); |
| + return network_delegate.Pass(); |
| + } |
| + |
| + void SetDelegate(net::NetworkDelegate* delegate) { |
| + context_->set_client_socket_factory(&socket_factory_); |
| + context_->set_network_delegate(network_delegate_.get()); |
| + context_->Init(); |
| + } |
| + |
| + void Initialize() { |
| + network_delegate_ = CreateNetworkDelegate(); |
| + SetDelegate(network_delegate_.get()); |
| + } |
| + net::TestURLRequestContext* context() { return context_.get(); } |
| + net::NetworkDelegate* network_delegate() { return network_delegate_.get(); } |
| + net::MockClientSocketFactory* socket_factory() { return &socket_factory_; } |
| + |
| + extensions::EventRouterForwarder* forwarder() { |
|
mmenke
2015/09/04 20:51:45
This code doesn't really depend on whether or not
amohammadkhan
2015/09/05 00:58:02
I tried to remove it, it give me the following err
|
| #if defined(ENABLE_EXTENSIONS) |
| - scoped_refptr<extensions::EventRouterForwarder> forwarder = |
| - new extensions::EventRouterForwarder(); |
| - delegate.reset(new ChromeNetworkDelegate(forwarder.get(), &pref_member_)); |
| + return forwarder_.get(); |
| #else |
| - delegate.reset(new ChromeNetworkDelegate(nullptr, &pref_member_)); |
| + return nullptr; |
| #endif |
| - EXPECT_TRUE(delegate->FirstPartyOnlyCookieExperimentEnabled()); |
| + } |
| + |
| + private: |
| + content::TestBrowserThreadBundle thread_bundle_; |
| +#if defined(ENABLE_EXTENSIONS) |
| + scoped_refptr<extensions::EventRouterForwarder> forwarder_; |
| +#endif |
| + TestingProfile profile_; |
| + BooleanPrefMember enable_referrers_; |
| + scoped_ptr<net::NetworkDelegate> network_delegate_; |
| + scoped_ptr<net::TestURLRequestContext> context_; |
| + net::MockClientSocketFactory socket_factory_; |
|
mmenke
2015/09/04 20:51:45
This should be above TestURLRequestContext
amohammadkhan
2015/09/05 00:58:02
Done.
|
| + |
|
mmenke
2015/09/04 20:51:45
nit: Blank line not needed.
amohammadkhan
2015/09/05 00:58:01
Done.
|
| +}; |
| + |
| +// This function tests data use measurement for requests by services. it makes a |
| +// query which is similar to a query of a service, so it should affect |
| +// DataUse.TrafficSize.System.Dimensions and DataUse.MessageSize.ServiceName |
| +// histograms. AppState and ConnectionType dimensions are always Foreground and |
| +// NotCellular respectively. |
| +#if !defined(OS_IOS) |
| +TEST_F(ChromeNetworkDelegateTest, DataUseMeasurementServiceTest) { |
| + Initialize(); |
| + base::HistogramTester histogram_tester; |
| + |
| + // A query from a service without redirection. |
| + RequestURL(context(), socket_factory(), 0, 0); |
|
mmenke
2015/09/04 20:51:45
0, 0 -> false, false
amohammadkhan
2015/09/05 00:58:02
Done.
|
| + histogram_tester.ExpectTotalCount( |
| + "DataUse.TrafficSize.System.Downstream.Foreground.NotCellular", 1); |
| + histogram_tester.ExpectTotalCount( |
| + "DataUse.TrafficSize.System.Upstream.Foreground.NotCellular", 1); |
| + // One upload and one download message, so totalCount should be 2. |
| + histogram_tester.ExpectTotalCount("DataUse.MessageSize.Suggestions", 2); |
| + histogram_tester.ExpectTotalCount( |
| + "DataUse.TrafficSize.User.Downstream.Foreground.NotCellular", 0); |
| + histogram_tester.ExpectTotalCount( |
| + "DataUse.TrafficSize.User.Upstream.Foreground.NotCellular", 0); |
| +} |
| + |
| +// This function tests data use measurement for requests by user.The query from |
| +// a user should affect DataUse.TrafficSize.User.Dimensions histogram. AppState |
| +// and ConnectionType dimensions are always Foreground and NotCellular |
| +// respectively. |
| +TEST_F(ChromeNetworkDelegateTest, DataUseMeasurementUserTest) { |
| + Initialize(); |
| + base::HistogramTester histogram_tester; |
| + |
| + // A query from user without redirection. |
| + RequestURL(context(), socket_factory(), 1, 0); |
|
mmenke
2015/09/04 20:51:45
1, 0 -> true, false
amohammadkhan
2015/09/05 00:58:02
Done.
|
| + histogram_tester.ExpectTotalCount( |
| + "DataUse.TrafficSize.User.Downstream.Foreground.NotCellular", 1); |
| + histogram_tester.ExpectTotalCount( |
| + "DataUse.TrafficSize.User.Upstream.Foreground.NotCellular", 1); |
| + histogram_tester.ExpectTotalCount( |
| + "DataUse.TrafficSize.System.Downstream.Foreground.NotCellular", 0); |
| + histogram_tester.ExpectTotalCount( |
| + "DataUse.TrafficSize.System.Upstream.Foreground.NotCellular", 0); |
| + histogram_tester.ExpectTotalCount("DataUse.MessageSize.Suggestions", 0); |
| +} |
| + |
| +// This function tests data use measurement for requests by services in case the |
| +// request is redirected once. it makes a query which is similar to a query of a |
| +// service, so it should affect DataUse.TrafficSize.System.Dimensions and |
| +// DataUse.MessageSize.ServiceName histograms. AppState and ConnectionType |
| +// dimensions are always Foreground and NotCellular respectively. |
| +TEST_F(ChromeNetworkDelegateTest, DataUseMeasurementServiceTestWithRedirect) { |
| + Initialize(); |
| + base::HistogramTester histogram_tester; |
| + |
| + // A query from user with one redirection. |
| + RequestURL(context(), socket_factory(), 0, 1); |
|
mmenke
2015/09/04 20:51:45
false/true
amohammadkhan
2015/09/05 00:58:01
Done.
|
| + histogram_tester.ExpectTotalCount( |
| + "DataUse.TrafficSize.System.Downstream.Foreground.NotCellular", 2); |
| + histogram_tester.ExpectTotalCount( |
| + "DataUse.TrafficSize.System.Upstream.Foreground.NotCellular", 2); |
| + // Two uploads and two downloads message, so totalCount should be 4. |
| + histogram_tester.ExpectTotalCount("DataUse.MessageSize.Suggestions", 4); |
| + histogram_tester.ExpectTotalCount( |
| + "DataUse.TrafficSize.User.Downstream.Foreground.NotCellular", 0); |
| + histogram_tester.ExpectTotalCount( |
| + "DataUse.TrafficSize.User.Upstream.Foreground.NotCellular", 0); |
| +} |
| + |
| +// This function tests data use measurement for requests by user in case the |
| +// request is redirected once.The query from a user should affect |
| +// DataUse.TrafficSize.User.Dimensions histogram. AppState and ConnectionType |
| +// dimensions are always Foreground and NotCellular respectively. |
| +TEST_F(ChromeNetworkDelegateTest, DataUseMeasurementUserTestWithRedirect) { |
| + Initialize(); |
| + base::HistogramTester histogram_tester; |
| + |
| + // A query from user with one redirection. |
| + RequestURL(context(), socket_factory(), 1, 1); |
|
mmenke
2015/09/04 20:51:45
true/true
amohammadkhan
2015/09/05 00:58:01
Done.
|
| + |
| + histogram_tester.ExpectTotalCount( |
| + "DataUse.TrafficSize.User.Downstream.Foreground.NotCellular", 2); |
| + histogram_tester.ExpectTotalCount( |
| + "DataUse.TrafficSize.User.Upstream.Foreground.NotCellular", 2); |
| + histogram_tester.ExpectTotalCount( |
| + "DataUse.TrafficSize.System.Downstream.Foreground.NotCellular", 0); |
| + histogram_tester.ExpectTotalCount( |
| + "DataUse.TrafficSize.System.Upstream.Foreground.NotCellular", 0); |
| + histogram_tester.ExpectTotalCount("DataUse.MessageSize.Suggestions", 0); |
| +} |
| + |
| +#endif |
| + |
| +TEST_F(ChromeNetworkDelegateTest, DisableFirstPartyOnlyCookiesIffFlagDisabled) { |
| + Initialize(); |
| + EXPECT_FALSE(network_delegate()->FirstPartyOnlyCookieExperimentEnabled()); |
| +} |
| + |
| +TEST_F(ChromeNetworkDelegateTest, EnableFirstPartyOnlyCookiesIffFlagEnabled) { |
| + base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| + switches::kEnableExperimentalWebPlatformFeatures); |
| + Initialize(); |
| + EXPECT_TRUE(network_delegate()->FirstPartyOnlyCookieExperimentEnabled()); |
| } |
| class ChromeNetworkDelegateSafeSearchTest : public testing::Test { |