OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |