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

Side by Side Diff: components/data_use_measurement/content/data_use_measurement_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 unified diff | Download patch
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "components/data_use_measurement/content/data_use_measurement.h"
6
7 #include <memory>
8 #include <string>
9
10 #include "base/macros.h"
11 #include "base/message_loop/message_loop.h"
12 #include "base/run_loop.h"
13 #include "base/test/histogram_tester.h"
14 #include "build/build_config.h"
15 #include "content/public/browser/resource_request_info.h"
16 #include "net/base/network_change_notifier.h"
17 #include "net/base/request_priority.h"
18 #include "net/socket/socket_test_util.h"
19 #include "net/url_request/url_request.h"
20 #include "net/url_request/url_request_test_util.h"
21 #include "testing/gtest/include/gtest/gtest.h"
22 #include "url/gurl.h"
23
24 #if defined(OS_ANDROID)
25 #include "base/android/application_status_listener.h"
26 #endif
27
28 namespace data_use_measurement {
29
30 class DataUseMeasurementTest : public testing::Test {
31 public:
32 DataUseMeasurementTest()
33 : data_use_measurement_(
34 base::Bind(&DataUseMeasurementTest::FakeDataUseforwarder,
35 base::Unretained(this))) {
36 // During the test it is expected to not have cellular connection.
37 DCHECK(!net::NetworkChangeNotifier::IsConnectionCellular(
38 net::NetworkChangeNotifier::GetConnectionType()));
39 }
40
41 // Creates a test request.
42 std::unique_ptr<net::URLRequest> CreateTestRequest(bool is_user_request) {
43 net::TestDelegate test_delegate;
44 InitializeContext();
45 net::MockRead reads[] = {net::MockRead("HTTP/1.1 200 OK\r\n"
46 "Content-Length: 12\r\n\r\n"),
47 net::MockRead("Test Content")};
48 net::StaticSocketDataProvider socket_data(reads, arraysize(reads), nullptr,
49 0);
50 socket_factory_->AddSocketDataProvider(&socket_data);
51
52 std::unique_ptr<net::URLRequest> request(context_->CreateRequest(
53 GURL("http://foo.com"), net::DEFAULT_PRIORITY, &test_delegate));
54 if (is_user_request) {
55 request->SetUserData(
56 data_use_measurement::DataUseUserData::kUserDataKey,
57 new data_use_measurement::DataUseUserData(
58 data_use_measurement::DataUseUserData::SUGGESTIONS,
59 data_use_measurement_.CurrentAppState()));
60 } else {
61 content::ResourceRequestInfo::AllocateForTesting(
62 request.get(), content::RESOURCE_TYPE_MAIN_FRAME, nullptr, -2, -2, -2,
63 true, false, true, true, false);
64 }
65
66 request->Start();
67 base::RunLoop().RunUntilIdle();
68 return request;
69 }
70
71 // Sends a request and reports data use attaching either user data or service
72 // data based on |is_user_request|.
73 void SendRequest(bool is_user_request) {
74 std::unique_ptr<net::URLRequest> request =
75 CreateTestRequest(is_user_request);
76 data_use_measurement_.OnBeforeURLRequest(request.get());
77 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
78 data_use_measurement_.OnNetworkBytesSent(*request, 100);
79 data_use_measurement_.OnCompleted(*request, true);
80 }
81
82 // This function makes a user request and confirms that its effect is
83 // reflected in proper histograms.
84 void TestForAUserRequest(const std::string& target_dimension) {
85 base::HistogramTester histogram_tester;
86 SendRequest(true);
87 histogram_tester.ExpectTotalCount("DataUse.TrafficSize.System.Downstream." +
88 target_dimension + kConnectionType,
89 1);
90 histogram_tester.ExpectTotalCount("DataUse.TrafficSize.System.Upstream." +
91 target_dimension + kConnectionType,
92 1);
93 // One upload and one download message, so total count should be 2.
94 histogram_tester.ExpectTotalCount("DataUse.MessageSize.Suggestions", 2);
95 }
96
97 // This function makes a service request and confirms that its effect is
98 // reflected in proper histograms.
99 void TestForAServiceRequest(const std::string& target_dimension) {
100 base::HistogramTester histogram_tester;
101 SendRequest(false);
102 histogram_tester.ExpectTotalCount("DataUse.TrafficSize.User.Downstream." +
103 target_dimension + kConnectionType,
104 1);
105 histogram_tester.ExpectTotalCount("DataUse.TrafficSize.User.Upstream." +
106 target_dimension + kConnectionType,
107 1);
108 histogram_tester.ExpectTotalCount(
109 "DataUse.MessageSize.AllServices.Upstream." + target_dimension +
110 kConnectionType,
111 0);
112 histogram_tester.ExpectTotalCount(
113 "DataUse.MessageSize.AllServices.Downstream." + target_dimension +
114 kConnectionType,
115 0);
116 }
117
118 DataUseMeasurement* data_use_measurement() { return &data_use_measurement_; }
119
120 bool IsDataUseForwarderCalled() { return is_data_use_forwarder_called_; }
121
122 protected:
123 void InitializeContext() {
124 context_.reset(new net::TestURLRequestContext(true));
125 socket_factory_.reset(new net::MockClientSocketFactory());
126 context_->set_client_socket_factory(socket_factory_.get());
127 context_->Init();
128 }
129
130 void FakeDataUseforwarder(const std::string& service_name,
131 int message_size,
132 bool is_celllular) {
133 is_data_use_forwarder_called_ = true;
134 }
135
136 base::MessageLoopForIO loop_;
137 DataUseMeasurement data_use_measurement_;
138 std::unique_ptr<net::MockClientSocketFactory> socket_factory_;
139 std::unique_ptr<net::TestURLRequestContext> context_;
140 const std::string kConnectionType = "NotCellular";
141 bool is_data_use_forwarder_called_ = false;
142
143 DISALLOW_COPY_AND_ASSIGN(DataUseMeasurementTest);
144 };
145
146 // This test function tests recording of data use information in UMA histogram
147 // when packet is originated from user or services when the app is in the
148 // foreground or the OS is not Android.
149 // TODO(amohammadkhan): Add tests for Cellular/non-cellular connection types
150 // when support for testing is provided in its class.
151 TEST_F(DataUseMeasurementTest, UserNotUserTest) {
152 #if defined(OS_ANDROID)
153 data_use_measurement()->OnApplicationStateChangeForTesting(
154 base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES);
155 #endif
156 TestForAServiceRequest("Foreground.");
157 TestForAUserRequest("Foreground.");
158 }
159
160 #if defined(OS_ANDROID)
161 // This test function tests recording of data use information in UMA histogram
162 // when packet is originated from user or services when the app is in the
163 // background and OS is Android.
164 TEST_F(DataUseMeasurementTest, ApplicationStateTest) {
165 data_use_measurement()->OnApplicationStateChangeForTesting(
166 base::android::APPLICATION_STATE_HAS_STOPPED_ACTIVITIES);
167 TestForAServiceRequest("Background.");
168 TestForAUserRequest("Background.");
169 }
170 #endif
171
172 TEST_F(DataUseMeasurementTest, DataUseForwarderIsCalled) {
173 EXPECT_FALSE(IsDataUseForwarderCalled());
174 SendRequest(true);
175 EXPECT_TRUE(IsDataUseForwarderCalled());
176 }
177
178 #if defined(OS_ANDROID)
179 TEST_F(DataUseMeasurementTest, AppStateUnknown) {
180 base::HistogramTester histogram_tester;
181 std::unique_ptr<net::URLRequest> request = CreateTestRequest(false);
182 data_use_measurement_.OnBeforeURLRequest(request.get());
183
184 {
185 base::HistogramTester histogram_tester;
186 data_use_measurement()->OnApplicationStateChangeForTesting(
187 base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES);
188 data_use_measurement_.OnNetworkBytesSent(*request, 100);
189 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
190 histogram_tester.ExpectTotalCount(
191 "DataUse.TrafficSize.User.Downstream.Foreground." + kConnectionType, 1);
192 histogram_tester.ExpectTotalCount(
193 "DataUse.TrafficSize.User.Upstream.Foreground." + kConnectionType, 1);
194 }
195
196 {
197 base::HistogramTester histogram_tester;
198 data_use_measurement()->OnApplicationStateChangeForTesting(
199 base::android::APPLICATION_STATE_HAS_STOPPED_ACTIVITIES);
200 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
201 histogram_tester.ExpectTotalCount(
202 "DataUse.TrafficSize.User.Downstream.Unknown." + kConnectionType, 1);
203 }
204
205 {
206 base::HistogramTester histogram_tester;
207 data_use_measurement()->OnApplicationStateChangeForTesting(
208 base::android::APPLICATION_STATE_HAS_STOPPED_ACTIVITIES);
209 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
210 histogram_tester.ExpectTotalCount(
211 "DataUse.TrafficSize.User.Downstream.Background." + kConnectionType, 1);
212 }
213 }
214
215 TEST_F(DataUseMeasurementTest, TimeOfBackgroundDownstreamBytes) {
216 {
217 std::unique_ptr<net::URLRequest> request = CreateTestRequest(false);
218 data_use_measurement_.OnBeforeURLRequest(request.get());
219 base::HistogramTester histogram_tester;
220 data_use_measurement()->OnApplicationStateChange(
221 base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES);
222 data_use_measurement_.OnNetworkBytesSent(*request, 100);
223 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
224 data_use_measurement_.OnNetworkBytesSent(*request, 200);
225 data_use_measurement_.OnNetworkBytesReceived(*request, 2000);
226 histogram_tester.ExpectTotalCount(
227 "DataUse.BackgroundToDataRecievedPerByte.User", 0);
228 histogram_tester.ExpectTotalCount(
229 "DataUse.BackgroundToFirstDownstream.User", 0);
230 }
231
232 {
233 // Create new request when app is in foreground..
234 base::HistogramTester histogram_tester;
235 std::unique_ptr<net::URLRequest> request = CreateTestRequest(false);
236 data_use_measurement_.OnBeforeURLRequest(request.get());
237 data_use_measurement_.OnNetworkBytesSent(*request, 100);
238 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
239 data_use_measurement_.OnNetworkBytesSent(*request, 200);
240 data_use_measurement_.OnNetworkBytesReceived(*request, 2000);
241 histogram_tester.ExpectTotalCount(
242 "DataUse.BackgroundToDataRecievedPerByte.User", 0);
243 histogram_tester.ExpectTotalCount(
244 "DataUse.BackgroundToFirstDownstream.User", 0);
245 }
246
247 {
248 std::unique_ptr<net::URLRequest> request = CreateTestRequest(false);
249 data_use_measurement_.OnBeforeURLRequest(request.get());
250 base::HistogramTester histogram_tester;
251 data_use_measurement()->OnApplicationStateChange(
252 base::android::APPLICATION_STATE_HAS_STOPPED_ACTIVITIES);
253 data_use_measurement_.OnNetworkBytesSent(*request, 100);
254 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
255 data_use_measurement_.OnNetworkBytesSent(*request, 200);
256 data_use_measurement_.OnNetworkBytesReceived(*request, 2000);
257 histogram_tester.ExpectTotalCount(
258 "DataUse.BackgroundToDataRecievedPerByte.User", 3000);
259 histogram_tester.ExpectTotalCount(
260 "DataUse.BackgroundToFirstDownstream.User", 1);
261 }
262
263 {
264 // Create new request when app is in background.
265 base::HistogramTester histogram_tester;
266 std::unique_ptr<net::URLRequest> request = CreateTestRequest(false);
267 data_use_measurement_.OnBeforeURLRequest(request.get());
268 data_use_measurement_.OnNetworkBytesSent(*request, 100);
269 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
270 data_use_measurement_.OnNetworkBytesSent(*request, 200);
271 data_use_measurement_.OnNetworkBytesReceived(*request, 2000);
272 histogram_tester.ExpectTotalCount(
273 "DataUse.BackgroundToDataRecievedPerByte.User", 3000);
274 histogram_tester.ExpectTotalCount(
275 "DataUse.BackgroundToFirstDownstream.User", 0);
276 }
277
278 {
279 // Create new request when app is in background.
280 base::HistogramTester histogram_tester;
281 std::unique_ptr<net::URLRequest> request = CreateTestRequest(true);
282 data_use_measurement_.OnBeforeURLRequest(request.get());
283 data_use_measurement_.OnNetworkBytesSent(*request, 100);
284 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
285 data_use_measurement_.OnNetworkBytesSent(*request, 200);
286 data_use_measurement_.OnNetworkBytesReceived(*request, 2000);
287 histogram_tester.ExpectTotalCount(
288 "DataUse.BackgroundToDataRecievedPerByte.System", 3000);
289 histogram_tester.ExpectTotalCount(
290 "DataUse.BackgroundToDataRecievedPerByte.User", 0);
291 histogram_tester.ExpectTotalCount(
292 "DataUse.BackgroundToFirstDownstream.System", 0);
293 histogram_tester.ExpectTotalCount(
294 "DataUse.BackgroundToFirstDownstream.User", 0);
295 }
296
297 {
298 std::unique_ptr<net::URLRequest> request = CreateTestRequest(false);
299 data_use_measurement_.OnBeforeURLRequest(request.get());
300 base::HistogramTester histogram_tester;
301 data_use_measurement()->OnApplicationStateChange(
302 base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES);
303 data_use_measurement_.OnNetworkBytesSent(*request, 100);
304 data_use_measurement_.OnNetworkBytesReceived(*request, 1000);
305 data_use_measurement_.OnNetworkBytesSent(*request, 200);
306 data_use_measurement_.OnNetworkBytesReceived(*request, 2000);
307 histogram_tester.ExpectTotalCount(
308 "DataUse.BackgroundToDataRecievedPerByte.User", 0);
309 histogram_tester.ExpectTotalCount(
310 "DataUse.BackgroundToFirstDownstream.User", 0);
311 }
312 }
313 #endif
314
315 } // namespace data_use_measurement
OLDNEW
« no previous file with comments | « components/data_use_measurement/content/data_use_measurement.cc ('k') | components/data_use_measurement/core/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698