blob: 370948d74a186d636af53d3001b81d4f17cca5e0 [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 Guthrie091c41c2013-03-22 15:48:53 -0700451TEST_F(MetricsTest, TimeToScanNoStart) {
452 EXPECT_CALL(library_,
453 SendToUMA("Network.Shill.Cellular.TimeToScan", _, _, _, _)).Times(0);
454 const int kInterfaceIndex = 1;
455 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular);
456 metrics_.NotifyDeviceScanFinished(kInterfaceIndex);
457}
458
Thieu Le18c11072013-01-28 17:21:37 -0800459TEST_F(MetricsTest, TimeToScanIgnore) {
460 // Make sure TimeToScan is not sent if the elapsed time exceeds the max
461 // value. This simulates the case where the device is in an area with no
462 // service.
463 const int kInterfaceIndex = 1;
464 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular);
465 base::TimeDelta large_time_delta =
466 base::TimeDelta::FromMilliseconds(
467 Metrics::kMetricTimeToScanMillisecondsMax + 1);
468 chromeos_metrics::TimerReporterMock *mock_time_to_scan_timer =
469 new chromeos_metrics::TimerReporterMock;
470 metrics_.set_time_to_scan_timer(kInterfaceIndex, mock_time_to_scan_timer);
Wade Guthrie091c41c2013-03-22 15:48:53 -0700471 EXPECT_CALL(*mock_time_to_scan_timer, Stop()).WillOnce(Return(true));
Thieu Le18c11072013-01-28 17:21:37 -0800472 EXPECT_CALL(*mock_time_to_scan_timer, GetElapsedTime(_)).
473 WillOnce(DoAll(SetArgumentPointee<0>(large_time_delta), Return(true)));
474 EXPECT_CALL(library_, SendToUMA(_, _, _, _, _)).Times(0);
475 metrics_.NotifyDeviceScanStarted(kInterfaceIndex);
476 metrics_.NotifyDeviceScanFinished(kInterfaceIndex);
477}
478
Thieu Le7cf36b02013-01-30 17:15:56 -0800479TEST_F(MetricsTest, CellularAutoConnect) {
480 EXPECT_CALL(library_,
481 SendToUMA("Network.Shill.Cellular.TimeToConnect",
482 Ge(0),
483 Metrics::kMetricTimeToConnectMillisecondsMin,
484 Metrics::kMetricTimeToConnectMillisecondsMax,
485 Metrics::kMetricTimeToConnectMillisecondsNumBuckets));
486 EXPECT_CALL(library_,
487 SendToUMA(Metrics::kMetricCellularAutoConnectTotalTime,
488 Ge(0),
489 Metrics::kMetricCellularAutoConnectTotalTimeMin,
490 Metrics::kMetricCellularAutoConnectTotalTimeMax,
491 Metrics::kMetricCellularAutoConnectTotalTimeNumBuckets));
492 EXPECT_CALL(library_,
493 SendToUMA(Metrics::kMetricCellularAutoConnectTries,
494 2,
495 Metrics::kMetricCellularAutoConnectTriesMin,
496 Metrics::kMetricCellularAutoConnectTriesMax,
497 Metrics::kMetricCellularAutoConnectTriesNumBuckets));
498 const int kInterfaceIndex = 1;
499 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular);
500 metrics_.NotifyDeviceConnectStarted(kInterfaceIndex, true);
501 metrics_.NotifyDeviceConnectStarted(kInterfaceIndex, true);
502 metrics_.NotifyDeviceConnectFinished(kInterfaceIndex);
503}
504
Thieu Le26fc01b2013-01-28 12:08:48 -0800505TEST_F(MetricsTest, CellularDrop) {
506 const char *kUMATechnologyStrings[] = {
507 flimflam::kNetworkTechnology1Xrtt,
508 flimflam::kNetworkTechnologyEdge,
509 flimflam::kNetworkTechnologyEvdo,
510 flimflam::kNetworkTechnologyGprs,
511 flimflam::kNetworkTechnologyGsm,
512 flimflam::kNetworkTechnologyHspa,
513 flimflam::kNetworkTechnologyHspaPlus,
514 flimflam::kNetworkTechnologyLte,
515 flimflam::kNetworkTechnologyUmts,
516 "Unknown" };
517
518 const uint16 signal_strength = 100;
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800519 const int kInterfaceIndex = 1;
520 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular);
Thieu Le26fc01b2013-01-28 12:08:48 -0800521 for (size_t index = 0; index < arraysize(kUMATechnologyStrings); ++index) {
522 EXPECT_CALL(library_,
523 SendEnumToUMA(Metrics::kMetricCellularDrop,
524 index,
525 Metrics::kCellularDropTechnologyMax));
526 EXPECT_CALL(library_,
527 SendToUMA(Metrics::kMetricCellularSignalStrengthBeforeDrop,
528 signal_strength,
529 Metrics::kMetricCellularSignalStrengthBeforeDropMin,
530 Metrics::kMetricCellularSignalStrengthBeforeDropMax,
531 Metrics::kMetricCellularSignalStrengthBeforeDropNumBuckets));
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800532 metrics_.NotifyCellularDeviceDrop(kInterfaceIndex,
533 kUMATechnologyStrings[index],
Thieu Le26fc01b2013-01-28 12:08:48 -0800534 signal_strength);
535 Mock::VerifyAndClearExpectations(&library_);
536 }
537}
538
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800539TEST_F(MetricsTest, CellularDropsPerHour) {
540 const int kInterfaceIndex = 1;
541 const int kSignalStrength = 33;
542 const int kNumDrops = 3;
543 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular);
544 EXPECT_CALL(library_,
545 SendEnumToUMA(Metrics::kMetricCellularDrop,
546 Metrics::kCellularDropTechnologyLte,
547 Metrics::kCellularDropTechnologyMax))
548 .Times(kNumDrops);
549 EXPECT_CALL(library_,
550 SendToUMA(Metrics::kMetricCellularSignalStrengthBeforeDrop,
551 kSignalStrength,
552 Metrics::kMetricCellularSignalStrengthBeforeDropMin,
553 Metrics::kMetricCellularSignalStrengthBeforeDropMax,
554 Metrics::kMetricCellularSignalStrengthBeforeDropNumBuckets))
555 .Times(kNumDrops);
556 EXPECT_CALL(library_,
557 SendToUMA(Metrics::kMetricCellularDropsPerHour,
558 kNumDrops,
559 Metrics::kMetricCellularDropsPerHourMin,
560 Metrics::kMetricCellularDropsPerHourMax,
561 Metrics::kMetricCellularDropsPerHourNumBuckets));
562 for (int count = 0; count < kNumDrops; ++count)
563 metrics_.NotifyCellularDeviceDrop(kInterfaceIndex,
564 flimflam::kNetworkTechnologyLte,
565 kSignalStrength);
566 metrics_.HourlyTimeoutHandler();
567
568 // Make sure the number of drops gets resetted after each hour.
569 EXPECT_CALL(library_,
570 SendToUMA(Metrics::kMetricCellularDropsPerHour, _, _, _, _))
571 .Times(0);
572 metrics_.HourlyTimeoutHandler();
573}
574
Thieu Leb7aa5f72013-01-31 15:57:48 -0800575TEST_F(MetricsTest, CellularDeviceFailure) {
576 const char kErrorMessage[] =
577 "org.chromium.flimflam.Error.Failure:"
578 "$NWQMISTATUS: QMI_RESULT_FAILURE:QMI_ERR_CALL_FAILED#015#012#011"
579 "QMI State: DISCONNECTED#015#012#011Call End Reason:1016#015#012#011"
580 "Call Duration: 0 seconds#015#015#012"
581 "$NWQMISTATUS: QMI_RESULT_SUCCESS:QMI_ERR_NONE#015#012#011"
582 "QMI State: DISCONNECTED#015#012#011Call End Reason:0#015#012#011"
583 "Call Duration: 0 seconds";
584 string expected_message =
585 string(Metrics::kMetricCellularFailureReason) + kErrorMessage;
586 EXPECT_CALL(library_, SendUserActionToUMA(expected_message));
587 Error error(Error::kOperationFailed, kErrorMessage);
588 metrics_.NotifyCellularDeviceFailure(error);
589}
590
Thieu Le91fccf62013-04-22 15:23:16 -0700591TEST_F(MetricsTest, CellularOutOfCreditsReason) {
592 EXPECT_CALL(library_,
593 SendEnumToUMA(Metrics::kMetricCellularOutOfCreditsReason,
594 Metrics::kCellularOutOfCreditsReasonConnectDisconnectLoop,
595 Metrics::kCellularOutOfCreditsReasonMax));
596 metrics_.NotifyCellularOutOfCredits(
597 Metrics::kCellularOutOfCreditsReasonConnectDisconnectLoop);
598 Mock::VerifyAndClearExpectations(&library_);
599
600 EXPECT_CALL(library_,
601 SendEnumToUMA(Metrics::kMetricCellularOutOfCreditsReason,
602 Metrics::kCellularOutOfCreditsReasonTxCongested,
603 Metrics::kCellularOutOfCreditsReasonMax));
604 metrics_.NotifyCellularOutOfCredits(
605 Metrics::kCellularOutOfCreditsReasonTxCongested);
606 Mock::VerifyAndClearExpectations(&library_);
607
608 EXPECT_CALL(library_,
609 SendEnumToUMA(Metrics::kMetricCellularOutOfCreditsReason,
610 Metrics::kCellularOutOfCreditsReasonElongatedTimeWait,
611 Metrics::kCellularOutOfCreditsReasonMax));
612 metrics_.NotifyCellularOutOfCredits(
613 Metrics::kCellularOutOfCreditsReasonElongatedTimeWait);
614}
615
Thieu Le5133b712013-02-19 14:47:21 -0800616TEST_F(MetricsTest, CorruptedProfile) {
617 EXPECT_CALL(library_, SendEnumToUMA(Metrics::kMetricCorruptedProfile,
618 Metrics::kCorruptedProfile,
619 Metrics::kCorruptedProfileMax));
620 metrics_.NotifyCorruptedProfile();
621}
622
Thieu Le85e050b2012-03-13 15:04:38 -0700623#ifndef NDEBUG
624
625typedef MetricsTest MetricsDeathTest;
626
627TEST_F(MetricsDeathTest, PortalDetectionResultToEnumDNSSuccess) {
628 PortalDetector::Result result(PortalDetector::kPhaseDNS,
629 PortalDetector::kStatusSuccess, 0, true);
630 EXPECT_DEATH(Metrics::PortalDetectionResultToEnum(result),
631 "Final result status 1 is not allowed in the DNS phase");
632}
633
634TEST_F(MetricsDeathTest, PortalDetectionResultToEnumConnectionSuccess) {
635 PortalDetector::Result result(PortalDetector::kPhaseConnection,
636 PortalDetector::kStatusSuccess, 0, true);
637 EXPECT_DEATH(Metrics::PortalDetectionResultToEnum(result),
638 "Final result status 1 is not allowed in the Connection phase");
639}
640
641TEST_F(MetricsDeathTest, PortalDetectionResultToEnumHTTPSuccess) {
642 PortalDetector::Result result(PortalDetector::kPhaseHTTP,
643 PortalDetector::kStatusSuccess, 0, true);
644 EXPECT_DEATH(Metrics::PortalDetectionResultToEnum(result),
645 "Final result status 1 is not allowed in the HTTP phase");
646}
647
648#endif // NDEBUG
649
Thieu Le48e6d6d2011-12-06 00:40:27 +0000650} // namespace shill