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

Side by Side Diff: components/data_use_measurement/core/data_use_measurement_unittest.cc

Issue 2595503002: Record the data use by content type (Closed)
Patch Set: Addressed nits Created 3 years, 12 months 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/data_use_measurement/core/data_use_measurement.h" 5 #include "components/data_use_measurement/core/data_use_measurement.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <string> 8 #include <string>
9 9
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 11 matching lines...) Expand all
22 #include "net/url_request/url_request_test_util.h" 22 #include "net/url_request/url_request_test_util.h"
23 #include "testing/gtest/include/gtest/gtest.h" 23 #include "testing/gtest/include/gtest/gtest.h"
24 #include "url/gurl.h" 24 #include "url/gurl.h"
25 25
26 #if defined(OS_ANDROID) 26 #if defined(OS_ANDROID)
27 #include "base/android/application_status_listener.h" 27 #include "base/android/application_status_listener.h"
28 #endif 28 #endif
29 29
30 namespace data_use_measurement { 30 namespace data_use_measurement {
31 31
32 class UserRequestUserDataForTesting : public base::SupportsUserData::Data, 32 class TestURLRequestClassifier : public base::SupportsUserData::Data,
33 public URLRequestClassifier { 33 public URLRequestClassifier {
34 public: 34 public:
35 static const void* const kUserDataKey; 35 static const void* const kUserDataKey;
36 36
37 TestURLRequestClassifier() : content_type_(DataUseUserData::OTHER) {}
38
37 bool IsUserRequest(const net::URLRequest& request) const override { 39 bool IsUserRequest(const net::URLRequest& request) const override {
38 return request.GetUserData(kUserDataKey) != nullptr; 40 return request.GetUserData(kUserDataKey) != nullptr;
39 } 41 }
40 42
41 static void MarkAsUserRequest(net::URLRequest* request) { 43 static void MarkAsUserRequest(net::URLRequest* request) {
42 request->SetUserData(kUserDataKey, new UserRequestUserDataForTesting()); 44 request->SetUserData(kUserDataKey, new TestURLRequestClassifier());
43 } 45 }
46
47 DataUseUserData::DataUseContentType GetContentType(
48 const net::URLRequest& request,
49 const net::HttpResponseHeaders& response_headers) const override {
50 return content_type_;
51 }
52
53 void set_content_type(DataUseUserData::DataUseContentType content_type) {
54 content_type_ = content_type;
55 }
56
57 private:
58 DataUseUserData::DataUseContentType content_type_;
44 }; 59 };
45 60
46 class TestDataUseAscriber : public DataUseAscriber { 61 class TestDataUseAscriber : public DataUseAscriber {
47 public: 62 public:
48 TestDataUseAscriber() {} 63 TestDataUseAscriber() {}
49 64
50 DataUseRecorder* GetOrCreateDataUseRecorder( 65 DataUseRecorder* GetOrCreateDataUseRecorder(
51 net::URLRequest* request) override { 66 net::URLRequest* request) override {
52 return &recorder_; 67 return &recorder_;
53 } 68 }
54 69
55 DataUseRecorder* GetDataUseRecorder(const net::URLRequest& request) override { 70 DataUseRecorder* GetDataUseRecorder(const net::URLRequest& request) override {
56 return &recorder_; 71 return &recorder_;
57 } 72 }
58 73
59 std::unique_ptr<URLRequestClassifier> CreateURLRequestClassifier() 74 std::unique_ptr<URLRequestClassifier> CreateURLRequestClassifier()
60 const override { 75 const override {
61 return nullptr; 76 return nullptr;
62 } 77 }
63 78
64 void SetTabVisibility(bool visible) { recorder_.set_is_visible(visible); } 79 void SetTabVisibility(bool visible) { recorder_.set_is_visible(visible); }
65 80
66 private: 81 private:
67 DataUseRecorder recorder_; 82 DataUseRecorder recorder_;
68 }; 83 };
69 84
70 // The more usual initialization of kUserDataKey would be along the lines of 85 // The more usual initialization of kUserDataKey would be along the lines of
71 // const void* const UserRequestUserDataForTesting::kUserDataKey = 86 // const void* const TestURLRequestClassifier::kUserDataKey =
72 // &UserRequestUserDataForTesting::kUserDataKey; 87 // &TestURLRequestClassifier::kUserDataKey;
73 // but lld's identical constant folding then folds that with 88 // but lld's identical constant folding then folds that with
74 // DataUseUserData::kUserDataKey which is initialized like that as well, and 89 // DataUseUserData::kUserDataKey which is initialized like that as well, and
75 // then UserRequestUserDataForTesting::IsUserRequest() starts classifying 90 // then TestURLRequestClassifier::IsUserRequest() starts classifying service
76 // service requests as user requests. To work around this, make 91 // requests as user requests. To work around this, make
77 // UserRequestUserDataForTesting::kUserDataKey point to an arbitrary integer 92 // TestURLRequestClassifier::kUserDataKey point to an arbitrary integer
78 // instead. 93 // instead.
79 // TODO(thakis): If we changed lld to only ICF over code and not over data, 94 // TODO(thakis): If we changed lld to only ICF over code and not over data,
80 // we could undo this again. 95 // we could undo this again.
81 const int kICFBuster = 12345634; 96 const int kICFBuster = 12345634;
82 97
83 // static 98 // static
84 const void* const UserRequestUserDataForTesting::kUserDataKey = &kICFBuster; 99 const void* const TestURLRequestClassifier::kUserDataKey = &kICFBuster;
85 100
86 class DataUseMeasurementTest : public testing::Test { 101 class DataUseMeasurementTest : public testing::Test {
87 public: 102 public:
88 DataUseMeasurementTest() 103 DataUseMeasurementTest()
89 : data_use_measurement_( 104 : url_request_classifier_(new TestURLRequestClassifier()),
90 base::MakeUnique<UserRequestUserDataForTesting>(), 105 data_use_measurement_(
106 std::unique_ptr<URLRequestClassifier>(url_request_classifier_),
91 base::Bind(&DataUseMeasurementTest::FakeDataUseforwarder, 107 base::Bind(&DataUseMeasurementTest::FakeDataUseforwarder,
92 base::Unretained(this)), 108 base::Unretained(this)),
93 &ascriber_) { 109 &ascriber_) {
94 // During the test it is expected to not have cellular connection. 110 // During the test it is expected to not have cellular connection.
95 DCHECK(!net::NetworkChangeNotifier::IsConnectionCellular( 111 DCHECK(!net::NetworkChangeNotifier::IsConnectionCellular(
96 net::NetworkChangeNotifier::GetConnectionType())); 112 net::NetworkChangeNotifier::GetConnectionType()));
97 } 113 }
98 114
99 // Creates a test request. 115 // Creates a test request.
100 enum RequestKind { kServiceRequest, kUserRequest }; 116 enum RequestKind { kServiceRequest, kUserRequest };
101 std::unique_ptr<net::URLRequest> CreateTestRequest( 117 std::unique_ptr<net::URLRequest> CreateTestRequest(
102 RequestKind is_user_request) { 118 RequestKind is_user_request) {
103 net::TestDelegate test_delegate; 119 net::TestDelegate test_delegate;
104 InitializeContext(); 120 InitializeContext();
105 net::MockRead reads[] = {net::MockRead("HTTP/1.1 200 OK\r\n" 121 net::MockRead reads[] = {net::MockRead("HTTP/1.1 200 OK\r\n"
106 "Content-Length: 12\r\n\r\n"), 122 "Content-Length: 12\r\n\r\n"),
107 net::MockRead("Test Content")}; 123 net::MockRead("Test Content")};
108 net::StaticSocketDataProvider socket_data(reads, arraysize(reads), nullptr, 124 net::StaticSocketDataProvider socket_data(reads, arraysize(reads), nullptr,
109 0); 125 0);
110 socket_factory_->AddSocketDataProvider(&socket_data); 126 socket_factory_->AddSocketDataProvider(&socket_data);
111 127
112 std::unique_ptr<net::URLRequest> request(context_->CreateRequest( 128 std::unique_ptr<net::URLRequest> request(context_->CreateRequest(
113 GURL("http://foo.com"), net::DEFAULT_PRIORITY, &test_delegate)); 129 GURL("http://foo.com"), net::DEFAULT_PRIORITY, &test_delegate));
114 if (is_user_request == kUserRequest) { 130 if (is_user_request == kUserRequest) {
115 UserRequestUserDataForTesting::MarkAsUserRequest(request.get()); 131 TestURLRequestClassifier::MarkAsUserRequest(request.get());
116 } else { 132 } else {
117 request->SetUserData( 133 request->SetUserData(
118 data_use_measurement::DataUseUserData::kUserDataKey, 134 data_use_measurement::DataUseUserData::kUserDataKey,
119 new data_use_measurement::DataUseUserData( 135 new data_use_measurement::DataUseUserData(
120 data_use_measurement::DataUseUserData::SUGGESTIONS, 136 data_use_measurement::DataUseUserData::SUGGESTIONS,
121 data_use_measurement_.CurrentAppState())); 137 data_use_measurement_.CurrentAppState()));
122 } 138 }
123 139
124 request->Start(); 140 request->Start();
125 base::RunLoop().RunUntilIdle(); 141 base::RunLoop().RunUntilIdle();
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 203
188 void FakeDataUseforwarder(const std::string& service_name, 204 void FakeDataUseforwarder(const std::string& service_name,
189 int message_size, 205 int message_size,
190 bool is_celllular) { 206 bool is_celllular) {
191 is_data_use_forwarder_called_ = true; 207 is_data_use_forwarder_called_ = true;
192 } 208 }
193 209
194 base::MessageLoopForIO loop_; 210 base::MessageLoopForIO loop_;
195 211
196 TestDataUseAscriber ascriber_; 212 TestDataUseAscriber ascriber_;
213 TestURLRequestClassifier* url_request_classifier_;
197 DataUseMeasurement data_use_measurement_; 214 DataUseMeasurement data_use_measurement_;
198 215
199 std::unique_ptr<net::MockClientSocketFactory> socket_factory_; 216 std::unique_ptr<net::MockClientSocketFactory> socket_factory_;
200 std::unique_ptr<net::TestURLRequestContext> context_; 217 std::unique_ptr<net::TestURLRequestContext> context_;
201 const std::string kConnectionType = "NotCellular"; 218 const std::string kConnectionType = "NotCellular";
202 bool is_data_use_forwarder_called_ = false; 219 bool is_data_use_forwarder_called_ = false;
203 220
204 DISALLOW_COPY_AND_ASSIGN(DataUseMeasurementTest); 221 DISALLOW_COPY_AND_ASSIGN(DataUseMeasurementTest);
205 }; 222 };
206 223
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 // access changes to BACKGROUND. 424 // access changes to BACKGROUND.
408 data_use_measurement_.OnNetworkBytesReceived(*request, 1000); 425 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
409 data_use_measurement_.OnNetworkBytesReceived(*request, 1000); 426 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
410 data_use_measurement_.OnNetworkBytesSent(*request, 100); 427 data_use_measurement_.OnNetworkBytesSent(*request, 100);
411 428
412 histogram_tester.ExpectTotalCount( 429 histogram_tester.ExpectTotalCount(
413 "DataUse.AppTabState.Upstream.AppBackground", 1); 430 "DataUse.AppTabState.Upstream.AppBackground", 1);
414 histogram_tester.ExpectTotalCount( 431 histogram_tester.ExpectTotalCount(
415 "DataUse.AppTabState.Downstream.AppBackground", 1); 432 "DataUse.AppTabState.Downstream.AppBackground", 1);
416 } 433 }
434
435 TEST_F(DataUseMeasurementTest, ContentType) {
436 net::HttpResponseHeaders response_headers(std::string());
437 {
438 base::HistogramTester histogram_tester;
439 std::unique_ptr<net::URLRequest> request = CreateTestRequest(kUserRequest);
440 data_use_measurement_.OnBeforeURLRequest(request.get());
441 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
442 histogram_tester.ExpectUniqueSample("DataUse.ContentType.UserTraffic",
443 DataUseUserData::OTHER, 1000);
444 }
445
446 {
447 base::HistogramTester histogram_tester;
448 std::unique_ptr<net::URLRequest> request =
449 CreateTestRequest(kServiceRequest);
450 data_use_measurement_.OnBeforeURLRequest(request.get());
451 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
452 histogram_tester.ExpectUniqueSample("DataUse.ContentType.Services",
453 DataUseUserData::OTHER, 1000);
454 }
455
456 // Video request in foreground.
457 {
458 base::HistogramTester histogram_tester;
459 std::unique_ptr<net::URLRequest> request = CreateTestRequest(kUserRequest);
460
461 ascriber_.SetTabVisibility(true);
462 url_request_classifier_->set_content_type(DataUseUserData::VIDEO);
463 data_use_measurement_.OnBeforeURLRequest(request.get());
464 data_use_measurement_.OnHeadersReceived(request.get(), nullptr);
465 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
466
467 histogram_tester.ExpectUniqueSample("DataUse.ContentType.UserTraffic",
468 DataUseUserData::VIDEO, 1000);
469 }
470
471 // Audio request from background tab.
472 {
473 base::HistogramTester histogram_tester;
474 std::unique_ptr<net::URLRequest> request = CreateTestRequest(kUserRequest);
475 ascriber_.SetTabVisibility(false);
476 url_request_classifier_->set_content_type(DataUseUserData::AUDIO);
477 data_use_measurement_.OnBeforeURLRequest(request.get());
478 data_use_measurement_.OnHeadersReceived(request.get(), nullptr);
479 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
480
481 histogram_tester.ExpectUniqueSample("DataUse.ContentType.UserTraffic",
482 DataUseUserData::AUDIO_TABBACKGROUND,
483 1000);
484 }
485
486 // Video request from background app.
487 {
488 base::HistogramTester histogram_tester;
489 std::unique_ptr<net::URLRequest> request = CreateTestRequest(kUserRequest);
490 url_request_classifier_->set_content_type(DataUseUserData::VIDEO);
491 data_use_measurement()->OnApplicationStateChangeForTesting(
492 base::android::APPLICATION_STATE_HAS_STOPPED_ACTIVITIES);
493 ascriber_.SetTabVisibility(false);
494 data_use_measurement_.OnBeforeURLRequest(request.get());
495 data_use_measurement_.OnHeadersReceived(request.get(), nullptr);
496 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
497
498 histogram_tester.ExpectUniqueSample("DataUse.ContentType.UserTraffic",
499 DataUseUserData::VIDEO_APPBACKGROUND,
500 1000);
501 }
502 }
503
417 #endif 504 #endif
418 505
419 } // namespace data_use_measurement 506 } // namespace data_use_measurement
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698