1 // 2 // Copyright (C) 2012 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #include "shill/metrics.h" 18 19 #include <string> 20 #include <vector> 21 22 #if defined(__ANDROID__) 23 #include <dbus/service_constants.h> 24 #else 25 #include <chromeos/dbus/service_constants.h> 26 #endif // __ANDROID__ 27 #include <metrics/metrics_library_mock.h> 28 #include <metrics/timer_mock.h> 29 30 #include "shill/mock_control.h" 31 #include "shill/mock_event_dispatcher.h" 32 #include "shill/mock_log.h" 33 #include "shill/mock_manager.h" 34 #include "shill/mock_service.h" 35 36 #if !defined(DISABLE_WIFI) 37 #include "shill/mock_eap_credentials.h" 38 #include "shill/wifi/mock_wifi_service.h" 39 #endif // DISABLE_WIFI 40 41 using std::string; 42 43 using testing::_; 44 using testing::DoAll; 45 using testing::Ge; 46 using testing::Mock; 47 using testing::Return; 48 using testing::SetArgumentPointee; 49 using testing::Test; 50 51 namespace shill { 52 53 class MetricsTest : public Test { 54 public: 55 MetricsTest() 56 : manager_(&control_interface_, 57 &dispatcher_, 58 &metrics_), 59 metrics_(&dispatcher_), 60 #if !defined(DISABLE_WIFI) 61 open_wifi_service_(new MockWiFiService(&control_interface_, 62 &dispatcher_, 63 &metrics_, 64 &manager_, 65 manager_.wifi_provider(), 66 ssid_, 67 kModeManaged, 68 kSecurityNone, 69 false)), 70 wep_wifi_service_(new MockWiFiService(&control_interface_, 71 &dispatcher_, 72 &metrics_, 73 &manager_, 74 manager_.wifi_provider(), 75 ssid_, 76 kModeManaged, 77 kSecurityWep, 78 false)), 79 eap_wifi_service_(new MockWiFiService(&control_interface_, 80 &dispatcher_, 81 &metrics_, 82 &manager_, 83 manager_.wifi_provider(), 84 ssid_, 85 kModeManaged, 86 kSecurity8021x, 87 false)), 88 eap_(new MockEapCredentials()), 89 #endif // DISABLE_WIFI 90 service_(new MockService(&control_interface_, 91 &dispatcher_, 92 &metrics_, 93 &manager_)) {} 94 95 virtual ~MetricsTest() {} 96 97 virtual void SetUp() { 98 metrics_.set_library(&library_); 99 #if !defined(DISABLE_WIFI) 100 eap_wifi_service_->eap_.reset(eap_); // Passes ownership. 101 #endif // DISABLE_WIFI 102 metrics_.collect_bootstats_ = false; 103 } 104 105 protected: 106 void ExpectCommonPostReady(Metrics::WiFiApMode ap_mode, 107 Metrics::WiFiChannel channel, 108 Metrics::WiFiNetworkPhyMode mode, 109 Metrics::WiFiSecurity security, 110 int signal_strength) { 111 EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.ApMode", 112 ap_mode, 113 Metrics::kWiFiApModeMax)); 114 EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.Channel", 115 channel, 116 Metrics::kMetricNetworkChannelMax)); 117 EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.PhyMode", 118 mode, 119 Metrics::kWiFiNetworkPhyModeMax)); 120 EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.Security", 121 security, 122 Metrics::kWiFiSecurityMax)); 123 EXPECT_CALL(library_, 124 SendToUMA("Network.Shill.Wifi.SignalStrength", 125 signal_strength, 126 Metrics::kMetricNetworkSignalStrengthMin, 127 Metrics::kMetricNetworkSignalStrengthMax, 128 Metrics::kMetricNetworkSignalStrengthNumBuckets)); 129 } 130 131 MockControl control_interface_; 132 MockEventDispatcher dispatcher_; 133 MockManager manager_; 134 Metrics metrics_; // This must be destroyed after all |service_|s. 135 MetricsLibraryMock library_; 136 #if !defined(DISABLE_WIFI) 137 const std::vector<uint8_t> ssid_; 138 scoped_refptr<MockWiFiService> open_wifi_service_; 139 scoped_refptr<MockWiFiService> wep_wifi_service_; 140 scoped_refptr<MockWiFiService> eap_wifi_service_; 141 MockEapCredentials* eap_; // Owned by |eap_wifi_service_|. 142 #endif // DISABLE_WIFI 143 scoped_refptr<MockService> service_; 144 }; 145 146 TEST_F(MetricsTest, TimeToConfig) { 147 EXPECT_CALL(library_, SendToUMA("Network.Shill.Unknown.TimeToConfig", 148 Ge(0), 149 Metrics::kTimerHistogramMillisecondsMin, 150 Metrics::kTimerHistogramMillisecondsMax, 151 Metrics::kTimerHistogramNumBuckets)); 152 metrics_.NotifyServiceStateChanged(*service_, Service::kStateConfiguring); 153 metrics_.NotifyServiceStateChanged(*service_, Service::kStateConnected); 154 } 155 156 TEST_F(MetricsTest, TimeToPortal) { 157 EXPECT_CALL(library_, SendToUMA("Network.Shill.Unknown.TimeToPortal", 158 Ge(0), 159 Metrics::kTimerHistogramMillisecondsMin, 160 Metrics::kTimerHistogramMillisecondsMax, 161 Metrics::kTimerHistogramNumBuckets)); 162 metrics_.NotifyServiceStateChanged(*service_, Service::kStateConnected); 163 metrics_.NotifyServiceStateChanged(*service_, Service::kStatePortal); 164 } 165 166 TEST_F(MetricsTest, TimeToOnline) { 167 EXPECT_CALL(library_, SendToUMA("Network.Shill.Unknown.TimeToOnline", 168 Ge(0), 169 Metrics::kTimerHistogramMillisecondsMin, 170 Metrics::kTimerHistogramMillisecondsMax, 171 Metrics::kTimerHistogramNumBuckets)); 172 metrics_.NotifyServiceStateChanged(*service_, Service::kStateConnected); 173 metrics_.NotifyServiceStateChanged(*service_, Service::kStateOnline); 174 } 175 176 TEST_F(MetricsTest, ServiceFailure) { 177 EXPECT_CALL(*service_, failure()) 178 .WillRepeatedly(Return(Service::kFailureBadPassphrase)); 179 EXPECT_CALL(library_, 180 SendEnumToUMA(Metrics::kMetricNetworkServiceErrors, 181 Metrics::kNetworkServiceErrorBadPassphrase, 182 Metrics::kNetworkServiceErrorMax)); 183 metrics_.NotifyServiceStateChanged(*service_, Service::kStateFailure); 184 } 185 186 #if !defined(DISABLE_WIFI) 187 TEST_F(MetricsTest, WiFiServiceTimeToJoin) { 188 EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.TimeToJoin", 189 Ge(0), 190 Metrics::kTimerHistogramMillisecondsMin, 191 Metrics::kTimerHistogramMillisecondsMax, 192 Metrics::kTimerHistogramNumBuckets)); 193 metrics_.NotifyServiceStateChanged(*open_wifi_service_, 194 Service::kStateAssociating); 195 metrics_.NotifyServiceStateChanged(*open_wifi_service_, 196 Service::kStateConfiguring); 197 } 198 199 TEST_F(MetricsTest, WiFiServicePostReady) { 200 base::TimeDelta non_zero_time_delta = base::TimeDelta::FromMilliseconds(1); 201 chromeos_metrics::TimerMock* mock_time_resume_to_ready_timer = 202 new chromeos_metrics::TimerMock; 203 metrics_.set_time_resume_to_ready_timer(mock_time_resume_to_ready_timer); 204 205 const int kStrength = -42; 206 ExpectCommonPostReady(Metrics::kWiFiApModeManaged, 207 Metrics::kWiFiChannel2412, 208 Metrics::kWiFiNetworkPhyMode11a, 209 Metrics::kWiFiSecurityWep, 210 -kStrength); 211 EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.TimeResumeToReady", 212 _, _, _, _)).Times(0); 213 EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.EapOuterProtocol", 214 _, _)).Times(0); 215 EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.EapInnerProtocol", 216 _, _)).Times(0); 217 wep_wifi_service_->frequency_ = 2412; 218 wep_wifi_service_->physical_mode_ = Metrics::kWiFiNetworkPhyMode11a; 219 wep_wifi_service_->raw_signal_strength_ = kStrength; 220 metrics_.NotifyServiceStateChanged(*wep_wifi_service_, 221 Service::kStateConnected); 222 Mock::VerifyAndClearExpectations(&library_); 223 224 // Simulate a system suspend, resume and an AP reconnect. 225 ExpectCommonPostReady(Metrics::kWiFiApModeManaged, 226 Metrics::kWiFiChannel2412, 227 Metrics::kWiFiNetworkPhyMode11a, 228 Metrics::kWiFiSecurityWep, 229 -kStrength); 230 EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.TimeResumeToReady", 231 Ge(0), 232 Metrics::kTimerHistogramMillisecondsMin, 233 Metrics::kTimerHistogramMillisecondsMax, 234 Metrics::kTimerHistogramNumBuckets)); 235 EXPECT_CALL(*mock_time_resume_to_ready_timer, GetElapsedTime(_)). 236 WillOnce(DoAll(SetArgumentPointee<0>(non_zero_time_delta), Return(true))); 237 metrics_.NotifySuspendDone(); 238 metrics_.NotifyServiceStateChanged(*wep_wifi_service_, 239 Service::kStateConnected); 240 Mock::VerifyAndClearExpectations(&library_); 241 Mock::VerifyAndClearExpectations(mock_time_resume_to_ready_timer); 242 243 // Make sure subsequent connects do not count towards TimeResumeToReady. 244 ExpectCommonPostReady(Metrics::kWiFiApModeManaged, 245 Metrics::kWiFiChannel2412, 246 Metrics::kWiFiNetworkPhyMode11a, 247 Metrics::kWiFiSecurityWep, 248 -kStrength); 249 EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.TimeResumeToReady", 250 _, _, _, _)).Times(0); 251 metrics_.NotifyServiceStateChanged(*wep_wifi_service_, 252 Service::kStateConnected); 253 } 254 255 TEST_F(MetricsTest, WiFiServicePostReadyEAP) { 256 const int kStrength = -42; 257 ExpectCommonPostReady(Metrics::kWiFiApModeManaged, 258 Metrics::kWiFiChannel2412, 259 Metrics::kWiFiNetworkPhyMode11a, 260 Metrics::kWiFiSecurity8021x, 261 -kStrength); 262 eap_wifi_service_->frequency_ = 2412; 263 eap_wifi_service_->physical_mode_ = Metrics::kWiFiNetworkPhyMode11a; 264 eap_wifi_service_->raw_signal_strength_ = kStrength; 265 EXPECT_CALL(*eap_, OutputConnectionMetrics(&metrics_, Technology::kWifi)); 266 metrics_.NotifyServiceStateChanged(*eap_wifi_service_, 267 Service::kStateConnected); 268 } 269 270 TEST_F(MetricsTest, WiFiServicePostReadyAdHoc) { 271 auto adhoc_wifi_service( 272 make_scoped_refptr(new MockWiFiService(&control_interface_, 273 &dispatcher_, 274 &metrics_, 275 &manager_, 276 manager_.wifi_provider(), 277 ssid_, 278 kModeAdhoc, 279 kSecurityNone, 280 false))); 281 const int kStrength = -42; 282 ExpectCommonPostReady(Metrics::kWiFiApModeAdHoc, 283 Metrics::kWiFiChannel2412, 284 Metrics::kWiFiNetworkPhyMode11b, 285 Metrics::kWiFiSecurityNone, 286 -kStrength); 287 adhoc_wifi_service->frequency_ = 2412; 288 adhoc_wifi_service->physical_mode_ = Metrics::kWiFiNetworkPhyMode11b; 289 adhoc_wifi_service->raw_signal_strength_ = kStrength; 290 metrics_.NotifyServiceStateChanged(*adhoc_wifi_service, 291 Service::kStateConnected); 292 } 293 #endif // DISABLE_WIFI 294 295 TEST_F(MetricsTest, FrequencyToChannel) { 296 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(2411)); 297 EXPECT_EQ(Metrics::kWiFiChannel2412, metrics_.WiFiFrequencyToChannel(2412)); 298 EXPECT_EQ(Metrics::kWiFiChannel2472, metrics_.WiFiFrequencyToChannel(2472)); 299 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(2473)); 300 EXPECT_EQ(Metrics::kWiFiChannel2484, metrics_.WiFiFrequencyToChannel(2484)); 301 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5169)); 302 EXPECT_EQ(Metrics::kWiFiChannel5170, metrics_.WiFiFrequencyToChannel(5170)); 303 EXPECT_EQ(Metrics::kWiFiChannel5190, metrics_.WiFiFrequencyToChannel(5190)); 304 EXPECT_EQ(Metrics::kWiFiChannel5180, metrics_.WiFiFrequencyToChannel(5180)); 305 EXPECT_EQ(Metrics::kWiFiChannel5200, metrics_.WiFiFrequencyToChannel(5200)); 306 EXPECT_EQ(Metrics::kWiFiChannel5230, metrics_.WiFiFrequencyToChannel(5230)); 307 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5231)); 308 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5239)); 309 EXPECT_EQ(Metrics::kWiFiChannel5240, metrics_.WiFiFrequencyToChannel(5240)); 310 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5241)); 311 EXPECT_EQ(Metrics::kWiFiChannel5320, metrics_.WiFiFrequencyToChannel(5320)); 312 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5321)); 313 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5499)); 314 EXPECT_EQ(Metrics::kWiFiChannel5500, metrics_.WiFiFrequencyToChannel(5500)); 315 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5501)); 316 EXPECT_EQ(Metrics::kWiFiChannel5700, metrics_.WiFiFrequencyToChannel(5700)); 317 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5701)); 318 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5744)); 319 EXPECT_EQ(Metrics::kWiFiChannel5745, metrics_.WiFiFrequencyToChannel(5745)); 320 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5746)); 321 EXPECT_EQ(Metrics::kWiFiChannel5825, metrics_.WiFiFrequencyToChannel(5825)); 322 EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5826)); 323 } 324 325 TEST_F(MetricsTest, TimeOnlineTimeToDrop) { 326 chromeos_metrics::TimerMock* mock_time_online_timer = 327 new chromeos_metrics::TimerMock; 328 metrics_.set_time_online_timer(mock_time_online_timer); 329 chromeos_metrics::TimerMock* mock_time_to_drop_timer = 330 new chromeos_metrics::TimerMock; 331 metrics_.set_time_to_drop_timer(mock_time_to_drop_timer); 332 scoped_refptr<MockService> wifi_service = 333 new MockService(&control_interface_, &dispatcher_, &metrics_, &manager_); 334 EXPECT_CALL(*service_, technology()). 335 WillOnce(Return(Technology::kEthernet)); 336 EXPECT_CALL(*wifi_service, technology()). 337 WillOnce(Return(Technology::kWifi)); 338 EXPECT_CALL(library_, SendToUMA("Network.Shill.Ethernet.TimeOnline", 339 Ge(0), 340 Metrics::kMetricTimeOnlineSecondsMin, 341 Metrics::kMetricTimeOnlineSecondsMax, 342 Metrics::kTimerHistogramNumBuckets)); 343 EXPECT_CALL(library_, SendToUMA(Metrics::kMetricTimeToDropSeconds, 344 Ge(0), 345 Metrics::kMetricTimeToDropSecondsMin, 346 Metrics::kMetricTimeToDropSecondsMax, 347 Metrics::kTimerHistogramNumBuckets)).Times(0); 348 EXPECT_CALL(*mock_time_online_timer, Start()).Times(2); 349 EXPECT_CALL(*mock_time_to_drop_timer, Start()); 350 metrics_.NotifyDefaultServiceChanged(service_.get()); 351 metrics_.NotifyDefaultServiceChanged(wifi_service.get()); 352 353 EXPECT_CALL(*mock_time_online_timer, Start()); 354 EXPECT_CALL(*mock_time_to_drop_timer, Start()).Times(0); 355 EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.TimeOnline", 356 Ge(0), 357 Metrics::kMetricTimeOnlineSecondsMin, 358 Metrics::kMetricTimeOnlineSecondsMax, 359 Metrics::kTimerHistogramNumBuckets)); 360 EXPECT_CALL(library_, SendToUMA(Metrics::kMetricTimeToDropSeconds, 361 Ge(0), 362 Metrics::kMetricTimeToDropSecondsMin, 363 Metrics::kMetricTimeToDropSecondsMax, 364 Metrics::kTimerHistogramNumBuckets)); 365 metrics_.NotifyDefaultServiceChanged(nullptr); 366 } 367 368 TEST_F(MetricsTest, Disconnect) { 369 EXPECT_CALL(*service_, technology()). 370 WillRepeatedly(Return(Technology::kWifi)); 371 EXPECT_CALL(*service_, explicitly_disconnected()). 372 WillOnce(Return(false)); 373 EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.Disconnect", 374 false, 375 Metrics::kMetricDisconnectMin, 376 Metrics::kMetricDisconnectMax, 377 Metrics::kMetricDisconnectNumBuckets)); 378 metrics_.NotifyServiceDisconnect(*service_); 379 380 EXPECT_CALL(*service_, explicitly_disconnected()). 381 WillOnce(Return(true)); 382 EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.Disconnect", 383 true, 384 Metrics::kMetricDisconnectMin, 385 Metrics::kMetricDisconnectMax, 386 Metrics::kMetricDisconnectNumBuckets)); 387 metrics_.NotifyServiceDisconnect(*service_); 388 } 389 390 TEST_F(MetricsTest, PortalDetectionResultToEnum) { 391 ConnectivityTrial::Result trial_result(ConnectivityTrial::kPhaseDNS, 392 ConnectivityTrial::kStatusFailure); 393 PortalDetector::Result result(trial_result, 0, true); 394 395 EXPECT_EQ(Metrics::kPortalResultDNSFailure, 396 Metrics::PortalDetectionResultToEnum(result)); 397 398 result.trial_result.phase = ConnectivityTrial::kPhaseDNS; 399 result.trial_result.status = ConnectivityTrial::kStatusTimeout; 400 EXPECT_EQ(Metrics::kPortalResultDNSTimeout, 401 Metrics::PortalDetectionResultToEnum(result)); 402 403 result.trial_result.phase = ConnectivityTrial::kPhaseConnection; 404 result.trial_result.status = ConnectivityTrial::kStatusFailure; 405 EXPECT_EQ(Metrics::kPortalResultConnectionFailure, 406 Metrics::PortalDetectionResultToEnum(result)); 407 408 result.trial_result.phase = ConnectivityTrial::kPhaseConnection; 409 result.trial_result.status = ConnectivityTrial::kStatusTimeout; 410 EXPECT_EQ(Metrics::kPortalResultConnectionTimeout, 411 Metrics::PortalDetectionResultToEnum(result)); 412 413 result.trial_result.phase = ConnectivityTrial::kPhaseHTTP; 414 result.trial_result.status = ConnectivityTrial::kStatusFailure; 415 EXPECT_EQ(Metrics::kPortalResultHTTPFailure, 416 Metrics::PortalDetectionResultToEnum(result)); 417 418 result.trial_result.phase = ConnectivityTrial::kPhaseHTTP; 419 result.trial_result.status = ConnectivityTrial::kStatusTimeout; 420 EXPECT_EQ(Metrics::kPortalResultHTTPTimeout, 421 Metrics::PortalDetectionResultToEnum(result)); 422 423 result.trial_result.phase = ConnectivityTrial::kPhaseContent; 424 result.trial_result.status = ConnectivityTrial::kStatusSuccess; 425 EXPECT_EQ(Metrics::kPortalResultSuccess, 426 Metrics::PortalDetectionResultToEnum(result)); 427 428 result.trial_result.phase = ConnectivityTrial::kPhaseContent; 429 result.trial_result.status = ConnectivityTrial::kStatusFailure; 430 EXPECT_EQ(Metrics::kPortalResultContentFailure, 431 Metrics::PortalDetectionResultToEnum(result)); 432 433 result.trial_result.phase = ConnectivityTrial::kPhaseContent; 434 result.trial_result.status = ConnectivityTrial::kStatusTimeout; 435 EXPECT_EQ(Metrics::kPortalResultContentTimeout, 436 Metrics::PortalDetectionResultToEnum(result)); 437 438 result.trial_result.phase = ConnectivityTrial::kPhaseUnknown; 439 result.trial_result.status = ConnectivityTrial::kStatusFailure; 440 EXPECT_EQ(Metrics::kPortalResultUnknown, 441 Metrics::PortalDetectionResultToEnum(result)); 442 } 443 444 TEST_F(MetricsTest, TimeToConnect) { 445 EXPECT_CALL(library_, 446 SendToUMA("Network.Shill.Cellular.TimeToConnect", 447 Ge(0), 448 Metrics::kMetricTimeToConnectMillisecondsMin, 449 Metrics::kMetricTimeToConnectMillisecondsMax, 450 Metrics::kMetricTimeToConnectMillisecondsNumBuckets)); 451 const int kInterfaceIndex = 1; 452 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 453 metrics_.NotifyDeviceConnectStarted(kInterfaceIndex, false); 454 metrics_.NotifyDeviceConnectFinished(kInterfaceIndex); 455 } 456 457 TEST_F(MetricsTest, TimeToDisable) { 458 EXPECT_CALL(library_, 459 SendToUMA("Network.Shill.Cellular.TimeToDisable", 460 Ge(0), 461 Metrics::kMetricTimeToDisableMillisecondsMin, 462 Metrics::kMetricTimeToDisableMillisecondsMax, 463 Metrics::kMetricTimeToDisableMillisecondsNumBuckets)); 464 const int kInterfaceIndex = 1; 465 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 466 metrics_.NotifyDeviceDisableStarted(kInterfaceIndex); 467 metrics_.NotifyDeviceDisableFinished(kInterfaceIndex); 468 } 469 470 TEST_F(MetricsTest, TimeToEnable) { 471 EXPECT_CALL(library_, 472 SendToUMA("Network.Shill.Cellular.TimeToEnable", 473 Ge(0), 474 Metrics::kMetricTimeToEnableMillisecondsMin, 475 Metrics::kMetricTimeToEnableMillisecondsMax, 476 Metrics::kMetricTimeToEnableMillisecondsNumBuckets)); 477 const int kInterfaceIndex = 1; 478 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 479 metrics_.NotifyDeviceEnableStarted(kInterfaceIndex); 480 metrics_.NotifyDeviceEnableFinished(kInterfaceIndex); 481 } 482 483 TEST_F(MetricsTest, TimeToInitialize) { 484 EXPECT_CALL(library_, 485 SendToUMA("Network.Shill.Cellular.TimeToInitialize", 486 Ge(0), 487 Metrics::kMetricTimeToInitializeMillisecondsMin, 488 Metrics::kMetricTimeToInitializeMillisecondsMax, 489 Metrics::kMetricTimeToInitializeMillisecondsNumBuckets)); 490 const int kInterfaceIndex = 1; 491 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 492 metrics_.NotifyDeviceInitialized(kInterfaceIndex); 493 } 494 495 TEST_F(MetricsTest, TimeToScan) { 496 EXPECT_CALL(library_, 497 SendToUMA("Network.Shill.Cellular.TimeToScan", 498 Ge(0), 499 Metrics::kMetricTimeToScanMillisecondsMin, 500 Metrics::kMetricTimeToScanMillisecondsMax, 501 Metrics::kMetricTimeToScanMillisecondsNumBuckets)); 502 const int kInterfaceIndex = 1; 503 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 504 metrics_.NotifyDeviceScanStarted(kInterfaceIndex); 505 metrics_.NotifyDeviceScanFinished(kInterfaceIndex); 506 } 507 508 TEST_F(MetricsTest, TimeToScanAndConnect) { 509 EXPECT_CALL(library_, 510 SendToUMA("Network.Shill.Wifi.TimeToScan", 511 Ge(0), 512 Metrics::kMetricTimeToScanMillisecondsMin, 513 Metrics::kMetricTimeToScanMillisecondsMax, 514 Metrics::kMetricTimeToScanMillisecondsNumBuckets)); 515 const int kInterfaceIndex = 1; 516 metrics_.RegisterDevice(kInterfaceIndex, Technology::kWifi); 517 metrics_.NotifyDeviceScanStarted(kInterfaceIndex); 518 metrics_.NotifyDeviceScanFinished(kInterfaceIndex); 519 520 EXPECT_CALL(library_, 521 SendToUMA("Network.Shill.Wifi.TimeToConnect", 522 Ge(0), 523 Metrics::kMetricTimeToConnectMillisecondsMin, 524 Metrics::kMetricTimeToConnectMillisecondsMax, 525 Metrics::kMetricTimeToConnectMillisecondsNumBuckets)); 526 EXPECT_CALL(library_, 527 SendToUMA("Network.Shill.Wifi.TimeToScanAndConnect", 528 Ge(0), 529 Metrics::kMetricTimeToScanMillisecondsMin, 530 Metrics::kMetricTimeToScanMillisecondsMax + 531 Metrics::kMetricTimeToConnectMillisecondsMax, 532 Metrics::kMetricTimeToScanMillisecondsNumBuckets + 533 Metrics::kMetricTimeToConnectMillisecondsNumBuckets)); 534 metrics_.NotifyDeviceConnectStarted(kInterfaceIndex, false); 535 metrics_.NotifyDeviceConnectFinished(kInterfaceIndex); 536 } 537 538 TEST_F(MetricsTest, SpontaneousConnect) { 539 const int kInterfaceIndex = 1; 540 metrics_.RegisterDevice(kInterfaceIndex, Technology::kWifi); 541 EXPECT_CALL(library_, 542 SendToUMA("Network.Shill.Wifi.TimeToConnect", 543 Ge(0), 544 Metrics::kMetricTimeToConnectMillisecondsMin, 545 Metrics::kMetricTimeToConnectMillisecondsMax, 546 Metrics::kMetricTimeToConnectMillisecondsNumBuckets)).Times(0); 547 EXPECT_CALL(library_, 548 SendToUMA("Network.Shill.Wifi.TimeToScanAndConnect", 549 Ge(0), 550 Metrics::kMetricTimeToScanMillisecondsMin, 551 Metrics::kMetricTimeToScanMillisecondsMax + 552 Metrics::kMetricTimeToConnectMillisecondsMax, 553 Metrics::kMetricTimeToScanMillisecondsNumBuckets + 554 Metrics::kMetricTimeToConnectMillisecondsNumBuckets)). 555 Times(0); 556 // This simulates a connection that is not scan-based. 557 metrics_.NotifyDeviceConnectFinished(kInterfaceIndex); 558 } 559 560 TEST_F(MetricsTest, ResetConnectTimer) { 561 const int kInterfaceIndex = 1; 562 metrics_.RegisterDevice(kInterfaceIndex, Technology::kWifi); 563 chromeos_metrics::TimerReporterMock* mock_scan_timer = 564 new chromeos_metrics::TimerReporterMock; 565 metrics_.set_time_to_scan_timer(kInterfaceIndex, mock_scan_timer); 566 chromeos_metrics::TimerReporterMock* mock_connect_timer = 567 new chromeos_metrics::TimerReporterMock; 568 metrics_.set_time_to_connect_timer(kInterfaceIndex, mock_connect_timer); 569 chromeos_metrics::TimerReporterMock* mock_scan_connect_timer = 570 new chromeos_metrics::TimerReporterMock; 571 metrics_.set_time_to_scan_connect_timer(kInterfaceIndex, 572 mock_scan_connect_timer); 573 EXPECT_CALL(*mock_scan_timer, Reset()).Times(0); 574 EXPECT_CALL(*mock_connect_timer, Reset()); 575 EXPECT_CALL(*mock_scan_connect_timer, Reset()); 576 metrics_.ResetConnectTimer(kInterfaceIndex); 577 } 578 579 TEST_F(MetricsTest, TimeToScanNoStart) { 580 EXPECT_CALL(library_, 581 SendToUMA("Network.Shill.Cellular.TimeToScan", _, _, _, _)).Times(0); 582 const int kInterfaceIndex = 1; 583 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 584 metrics_.NotifyDeviceScanFinished(kInterfaceIndex); 585 } 586 587 TEST_F(MetricsTest, TimeToScanIgnore) { 588 // Make sure TimeToScan is not sent if the elapsed time exceeds the max 589 // value. This simulates the case where the device is in an area with no 590 // service. 591 const int kInterfaceIndex = 1; 592 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 593 base::TimeDelta large_time_delta = 594 base::TimeDelta::FromMilliseconds( 595 Metrics::kMetricTimeToScanMillisecondsMax + 1); 596 chromeos_metrics::TimerReporterMock* mock_time_to_scan_timer = 597 new chromeos_metrics::TimerReporterMock; 598 metrics_.set_time_to_scan_timer(kInterfaceIndex, mock_time_to_scan_timer); 599 EXPECT_CALL(*mock_time_to_scan_timer, Stop()).WillOnce(Return(true)); 600 EXPECT_CALL(*mock_time_to_scan_timer, GetElapsedTime(_)). 601 WillOnce(DoAll(SetArgumentPointee<0>(large_time_delta), Return(true))); 602 EXPECT_CALL(library_, SendToUMA(_, _, _, _, _)).Times(0); 603 metrics_.NotifyDeviceScanStarted(kInterfaceIndex); 604 metrics_.NotifyDeviceScanFinished(kInterfaceIndex); 605 } 606 607 TEST_F(MetricsTest, Cellular3GPPRegistrationDelayedDropPosted) { 608 EXPECT_CALL(library_, 609 SendEnumToUMA(Metrics::kMetricCellular3GPPRegistrationDelayedDrop, 610 Metrics::kCellular3GPPRegistrationDelayedDropPosted, 611 Metrics::kCellular3GPPRegistrationDelayedDropMax)); 612 metrics_.Notify3GPPRegistrationDelayedDropPosted(); 613 Mock::VerifyAndClearExpectations(&library_); 614 615 EXPECT_CALL(library_, 616 SendEnumToUMA(Metrics::kMetricCellular3GPPRegistrationDelayedDrop, 617 Metrics::kCellular3GPPRegistrationDelayedDropCanceled, 618 Metrics::kCellular3GPPRegistrationDelayedDropMax)); 619 metrics_.Notify3GPPRegistrationDelayedDropCanceled(); 620 } 621 622 TEST_F(MetricsTest, CellularAutoConnect) { 623 EXPECT_CALL(library_, 624 SendToUMA("Network.Shill.Cellular.TimeToConnect", 625 Ge(0), 626 Metrics::kMetricTimeToConnectMillisecondsMin, 627 Metrics::kMetricTimeToConnectMillisecondsMax, 628 Metrics::kMetricTimeToConnectMillisecondsNumBuckets)); 629 EXPECT_CALL(library_, 630 SendToUMA(Metrics::kMetricCellularAutoConnectTotalTime, 631 Ge(0), 632 Metrics::kMetricCellularAutoConnectTotalTimeMin, 633 Metrics::kMetricCellularAutoConnectTotalTimeMax, 634 Metrics::kMetricCellularAutoConnectTotalTimeNumBuckets)); 635 EXPECT_CALL(library_, 636 SendToUMA(Metrics::kMetricCellularAutoConnectTries, 637 2, 638 Metrics::kMetricCellularAutoConnectTriesMin, 639 Metrics::kMetricCellularAutoConnectTriesMax, 640 Metrics::kMetricCellularAutoConnectTriesNumBuckets)); 641 const int kInterfaceIndex = 1; 642 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 643 metrics_.NotifyDeviceConnectStarted(kInterfaceIndex, true); 644 metrics_.NotifyDeviceConnectStarted(kInterfaceIndex, true); 645 metrics_.NotifyDeviceConnectFinished(kInterfaceIndex); 646 } 647 648 TEST_F(MetricsTest, CellularDrop) { 649 const char* kUMATechnologyStrings[] = { 650 kNetworkTechnology1Xrtt, 651 kNetworkTechnologyEdge, 652 kNetworkTechnologyEvdo, 653 kNetworkTechnologyGprs, 654 kNetworkTechnologyGsm, 655 kNetworkTechnologyHspa, 656 kNetworkTechnologyHspaPlus, 657 kNetworkTechnologyLte, 658 kNetworkTechnologyUmts, 659 "Unknown" }; 660 661 const uint16_t signal_strength = 100; 662 const int kInterfaceIndex = 1; 663 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 664 for (size_t index = 0; index < arraysize(kUMATechnologyStrings); ++index) { 665 EXPECT_CALL(library_, 666 SendEnumToUMA(Metrics::kMetricCellularDrop, 667 index, 668 Metrics::kCellularDropTechnologyMax)); 669 EXPECT_CALL(library_, 670 SendToUMA(Metrics::kMetricCellularSignalStrengthBeforeDrop, 671 signal_strength, 672 Metrics::kMetricCellularSignalStrengthBeforeDropMin, 673 Metrics::kMetricCellularSignalStrengthBeforeDropMax, 674 Metrics::kMetricCellularSignalStrengthBeforeDropNumBuckets)); 675 metrics_.NotifyCellularDeviceDrop(kUMATechnologyStrings[index], 676 signal_strength); 677 Mock::VerifyAndClearExpectations(&library_); 678 } 679 } 680 681 TEST_F(MetricsTest, CellularDeviceFailure) { 682 EXPECT_CALL(library_, SendEnumToUMA(Metrics::kMetricCellularFailure, 683 Metrics::kMetricCellularConnectionFailure, 684 Metrics::kMetricCellularMaxFailure)); 685 metrics_.NotifyCellularDeviceConnectionFailure(); 686 } 687 688 TEST_F(MetricsTest, CellularOutOfCreditsReason) { 689 EXPECT_CALL(library_, 690 SendEnumToUMA(Metrics::kMetricCellularOutOfCreditsReason, 691 Metrics::kCellularOutOfCreditsReasonConnectDisconnectLoop, 692 Metrics::kCellularOutOfCreditsReasonMax)); 693 metrics_.NotifyCellularOutOfCredits( 694 Metrics::kCellularOutOfCreditsReasonConnectDisconnectLoop); 695 Mock::VerifyAndClearExpectations(&library_); 696 697 EXPECT_CALL(library_, 698 SendEnumToUMA(Metrics::kMetricCellularOutOfCreditsReason, 699 Metrics::kCellularOutOfCreditsReasonTxCongested, 700 Metrics::kCellularOutOfCreditsReasonMax)); 701 metrics_.NotifyCellularOutOfCredits( 702 Metrics::kCellularOutOfCreditsReasonTxCongested); 703 Mock::VerifyAndClearExpectations(&library_); 704 705 EXPECT_CALL(library_, 706 SendEnumToUMA(Metrics::kMetricCellularOutOfCreditsReason, 707 Metrics::kCellularOutOfCreditsReasonElongatedTimeWait, 708 Metrics::kCellularOutOfCreditsReasonMax)); 709 metrics_.NotifyCellularOutOfCredits( 710 Metrics::kCellularOutOfCreditsReasonElongatedTimeWait); 711 } 712 713 TEST_F(MetricsTest, CorruptedProfile) { 714 EXPECT_CALL(library_, SendEnumToUMA(Metrics::kMetricCorruptedProfile, 715 Metrics::kCorruptedProfile, 716 Metrics::kCorruptedProfileMax)); 717 metrics_.NotifyCorruptedProfile(); 718 } 719 720 TEST_F(MetricsTest, Logging) { 721 NiceScopedMockLog log; 722 const int kVerboseLevel5 = -5; 723 ScopeLogger::GetInstance()->EnableScopesByName("+metrics"); 724 ScopeLogger::GetInstance()->set_verbose_level(-kVerboseLevel5); 725 726 const string kEnumName("fake-enum"); 727 const int kEnumValue = 1; 728 const int kEnumMax = 12; 729 EXPECT_CALL(log, Log(kVerboseLevel5, _, 730 "(metrics) Sending enum fake-enum with value 1.")); 731 EXPECT_CALL(library_, SendEnumToUMA(kEnumName, kEnumValue, kEnumMax)); 732 metrics_.SendEnumToUMA(kEnumName, kEnumValue, kEnumMax); 733 734 const string kMetricName("fake-metric"); 735 const int kMetricValue = 2; 736 const int kHistogramMin = 0; 737 const int kHistogramMax = 100; 738 const int kHistogramBuckets = 10; 739 EXPECT_CALL(log, Log(kVerboseLevel5, _, 740 "(metrics) Sending metric fake-metric with value 2.")); 741 EXPECT_CALL(library_, SendToUMA(kMetricName, kMetricValue, kHistogramMin, 742 kHistogramMax, kHistogramBuckets)); 743 metrics_.SendToUMA(kMetricName, kMetricValue, 744 kHistogramMin, kHistogramMax, kHistogramBuckets); 745 746 ScopeLogger::GetInstance()->EnableScopesByName("-metrics"); 747 ScopeLogger::GetInstance()->set_verbose_level(0); 748 } 749 750 TEST_F(MetricsTest, NotifyServicesOnSameNetwork) { 751 EXPECT_CALL(library_, 752 SendToUMA(Metrics::kMetricServicesOnSameNetwork, 753 1, 754 Metrics::kMetricServicesOnSameNetworkMin, 755 Metrics::kMetricServicesOnSameNetworkMax, 756 Metrics::kMetricServicesOnSameNetworkNumBuckets)); 757 metrics_.NotifyServicesOnSameNetwork(1); 758 } 759 760 TEST_F(MetricsTest, NotifyUserInitiatedEvent) { 761 EXPECT_CALL(library_, 762 SendEnumToUMA(Metrics::kMetricUserInitiatedEvents, 763 Metrics::kUserInitiatedEventWifiScan, 764 Metrics::kUserInitiatedEventMax)); 765 metrics_.NotifyUserInitiatedEvent(Metrics::kUserInitiatedEventWifiScan); 766 } 767 768 TEST_F(MetricsTest, NotifyWifiTxBitrate) { 769 EXPECT_CALL(library_, 770 SendToUMA(Metrics::kMetricWifiTxBitrate, 771 1, 772 Metrics::kMetricWifiTxBitrateMin, 773 Metrics::kMetricWifiTxBitrateMax, 774 Metrics::kMetricWifiTxBitrateNumBuckets)); 775 metrics_.NotifyWifiTxBitrate(1); 776 } 777 778 TEST_F(MetricsTest, NotifyUserInitiatedConnectionResult) { 779 EXPECT_CALL(library_, 780 SendEnumToUMA(Metrics::kMetricWifiUserInitiatedConnectionResult, 781 Metrics::kUserInitiatedConnectionResultSuccess, 782 Metrics::kUserInitiatedConnectionResultMax)); 783 metrics_.NotifyUserInitiatedConnectionResult( 784 Metrics::kMetricWifiUserInitiatedConnectionResult, 785 Metrics::kUserInitiatedConnectionResultSuccess); 786 } 787 788 TEST_F(MetricsTest, NotifyFallbackDNSTestResult) { 789 EXPECT_CALL(library_, 790 SendEnumToUMA("Network.Shill.Wifi.FallbackDNSTestResult", 791 Metrics::kFallbackDNSTestResultSuccess, 792 Metrics::kFallbackDNSTestResultMax)); 793 metrics_.NotifyFallbackDNSTestResult(Technology::kWifi, 794 Metrics::kFallbackDNSTestResultSuccess); 795 } 796 797 TEST_F(MetricsTest, NotifyNetworkProblemDetected) { 798 EXPECT_CALL(library_, 799 SendEnumToUMA("Network.Shill.Wifi.NetworkProblemDetected", 800 Metrics::kNetworkProblemDNSFailure, 801 Metrics::kNetworkProblemMax)); 802 metrics_.NotifyNetworkProblemDetected(Technology::kWifi, 803 Metrics::kNetworkProblemDNSFailure); 804 } 805 806 TEST_F(MetricsTest, NotifyDhcpClientStatus) { 807 EXPECT_CALL(library_, 808 SendEnumToUMA("Network.Shill.DHCPClientStatus", 809 Metrics::kDhcpClientStatusReboot, 810 Metrics::kDhcpClientStatusMax)); 811 metrics_.NotifyDhcpClientStatus(Metrics::kDhcpClientStatusReboot); 812 } 813 814 TEST_F(MetricsTest, DeregisterDevice) { 815 const int kInterfaceIndex = 1; 816 metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 817 818 EXPECT_CALL(library_, 819 SendEnumToUMA("Network.Shill.DeviceRemovedEvent", 820 Metrics::kDeviceTechnologyTypeCellular, 821 Metrics::kDeviceTechnologyTypeMax)); 822 metrics_.DeregisterDevice(kInterfaceIndex); 823 } 824 825 TEST_F(MetricsTest, NotifyWakeOnWiFiFeaturesEnabledState) { 826 const Metrics::WakeOnWiFiFeaturesEnabledState state = 827 Metrics::kWakeOnWiFiFeaturesEnabledStateNone; 828 EXPECT_CALL( 829 library_, 830 SendEnumToUMA("Network.Shill.WiFi.WakeOnWiFiFeaturesEnabledState", state, 831 Metrics::kWakeOnWiFiFeaturesEnabledStateMax)); 832 metrics_.NotifyWakeOnWiFiFeaturesEnabledState(state); 833 } 834 835 TEST_F(MetricsTest, NotifyVerifyWakeOnWiFiSettingsResult) { 836 const Metrics::VerifyWakeOnWiFiSettingsResult result = 837 Metrics::kVerifyWakeOnWiFiSettingsResultSuccess; 838 EXPECT_CALL( 839 library_, 840 SendEnumToUMA("Network.Shill.WiFi.VerifyWakeOnWiFiSettingsResult", result, 841 Metrics::kVerifyWakeOnWiFiSettingsResultMax)); 842 metrics_.NotifyVerifyWakeOnWiFiSettingsResult(result); 843 } 844 845 TEST_F(MetricsTest, NotifyConnectedToServiceAfterWake) { 846 const Metrics::WiFiConnectionStatusAfterWake status = 847 Metrics::kWiFiConnetionStatusAfterWakeOnWiFiEnabledWakeConnected; 848 EXPECT_CALL(library_, 849 SendEnumToUMA("Network.Shill.WiFi.WiFiConnectionStatusAfterWake", 850 status, Metrics::kWiFiConnetionStatusAfterWakeMax)); 851 metrics_.NotifyConnectedToServiceAfterWake(status); 852 } 853 854 TEST_F(MetricsTest, NotifyWakeOnWiFiThrottled) { 855 EXPECT_FALSE(metrics_.wake_on_wifi_throttled_); 856 metrics_.NotifyWakeOnWiFiThrottled(); 857 EXPECT_TRUE(metrics_.wake_on_wifi_throttled_); 858 } 859 860 TEST_F(MetricsTest, NotifySuspendWithWakeOnWiFiEnabledDone) { 861 const Metrics::WakeOnWiFiThrottled result_true = 862 Metrics::kWakeOnWiFiThrottledTrue; 863 metrics_.wake_on_wifi_throttled_ = true; 864 EXPECT_CALL(library_, 865 SendEnumToUMA("Network.Shill.WiFi.WakeOnWiFiThrottled", 866 result_true, Metrics::kWakeOnWiFiThrottledMax)); 867 metrics_.NotifySuspendWithWakeOnWiFiEnabledDone(); 868 869 const Metrics::WakeOnWiFiThrottled result_false = 870 Metrics::kWakeOnWiFiThrottledFalse; 871 metrics_.wake_on_wifi_throttled_ = false; 872 EXPECT_CALL(library_, 873 SendEnumToUMA("Network.Shill.WiFi.WakeOnWiFiThrottled", 874 result_false, Metrics::kWakeOnWiFiThrottledMax)); 875 metrics_.NotifySuspendWithWakeOnWiFiEnabledDone(); 876 } 877 878 TEST_F(MetricsTest, NotifySuspendActionsCompleted_Success) { 879 base::TimeDelta non_zero_time_delta = base::TimeDelta::FromMilliseconds(1); 880 chromeos_metrics::TimerMock* mock_time_suspend_actions_timer = 881 new chromeos_metrics::TimerMock; 882 metrics_.set_time_suspend_actions_timer(mock_time_suspend_actions_timer); 883 metrics_.wake_reason_received_ = true; 884 EXPECT_CALL(*mock_time_suspend_actions_timer, GetElapsedTime(_)) 885 .WillOnce( 886 DoAll(SetArgumentPointee<0>(non_zero_time_delta), Return(true))); 887 EXPECT_CALL(*mock_time_suspend_actions_timer, HasStarted()) 888 .WillOnce(Return(true)); 889 EXPECT_CALL(library_, 890 SendToUMA(Metrics::kMetricSuspendActionTimeTaken, 891 non_zero_time_delta.InMilliseconds(), 892 Metrics::kMetricSuspendActionTimeTakenMillisecondsMin, 893 Metrics::kMetricSuspendActionTimeTakenMillisecondsMax, 894 Metrics::kTimerHistogramNumBuckets)); 895 EXPECT_CALL(library_, SendEnumToUMA(Metrics::kMetricSuspendActionResult, 896 Metrics::kSuspendActionResultSuccess, 897 Metrics::kSuspendActionResultMax)); 898 metrics_.NotifySuspendActionsCompleted(true); 899 EXPECT_FALSE(metrics_.wake_reason_received_); 900 } 901 902 TEST_F(MetricsTest, NotifySuspendActionsCompleted_Failure) { 903 base::TimeDelta non_zero_time_delta = base::TimeDelta::FromMilliseconds(1); 904 chromeos_metrics::TimerMock* mock_time_suspend_actions_timer = 905 new chromeos_metrics::TimerMock; 906 metrics_.set_time_suspend_actions_timer(mock_time_suspend_actions_timer); 907 metrics_.wake_reason_received_ = true; 908 EXPECT_CALL(*mock_time_suspend_actions_timer, GetElapsedTime(_)) 909 .WillOnce( 910 DoAll(SetArgumentPointee<0>(non_zero_time_delta), Return(true))); 911 EXPECT_CALL(*mock_time_suspend_actions_timer, HasStarted()) 912 .WillOnce(Return(true)); 913 EXPECT_CALL(library_, 914 SendToUMA(Metrics::kMetricSuspendActionTimeTaken, 915 non_zero_time_delta.InMilliseconds(), 916 Metrics::kMetricSuspendActionTimeTakenMillisecondsMin, 917 Metrics::kMetricSuspendActionTimeTakenMillisecondsMax, 918 Metrics::kTimerHistogramNumBuckets)); 919 EXPECT_CALL(library_, SendEnumToUMA(Metrics::kMetricSuspendActionResult, 920 Metrics::kSuspendActionResultFailure, 921 Metrics::kSuspendActionResultMax)); 922 metrics_.NotifySuspendActionsCompleted(false); 923 EXPECT_FALSE(metrics_.wake_reason_received_); 924 } 925 926 TEST_F(MetricsTest, NotifyDarkResumeActionsCompleted_Success) { 927 metrics_.num_scan_results_expected_in_dark_resume_ = 0; 928 base::TimeDelta non_zero_time_delta = base::TimeDelta::FromMilliseconds(1); 929 chromeos_metrics::TimerMock* mock_time_dark_resume_actions_timer = 930 new chromeos_metrics::TimerMock; 931 metrics_.set_time_dark_resume_actions_timer( 932 mock_time_dark_resume_actions_timer); 933 metrics_.wake_reason_received_ = true; 934 const int non_zero_num_retries = 3; 935 metrics_.dark_resume_scan_retries_ = non_zero_num_retries; 936 EXPECT_CALL(*mock_time_dark_resume_actions_timer, GetElapsedTime(_)) 937 .WillOnce( 938 DoAll(SetArgumentPointee<0>(non_zero_time_delta), Return(true))); 939 EXPECT_CALL(*mock_time_dark_resume_actions_timer, HasStarted()) 940 .WillOnce(Return(true)); 941 EXPECT_CALL( 942 library_, 943 SendToUMA(Metrics::kMetricDarkResumeActionTimeTaken, 944 non_zero_time_delta.InMilliseconds(), 945 Metrics::kMetricDarkResumeActionTimeTakenMillisecondsMin, 946 Metrics::kMetricDarkResumeActionTimeTakenMillisecondsMax, 947 Metrics::kTimerHistogramNumBuckets)); 948 EXPECT_CALL(library_, SendEnumToUMA(Metrics::kMetricDarkResumeActionResult, 949 Metrics::kDarkResumeActionResultSuccess, 950 Metrics::kDarkResumeActionResultMax)); 951 EXPECT_CALL( 952 library_, 953 SendEnumToUMA(Metrics::kMetricDarkResumeUnmatchedScanResultReceived, 954 Metrics::kDarkResumeUnmatchedScanResultsReceivedFalse, 955 Metrics::kDarkResumeUnmatchedScanResultsReceivedMax)); 956 EXPECT_CALL(library_, SendToUMA(Metrics::kMetricDarkResumeScanNumRetries, 957 non_zero_num_retries, 958 Metrics::kMetricDarkResumeScanNumRetriesMin, 959 Metrics::kMetricDarkResumeScanNumRetriesMax, 960 Metrics::kTimerHistogramNumBuckets)); 961 metrics_.NotifyDarkResumeActionsCompleted(true); 962 EXPECT_FALSE(metrics_.wake_reason_received_); 963 } 964 965 TEST_F(MetricsTest, NotifyDarkResumeActionsCompleted_Failure) { 966 metrics_.num_scan_results_expected_in_dark_resume_ = 0; 967 base::TimeDelta non_zero_time_delta = base::TimeDelta::FromMilliseconds(1); 968 chromeos_metrics::TimerMock* mock_time_dark_resume_actions_timer = 969 new chromeos_metrics::TimerMock; 970 metrics_.set_time_dark_resume_actions_timer( 971 mock_time_dark_resume_actions_timer); 972 metrics_.wake_reason_received_ = true; 973 const int non_zero_num_retries = 3; 974 metrics_.dark_resume_scan_retries_ = non_zero_num_retries; 975 EXPECT_CALL(*mock_time_dark_resume_actions_timer, GetElapsedTime(_)) 976 .WillOnce( 977 DoAll(SetArgumentPointee<0>(non_zero_time_delta), Return(true))); 978 EXPECT_CALL(*mock_time_dark_resume_actions_timer, HasStarted()) 979 .WillOnce(Return(true)); 980 EXPECT_CALL( 981 library_, 982 SendToUMA(Metrics::kMetricDarkResumeActionTimeTaken, 983 non_zero_time_delta.InMilliseconds(), 984 Metrics::kMetricDarkResumeActionTimeTakenMillisecondsMin, 985 Metrics::kMetricDarkResumeActionTimeTakenMillisecondsMax, 986 Metrics::kTimerHistogramNumBuckets)); 987 EXPECT_CALL(library_, SendEnumToUMA(Metrics::kMetricDarkResumeActionResult, 988 Metrics::kDarkResumeActionResultFailure, 989 Metrics::kDarkResumeActionResultMax)); 990 EXPECT_CALL( 991 library_, 992 SendEnumToUMA(Metrics::kMetricDarkResumeUnmatchedScanResultReceived, 993 Metrics::kDarkResumeUnmatchedScanResultsReceivedFalse, 994 Metrics::kDarkResumeUnmatchedScanResultsReceivedMax)); 995 EXPECT_CALL(library_, SendToUMA(Metrics::kMetricDarkResumeScanNumRetries, 996 non_zero_num_retries, 997 Metrics::kMetricDarkResumeScanNumRetriesMin, 998 Metrics::kMetricDarkResumeScanNumRetriesMax, 999 Metrics::kTimerHistogramNumBuckets)); 1000 metrics_.NotifyDarkResumeActionsCompleted(false); 1001 EXPECT_FALSE(metrics_.wake_reason_received_); 1002 } 1003 1004 TEST_F(MetricsTest, NotifySuspendActionsStarted) { 1005 metrics_.time_suspend_actions_timer->Stop(); 1006 metrics_.wake_on_wifi_throttled_ = true; 1007 metrics_.NotifySuspendActionsStarted(); 1008 EXPECT_TRUE(metrics_.time_suspend_actions_timer->HasStarted()); 1009 EXPECT_FALSE(metrics_.wake_on_wifi_throttled_); 1010 } 1011 1012 TEST_F(MetricsTest, NotifyDarkResumeActionsStarted) { 1013 metrics_.time_dark_resume_actions_timer->Stop(); 1014 metrics_.num_scan_results_expected_in_dark_resume_ = 2; 1015 metrics_.dark_resume_scan_retries_ = 3; 1016 metrics_.NotifyDarkResumeActionsStarted(); 1017 EXPECT_TRUE(metrics_.time_dark_resume_actions_timer->HasStarted()); 1018 EXPECT_EQ(0, metrics_.num_scan_results_expected_in_dark_resume_); 1019 EXPECT_EQ(0, metrics_.dark_resume_scan_retries_); 1020 } 1021 1022 TEST_F(MetricsTest, NotifyDarkResumeInitiateScan) { 1023 metrics_.num_scan_results_expected_in_dark_resume_ = 0; 1024 metrics_.NotifyDarkResumeInitiateScan(); 1025 EXPECT_EQ(1, metrics_.num_scan_results_expected_in_dark_resume_); 1026 } 1027 1028 TEST_F(MetricsTest, NotifyDarkResumeScanResultsReceived) { 1029 metrics_.num_scan_results_expected_in_dark_resume_ = 1; 1030 metrics_.NotifyDarkResumeScanResultsReceived(); 1031 EXPECT_EQ(0, metrics_.num_scan_results_expected_in_dark_resume_); 1032 } 1033 1034 TEST_F(MetricsTest, NotifyDarkResumeScanRetry) { 1035 const int initial_num_retries = 2; 1036 metrics_.dark_resume_scan_retries_ = initial_num_retries; 1037 metrics_.NotifyDarkResumeScanRetry(); 1038 EXPECT_EQ(initial_num_retries + 1, metrics_.dark_resume_scan_retries_); 1039 } 1040 1041 TEST_F(MetricsTest, NotifyBeforeSuspendActions_InDarkResume) { 1042 const bool in_dark_resume = true; 1043 bool is_connected; 1044 metrics_.dark_resume_scan_retries_ = 1; 1045 1046 is_connected = true; 1047 EXPECT_CALL(library_, 1048 SendEnumToUMA(Metrics::kMetricDarkResumeScanRetryResult, 1049 Metrics::kDarkResumeScanRetryResultConnected, 1050 Metrics::kDarkResumeScanRetryResultMax)); 1051 metrics_.NotifyBeforeSuspendActions(is_connected, in_dark_resume); 1052 1053 is_connected = false; 1054 EXPECT_CALL(library_, 1055 SendEnumToUMA(Metrics::kMetricDarkResumeScanRetryResult, 1056 Metrics::kDarkResumeScanRetryResultNotConnected, 1057 Metrics::kDarkResumeScanRetryResultMax)); 1058 metrics_.NotifyBeforeSuspendActions(is_connected, in_dark_resume); 1059 } 1060 1061 TEST_F(MetricsTest, NotifyBeforeSuspendActions_NotInDarkResume) { 1062 const bool in_dark_resume = false; 1063 bool is_connected; 1064 metrics_.dark_resume_scan_retries_ = 1; 1065 1066 is_connected = true; 1067 EXPECT_CALL(library_, SendEnumToUMA(_, _, _)).Times(0); 1068 metrics_.NotifyBeforeSuspendActions(is_connected, in_dark_resume); 1069 1070 is_connected = false; 1071 EXPECT_CALL(library_, SendEnumToUMA(_, _, _)).Times(0); 1072 metrics_.NotifyBeforeSuspendActions(is_connected, in_dark_resume); 1073 } 1074 1075 TEST_F(MetricsTest, NotifyConnectionDiagnosticsIssue_Success) { 1076 const string& issue = ConnectionDiagnostics::kIssueIPCollision; 1077 EXPECT_CALL(library_, 1078 SendEnumToUMA(Metrics::kMetricConnectionDiagnosticsIssue, 1079 Metrics::kConnectionDiagnosticsIssueIPCollision, 1080 Metrics::kConnectionDiagnosticsIssueMax)); 1081 metrics_.NotifyConnectionDiagnosticsIssue(issue); 1082 } 1083 1084 TEST_F(MetricsTest, NotifyConnectionDiagnosticsIssue_Failure) { 1085 const string& invalid_issue = "Invalid issue string."; 1086 EXPECT_CALL(library_, SendEnumToUMA(_, _, _)).Times(0); 1087 metrics_.NotifyConnectionDiagnosticsIssue(invalid_issue); 1088 } 1089 1090 #ifndef NDEBUG 1091 1092 typedef MetricsTest MetricsDeathTest; 1093 1094 TEST_F(MetricsDeathTest, PortalDetectionResultToEnumDNSSuccess) { 1095 PortalDetector::Result result( 1096 ConnectivityTrial::Result(ConnectivityTrial::kPhaseDNS, 1097 ConnectivityTrial::kStatusSuccess), 1098 0, true); 1099 EXPECT_DEATH(Metrics::PortalDetectionResultToEnum(result), 1100 "Final result status 1 is not allowed in the DNS phase"); 1101 } 1102 1103 TEST_F(MetricsDeathTest, PortalDetectionResultToEnumConnectionSuccess) { 1104 PortalDetector::Result result( 1105 ConnectivityTrial::Result(ConnectivityTrial::kPhaseConnection, 1106 ConnectivityTrial::kStatusSuccess), 1107 0, true); 1108 EXPECT_DEATH(Metrics::PortalDetectionResultToEnum(result), 1109 "Final result status 1 is not allowed in the Connection phase"); 1110 } 1111 1112 TEST_F(MetricsDeathTest, PortalDetectionResultToEnumHTTPSuccess) { 1113 PortalDetector::Result result( 1114 ConnectivityTrial::Result(ConnectivityTrial::kPhaseHTTP, 1115 ConnectivityTrial::kStatusSuccess), 1116 0, true); 1117 EXPECT_DEATH(Metrics::PortalDetectionResultToEnum(result), 1118 "Final result status 1 is not allowed in the HTTP phase"); 1119 } 1120 1121 #endif // NDEBUG 1122 1123 } // namespace shill 1124