blob: a4af912f3a64db8340dd7913c30083e435f2eb50 [file] [log] [blame]
Thieu Le3426c8f2012-01-11 17:35:11 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Thieu Le48e6d6d2011-12-06 00:40:27 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/metrics.h"
6
Thieu Le26fc01b2013-01-28 12:08:48 -08007#include <string>
8
Thieu Le48e6d6d2011-12-06 00:40:27 +00009#include <chromeos/dbus/service_constants.h>
10#include <metrics/metrics_library_mock.h>
Thieu Lea20cbc22012-01-09 22:01:43 +000011#include <metrics/timer_mock.h>
Thieu Le48e6d6d2011-12-06 00:40:27 +000012
Thieu Le6c1e3bb2013-02-06 15:20:35 -080013#include "shill/mock_control.h"
Paul Stewartc43cbbe2013-04-11 06:29:30 -070014#include "shill/mock_eap_credentials.h"
Thieu Le6c1e3bb2013-02-06 15:20:35 -080015#include "shill/mock_event_dispatcher.h"
16#include "shill/mock_glib.h"
17#include "shill/mock_manager.h"
Thieu Le48e6d6d2011-12-06 00:40:27 +000018#include "shill/mock_service.h"
19#include "shill/mock_wifi_service.h"
Thieu Le48e6d6d2011-12-06 00:40:27 +000020
Thieu Le26fc01b2013-01-28 12:08:48 -080021using std::string;
22
Thieu Le48e6d6d2011-12-06 00:40:27 +000023using testing::_;
Thieu Leb84ba342012-03-02 15:15:19 -080024using testing::DoAll;
Thieu Le48e6d6d2011-12-06 00:40:27 +000025using testing::Ge;
Thieu Leb84ba342012-03-02 15:15:19 -080026using testing::Mock;
Thieu Le48e6d6d2011-12-06 00:40:27 +000027using testing::Return;
Thieu Leb84ba342012-03-02 15:15:19 -080028using testing::SetArgumentPointee;
Thieu Le48e6d6d2011-12-06 00:40:27 +000029using testing::Test;
30
31namespace shill {
32
Thieu Le6c1e3bb2013-02-06 15:20:35 -080033class MetricsTest : public Test {
Thieu Le48e6d6d2011-12-06 00:40:27 +000034 public:
35 MetricsTest()
Thieu Le6c1e3bb2013-02-06 15:20:35 -080036 : manager_(&control_interface_,
37 &dispatcher_,
38 &metrics_,
39 &glib_),
40 metrics_(&dispatcher_),
41 service_(new MockService(&control_interface_,
42 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -080043 &metrics_,
Thieu Le6c1e3bb2013-02-06 15:20:35 -080044 &manager_)),
mukesh agrawalcbfb34e2013-04-17 19:33:25 -070045 open_wifi_service_(new MockWiFiService(&control_interface_,
46 &dispatcher_,
47 &metrics_,
48 &manager_,
49 manager_.wifi_provider(),
50 ssid_,
51 flimflam::kModeManaged,
52 flimflam::kSecurityNone,
53 false)),
54 wep_wifi_service_(new MockWiFiService(&control_interface_,
55 &dispatcher_,
56 &metrics_,
57 &manager_,
58 manager_.wifi_provider(),
59 ssid_,
60 flimflam::kModeManaged,
61 flimflam::kSecurityWep,
62 false)),
63 eap_wifi_service_(new MockWiFiService(&control_interface_,
64 &dispatcher_,
65 &metrics_,
66 &manager_,
67 manager_.wifi_provider(),
68 ssid_,
69 flimflam::kModeManaged,
70 flimflam::kSecurity8021x,
71 false)),
Paul Stewartc43cbbe2013-04-11 06:29:30 -070072 eap_(new MockEapCredentials()) {}
Thieu Le48e6d6d2011-12-06 00:40:27 +000073
74 virtual ~MetricsTest() {}
75
76 virtual void SetUp() {
77 metrics_.set_library(&library_);
mukesh agrawalcbfb34e2013-04-17 19:33:25 -070078 eap_wifi_service_->eap_.reset(eap_); // Passes ownership.
Darin Petkov58f0b6d2012-06-12 12:52:30 +020079 metrics_.collect_bootstats_ = false;
Thieu Le48e6d6d2011-12-06 00:40:27 +000080 }
81
82 protected:
Thieu Leb84ba342012-03-02 15:15:19 -080083 void ExpectCommonPostReady(Metrics::WiFiChannel channel,
84 Metrics::WiFiNetworkPhyMode mode,
Paul Stewart23b393a2012-09-25 21:21:06 -070085 Metrics::WiFiSecurity security,
86 int signal_strength) {
Thieu Leb84ba342012-03-02 15:15:19 -080087 EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.Channel",
88 channel,
89 Metrics::kMetricNetworkChannelMax));
90 EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.PhyMode",
91 mode,
92 Metrics::kWiFiNetworkPhyModeMax));
93 EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.Security",
94 security,
95 Metrics::kWiFiSecurityMax));
Paul Stewart23b393a2012-09-25 21:21:06 -070096 EXPECT_CALL(library_,
97 SendToUMA("Network.Shill.Wifi.SignalStrength",
98 signal_strength,
99 Metrics::kMetricNetworkSignalStrengthMin,
100 Metrics::kMetricNetworkSignalStrengthMax,
101 Metrics::kMetricNetworkSignalStrengthNumBuckets));
Thieu Leb84ba342012-03-02 15:15:19 -0800102 }
103
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800104 MockControl control_interface_;
105 MockEventDispatcher dispatcher_;
106 MockGLib glib_;
107 MockManager manager_;
mukesh agrawalcbfb34e2013-04-17 19:33:25 -0700108 Metrics metrics_; // This must be destroyed after all |service_|s.
Thieu Le48e6d6d2011-12-06 00:40:27 +0000109 MetricsLibraryMock library_;
110 scoped_refptr<MockService> service_;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000111 const std::vector<uint8_t> ssid_;
mukesh agrawalcbfb34e2013-04-17 19:33:25 -0700112 scoped_refptr<MockWiFiService> open_wifi_service_;
113 scoped_refptr<MockWiFiService> wep_wifi_service_;
114 scoped_refptr<MockWiFiService> eap_wifi_service_;
115 MockEapCredentials *eap_; // Owned by |eap_wifi_service_|.
Thieu Le48e6d6d2011-12-06 00:40:27 +0000116};
117
118TEST_F(MetricsTest, TimeToConfig) {
119 EXPECT_CALL(library_, SendToUMA("Network.Shill.Unknown.TimeToConfig",
120 Ge(0),
Thieu Lea20cbc22012-01-09 22:01:43 +0000121 Metrics::kTimerHistogramMillisecondsMin,
122 Metrics::kTimerHistogramMillisecondsMax,
Thieu Le48e6d6d2011-12-06 00:40:27 +0000123 Metrics::kTimerHistogramNumBuckets));
124 metrics_.RegisterService(service_);
125 metrics_.NotifyServiceStateChanged(service_, Service::kStateConfiguring);
Paul Stewart20088d82012-02-16 06:58:55 -0800126 metrics_.NotifyServiceStateChanged(service_, Service::kStateConnected);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000127}
128
129TEST_F(MetricsTest, TimeToPortal) {
130 EXPECT_CALL(library_, SendToUMA("Network.Shill.Unknown.TimeToPortal",
131 Ge(0),
Thieu Lea20cbc22012-01-09 22:01:43 +0000132 Metrics::kTimerHistogramMillisecondsMin,
133 Metrics::kTimerHistogramMillisecondsMax,
Thieu Le48e6d6d2011-12-06 00:40:27 +0000134 Metrics::kTimerHistogramNumBuckets));
135 metrics_.RegisterService(service_);
Paul Stewart20088d82012-02-16 06:58:55 -0800136 metrics_.NotifyServiceStateChanged(service_, Service::kStateConnected);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000137 metrics_.NotifyServiceStateChanged(service_, Service::kStatePortal);
138}
139
140TEST_F(MetricsTest, TimeToOnline) {
141 EXPECT_CALL(library_, SendToUMA("Network.Shill.Unknown.TimeToOnline",
142 Ge(0),
Thieu Lea20cbc22012-01-09 22:01:43 +0000143 Metrics::kTimerHistogramMillisecondsMin,
144 Metrics::kTimerHistogramMillisecondsMax,
Thieu Le48e6d6d2011-12-06 00:40:27 +0000145 Metrics::kTimerHistogramNumBuckets));
146 metrics_.RegisterService(service_);
Paul Stewart20088d82012-02-16 06:58:55 -0800147 metrics_.NotifyServiceStateChanged(service_, Service::kStateConnected);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000148 metrics_.NotifyServiceStateChanged(service_, Service::kStateOnline);
149}
150
151TEST_F(MetricsTest, ServiceFailure) {
152 EXPECT_CALL(*service_.get(), failure())
Paul Stewartf2d60912012-07-15 08:37:30 -0700153 .WillRepeatedly(Return(Service::kFailureBadPassphrase));
Thieu Le48e6d6d2011-12-06 00:40:27 +0000154 EXPECT_CALL(library_, SendEnumToUMA(Metrics::kMetricNetworkServiceErrors,
Paul Stewartf2d60912012-07-15 08:37:30 -0700155 Service::kFailureBadPassphrase,
Thieu Le48e6d6d2011-12-06 00:40:27 +0000156 Metrics::kMetricNetworkServiceErrorsMax));
157 metrics_.RegisterService(service_);
158 metrics_.NotifyServiceStateChanged(service_, Service::kStateFailure);
159}
160
161TEST_F(MetricsTest, WiFiServiceTimeToJoin) {
162 EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.TimeToJoin",
163 Ge(0),
Thieu Lea20cbc22012-01-09 22:01:43 +0000164 Metrics::kTimerHistogramMillisecondsMin,
165 Metrics::kTimerHistogramMillisecondsMax,
Thieu Le48e6d6d2011-12-06 00:40:27 +0000166 Metrics::kTimerHistogramNumBuckets));
mukesh agrawalcbfb34e2013-04-17 19:33:25 -0700167 metrics_.RegisterService(open_wifi_service_);
168 metrics_.NotifyServiceStateChanged(open_wifi_service_,
169 Service::kStateAssociating);
170 metrics_.NotifyServiceStateChanged(open_wifi_service_,
171 Service::kStateConfiguring);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000172}
173
Thieu Lead1ec2c2012-01-05 23:39:48 +0000174TEST_F(MetricsTest, WiFiServicePostReady) {
Thieu Leb84ba342012-03-02 15:15:19 -0800175 base::TimeDelta non_zero_time_delta = base::TimeDelta::FromMilliseconds(1);
176 chromeos_metrics::TimerMock *mock_time_resume_to_ready_timer =
177 new chromeos_metrics::TimerMock;
178 metrics_.set_time_resume_to_ready_timer(mock_time_resume_to_ready_timer);
179
Paul Stewart23b393a2012-09-25 21:21:06 -0700180 const int kStrength = -42;
Thieu Leb84ba342012-03-02 15:15:19 -0800181 ExpectCommonPostReady(Metrics::kWiFiChannel2412,
182 Metrics::kWiFiNetworkPhyMode11a,
Paul Stewart23b393a2012-09-25 21:21:06 -0700183 Metrics::kWiFiSecurityWep,
184 -kStrength);
Thieu Leb84ba342012-03-02 15:15:19 -0800185 EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.TimeResumeToReady",
186 _, _, _, _)).Times(0);
Paul Stewart21f40962013-03-01 14:27:28 -0800187 EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.EapOuterProtocol",
188 _, _)).Times(0);
189 EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.EapInnerProtocol",
190 _, _)).Times(0);
mukesh agrawalcbfb34e2013-04-17 19:33:25 -0700191 wep_wifi_service_->frequency_ = 2412;
192 wep_wifi_service_->physical_mode_ = Metrics::kWiFiNetworkPhyMode11a;
193 wep_wifi_service_->raw_signal_strength_ = kStrength;
194 metrics_.RegisterService(wep_wifi_service_);
195 metrics_.NotifyServiceStateChanged(wep_wifi_service_,
196 Service::kStateConnected);
Thieu Leb84ba342012-03-02 15:15:19 -0800197 Mock::VerifyAndClearExpectations(&library_);
198
199 // Simulate a system suspend, resume and an AP reconnect.
200 ExpectCommonPostReady(Metrics::kWiFiChannel2412,
201 Metrics::kWiFiNetworkPhyMode11a,
Paul Stewart23b393a2012-09-25 21:21:06 -0700202 Metrics::kWiFiSecurityWep,
203 -kStrength);
Thieu Leb84ba342012-03-02 15:15:19 -0800204 EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.TimeResumeToReady",
205 Ge(0),
206 Metrics::kTimerHistogramMillisecondsMin,
207 Metrics::kTimerHistogramMillisecondsMax,
208 Metrics::kTimerHistogramNumBuckets));
209 EXPECT_CALL(*mock_time_resume_to_ready_timer, GetElapsedTime(_)).
210 WillOnce(DoAll(SetArgumentPointee<0>(non_zero_time_delta), Return(true)));
211 metrics_.NotifyPowerStateChange(PowerManagerProxyDelegate::kMem);
212 metrics_.NotifyPowerStateChange(PowerManagerProxyDelegate::kOn);
mukesh agrawalcbfb34e2013-04-17 19:33:25 -0700213 metrics_.NotifyServiceStateChanged(wep_wifi_service_,
214 Service::kStateConnected);
Thieu Leb84ba342012-03-02 15:15:19 -0800215 Mock::VerifyAndClearExpectations(&library_);
216 Mock::VerifyAndClearExpectations(mock_time_resume_to_ready_timer);
217
218 // Make sure subsequent connects do not count towards TimeResumeToReady.
219 ExpectCommonPostReady(Metrics::kWiFiChannel2412,
220 Metrics::kWiFiNetworkPhyMode11a,
Paul Stewart23b393a2012-09-25 21:21:06 -0700221 Metrics::kWiFiSecurityWep,
222 -kStrength);
Thieu Leb84ba342012-03-02 15:15:19 -0800223 EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.TimeResumeToReady",
224 _, _, _, _)).Times(0);
mukesh agrawalcbfb34e2013-04-17 19:33:25 -0700225 metrics_.NotifyServiceStateChanged(wep_wifi_service_,
226 Service::kStateConnected);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000227}
228
Paul Stewart21f40962013-03-01 14:27:28 -0800229TEST_F(MetricsTest, WiFiServicePostReadyEAP) {
230 const int kStrength = -42;
231 ExpectCommonPostReady(Metrics::kWiFiChannel2412,
232 Metrics::kWiFiNetworkPhyMode11a,
233 Metrics::kWiFiSecurity8021x,
234 -kStrength);
mukesh agrawalcbfb34e2013-04-17 19:33:25 -0700235 eap_wifi_service_->frequency_ = 2412;
236 eap_wifi_service_->physical_mode_ = Metrics::kWiFiNetworkPhyMode11a;
237 eap_wifi_service_->raw_signal_strength_ = kStrength;
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700238 EXPECT_CALL(*eap_, OutputConnectionMetrics(&metrics_, Technology::kWifi));
mukesh agrawalcbfb34e2013-04-17 19:33:25 -0700239 metrics_.RegisterService(eap_wifi_service_);
240 metrics_.NotifyServiceStateChanged(eap_wifi_service_,
241 Service::kStateConnected);
Paul Stewart21f40962013-03-01 14:27:28 -0800242}
243
Thieu Le48e6d6d2011-12-06 00:40:27 +0000244TEST_F(MetricsTest, FrequencyToChannel) {
245 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(2411));
246 EXPECT_EQ(Metrics::kWiFiChannel2412, metrics_.WiFiFrequencyToChannel(2412));
247 EXPECT_EQ(Metrics::kWiFiChannel2472, metrics_.WiFiFrequencyToChannel(2472));
248 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(2473));
249 EXPECT_EQ(Metrics::kWiFiChannel2484, metrics_.WiFiFrequencyToChannel(2484));
250 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5169));
251 EXPECT_EQ(Metrics::kWiFiChannel5170, metrics_.WiFiFrequencyToChannel(5170));
252 EXPECT_EQ(Metrics::kWiFiChannel5190, metrics_.WiFiFrequencyToChannel(5190));
253 EXPECT_EQ(Metrics::kWiFiChannel5180, metrics_.WiFiFrequencyToChannel(5180));
254 EXPECT_EQ(Metrics::kWiFiChannel5200, metrics_.WiFiFrequencyToChannel(5200));
255 EXPECT_EQ(Metrics::kWiFiChannel5230, metrics_.WiFiFrequencyToChannel(5230));
256 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5231));
257 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5239));
258 EXPECT_EQ(Metrics::kWiFiChannel5240, metrics_.WiFiFrequencyToChannel(5240));
259 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5241));
260 EXPECT_EQ(Metrics::kWiFiChannel5320, metrics_.WiFiFrequencyToChannel(5320));
261 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5321));
262 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5499));
263 EXPECT_EQ(Metrics::kWiFiChannel5500, metrics_.WiFiFrequencyToChannel(5500));
264 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5501));
265 EXPECT_EQ(Metrics::kWiFiChannel5700, metrics_.WiFiFrequencyToChannel(5700));
266 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5701));
267 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5744));
268 EXPECT_EQ(Metrics::kWiFiChannel5745, metrics_.WiFiFrequencyToChannel(5745));
269 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5746));
270 EXPECT_EQ(Metrics::kWiFiChannel5825, metrics_.WiFiFrequencyToChannel(5825));
271 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5826));
272}
273
Thieu Lea20cbc22012-01-09 22:01:43 +0000274TEST_F(MetricsTest, TimeOnlineTimeToDrop) {
275 chromeos_metrics::TimerMock *mock_time_online_timer =
276 new chromeos_metrics::TimerMock;
277 metrics_.set_time_online_timer(mock_time_online_timer);
278 chromeos_metrics::TimerMock *mock_time_to_drop_timer =
279 new chromeos_metrics::TimerMock;
280 metrics_.set_time_to_drop_timer(mock_time_to_drop_timer);
281 EXPECT_CALL(*service_.get(), technology()).
282 WillOnce(Return(Technology::kEthernet));
283 EXPECT_CALL(library_, SendToUMA("Network.Shill.Ethernet.TimeOnline",
284 Ge(0),
285 Metrics::kMetricTimeOnlineSecondsMin,
286 Metrics::kMetricTimeOnlineSecondsMax,
287 Metrics::kTimerHistogramNumBuckets));
288 EXPECT_CALL(library_, SendToUMA(Metrics::kMetricTimeToDropSeconds,
289 Ge(0),
290 Metrics::kMetricTimeToDropSecondsMin,
291 Metrics::kMetricTimeToDropSecondsMax,
292 Metrics::kTimerHistogramNumBuckets)).Times(0);
293 EXPECT_CALL(*mock_time_online_timer, Start()).Times(2);
294 EXPECT_CALL(*mock_time_to_drop_timer, Start());
295 metrics_.NotifyDefaultServiceChanged(service_);
mukesh agrawalcbfb34e2013-04-17 19:33:25 -0700296 metrics_.NotifyDefaultServiceChanged(open_wifi_service_);
Thieu Lea20cbc22012-01-09 22:01:43 +0000297
298 EXPECT_CALL(*mock_time_online_timer, Start());
299 EXPECT_CALL(*mock_time_to_drop_timer, Start()).Times(0);
300 EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.TimeOnline",
301 Ge(0),
302 Metrics::kMetricTimeOnlineSecondsMin,
303 Metrics::kMetricTimeOnlineSecondsMax,
304 Metrics::kTimerHistogramNumBuckets));
305 EXPECT_CALL(library_, SendToUMA(Metrics::kMetricTimeToDropSeconds,
306 Ge(0),
307 Metrics::kMetricTimeToDropSecondsMin,
308 Metrics::kMetricTimeToDropSecondsMax,
309 Metrics::kTimerHistogramNumBuckets));
310 metrics_.NotifyDefaultServiceChanged(NULL);
311}
312
Thieu Le67370f62012-02-14 23:01:42 +0000313TEST_F(MetricsTest, Disconnect) {
314 EXPECT_CALL(*service_.get(), technology()).
315 WillRepeatedly(Return(Technology::kWifi));
316 EXPECT_CALL(*service_.get(), explicitly_disconnected()).
317 WillOnce(Return(false));
318 EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.Disconnect",
319 false,
320 Metrics::kMetricDisconnectMin,
321 Metrics::kMetricDisconnectMax,
322 Metrics::kMetricDisconnectNumBuckets));
323 metrics_.NotifyServiceDisconnect(service_);
324
325 EXPECT_CALL(*service_.get(), explicitly_disconnected()).
326 WillOnce(Return(true));
327 EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.Disconnect",
328 true,
329 Metrics::kMetricDisconnectMin,
330 Metrics::kMetricDisconnectMax,
331 Metrics::kMetricDisconnectNumBuckets));
332 metrics_.NotifyServiceDisconnect(service_);
333}
334
Thieu Le85e050b2012-03-13 15:04:38 -0700335TEST_F(MetricsTest, PortalDetectionResultToEnum) {
336 PortalDetector::Result result(PortalDetector::kPhaseDNS,
337 PortalDetector::kStatusFailure, 0, true);
338 EXPECT_EQ(Metrics::kPortalResultDNSFailure,
339 Metrics::PortalDetectionResultToEnum(result));
340
341 result.phase = PortalDetector::kPhaseDNS;
342 result.status = PortalDetector::kStatusTimeout;
343 EXPECT_EQ(Metrics::kPortalResultDNSTimeout,
344 Metrics::PortalDetectionResultToEnum(result));
345
346 result.phase = PortalDetector::kPhaseConnection;
347 result.status = PortalDetector::kStatusFailure;
348 EXPECT_EQ(Metrics::kPortalResultConnectionFailure,
349 Metrics::PortalDetectionResultToEnum(result));
350
351 result.phase = PortalDetector::kPhaseConnection;
352 result.status = PortalDetector::kStatusTimeout;
353 EXPECT_EQ(Metrics::kPortalResultConnectionTimeout,
354 Metrics::PortalDetectionResultToEnum(result));
355
356 result.phase = PortalDetector::kPhaseHTTP;
357 result.status = PortalDetector::kStatusFailure;
358 EXPECT_EQ(Metrics::kPortalResultHTTPFailure,
359 Metrics::PortalDetectionResultToEnum(result));
360
361 result.phase = PortalDetector::kPhaseHTTP;
362 result.status = PortalDetector::kStatusTimeout;
363 EXPECT_EQ(Metrics::kPortalResultHTTPTimeout,
364 Metrics::PortalDetectionResultToEnum(result));
365
366 result.phase = PortalDetector::kPhaseContent;
367 result.status = PortalDetector::kStatusSuccess;
368 EXPECT_EQ(Metrics::kPortalResultSuccess,
369 Metrics::PortalDetectionResultToEnum(result));
370
371 result.phase = PortalDetector::kPhaseContent;
372 result.status = PortalDetector::kStatusFailure;
373 EXPECT_EQ(Metrics::kPortalResultContentFailure,
374 Metrics::PortalDetectionResultToEnum(result));
375
376 result.phase = PortalDetector::kPhaseContent;
377 result.status = PortalDetector::kStatusTimeout;
378 EXPECT_EQ(Metrics::kPortalResultContentTimeout,
379 Metrics::PortalDetectionResultToEnum(result));
380
381 result.phase = PortalDetector::kPhaseUnknown;
382 result.status = PortalDetector::kStatusFailure;
383 EXPECT_EQ(Metrics::kPortalResultUnknown,
384 Metrics::PortalDetectionResultToEnum(result));
385}
386
Thieu Lecdb5a212013-01-25 11:17:18 -0800387TEST_F(MetricsTest, TimeToConnect) {
388 EXPECT_CALL(library_,
389 SendToUMA("Network.Shill.Cellular.TimeToConnect",
390 Ge(0),
391 Metrics::kMetricTimeToConnectMillisecondsMin,
392 Metrics::kMetricTimeToConnectMillisecondsMax,
393 Metrics::kMetricTimeToConnectMillisecondsNumBuckets));
394 const int kInterfaceIndex = 1;
395 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular);
Thieu Le7cf36b02013-01-30 17:15:56 -0800396 metrics_.NotifyDeviceConnectStarted(kInterfaceIndex, false);
Thieu Lecdb5a212013-01-25 11:17:18 -0800397 metrics_.NotifyDeviceConnectFinished(kInterfaceIndex);
398}
399
Thieu Lea2519bf2013-01-23 16:51:54 -0800400TEST_F(MetricsTest, TimeToDisable) {
401 EXPECT_CALL(library_,
402 SendToUMA("Network.Shill.Cellular.TimeToDisable",
403 Ge(0),
404 Metrics::kMetricTimeToDisableMillisecondsMin,
405 Metrics::kMetricTimeToDisableMillisecondsMax,
406 Metrics::kMetricTimeToDisableMillisecondsNumBuckets));
407 const int kInterfaceIndex = 1;
408 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular);
409 metrics_.NotifyDeviceDisableStarted(kInterfaceIndex);
410 metrics_.NotifyDeviceDisableFinished(kInterfaceIndex);
411}
412
Thieu Lece4483e2013-01-23 15:12:03 -0800413TEST_F(MetricsTest, TimeToEnable) {
414 EXPECT_CALL(library_,
415 SendToUMA("Network.Shill.Cellular.TimeToEnable",
416 Ge(0),
417 Metrics::kMetricTimeToEnableMillisecondsMin,
418 Metrics::kMetricTimeToEnableMillisecondsMax,
419 Metrics::kMetricTimeToEnableMillisecondsNumBuckets));
420 const int kInterfaceIndex = 1;
421 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular);
422 metrics_.NotifyDeviceEnableStarted(kInterfaceIndex);
423 metrics_.NotifyDeviceEnableFinished(kInterfaceIndex);
424}
425
Thieu Lec8078a62013-01-22 18:01:12 -0800426TEST_F(MetricsTest, TimeToInitialize) {
427 EXPECT_CALL(library_,
428 SendToUMA("Network.Shill.Cellular.TimeToInitialize",
429 Ge(0),
430 Metrics::kMetricTimeToInitializeMillisecondsMin,
431 Metrics::kMetricTimeToInitializeMillisecondsMax,
432 Metrics::kMetricTimeToInitializeMillisecondsNumBuckets));
433 const int kInterfaceIndex = 1;
434 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular);
435 metrics_.NotifyDeviceInitialized(kInterfaceIndex);
436}
437
Thieu Le18c11072013-01-28 17:21:37 -0800438TEST_F(MetricsTest, TimeToScan) {
439 EXPECT_CALL(library_,
440 SendToUMA("Network.Shill.Cellular.TimeToScan",
441 Ge(0),
442 Metrics::kMetricTimeToScanMillisecondsMin,
443 Metrics::kMetricTimeToScanMillisecondsMax,
444 Metrics::kMetricTimeToScanMillisecondsNumBuckets));
445 const int kInterfaceIndex = 1;
446 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular);
447 metrics_.NotifyDeviceScanStarted(kInterfaceIndex);
448 metrics_.NotifyDeviceScanFinished(kInterfaceIndex);
449}
450
Wade Guthrie44f290d2013-05-28 10:16:25 -0700451TEST_F(MetricsTest, TimeToScanAndConnect) {
452 EXPECT_CALL(library_,
453 SendToUMA("Network.Shill.Wifi.TimeToScan",
454 Ge(0),
455 Metrics::kMetricTimeToScanMillisecondsMin,
456 Metrics::kMetricTimeToScanMillisecondsMax,
457 Metrics::kMetricTimeToScanMillisecondsNumBuckets));
458 const int kInterfaceIndex = 1;
459 metrics_.RegisterDevice(kInterfaceIndex, Technology::kWifi);
460 metrics_.NotifyDeviceScanStarted(kInterfaceIndex);
461 metrics_.NotifyDeviceScanFinished(kInterfaceIndex);
462
463 EXPECT_CALL(library_,
464 SendToUMA("Network.Shill.Wifi.TimeToConnect",
465 Ge(0),
466 Metrics::kMetricTimeToConnectMillisecondsMin,
467 Metrics::kMetricTimeToConnectMillisecondsMax,
468 Metrics::kMetricTimeToConnectMillisecondsNumBuckets));
469 EXPECT_CALL(library_,
470 SendToUMA("Network.Shill.Wifi.TimeToScanAndConnect",
471 Ge(0),
472 Metrics::kMetricTimeToScanMillisecondsMin,
473 Metrics::kMetricTimeToScanMillisecondsMax +
474 Metrics::kMetricTimeToConnectMillisecondsMax,
475 Metrics::kMetricTimeToScanMillisecondsNumBuckets +
476 Metrics::kMetricTimeToConnectMillisecondsNumBuckets));
477 metrics_.NotifyDeviceConnectStarted(kInterfaceIndex, false);
478 metrics_.NotifyDeviceConnectFinished(kInterfaceIndex);
479}
480
481TEST_F(MetricsTest, SpontaneousConnect) {
482 const int kInterfaceIndex = 1;
483 metrics_.RegisterDevice(kInterfaceIndex, Technology::kWifi);
484 EXPECT_CALL(library_,
485 SendToUMA("Network.Shill.Wifi.TimeToConnect",
486 Ge(0),
487 Metrics::kMetricTimeToConnectMillisecondsMin,
488 Metrics::kMetricTimeToConnectMillisecondsMax,
489 Metrics::kMetricTimeToConnectMillisecondsNumBuckets)).Times(0);
490 EXPECT_CALL(library_,
491 SendToUMA("Network.Shill.Wifi.TimeToScanAndConnect",
492 Ge(0),
493 Metrics::kMetricTimeToScanMillisecondsMin,
494 Metrics::kMetricTimeToScanMillisecondsMax +
495 Metrics::kMetricTimeToConnectMillisecondsMax,
496 Metrics::kMetricTimeToScanMillisecondsNumBuckets +
497 Metrics::kMetricTimeToConnectMillisecondsNumBuckets)).
498 Times(0);
499 // This simulates a connection that is not scan-based.
500 metrics_.NotifyDeviceConnectFinished(kInterfaceIndex);
501}
502
503TEST_F(MetricsTest, ResetConnectTimer) {
504 const int kInterfaceIndex = 1;
505 metrics_.RegisterDevice(kInterfaceIndex, Technology::kWifi);
506 chromeos_metrics::TimerReporterMock *mock_scan_timer =
507 new chromeos_metrics::TimerReporterMock;
508 metrics_.set_time_to_scan_timer(kInterfaceIndex, mock_scan_timer);
509 chromeos_metrics::TimerReporterMock *mock_connect_timer =
510 new chromeos_metrics::TimerReporterMock;
511 metrics_.set_time_to_connect_timer(kInterfaceIndex, mock_connect_timer);
512 chromeos_metrics::TimerReporterMock *mock_scan_connect_timer =
513 new chromeos_metrics::TimerReporterMock;
514 metrics_.set_time_to_scan_connect_timer(kInterfaceIndex,
515 mock_scan_connect_timer);
516 EXPECT_CALL(*mock_scan_timer, Reset()).Times(0);
517 EXPECT_CALL(*mock_connect_timer, Reset());
518 EXPECT_CALL(*mock_scan_connect_timer, Reset());
519 metrics_.ResetConnectTimer(kInterfaceIndex);
520}
521
Wade Guthrie091c41c2013-03-22 15:48:53 -0700522TEST_F(MetricsTest, TimeToScanNoStart) {
523 EXPECT_CALL(library_,
524 SendToUMA("Network.Shill.Cellular.TimeToScan", _, _, _, _)).Times(0);
525 const int kInterfaceIndex = 1;
526 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular);
527 metrics_.NotifyDeviceScanFinished(kInterfaceIndex);
528}
529
Thieu Le18c11072013-01-28 17:21:37 -0800530TEST_F(MetricsTest, TimeToScanIgnore) {
531 // Make sure TimeToScan is not sent if the elapsed time exceeds the max
532 // value. This simulates the case where the device is in an area with no
533 // service.
534 const int kInterfaceIndex = 1;
535 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular);
536 base::TimeDelta large_time_delta =
537 base::TimeDelta::FromMilliseconds(
538 Metrics::kMetricTimeToScanMillisecondsMax + 1);
539 chromeos_metrics::TimerReporterMock *mock_time_to_scan_timer =
540 new chromeos_metrics::TimerReporterMock;
541 metrics_.set_time_to_scan_timer(kInterfaceIndex, mock_time_to_scan_timer);
Wade Guthrie091c41c2013-03-22 15:48:53 -0700542 EXPECT_CALL(*mock_time_to_scan_timer, Stop()).WillOnce(Return(true));
Thieu Le18c11072013-01-28 17:21:37 -0800543 EXPECT_CALL(*mock_time_to_scan_timer, GetElapsedTime(_)).
544 WillOnce(DoAll(SetArgumentPointee<0>(large_time_delta), Return(true)));
545 EXPECT_CALL(library_, SendToUMA(_, _, _, _, _)).Times(0);
546 metrics_.NotifyDeviceScanStarted(kInterfaceIndex);
547 metrics_.NotifyDeviceScanFinished(kInterfaceIndex);
548}
549
Thieu Le7cf36b02013-01-30 17:15:56 -0800550TEST_F(MetricsTest, CellularAutoConnect) {
551 EXPECT_CALL(library_,
552 SendToUMA("Network.Shill.Cellular.TimeToConnect",
553 Ge(0),
554 Metrics::kMetricTimeToConnectMillisecondsMin,
555 Metrics::kMetricTimeToConnectMillisecondsMax,
556 Metrics::kMetricTimeToConnectMillisecondsNumBuckets));
557 EXPECT_CALL(library_,
558 SendToUMA(Metrics::kMetricCellularAutoConnectTotalTime,
559 Ge(0),
560 Metrics::kMetricCellularAutoConnectTotalTimeMin,
561 Metrics::kMetricCellularAutoConnectTotalTimeMax,
562 Metrics::kMetricCellularAutoConnectTotalTimeNumBuckets));
563 EXPECT_CALL(library_,
564 SendToUMA(Metrics::kMetricCellularAutoConnectTries,
565 2,
566 Metrics::kMetricCellularAutoConnectTriesMin,
567 Metrics::kMetricCellularAutoConnectTriesMax,
568 Metrics::kMetricCellularAutoConnectTriesNumBuckets));
569 const int kInterfaceIndex = 1;
570 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular);
571 metrics_.NotifyDeviceConnectStarted(kInterfaceIndex, true);
572 metrics_.NotifyDeviceConnectStarted(kInterfaceIndex, true);
573 metrics_.NotifyDeviceConnectFinished(kInterfaceIndex);
574}
575
Thieu Le26fc01b2013-01-28 12:08:48 -0800576TEST_F(MetricsTest, CellularDrop) {
577 const char *kUMATechnologyStrings[] = {
578 flimflam::kNetworkTechnology1Xrtt,
579 flimflam::kNetworkTechnologyEdge,
580 flimflam::kNetworkTechnologyEvdo,
581 flimflam::kNetworkTechnologyGprs,
582 flimflam::kNetworkTechnologyGsm,
583 flimflam::kNetworkTechnologyHspa,
584 flimflam::kNetworkTechnologyHspaPlus,
585 flimflam::kNetworkTechnologyLte,
586 flimflam::kNetworkTechnologyUmts,
587 "Unknown" };
588
589 const uint16 signal_strength = 100;
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800590 const int kInterfaceIndex = 1;
591 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular);
Thieu Le26fc01b2013-01-28 12:08:48 -0800592 for (size_t index = 0; index < arraysize(kUMATechnologyStrings); ++index) {
593 EXPECT_CALL(library_,
594 SendEnumToUMA(Metrics::kMetricCellularDrop,
595 index,
596 Metrics::kCellularDropTechnologyMax));
597 EXPECT_CALL(library_,
598 SendToUMA(Metrics::kMetricCellularSignalStrengthBeforeDrop,
599 signal_strength,
600 Metrics::kMetricCellularSignalStrengthBeforeDropMin,
601 Metrics::kMetricCellularSignalStrengthBeforeDropMax,
602 Metrics::kMetricCellularSignalStrengthBeforeDropNumBuckets));
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800603 metrics_.NotifyCellularDeviceDrop(kInterfaceIndex,
604 kUMATechnologyStrings[index],
Thieu Le26fc01b2013-01-28 12:08:48 -0800605 signal_strength);
606 Mock::VerifyAndClearExpectations(&library_);
607 }
608}
609
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800610TEST_F(MetricsTest, CellularDropsPerHour) {
611 const int kInterfaceIndex = 1;
612 const int kSignalStrength = 33;
613 const int kNumDrops = 3;
614 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular);
615 EXPECT_CALL(library_,
616 SendEnumToUMA(Metrics::kMetricCellularDrop,
617 Metrics::kCellularDropTechnologyLte,
618 Metrics::kCellularDropTechnologyMax))
619 .Times(kNumDrops);
620 EXPECT_CALL(library_,
621 SendToUMA(Metrics::kMetricCellularSignalStrengthBeforeDrop,
622 kSignalStrength,
623 Metrics::kMetricCellularSignalStrengthBeforeDropMin,
624 Metrics::kMetricCellularSignalStrengthBeforeDropMax,
625 Metrics::kMetricCellularSignalStrengthBeforeDropNumBuckets))
626 .Times(kNumDrops);
627 EXPECT_CALL(library_,
628 SendToUMA(Metrics::kMetricCellularDropsPerHour,
629 kNumDrops,
630 Metrics::kMetricCellularDropsPerHourMin,
631 Metrics::kMetricCellularDropsPerHourMax,
632 Metrics::kMetricCellularDropsPerHourNumBuckets));
633 for (int count = 0; count < kNumDrops; ++count)
634 metrics_.NotifyCellularDeviceDrop(kInterfaceIndex,
635 flimflam::kNetworkTechnologyLte,
636 kSignalStrength);
637 metrics_.HourlyTimeoutHandler();
638
639 // Make sure the number of drops gets resetted after each hour.
640 EXPECT_CALL(library_,
641 SendToUMA(Metrics::kMetricCellularDropsPerHour, _, _, _, _))
642 .Times(0);
643 metrics_.HourlyTimeoutHandler();
644}
645
Thieu Leb7aa5f72013-01-31 15:57:48 -0800646TEST_F(MetricsTest, CellularDeviceFailure) {
647 const char kErrorMessage[] =
648 "org.chromium.flimflam.Error.Failure:"
649 "$NWQMISTATUS: QMI_RESULT_FAILURE:QMI_ERR_CALL_FAILED#015#012#011"
650 "QMI State: DISCONNECTED#015#012#011Call End Reason:1016#015#012#011"
651 "Call Duration: 0 seconds#015#015#012"
652 "$NWQMISTATUS: QMI_RESULT_SUCCESS:QMI_ERR_NONE#015#012#011"
653 "QMI State: DISCONNECTED#015#012#011Call End Reason:0#015#012#011"
654 "Call Duration: 0 seconds";
655 string expected_message =
656 string(Metrics::kMetricCellularFailureReason) + kErrorMessage;
657 EXPECT_CALL(library_, SendUserActionToUMA(expected_message));
658 Error error(Error::kOperationFailed, kErrorMessage);
659 metrics_.NotifyCellularDeviceFailure(error);
660}
661
Thieu Le91fccf62013-04-22 15:23:16 -0700662TEST_F(MetricsTest, CellularOutOfCreditsReason) {
663 EXPECT_CALL(library_,
664 SendEnumToUMA(Metrics::kMetricCellularOutOfCreditsReason,
665 Metrics::kCellularOutOfCreditsReasonConnectDisconnectLoop,
666 Metrics::kCellularOutOfCreditsReasonMax));
667 metrics_.NotifyCellularOutOfCredits(
668 Metrics::kCellularOutOfCreditsReasonConnectDisconnectLoop);
669 Mock::VerifyAndClearExpectations(&library_);
670
671 EXPECT_CALL(library_,
672 SendEnumToUMA(Metrics::kMetricCellularOutOfCreditsReason,
673 Metrics::kCellularOutOfCreditsReasonTxCongested,
674 Metrics::kCellularOutOfCreditsReasonMax));
675 metrics_.NotifyCellularOutOfCredits(
676 Metrics::kCellularOutOfCreditsReasonTxCongested);
677 Mock::VerifyAndClearExpectations(&library_);
678
679 EXPECT_CALL(library_,
680 SendEnumToUMA(Metrics::kMetricCellularOutOfCreditsReason,
681 Metrics::kCellularOutOfCreditsReasonElongatedTimeWait,
682 Metrics::kCellularOutOfCreditsReasonMax));
683 metrics_.NotifyCellularOutOfCredits(
684 Metrics::kCellularOutOfCreditsReasonElongatedTimeWait);
685}
686
Thieu Le5133b712013-02-19 14:47:21 -0800687TEST_F(MetricsTest, CorruptedProfile) {
688 EXPECT_CALL(library_, SendEnumToUMA(Metrics::kMetricCorruptedProfile,
689 Metrics::kCorruptedProfile,
690 Metrics::kCorruptedProfileMax));
691 metrics_.NotifyCorruptedProfile();
692}
693
Thieu Le85e050b2012-03-13 15:04:38 -0700694#ifndef NDEBUG
695
696typedef MetricsTest MetricsDeathTest;
697
698TEST_F(MetricsDeathTest, PortalDetectionResultToEnumDNSSuccess) {
699 PortalDetector::Result result(PortalDetector::kPhaseDNS,
700 PortalDetector::kStatusSuccess, 0, true);
701 EXPECT_DEATH(Metrics::PortalDetectionResultToEnum(result),
702 "Final result status 1 is not allowed in the DNS phase");
703}
704
705TEST_F(MetricsDeathTest, PortalDetectionResultToEnumConnectionSuccess) {
706 PortalDetector::Result result(PortalDetector::kPhaseConnection,
707 PortalDetector::kStatusSuccess, 0, true);
708 EXPECT_DEATH(Metrics::PortalDetectionResultToEnum(result),
709 "Final result status 1 is not allowed in the Connection phase");
710}
711
712TEST_F(MetricsDeathTest, PortalDetectionResultToEnumHTTPSuccess) {
713 PortalDetector::Result result(PortalDetector::kPhaseHTTP,
714 PortalDetector::kStatusSuccess, 0, true);
715 EXPECT_DEATH(Metrics::PortalDetectionResultToEnum(result),
716 "Final result status 1 is not allowed in the HTTP phase");
717}
718
719#endif // NDEBUG
720
Thieu Le48e6d6d2011-12-06 00:40:27 +0000721} // namespace shill