blob: 7bec934750c282e0450bb84573dd8640db3f6145 [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#ifndef SHILL_METRICS_
6#define SHILL_METRICS_
7
8#include <list>
9
Thieu Le48e6d6d2011-12-06 00:40:27 +000010#include <base/memory/scoped_vector.h>
11#include <metrics/metrics_library.h>
12#include <metrics/timer.h>
13
Wade Guthried4977f22012-08-22 12:37:54 -070014#include "shill/ieee80211.h"
Thieu Le85e050b2012-03-13 15:04:38 -070015#include "shill/portal_detector.h"
Thieu Leb84ba342012-03-02 15:15:19 -080016#include "shill/power_manager.h"
Thieu Le48e6d6d2011-12-06 00:40:27 +000017#include "shill/refptr_types.h"
18#include "shill/service.h"
19
20namespace shill {
21
Gaurav Shah6d2c72d2012-10-16 16:30:44 -070022class WiFiMainTest;
Thieu Le48e6d6d2011-12-06 00:40:27 +000023class WiFiService;
24
25class Metrics {
26 public:
27 enum WiFiChannel {
28 kWiFiChannelUndef = 0,
29 kWiFiChannel2412 = 1,
30 kWiFiChannel2417 = 2,
31 kWiFiChannel2422 = 3,
32 kWiFiChannel2427 = 4,
33 kWiFiChannel2432 = 5,
34 kWiFiChannel2437 = 6,
35 kWiFiChannel2442 = 7,
36 kWiFiChannel2447 = 8,
37 kWiFiChannel2452 = 9,
38 kWiFiChannel2457 = 10,
39 kWiFiChannel2462 = 11,
40 kWiFiChannel2467 = 12,
41 kWiFiChannel2472 = 13,
42 kWiFiChannel2484 = 14,
43
44 kWiFiChannel5180 = 15,
45 kWiFiChannel5200 = 16,
46 kWiFiChannel5220 = 17,
47 kWiFiChannel5240 = 18,
48 kWiFiChannel5260 = 19,
49 kWiFiChannel5280 = 20,
50 kWiFiChannel5300 = 21,
51 kWiFiChannel5320 = 22,
52
53 kWiFiChannel5500 = 23,
54 kWiFiChannel5520 = 24,
55 kWiFiChannel5540 = 25,
56 kWiFiChannel5560 = 26,
57 kWiFiChannel5580 = 27,
58 kWiFiChannel5600 = 28,
59 kWiFiChannel5620 = 29,
60 kWiFiChannel5640 = 30,
61 kWiFiChannel5660 = 31,
62 kWiFiChannel5680 = 32,
63 kWiFiChannel5700 = 33,
64
65 kWiFiChannel5745 = 34,
66 kWiFiChannel5765 = 35,
67 kWiFiChannel5785 = 36,
68 kWiFiChannel5805 = 37,
69 kWiFiChannel5825 = 38,
70
71 kWiFiChannel5170 = 39,
72 kWiFiChannel5190 = 40,
73 kWiFiChannel5210 = 41,
74 kWiFiChannel5230 = 42,
75
76 /* NB: ignore old 11b bands 2312..2372 and 2512..2532 */
77 /* NB: ignore regulated bands 4920..4980 and 5020..5160 */
78 kWiFiChannelMax
79 };
80
Thieu Lead1ec2c2012-01-05 23:39:48 +000081 enum WiFiNetworkPhyMode {
82 kWiFiNetworkPhyModeUndef = 0, // Unknown/undefined
83 kWiFiNetworkPhyMode11a = 1, // 802.11a
84 kWiFiNetworkPhyMode11b = 2, // 802.11b
85 kWiFiNetworkPhyMode11g = 3, // 802.11g
86 kWiFiNetworkPhyMode11n = 4, // 802.11n
87 kWiFiNetworkPhyModeHalf = 5, // PSB Half-width
88 kWiFiNetworkPhyModeQuarter = 6, // PSB Quarter-width
89 kWiFiNetworkPhyModeTurbo = 7, // Atheros Turbo mode
90
91 kWiFiNetworkPhyModeMax
92 };
93
94 enum WiFiSecurity {
95 kWiFiSecurityUnknown = 0,
96 kWiFiSecurityNone = 1,
97 kWiFiSecurityWep = 2,
98 kWiFiSecurityWpa = 3,
99 kWiFiSecurityRsn = 4,
100 kWiFiSecurity8021x = 5,
101 kWiFiSecurityPsk = 6,
102
103 kWiFiSecurityMax
104 };
105
Thieu Le85e050b2012-03-13 15:04:38 -0700106 enum PortalResult {
107 kPortalResultSuccess = 0,
108 kPortalResultDNSFailure = 1,
109 kPortalResultDNSTimeout = 2,
110 kPortalResultConnectionFailure = 3,
111 kPortalResultConnectionTimeout = 4,
112 kPortalResultHTTPFailure = 5,
113 kPortalResultHTTPTimeout = 6,
114 kPortalResultContentFailure = 7,
115 kPortalResultContentTimeout = 8,
116 kPortalResultUnknown = 9,
117
118 kPortalResultMax
119 };
120
Paul Stewartff845fc2012-08-07 07:28:44 -0700121 enum LinkMonitorFailure {
122 kLinkMonitorMacAddressNotFound = 0,
123 kLinkMonitorClientStartFailure = 1,
124 kLinkMonitorTransmitFailure = 2,
125 kLinkMonitorFailureThresholdReached = 3,
126
127 kLinkMonitorFailureMax
128 };
129
Wade Guthried4977f22012-08-22 12:37:54 -0700130 enum WiFiStatusType {
131 kStatusCodeTypeByAp,
132 kStatusCodeTypeByClient,
133 kStatusCodeTypeByUser,
134 kStatusCodeTypeConsideredDead,
135 kStatusCodeTypeMax
136 };
137
138 enum WiFiDisconnectByWhom {
139 kDisconnectedByAp,
140 kDisconnectedNotByAp
141 };
142
Paul Stewart85aea152013-01-22 09:31:56 -0800143 enum ServiceFixupProfileType {
144 kMetricServiceFixupDefaultProfile,
145 kMetricServiceFixupUserProfile,
146 kMetricServiceFixupMax
147 };
148
Arman Uguray6d528f12012-09-13 13:44:55 -0700149 enum TerminationActionResult {
Arman Ugurayab22c162012-10-08 19:08:38 -0700150 kTerminationActionResultSuccess,
151 kTerminationActionResultFailure,
Arman Uguray6d528f12012-09-13 13:44:55 -0700152 kTerminationActionResultMax
153 };
154
Arman Ugurayab22c162012-10-08 19:08:38 -0700155 enum TerminationActionReason {
156 kTerminationActionReasonSuspend,
157 kTerminationActionReasonTerminate
158 };
159
Thieu Le26fc01b2013-01-28 12:08:48 -0800160 enum CellularDropTechnology {
161 kCellularDropTechnology1Xrtt = 0,
162 kCellularDropTechnologyEdge = 1,
163 kCellularDropTechnologyEvdo = 2,
164 kCellularDropTechnologyGprs = 3,
165 kCellularDropTechnologyGsm = 4,
166 kCellularDropTechnologyHspa = 5,
167 kCellularDropTechnologyHspaPlus = 6,
168 kCellularDropTechnologyLte = 7,
169 kCellularDropTechnologyUmts = 8,
170 kCellularDropTechnologyUnknown = 9,
171 kCellularDropTechnologyMax
172 };
173
Thieu Le67370f62012-02-14 23:01:42 +0000174 static const char kMetricDisconnect[];
175 static const int kMetricDisconnectMax;
176 static const int kMetricDisconnectMin;
177 static const int kMetricDisconnectNumBuckets;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000178 static const char kMetricNetworkChannel[];
179 static const int kMetricNetworkChannelMax;
Thieu Lead1ec2c2012-01-05 23:39:48 +0000180 static const char kMetricNetworkPhyMode[];
181 static const int kMetricNetworkPhyModeMax;
182 static const char kMetricNetworkSecurity[];
183 static const int kMetricNetworkSecurityMax;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000184 static const char kMetricNetworkServiceErrors[];
185 static const int kMetricNetworkServiceErrorsMax;
Paul Stewart23b393a2012-09-25 21:21:06 -0700186 static const char kMetricNetworkSignalStrength[];
187 static const int kMetricNetworkSignalStrengthMin;
188 static const int kMetricNetworkSignalStrengthMax;
189 static const int kMetricNetworkSignalStrengthNumBuckets;
Thieu Lea20cbc22012-01-09 22:01:43 +0000190 static const char kMetricTimeOnlineSeconds[];
191 static const int kMetricTimeOnlineSecondsMax;
192 static const int kMetricTimeOnlineSecondsMin;
193 static const int kMetricTimeOnlineSecondsNumBuckets;
Thieu Leb84ba342012-03-02 15:15:19 -0800194 static const char kMetricTimeResumeToReadyMilliseconds[];
Thieu Le48e6d6d2011-12-06 00:40:27 +0000195 static const char kMetricTimeToConfigMilliseconds[];
Thieu Lecdb5a212013-01-25 11:17:18 -0800196 static const char kMetricTimeToConnectMilliseconds[];
197 static const int kMetricTimeToConnectMillisecondsMax;
198 static const int kMetricTimeToConnectMillisecondsMin;
199 static const int kMetricTimeToConnectMillisecondsNumBuckets;
Thieu Lea20cbc22012-01-09 22:01:43 +0000200 static const char kMetricTimeToDropSeconds[];
201 static const int kMetricTimeToDropSecondsMax;
202 static const int kMetricTimeToDropSecondsMin;
Thieu Lea2519bf2013-01-23 16:51:54 -0800203 static const char kMetricTimeToDisableMilliseconds[];
204 static const int kMetricTimeToDisableMillisecondsMax;
205 static const int kMetricTimeToDisableMillisecondsMin;
206 static const int kMetricTimeToDisableMillisecondsNumBuckets;
Thieu Lece4483e2013-01-23 15:12:03 -0800207 static const char kMetricTimeToEnableMilliseconds[];
208 static const int kMetricTimeToEnableMillisecondsMax;
209 static const int kMetricTimeToEnableMillisecondsMin;
210 static const int kMetricTimeToEnableMillisecondsNumBuckets;
Thieu Lec8078a62013-01-22 18:01:12 -0800211 static const char kMetricTimeToInitializeMilliseconds[];
Thieu Lec8078a62013-01-22 18:01:12 -0800212 static const int kMetricTimeToInitializeMillisecondsMax;
Thieu Lece4483e2013-01-23 15:12:03 -0800213 static const int kMetricTimeToInitializeMillisecondsMin;
Thieu Lec8078a62013-01-22 18:01:12 -0800214 static const int kMetricTimeToInitializeMillisecondsNumBuckets;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000215 static const char kMetricTimeToJoinMilliseconds[];
216 static const char kMetricTimeToOnlineMilliseconds[];
217 static const char kMetricTimeToPortalMilliseconds[];
Thieu Le18c11072013-01-28 17:21:37 -0800218 static const char kMetricTimeToScanMilliseconds[];
219 static const int kMetricTimeToScanMillisecondsMax;
220 static const int kMetricTimeToScanMillisecondsMin;
221 static const int kMetricTimeToScanMillisecondsNumBuckets;
Thieu Lea20cbc22012-01-09 22:01:43 +0000222 static const int kTimerHistogramMillisecondsMax;
223 static const int kTimerHistogramMillisecondsMin;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000224 static const int kTimerHistogramNumBuckets;
225
Thieu Le85e050b2012-03-13 15:04:38 -0700226 // The number of portal detections attempted for each pass.
227 // This includes both failure/timeout attempts and successful attempt
228 // (if any).
229 static const char kMetricPortalAttempts[];
230 static const int kMetricPortalAttemptsMax;
231 static const int kMetricPortalAttemptsMin;
232 static const int kMetricPortalAttemptsNumBuckets;
233
234 // The total number of portal detections attempted between the Connected
235 // state and the Online state. This includes both failure/timeout attempts
236 // and the final successful attempt.
237 static const char kMetricPortalAttemptsToOnline[];
238 static const int kMetricPortalAttemptsToOnlineMax;
239 static const int kMetricPortalAttemptsToOnlineMin;
240 static const int kMetricPortalAttemptsToOnlineNumBuckets;
241
242 // The result of the portal detection.
243 static const char kMetricPortalResult[];
244
Thieu Leb84ba342012-03-02 15:15:19 -0800245 static const char kMetricPowerManagerKey[];
246
Paul Stewartff845fc2012-08-07 07:28:44 -0700247 // LinkMonitor statistics.
248 static const char kMetricLinkMonitorFailure[];
249 static const char kMetricLinkMonitorResponseTimeSample[];
Paul Stewartf1961f82012-09-11 20:45:39 -0700250 static const int kMetricLinkMonitorResponseTimeSampleMin;
251 static const int kMetricLinkMonitorResponseTimeSampleMax;
Paul Stewartff845fc2012-08-07 07:28:44 -0700252 static const int kMetricLinkMonitorResponseTimeSampleNumBuckets;
Paul Stewart0443aa52012-08-09 10:43:50 -0700253 static const char kMetricLinkMonitorSecondsToFailure[];
Paul Stewartf1961f82012-09-11 20:45:39 -0700254 static const int kMetricLinkMonitorSecondsToFailureMin;
255 static const int kMetricLinkMonitorSecondsToFailureMax;
Paul Stewart0443aa52012-08-09 10:43:50 -0700256 static const int kMetricLinkMonitorSecondsToFailureNumBuckets;
257 static const char kMetricLinkMonitorBroadcastErrorsAtFailure[];
258 static const char kMetricLinkMonitorUnicastErrorsAtFailure[];
Paul Stewartf1961f82012-09-11 20:45:39 -0700259 static const int kMetricLinkMonitorErrorCountMin;
260 static const int kMetricLinkMonitorErrorCountMax;
Paul Stewart0443aa52012-08-09 10:43:50 -0700261 static const int kMetricLinkMonitorErrorCountNumBuckets;
Paul Stewartff845fc2012-08-07 07:28:44 -0700262
Wade Guthried4977f22012-08-22 12:37:54 -0700263 static const char kMetricLinkClientDisconnectReason[];
264 static const char kMetricLinkApDisconnectReason[];
265 static const char kMetricLinkClientDisconnectType[];
266 static const char kMetricLinkApDisconnectType[];
267
Arman Uguray6d528f12012-09-13 13:44:55 -0700268 // Shill termination action statistics.
Arman Ugurayab22c162012-10-08 19:08:38 -0700269 static const char kMetricTerminationActionTimeOnTerminate[];
270 static const char kMetricTerminationActionResultOnTerminate[];
271 static const char kMetricTerminationActionTimeOnSuspend[];
272 static const char kMetricTerminationActionResultOnSuspend[];
273 static const int kMetricTerminationActionTimeMillisecondsMax;
274 static const int kMetricTerminationActionTimeMillisecondsMin;
Arman Uguray6d528f12012-09-13 13:44:55 -0700275
Paul Stewart85aea152013-01-22 09:31:56 -0800276 // WiFiService Entry Fixup.
277 static const char kMetricServiceFixupEntries[];
278
Thieu Le26fc01b2013-01-28 12:08:48 -0800279 // Cellular specific statistics.
280 static const char kMetricCellularDrop[];
Thieu Leb7aa5f72013-01-31 15:57:48 -0800281 static const char kMetricCellularFailureReason[];
Thieu Le26fc01b2013-01-28 12:08:48 -0800282 static const char kMetricCellularSignalStrengthBeforeDrop[];
283 static const int kMetricCellularSignalStrengthBeforeDropMax;
284 static const int kMetricCellularSignalStrengthBeforeDropMin;
285 static const int kMetricCellularSignalStrengthBeforeDropNumBuckets;
Thieu Le7cf36b02013-01-30 17:15:56 -0800286 static const char kMetricCellularAutoConnectTries[];
287 static const int kMetricCellularAutoConnectTriesMax;
288 static const int kMetricCellularAutoConnectTriesMin;
289 static const int kMetricCellularAutoConnectTriesNumBuckets;
290 static const char kMetricCellularAutoConnectTotalTime[];
291 static const int kMetricCellularAutoConnectTotalTimeMax;
292 static const int kMetricCellularAutoConnectTotalTimeMin;
293 static const int kMetricCellularAutoConnectTotalTimeNumBuckets;
Thieu Le26fc01b2013-01-28 12:08:48 -0800294
Thieu Le3426c8f2012-01-11 17:35:11 -0800295 Metrics();
Thieu Le48e6d6d2011-12-06 00:40:27 +0000296 virtual ~Metrics();
297
Thieu Le48e6d6d2011-12-06 00:40:27 +0000298 // Converts the WiFi frequency into the associated UMA channel enumerator.
299 static WiFiChannel WiFiFrequencyToChannel(uint16 frequency);
300
Thieu Lead1ec2c2012-01-05 23:39:48 +0000301 // Converts a flimflam security string into its UMA security enumerator.
302 static WiFiSecurity WiFiSecurityStringToEnum(const std::string &security);
303
Thieu Le85e050b2012-03-13 15:04:38 -0700304 // Converts portal detection result to UMA portal result enumerator.
305 static PortalResult PortalDetectionResultToEnum(
306 const PortalDetector::Result &result);
307
Thieu Le48e6d6d2011-12-06 00:40:27 +0000308 // Registers a service with this object so it can use the timers to track
309 // state transition metrics.
310 void RegisterService(const Service *service);
311
312 // Deregisters the service from this class. All state transition timers
313 // will be removed.
314 void DeregisterService(const Service *service);
315
316 // Tracks the time it takes |service| to go from |start_state| to
317 // |stop_state|. When |stop_state| is reached, the time is sent to UMA.
318 void AddServiceStateTransitionTimer(const Service *service,
319 const std::string &histogram_name,
320 Service::ConnectState start_state,
321 Service::ConnectState stop_state);
322
323 // Specializes |metric_name| for the specified |technology_id|.
324 std::string GetFullMetricName(const char *metric_name,
325 Technology::Identifier technology_id);
326
327 // Notifies this object that the default service has changed.
328 // |service| is the new default service.
Thieu Lea20cbc22012-01-09 22:01:43 +0000329 virtual void NotifyDefaultServiceChanged(const Service *service);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000330
331 // Notifies this object that |service| state has changed.
332 virtual void NotifyServiceStateChanged(const Service *service,
333 Service::ConnectState new_state);
334
Thieu Le67370f62012-02-14 23:01:42 +0000335 // Notifies this object that |service| has been disconnected.
336 void NotifyServiceDisconnect(const Service *service);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000337
Thieu Leb84ba342012-03-02 15:15:19 -0800338 // Notifies this object of a power management state change.
339 void NotifyPowerStateChange(PowerManager::SuspendState new_state);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000340
Arman Ugurayab22c162012-10-08 19:08:38 -0700341 // Notifies this object that termination actions started executing.
342 void NotifyTerminationActionsStarted(TerminationActionReason reason);
343
344 // Notifies this object that termination actions have been completed.
345 // |success| is true, if the termination actions completed successfully.
346 void NotifyTerminationActionsCompleted(
347 TerminationActionReason reason, bool success);
348
Paul Stewartff845fc2012-08-07 07:28:44 -0700349 // Notifies this object of a failure in LinkMonitor.
350 void NotifyLinkMonitorFailure(
Paul Stewart0443aa52012-08-09 10:43:50 -0700351 Technology::Identifier technology,
352 LinkMonitorFailure failure,
Paul Stewartf1961f82012-09-11 20:45:39 -0700353 int seconds_to_failure,
354 int broadcast_error_count,
355 int unicast_error_count);
Paul Stewartff845fc2012-08-07 07:28:44 -0700356
357 // Notifies this object that LinkMonitor has added a response time sample
358 // for |connection| with a value of |response_time_milliseconds|.
359 void NotifyLinkMonitorResponseTimeSampleAdded(
360 Technology::Identifier technology,
Paul Stewartf1961f82012-09-11 20:45:39 -0700361 int response_time_milliseconds);
Paul Stewartff845fc2012-08-07 07:28:44 -0700362
Wade Guthried4977f22012-08-22 12:37:54 -0700363 // Notifies this object of WiFi disconnect.
364 void Notify80211Disconnect(WiFiDisconnectByWhom by_whom,
365 IEEE_80211::WiFiReasonCode reason);
366
Thieu Lec8078a62013-01-22 18:01:12 -0800367 // Registers a device with this object so the device can use the timers to
368 // track state transition metrics.
369 void RegisterDevice(int interface_index,
370 Technology::Identifier technology);
371
Thieu Le9abd6742013-01-23 23:35:37 -0800372 // Checks to see if the device has already been registered.
373 bool IsDeviceRegistered(int interface_index,
374 Technology::Identifier technology);
375
Thieu Lec8078a62013-01-22 18:01:12 -0800376 // Deregisters the device from this class. All state transition timers
377 // will be removed.
378 void DeregisterDevice(int interface_index);
379
380 // Notifies this object that a device has been initialized.
381 void NotifyDeviceInitialized(int interface_index);
382
Thieu Lece4483e2013-01-23 15:12:03 -0800383 // Notifies this object that a device has started the enable process.
384 void NotifyDeviceEnableStarted(int interface_index);
385
386 // Notifies this object that a device has completed the enable process.
387 void NotifyDeviceEnableFinished(int interface_index);
388
Thieu Lea2519bf2013-01-23 16:51:54 -0800389 // Notifies this object that a device has started the disable process.
390 void NotifyDeviceDisableStarted(int interface_index);
391
392 // Notifies this object that a device has completed the disable process.
393 void NotifyDeviceDisableFinished(int interface_index);
394
Thieu Le18c11072013-01-28 17:21:37 -0800395 // Notifies this object that a device has started the scanning process.
396 void NotifyDeviceScanStarted(int interface_index);
397
398 // Notifies this object that a device has completed the scanning process.
399 void NotifyDeviceScanFinished(int interface_index);
400
Thieu Lecdb5a212013-01-25 11:17:18 -0800401 // Notifies this object that a device has started the connect process.
Thieu Le7cf36b02013-01-30 17:15:56 -0800402 void NotifyDeviceConnectStarted(int interface_index,
403 bool is_auto_connecting);
Thieu Lecdb5a212013-01-25 11:17:18 -0800404
405 // Notifies this object that a device has completed the connect process.
406 void NotifyDeviceConnectFinished(int interface_index);
407
Thieu Le26fc01b2013-01-28 12:08:48 -0800408 // Notifies this object that a cellular device has been dropped by the
409 // network.
410 void NotifyCellularDeviceDrop(const std::string &network_technology,
411 uint16 signal_strength);
412
Thieu Leb7aa5f72013-01-31 15:57:48 -0800413 // Notifies this object about a cellular device failure code.
414 void NotifyCellularDeviceFailure(const Error &error);
415
Thieu Le48e6d6d2011-12-06 00:40:27 +0000416 // Sends linear histogram data to UMA.
Thieu Le85e050b2012-03-13 15:04:38 -0700417 virtual bool SendEnumToUMA(const std::string &name, int sample, int max);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000418
Thieu Lea20cbc22012-01-09 22:01:43 +0000419 // Send histogram data to UMA.
Thieu Le85e050b2012-03-13 15:04:38 -0700420 virtual bool SendToUMA(const std::string &name, int sample, int min,
421 int max, int num_buckets);
Thieu Lea20cbc22012-01-09 22:01:43 +0000422
Thieu Le48e6d6d2011-12-06 00:40:27 +0000423 private:
Thieu Le48e6d6d2011-12-06 00:40:27 +0000424 friend class MetricsTest;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000425 FRIEND_TEST(MetricsTest, FrequencyToChannel);
Thieu Leb84ba342012-03-02 15:15:19 -0800426 FRIEND_TEST(MetricsTest, ServiceFailure);
Thieu Lea20cbc22012-01-09 22:01:43 +0000427 FRIEND_TEST(MetricsTest, TimeOnlineTimeToDrop);
Thieu Leb84ba342012-03-02 15:15:19 -0800428 FRIEND_TEST(MetricsTest, TimeToConfig);
429 FRIEND_TEST(MetricsTest, TimeToOnline);
430 FRIEND_TEST(MetricsTest, TimeToPortal);
Thieu Le18c11072013-01-28 17:21:37 -0800431 FRIEND_TEST(MetricsTest, TimeToScanIgnore);
Thieu Leb84ba342012-03-02 15:15:19 -0800432 FRIEND_TEST(MetricsTest, WiFiServiceChannel);
433 FRIEND_TEST(MetricsTest, WiFiServicePostReady);
Gaurav Shah6d2c72d2012-10-16 16:30:44 -0700434 FRIEND_TEST(WiFiMainTest, GetGeolocationObjects);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000435
436 typedef ScopedVector<chromeos_metrics::TimerReporter> TimerReporters;
437 typedef std::list<chromeos_metrics::TimerReporter *> TimerReportersList;
438 typedef std::map<Service::ConnectState, TimerReportersList>
439 TimerReportersByState;
440 struct ServiceMetrics {
441 ServiceMetrics() : service(NULL) {}
442 // The service is registered/deregistered in the Service
443 // constructor/destructor, therefore there is no need to keep a ref count.
444 const Service *service;
445 // All TimerReporter objects are stored in |timers| which owns the objects.
446 // |start_on_state| and |stop_on_state| contain pointers to the
447 // TimerReporter objects and control when to start and stop the timers.
448 TimerReporters timers;
449 TimerReportersByState start_on_state;
450 TimerReportersByState stop_on_state;
451 };
452 typedef std::map<const Service *, std::tr1::shared_ptr<ServiceMetrics> >
453 ServiceMetricsLookupMap;
454
Thieu Lec8078a62013-01-22 18:01:12 -0800455 struct DeviceMetrics {
456 DeviceMetrics() {}
Thieu Le9abd6742013-01-23 23:35:37 -0800457 Technology::Identifier technology;
Thieu Lec8078a62013-01-22 18:01:12 -0800458 scoped_ptr<chromeos_metrics::TimerReporter> initialization_timer;
Thieu Lece4483e2013-01-23 15:12:03 -0800459 scoped_ptr<chromeos_metrics::TimerReporter> enable_timer;
Thieu Lea2519bf2013-01-23 16:51:54 -0800460 scoped_ptr<chromeos_metrics::TimerReporter> disable_timer;
Thieu Le18c11072013-01-28 17:21:37 -0800461 scoped_ptr<chromeos_metrics::TimerReporter> scan_timer;
Thieu Lecdb5a212013-01-25 11:17:18 -0800462 scoped_ptr<chromeos_metrics::TimerReporter> connect_timer;
Thieu Le7cf36b02013-01-30 17:15:56 -0800463 int auto_connect_tries;
464 scoped_ptr<chromeos_metrics::TimerReporter> auto_connect_timer;
Thieu Lec8078a62013-01-22 18:01:12 -0800465 };
466 typedef std::map<const int, std::tr1::shared_ptr<DeviceMetrics> >
467 DeviceMetricsLookupMap;
468
Thieu Le48e6d6d2011-12-06 00:40:27 +0000469 static const uint16 kWiFiBandwidth5MHz;
470 static const uint16 kWiFiBandwidth20MHz;
471 static const uint16 kWiFiFrequency2412;
472 static const uint16 kWiFiFrequency2472;
473 static const uint16 kWiFiFrequency2484;
474 static const uint16 kWiFiFrequency5170;
475 static const uint16 kWiFiFrequency5180;
476 static const uint16 kWiFiFrequency5230;
477 static const uint16 kWiFiFrequency5240;
478 static const uint16 kWiFiFrequency5320;
479 static const uint16 kWiFiFrequency5500;
480 static const uint16 kWiFiFrequency5700;
481 static const uint16 kWiFiFrequency5745;
482 static const uint16 kWiFiFrequency5825;
483
Thieu Le48e6d6d2011-12-06 00:40:27 +0000484 void InitializeCommonServiceMetrics(const Service *service);
485 void UpdateServiceStateTransitionMetrics(ServiceMetrics *service_metrics,
486 Service::ConnectState new_state);
487 void SendServiceFailure(const Service *service);
488
Thieu Le9abd6742013-01-23 23:35:37 -0800489 DeviceMetrics *GetDeviceMetrics (int interface_index) const;
Thieu Le7cf36b02013-01-30 17:15:56 -0800490 void AutoConnectMetricsReset(DeviceMetrics *device_metrics);
Thieu Lece4483e2013-01-23 15:12:03 -0800491
Thieu Le48e6d6d2011-12-06 00:40:27 +0000492 // For unit test purposes.
493 void set_library(MetricsLibraryInterface *library);
Thieu Lea20cbc22012-01-09 22:01:43 +0000494 void set_time_online_timer(chromeos_metrics::Timer *timer) {
495 time_online_timer_.reset(timer); // Passes ownership
496 }
497 void set_time_to_drop_timer(chromeos_metrics::Timer *timer) {
498 time_to_drop_timer_.reset(timer); // Passes ownership
499 }
Thieu Leb84ba342012-03-02 15:15:19 -0800500 void set_time_resume_to_ready_timer(chromeos_metrics::Timer *timer) {
501 time_resume_to_ready_timer_.reset(timer); // Passes ownership
502 }
Arman Ugurayab22c162012-10-08 19:08:38 -0700503 void set_time_termination_actions_timer(
504 chromeos_metrics::Timer *timer) {
505 time_termination_actions_timer.reset(timer); // Passes ownership
506 }
Thieu Le18c11072013-01-28 17:21:37 -0800507 void set_time_to_scan_timer(int interface_index,
508 chromeos_metrics::TimerReporter *timer) {
509 DeviceMetrics *device_metrics = GetDeviceMetrics(interface_index);
510 device_metrics->scan_timer.reset(timer); // Passes ownership
511 }
Thieu Le48e6d6d2011-12-06 00:40:27 +0000512
513 // |library_| points to |metrics_library_| when shill runs normally.
514 // However, in order to allow for unit testing, we point |library_| to a
515 // MetricsLibraryMock object instead.
516 MetricsLibrary metrics_library_;
517 MetricsLibraryInterface *library_;
518 ServiceMetricsLookupMap services_metrics_;
Thieu Lea20cbc22012-01-09 22:01:43 +0000519 Technology::Identifier last_default_technology_;
520 bool was_online_;
521 scoped_ptr<chromeos_metrics::Timer> time_online_timer_;
522 scoped_ptr<chromeos_metrics::Timer> time_to_drop_timer_;
Thieu Leb84ba342012-03-02 15:15:19 -0800523 scoped_ptr<chromeos_metrics::Timer> time_resume_to_ready_timer_;
Arman Ugurayab22c162012-10-08 19:08:38 -0700524 scoped_ptr<chromeos_metrics::Timer> time_termination_actions_timer;
Darin Petkov58f0b6d2012-06-12 12:52:30 +0200525 bool collect_bootstats_;
Thieu Lec8078a62013-01-22 18:01:12 -0800526 DeviceMetricsLookupMap devices_metrics_;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000527
528 DISALLOW_COPY_AND_ASSIGN(Metrics);
529};
530
531} // namespace shill
532
533#endif // SHILL_METRICS_