Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(392)

Unified Diff: components/data_use_measurement/core/data_use_network_delegate_unittest.cc

Issue 2462983003: Move data use measurement to DataUseNetworkDelegate (Closed)
Patch Set: Rebased and fixed nits Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/data_use_measurement/core/data_use_network_delegate_unittest.cc
diff --git a/components/data_use_measurement/core/data_use_network_delegate_unittest.cc b/components/data_use_measurement/core/data_use_network_delegate_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..b671935b00ca21fda6108d4eafe9ff3c466b643a
--- /dev/null
+++ b/components/data_use_measurement/core/data_use_network_delegate_unittest.cc
@@ -0,0 +1,232 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/data_use_measurement/core/data_use_network_delegate.h"
+
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "base/test/histogram_tester.h"
+#include "components/data_use_measurement/core/data_use_ascriber.h"
+#include "components/data_use_measurement/core/url_request_classifier.h"
+#include "components/metrics/data_use_tracker.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/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace data_use_measurement {
+
+namespace {
+
+class UserRequestUserDataForTesting : public base::SupportsUserData::Data,
+ public URLRequestClassifier {
+ public:
+ static const void* const kUserDataKey;
+
+ bool IsUserRequest(const net::URLRequest& request) const override {
+ return request.GetUserData(kUserDataKey) != nullptr;
+ }
+
+ static void MarkAsUserRequest(net::URLRequest* request) {
+ request->SetUserData(kUserDataKey, new UserRequestUserDataForTesting());
+ }
+};
+
+class TestDataUseAscriber : public DataUseAscriber {
+ public:
+ TestDataUseAscriber() {}
+
+ DataUseRecorder* GetDataUseRecorder(net::URLRequest* request) override {
+ return nullptr;
+ }
+
+ std::unique_ptr<URLRequestClassifier> CreateURLRequestClassifier()
+ const override {
+ return nullptr;
+ }
+};
+
+// static
+const void* const UserRequestUserDataForTesting::kUserDataKey =
+ &UserRequestUserDataForTesting::kUserDataKey;
+
+// 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.
+std::unique_ptr<net::URLRequest> 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(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);
+ 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);
+ std::unique_ptr<net::URLRequest> request(context->CreateRequest(
+ GURL("http://example.com"), net::DEFAULT_PRIORITY, &test_delegate));
+
+ if (from_user) {
+ UserRequestUserDataForTesting::MarkAsUserRequest(request.get());
+ } else {
+ request->SetUserData(
+ data_use_measurement::DataUseUserData::kUserDataKey,
+ new data_use_measurement::DataUseUserData(
+ data_use_measurement::DataUseUserData::SUGGESTIONS,
+ data_use_measurement::DataUseUserData::FOREGROUND));
+ }
+ request->Start();
+ base::RunLoop().RunUntilIdle();
+ return request;
+}
+
+class DataUseNetworkDelegateTest : public testing::Test {
+ public:
+ DataUseNetworkDelegateTest()
+ : context_(true),
+ data_use_network_delegate_(
+ base::MakeUnique<net::TestNetworkDelegate>(),
+ &test_data_use_ascriber_,
+ base::MakeUnique<UserRequestUserDataForTesting>(),
+ metrics::UpdateUsagePrefCallbackType()) {
+ context_.set_client_socket_factory(&mock_socket_factory_);
+ context_.set_network_delegate(&data_use_network_delegate_);
+ context_.Init();
+ }
+
+ net::TestURLRequestContext* context() { return &context_; }
+ net::MockClientSocketFactory* socket_factory() {
+ return &mock_socket_factory_;
+ }
+
+ private:
+ base::MessageLoopForIO message_loop_;
+ net::MockClientSocketFactory mock_socket_factory_;
+ net::TestURLRequestContext context_;
+ TestDataUseAscriber test_data_use_ascriber_;
+ DataUseNetworkDelegate data_use_network_delegate_;
+};
+
+// 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.
+TEST_F(DataUseNetworkDelegateTest, DataUseMeasurementServiceTest) {
+ base::HistogramTester histogram_tester;
+
+ // A query from a service without redirection.
+ RequestURL(context(), socket_factory(), false, false);
+ EXPECT_FALSE(
+ histogram_tester
+ .GetTotalCountsForPrefix(
+ "DataUse.TrafficSize.System.Downstream.Foreground.NotCellular")
+ .empty());
+ histogram_tester.ExpectTotalCount(
+ "DataUse.TrafficSize.System.Upstream.Foreground.NotCellular", 1);
+ EXPECT_FALSE(histogram_tester
+ .GetTotalCountsForPrefix("DataUse.MessageSize.Suggestions")
+ .empty());
+ 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(DataUseNetworkDelegateTest, DataUseMeasurementUserTest) {
+ base::HistogramTester histogram_tester;
+
+ // A query from user without redirection.
+ RequestURL(context(), socket_factory(), true, false);
+ EXPECT_FALSE(
+ histogram_tester
+ .GetTotalCountsForPrefix(
+ "DataUse.TrafficSize.User.Downstream.Foreground.NotCellular")
+ .empty());
+ 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(DataUseNetworkDelegateTest, DataUseMeasurementServiceTestWithRedirect) {
+ base::HistogramTester histogram_tester;
+
+ // A query from user with one redirection.
+ RequestURL(context(), socket_factory(), false, true);
+ EXPECT_FALSE(
+ histogram_tester
+ .GetTotalCountsForPrefix(
+ "DataUse.TrafficSize.System.Downstream.Foreground.NotCellular")
+ .empty());
+ histogram_tester.ExpectTotalCount(
+ "DataUse.TrafficSize.System.Upstream.Foreground.NotCellular", 2);
+ // Two uploads and two downloads message, so totalCount should be 4.
+ EXPECT_FALSE(histogram_tester
+ .GetTotalCountsForPrefix("DataUse.MessageSize.Suggestions")
+ .empty());
+ 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(DataUseNetworkDelegateTest, DataUseMeasurementUserTestWithRedirect) {
+ base::HistogramTester histogram_tester;
+
+ // A query from user with one redirection.
+ RequestURL(context(), socket_factory(), true, true);
+
+ EXPECT_FALSE(
+ histogram_tester
+ .GetTotalCountsForPrefix(
+ "DataUse.TrafficSize.User.Downstream.Foreground.NotCellular")
+ .empty());
+ 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);
+}
+
+} // namespace
+
+} // namespace data_use_measurement

Powered by Google App Engine
This is Rietveld 408576698