1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project 3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License"); 5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License. 6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at 7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// http://www.apache.org/licenses/LICENSE-2.0 9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software 11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS, 12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and 14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License. 15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 1648e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 1748e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le#include "shill/metrics.h" 1848e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 1926fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le#include <string> 208a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <vector> 2126fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le 22289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#if defined(__ANDROID__) 23289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#include <dbus/service_constants.h> 24289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#else 2548e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le#include <chromeos/dbus/service_constants.h> 26289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#endif // __ANDROID__ 2748e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le#include <metrics/metrics_library_mock.h> 28a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le#include <metrics/timer_mock.h> 2948e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 306c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le#include "shill/mock_control.h" 316c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le#include "shill/mock_event_dispatcher.h" 3294cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal#include "shill/mock_log.h" 336c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le#include "shill/mock_manager.h" 3448e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le#include "shill/mock_service.h" 351a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu 361a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIFI) 371a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#include "shill/mock_eap_credentials.h" 38d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wifi_service.h" 391a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIFI 4048e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 4126fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Leusing std::string; 4226fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le 4348e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Leusing testing::_; 44b84ba34aec59d083980d840fb845a3e2bea893cbThieu Leusing testing::DoAll; 4548e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Leusing testing::Ge; 46b84ba34aec59d083980d840fb845a3e2bea893cbThieu Leusing testing::Mock; 4748e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Leusing testing::Return; 48b84ba34aec59d083980d840fb845a3e2bea893cbThieu Leusing testing::SetArgumentPointee; 4948e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Leusing testing::Test; 5048e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 5148e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Lenamespace shill { 5248e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 536c1e3bbca64d642cb30ed9952203626942bc1451Thieu Leclass MetricsTest : public Test { 5448e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le public: 5548e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le MetricsTest() 566c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le : manager_(&control_interface_, 576c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le &dispatcher_, 58bad1c10ffd2d4ac14f7bd9f4ef6a8982e711f566mukesh agrawal &metrics_), 596c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le metrics_(&dispatcher_), 601a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIFI) 61cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal open_wifi_service_(new MockWiFiService(&control_interface_, 62cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal &dispatcher_, 63cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal &metrics_, 64cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal &manager_, 65cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal manager_.wifi_provider(), 66cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal ssid_, 67923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kModeManaged, 68923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kSecurityNone, 69cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal false)), 70cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal wep_wifi_service_(new MockWiFiService(&control_interface_, 71cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal &dispatcher_, 72cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal &metrics_, 73cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal &manager_, 74cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal manager_.wifi_provider(), 75cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal ssid_, 76923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kModeManaged, 77923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kSecurityWep, 78cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal false)), 79cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal eap_wifi_service_(new MockWiFiService(&control_interface_, 80cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal &dispatcher_, 81cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal &metrics_, 82cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal &manager_, 83cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal manager_.wifi_provider(), 84cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal ssid_, 85923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kModeManaged, 86923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kSecurity8021x, 87cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal false)), 881a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu eap_(new MockEapCredentials()), 891a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIFI 901a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu service_(new MockService(&control_interface_, 911a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu &dispatcher_, 921a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu &metrics_, 931a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu &manager_)) {} 9448e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 9548e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le virtual ~MetricsTest() {} 9648e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 9748e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le virtual void SetUp() { 9848e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le metrics_.set_library(&library_); 991a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIFI) 100cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal eap_wifi_service_->eap_.reset(eap_); // Passes ownership. 1011a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIFI 10258f0b6dbd71f52c3abdac91aed44024a35bc4898Darin Petkov metrics_.collect_bootstats_ = false; 10348e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le } 10448e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 10548e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le protected: 106e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart void ExpectCommonPostReady(Metrics::WiFiApMode ap_mode, 107e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart Metrics::WiFiChannel channel, 108b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le Metrics::WiFiNetworkPhyMode mode, 10923b393ab3d44c0c3a95c30078978cab53b50c9f2Paul Stewart Metrics::WiFiSecurity security, 11023b393ab3d44c0c3a95c30078978cab53b50c9f2Paul Stewart int signal_strength) { 111e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.ApMode", 112e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart ap_mode, 113e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart Metrics::kWiFiApModeMax)); 114b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.Channel", 115b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le channel, 116b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le Metrics::kMetricNetworkChannelMax)); 117b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.PhyMode", 118b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le mode, 119b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le Metrics::kWiFiNetworkPhyModeMax)); 120b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.Security", 121b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le security, 122b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le Metrics::kWiFiSecurityMax)); 12323b393ab3d44c0c3a95c30078978cab53b50c9f2Paul Stewart EXPECT_CALL(library_, 12423b393ab3d44c0c3a95c30078978cab53b50c9f2Paul Stewart SendToUMA("Network.Shill.Wifi.SignalStrength", 12523b393ab3d44c0c3a95c30078978cab53b50c9f2Paul Stewart signal_strength, 12623b393ab3d44c0c3a95c30078978cab53b50c9f2Paul Stewart Metrics::kMetricNetworkSignalStrengthMin, 12723b393ab3d44c0c3a95c30078978cab53b50c9f2Paul Stewart Metrics::kMetricNetworkSignalStrengthMax, 12823b393ab3d44c0c3a95c30078978cab53b50c9f2Paul Stewart Metrics::kMetricNetworkSignalStrengthNumBuckets)); 129b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le } 130b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le 1316c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le MockControl control_interface_; 1326c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le MockEventDispatcher dispatcher_; 1336c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le MockManager manager_; 134cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal Metrics metrics_; // This must be destroyed after all |service_|s. 13548e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le MetricsLibraryMock library_; 1361a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIFI) 13748e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le const std::vector<uint8_t> ssid_; 138cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal scoped_refptr<MockWiFiService> open_wifi_service_; 139cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal scoped_refptr<MockWiFiService> wep_wifi_service_; 140cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal scoped_refptr<MockWiFiService> eap_wifi_service_; 1413b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart MockEapCredentials* eap_; // Owned by |eap_wifi_service_|. 1421a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIFI 1431a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu scoped_refptr<MockService> service_; 14448e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le}; 14548e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 14648e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu LeTEST_F(MetricsTest, TimeToConfig) { 14748e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_CALL(library_, SendToUMA("Network.Shill.Unknown.TimeToConfig", 14848e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le Ge(0), 149a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kTimerHistogramMillisecondsMin, 150a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kTimerHistogramMillisecondsMax, 15148e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le Metrics::kTimerHistogramNumBuckets)); 1527ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie metrics_.NotifyServiceStateChanged(*service_, Service::kStateConfiguring); 1537ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie metrics_.NotifyServiceStateChanged(*service_, Service::kStateConnected); 15448e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le} 15548e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 15648e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu LeTEST_F(MetricsTest, TimeToPortal) { 15748e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_CALL(library_, SendToUMA("Network.Shill.Unknown.TimeToPortal", 15848e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le Ge(0), 159a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kTimerHistogramMillisecondsMin, 160a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kTimerHistogramMillisecondsMax, 16148e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le Metrics::kTimerHistogramNumBuckets)); 1627ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie metrics_.NotifyServiceStateChanged(*service_, Service::kStateConnected); 1637ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie metrics_.NotifyServiceStateChanged(*service_, Service::kStatePortal); 16448e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le} 16548e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 16648e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu LeTEST_F(MetricsTest, TimeToOnline) { 16748e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_CALL(library_, SendToUMA("Network.Shill.Unknown.TimeToOnline", 16848e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le Ge(0), 169a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kTimerHistogramMillisecondsMin, 170a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kTimerHistogramMillisecondsMax, 17148e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le Metrics::kTimerHistogramNumBuckets)); 1727ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie metrics_.NotifyServiceStateChanged(*service_, Service::kStateConnected); 1737ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie metrics_.NotifyServiceStateChanged(*service_, Service::kStateOnline); 17448e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le} 17548e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 17648e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu LeTEST_F(MetricsTest, ServiceFailure) { 1777ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie EXPECT_CALL(*service_, failure()) 178f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart .WillRepeatedly(Return(Service::kFailureBadPassphrase)); 17927df364826f6f8ac5eb36b8e62f2960516cf9b1bPeter Qiu EXPECT_CALL(library_, 18027df364826f6f8ac5eb36b8e62f2960516cf9b1bPeter Qiu SendEnumToUMA(Metrics::kMetricNetworkServiceErrors, 18127df364826f6f8ac5eb36b8e62f2960516cf9b1bPeter Qiu Metrics::kNetworkServiceErrorBadPassphrase, 18227df364826f6f8ac5eb36b8e62f2960516cf9b1bPeter Qiu Metrics::kNetworkServiceErrorMax)); 1837ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie metrics_.NotifyServiceStateChanged(*service_, Service::kStateFailure); 18448e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le} 18548e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 1861a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#if !defined(DISABLE_WIFI) 18748e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu LeTEST_F(MetricsTest, WiFiServiceTimeToJoin) { 18848e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.TimeToJoin", 18948e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le Ge(0), 190a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kTimerHistogramMillisecondsMin, 191a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kTimerHistogramMillisecondsMax, 19248e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le Metrics::kTimerHistogramNumBuckets)); 1937ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie metrics_.NotifyServiceStateChanged(*open_wifi_service_, 194cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal Service::kStateAssociating); 1957ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie metrics_.NotifyServiceStateChanged(*open_wifi_service_, 196cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal Service::kStateConfiguring); 19748e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le} 19848e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 199ad1ec2c02af19d65b1302db59a1cebb1c9465516Thieu LeTEST_F(MetricsTest, WiFiServicePostReady) { 200b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le base::TimeDelta non_zero_time_delta = base::TimeDelta::FromMilliseconds(1); 2013b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart chromeos_metrics::TimerMock* mock_time_resume_to_ready_timer = 202b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le new chromeos_metrics::TimerMock; 203b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le metrics_.set_time_resume_to_ready_timer(mock_time_resume_to_ready_timer); 204b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le 20523b393ab3d44c0c3a95c30078978cab53b50c9f2Paul Stewart const int kStrength = -42; 206e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart ExpectCommonPostReady(Metrics::kWiFiApModeManaged, 207e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart Metrics::kWiFiChannel2412, 208b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le Metrics::kWiFiNetworkPhyMode11a, 20923b393ab3d44c0c3a95c30078978cab53b50c9f2Paul Stewart Metrics::kWiFiSecurityWep, 21023b393ab3d44c0c3a95c30078978cab53b50c9f2Paul Stewart -kStrength); 211b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.TimeResumeToReady", 212b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le _, _, _, _)).Times(0); 21321f4096b66e7d16f211942fb2c27bd3a7ad0859ePaul Stewart EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.EapOuterProtocol", 21421f4096b66e7d16f211942fb2c27bd3a7ad0859ePaul Stewart _, _)).Times(0); 21521f4096b66e7d16f211942fb2c27bd3a7ad0859ePaul Stewart EXPECT_CALL(library_, SendEnumToUMA("Network.Shill.Wifi.EapInnerProtocol", 21621f4096b66e7d16f211942fb2c27bd3a7ad0859ePaul Stewart _, _)).Times(0); 217cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal wep_wifi_service_->frequency_ = 2412; 218cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal wep_wifi_service_->physical_mode_ = Metrics::kWiFiNetworkPhyMode11a; 219cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal wep_wifi_service_->raw_signal_strength_ = kStrength; 2207ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie metrics_.NotifyServiceStateChanged(*wep_wifi_service_, 221cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal Service::kStateConnected); 222b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le Mock::VerifyAndClearExpectations(&library_); 223b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le 224b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le // Simulate a system suspend, resume and an AP reconnect. 225e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart ExpectCommonPostReady(Metrics::kWiFiApModeManaged, 226e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart Metrics::kWiFiChannel2412, 227b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le Metrics::kWiFiNetworkPhyMode11a, 22823b393ab3d44c0c3a95c30078978cab53b50c9f2Paul Stewart Metrics::kWiFiSecurityWep, 22923b393ab3d44c0c3a95c30078978cab53b50c9f2Paul Stewart -kStrength); 230b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.TimeResumeToReady", 231b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le Ge(0), 232b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le Metrics::kTimerHistogramMillisecondsMin, 233b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le Metrics::kTimerHistogramMillisecondsMax, 234b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le Metrics::kTimerHistogramNumBuckets)); 235b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le EXPECT_CALL(*mock_time_resume_to_ready_timer, GetElapsedTime(_)). 236b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le WillOnce(DoAll(SetArgumentPointee<0>(non_zero_time_delta), Return(true))); 237fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat metrics_.NotifySuspendDone(); 2387ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie metrics_.NotifyServiceStateChanged(*wep_wifi_service_, 239cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal Service::kStateConnected); 240b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le Mock::VerifyAndClearExpectations(&library_); 241b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le Mock::VerifyAndClearExpectations(mock_time_resume_to_ready_timer); 242b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le 243b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le // Make sure subsequent connects do not count towards TimeResumeToReady. 244e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart ExpectCommonPostReady(Metrics::kWiFiApModeManaged, 245e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart Metrics::kWiFiChannel2412, 246b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le Metrics::kWiFiNetworkPhyMode11a, 24723b393ab3d44c0c3a95c30078978cab53b50c9f2Paul Stewart Metrics::kWiFiSecurityWep, 24823b393ab3d44c0c3a95c30078978cab53b50c9f2Paul Stewart -kStrength); 249b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.TimeResumeToReady", 250b84ba34aec59d083980d840fb845a3e2bea893cbThieu Le _, _, _, _)).Times(0); 2517ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie metrics_.NotifyServiceStateChanged(*wep_wifi_service_, 252cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal Service::kStateConnected); 25348e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le} 25448e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 25521f4096b66e7d16f211942fb2c27bd3a7ad0859ePaul StewartTEST_F(MetricsTest, WiFiServicePostReadyEAP) { 25621f4096b66e7d16f211942fb2c27bd3a7ad0859ePaul Stewart const int kStrength = -42; 257e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart ExpectCommonPostReady(Metrics::kWiFiApModeManaged, 258e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart Metrics::kWiFiChannel2412, 25921f4096b66e7d16f211942fb2c27bd3a7ad0859ePaul Stewart Metrics::kWiFiNetworkPhyMode11a, 26021f4096b66e7d16f211942fb2c27bd3a7ad0859ePaul Stewart Metrics::kWiFiSecurity8021x, 26121f4096b66e7d16f211942fb2c27bd3a7ad0859ePaul Stewart -kStrength); 262cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal eap_wifi_service_->frequency_ = 2412; 263cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal eap_wifi_service_->physical_mode_ = Metrics::kWiFiNetworkPhyMode11a; 264cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal eap_wifi_service_->raw_signal_strength_ = kStrength; 265c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart EXPECT_CALL(*eap_, OutputConnectionMetrics(&metrics_, Technology::kWifi)); 2667ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie metrics_.NotifyServiceStateChanged(*eap_wifi_service_, 267cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal Service::kStateConnected); 26821f4096b66e7d16f211942fb2c27bd3a7ad0859ePaul Stewart} 26921f4096b66e7d16f211942fb2c27bd3a7ad0859ePaul Stewart 270e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul StewartTEST_F(MetricsTest, WiFiServicePostReadyAdHoc) { 271e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart auto adhoc_wifi_service( 272e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart make_scoped_refptr(new MockWiFiService(&control_interface_, 273e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart &dispatcher_, 274e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart &metrics_, 275e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart &manager_, 276e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart manager_.wifi_provider(), 277e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart ssid_, 278923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kModeAdhoc, 279923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kSecurityNone, 280e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart false))); 281e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart const int kStrength = -42; 282e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart ExpectCommonPostReady(Metrics::kWiFiApModeAdHoc, 283e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart Metrics::kWiFiChannel2412, 284e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart Metrics::kWiFiNetworkPhyMode11b, 285e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart Metrics::kWiFiSecurityNone, 286e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart -kStrength); 287e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart adhoc_wifi_service->frequency_ = 2412; 288e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart adhoc_wifi_service->physical_mode_ = Metrics::kWiFiNetworkPhyMode11b; 289e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart adhoc_wifi_service->raw_signal_strength_ = kStrength; 2907ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie metrics_.NotifyServiceStateChanged(*adhoc_wifi_service, 291e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart Service::kStateConnected); 292e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart} 2931a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu#endif // DISABLE_WIFI 294e4cedde9ce9b21d2317e50cf267be31b1d6c279bPaul Stewart 29548e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu LeTEST_F(MetricsTest, FrequencyToChannel) { 29648e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(2411)); 29748e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannel2412, metrics_.WiFiFrequencyToChannel(2412)); 29848e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannel2472, metrics_.WiFiFrequencyToChannel(2472)); 29948e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(2473)); 30048e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannel2484, metrics_.WiFiFrequencyToChannel(2484)); 30148e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5169)); 30248e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannel5170, metrics_.WiFiFrequencyToChannel(5170)); 30348e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannel5190, metrics_.WiFiFrequencyToChannel(5190)); 30448e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannel5180, metrics_.WiFiFrequencyToChannel(5180)); 30548e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannel5200, metrics_.WiFiFrequencyToChannel(5200)); 30648e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannel5230, metrics_.WiFiFrequencyToChannel(5230)); 30748e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5231)); 30848e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5239)); 30948e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannel5240, metrics_.WiFiFrequencyToChannel(5240)); 31048e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5241)); 31148e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannel5320, metrics_.WiFiFrequencyToChannel(5320)); 31248e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5321)); 31348e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5499)); 31448e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannel5500, metrics_.WiFiFrequencyToChannel(5500)); 31548e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5501)); 31648e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannel5700, metrics_.WiFiFrequencyToChannel(5700)); 31748e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5701)); 31848e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5744)); 31948e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannel5745, metrics_.WiFiFrequencyToChannel(5745)); 32048e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5746)); 32148e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannel5825, metrics_.WiFiFrequencyToChannel(5825)); 32248e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le EXPECT_EQ(Metrics::kWiFiChannelUndef, metrics_.WiFiFrequencyToChannel(5826)); 32348e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le} 32448e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le 325a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu LeTEST_F(MetricsTest, TimeOnlineTimeToDrop) { 3263b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart chromeos_metrics::TimerMock* mock_time_online_timer = 327a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le new chromeos_metrics::TimerMock; 328a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le metrics_.set_time_online_timer(mock_time_online_timer); 3293b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart chromeos_metrics::TimerMock* mock_time_to_drop_timer = 330a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le new chromeos_metrics::TimerMock; 331a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le metrics_.set_time_to_drop_timer(mock_time_to_drop_timer); 3321a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu scoped_refptr<MockService> wifi_service = 3331a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu new MockService(&control_interface_, &dispatcher_, &metrics_, &manager_); 3347ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie EXPECT_CALL(*service_, technology()). 335a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le WillOnce(Return(Technology::kEthernet)); 3361a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu EXPECT_CALL(*wifi_service, technology()). 3371a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu WillOnce(Return(Technology::kWifi)); 338a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le EXPECT_CALL(library_, SendToUMA("Network.Shill.Ethernet.TimeOnline", 339a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Ge(0), 340a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kMetricTimeOnlineSecondsMin, 341a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kMetricTimeOnlineSecondsMax, 342a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kTimerHistogramNumBuckets)); 343a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le EXPECT_CALL(library_, SendToUMA(Metrics::kMetricTimeToDropSeconds, 344a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Ge(0), 345a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kMetricTimeToDropSecondsMin, 346a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kMetricTimeToDropSecondsMax, 347a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kTimerHistogramNumBuckets)).Times(0); 348a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le EXPECT_CALL(*mock_time_online_timer, Start()).Times(2); 349a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le EXPECT_CALL(*mock_time_to_drop_timer, Start()); 3500951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko metrics_.NotifyDefaultServiceChanged(service_.get()); 3511a72f5444e077ed21b8e085b17d7f9f1bc44fa5ePeter Qiu metrics_.NotifyDefaultServiceChanged(wifi_service.get()); 352a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le 353a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le EXPECT_CALL(*mock_time_online_timer, Start()); 354a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le EXPECT_CALL(*mock_time_to_drop_timer, Start()).Times(0); 355a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.TimeOnline", 356a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Ge(0), 357a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kMetricTimeOnlineSecondsMin, 358a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kMetricTimeOnlineSecondsMax, 359a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kTimerHistogramNumBuckets)); 360a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le EXPECT_CALL(library_, SendToUMA(Metrics::kMetricTimeToDropSeconds, 361a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Ge(0), 362a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kMetricTimeToDropSecondsMin, 363a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kMetricTimeToDropSecondsMax, 364a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le Metrics::kTimerHistogramNumBuckets)); 365cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan metrics_.NotifyDefaultServiceChanged(nullptr); 366a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le} 367a20cbc2864edf5491cfa1fa240ba83c30b8a483cThieu Le 36867370f6ebe6757f55249f6e87f4a96922d0c4518Thieu LeTEST_F(MetricsTest, Disconnect) { 3697ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie EXPECT_CALL(*service_, technology()). 37067370f6ebe6757f55249f6e87f4a96922d0c4518Thieu Le WillRepeatedly(Return(Technology::kWifi)); 3717ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie EXPECT_CALL(*service_, explicitly_disconnected()). 37267370f6ebe6757f55249f6e87f4a96922d0c4518Thieu Le WillOnce(Return(false)); 37367370f6ebe6757f55249f6e87f4a96922d0c4518Thieu Le EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.Disconnect", 37467370f6ebe6757f55249f6e87f4a96922d0c4518Thieu Le false, 37567370f6ebe6757f55249f6e87f4a96922d0c4518Thieu Le Metrics::kMetricDisconnectMin, 37667370f6ebe6757f55249f6e87f4a96922d0c4518Thieu Le Metrics::kMetricDisconnectMax, 37767370f6ebe6757f55249f6e87f4a96922d0c4518Thieu Le Metrics::kMetricDisconnectNumBuckets)); 3787ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie metrics_.NotifyServiceDisconnect(*service_); 37967370f6ebe6757f55249f6e87f4a96922d0c4518Thieu Le 3807ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie EXPECT_CALL(*service_, explicitly_disconnected()). 38167370f6ebe6757f55249f6e87f4a96922d0c4518Thieu Le WillOnce(Return(true)); 38267370f6ebe6757f55249f6e87f4a96922d0c4518Thieu Le EXPECT_CALL(library_, SendToUMA("Network.Shill.Wifi.Disconnect", 38367370f6ebe6757f55249f6e87f4a96922d0c4518Thieu Le true, 38467370f6ebe6757f55249f6e87f4a96922d0c4518Thieu Le Metrics::kMetricDisconnectMin, 38567370f6ebe6757f55249f6e87f4a96922d0c4518Thieu Le Metrics::kMetricDisconnectMax, 38667370f6ebe6757f55249f6e87f4a96922d0c4518Thieu Le Metrics::kMetricDisconnectNumBuckets)); 3877ac610b7edc059fbcc378cdac9ca235975470563Wade Guthrie metrics_.NotifyServiceDisconnect(*service_); 38867370f6ebe6757f55249f6e87f4a96922d0c4518Thieu Le} 38967370f6ebe6757f55249f6e87f4a96922d0c4518Thieu Le 39085e050b4923878a57aec1415314d2b39ff233e00Thieu LeTEST_F(MetricsTest, PortalDetectionResultToEnum) { 3913d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein ConnectivityTrial::Result trial_result(ConnectivityTrial::kPhaseDNS, 3923d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein ConnectivityTrial::kStatusFailure); 3933d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein PortalDetector::Result result(trial_result, 0, true); 3943d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein 39585e050b4923878a57aec1415314d2b39ff233e00Thieu Le EXPECT_EQ(Metrics::kPortalResultDNSFailure, 39685e050b4923878a57aec1415314d2b39ff233e00Thieu Le Metrics::PortalDetectionResultToEnum(result)); 39785e050b4923878a57aec1415314d2b39ff233e00Thieu Le 3983d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.phase = ConnectivityTrial::kPhaseDNS; 3993d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.status = ConnectivityTrial::kStatusTimeout; 40085e050b4923878a57aec1415314d2b39ff233e00Thieu Le EXPECT_EQ(Metrics::kPortalResultDNSTimeout, 40185e050b4923878a57aec1415314d2b39ff233e00Thieu Le Metrics::PortalDetectionResultToEnum(result)); 40285e050b4923878a57aec1415314d2b39ff233e00Thieu Le 4033d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.phase = ConnectivityTrial::kPhaseConnection; 4043d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.status = ConnectivityTrial::kStatusFailure; 40585e050b4923878a57aec1415314d2b39ff233e00Thieu Le EXPECT_EQ(Metrics::kPortalResultConnectionFailure, 40685e050b4923878a57aec1415314d2b39ff233e00Thieu Le Metrics::PortalDetectionResultToEnum(result)); 40785e050b4923878a57aec1415314d2b39ff233e00Thieu Le 4083d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.phase = ConnectivityTrial::kPhaseConnection; 4093d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.status = ConnectivityTrial::kStatusTimeout; 41085e050b4923878a57aec1415314d2b39ff233e00Thieu Le EXPECT_EQ(Metrics::kPortalResultConnectionTimeout, 41185e050b4923878a57aec1415314d2b39ff233e00Thieu Le Metrics::PortalDetectionResultToEnum(result)); 41285e050b4923878a57aec1415314d2b39ff233e00Thieu Le 4133d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.phase = ConnectivityTrial::kPhaseHTTP; 4143d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.status = ConnectivityTrial::kStatusFailure; 41585e050b4923878a57aec1415314d2b39ff233e00Thieu Le EXPECT_EQ(Metrics::kPortalResultHTTPFailure, 41685e050b4923878a57aec1415314d2b39ff233e00Thieu Le Metrics::PortalDetectionResultToEnum(result)); 41785e050b4923878a57aec1415314d2b39ff233e00Thieu Le 4183d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.phase = ConnectivityTrial::kPhaseHTTP; 4193d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.status = ConnectivityTrial::kStatusTimeout; 42085e050b4923878a57aec1415314d2b39ff233e00Thieu Le EXPECT_EQ(Metrics::kPortalResultHTTPTimeout, 42185e050b4923878a57aec1415314d2b39ff233e00Thieu Le Metrics::PortalDetectionResultToEnum(result)); 42285e050b4923878a57aec1415314d2b39ff233e00Thieu Le 4233d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.phase = ConnectivityTrial::kPhaseContent; 4243d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.status = ConnectivityTrial::kStatusSuccess; 42585e050b4923878a57aec1415314d2b39ff233e00Thieu Le EXPECT_EQ(Metrics::kPortalResultSuccess, 42685e050b4923878a57aec1415314d2b39ff233e00Thieu Le Metrics::PortalDetectionResultToEnum(result)); 42785e050b4923878a57aec1415314d2b39ff233e00Thieu Le 4283d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.phase = ConnectivityTrial::kPhaseContent; 4293d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.status = ConnectivityTrial::kStatusFailure; 43085e050b4923878a57aec1415314d2b39ff233e00Thieu Le EXPECT_EQ(Metrics::kPortalResultContentFailure, 43185e050b4923878a57aec1415314d2b39ff233e00Thieu Le Metrics::PortalDetectionResultToEnum(result)); 43285e050b4923878a57aec1415314d2b39ff233e00Thieu Le 4333d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.phase = ConnectivityTrial::kPhaseContent; 4343d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.status = ConnectivityTrial::kStatusTimeout; 43585e050b4923878a57aec1415314d2b39ff233e00Thieu Le EXPECT_EQ(Metrics::kPortalResultContentTimeout, 43685e050b4923878a57aec1415314d2b39ff233e00Thieu Le Metrics::PortalDetectionResultToEnum(result)); 43785e050b4923878a57aec1415314d2b39ff233e00Thieu Le 4383d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.phase = ConnectivityTrial::kPhaseUnknown; 4393d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein result.trial_result.status = ConnectivityTrial::kStatusFailure; 44085e050b4923878a57aec1415314d2b39ff233e00Thieu Le EXPECT_EQ(Metrics::kPortalResultUnknown, 44185e050b4923878a57aec1415314d2b39ff233e00Thieu Le Metrics::PortalDetectionResultToEnum(result)); 44285e050b4923878a57aec1415314d2b39ff233e00Thieu Le} 44385e050b4923878a57aec1415314d2b39ff233e00Thieu Le 444cdb5a2112e71c68b094eaaf32dfb0ec295b6fc76Thieu LeTEST_F(MetricsTest, TimeToConnect) { 445cdb5a2112e71c68b094eaaf32dfb0ec295b6fc76Thieu Le EXPECT_CALL(library_, 446cdb5a2112e71c68b094eaaf32dfb0ec295b6fc76Thieu Le SendToUMA("Network.Shill.Cellular.TimeToConnect", 447cdb5a2112e71c68b094eaaf32dfb0ec295b6fc76Thieu Le Ge(0), 448cdb5a2112e71c68b094eaaf32dfb0ec295b6fc76Thieu Le Metrics::kMetricTimeToConnectMillisecondsMin, 449cdb5a2112e71c68b094eaaf32dfb0ec295b6fc76Thieu Le Metrics::kMetricTimeToConnectMillisecondsMax, 450cdb5a2112e71c68b094eaaf32dfb0ec295b6fc76Thieu Le Metrics::kMetricTimeToConnectMillisecondsNumBuckets)); 451cdb5a2112e71c68b094eaaf32dfb0ec295b6fc76Thieu Le const int kInterfaceIndex = 1; 452cdb5a2112e71c68b094eaaf32dfb0ec295b6fc76Thieu Le metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 4537cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le metrics_.NotifyDeviceConnectStarted(kInterfaceIndex, false); 454cdb5a2112e71c68b094eaaf32dfb0ec295b6fc76Thieu Le metrics_.NotifyDeviceConnectFinished(kInterfaceIndex); 455cdb5a2112e71c68b094eaaf32dfb0ec295b6fc76Thieu Le} 456cdb5a2112e71c68b094eaaf32dfb0ec295b6fc76Thieu Le 457a2519bfa1b13957ce0466d353fcbc1be5ad80e13Thieu LeTEST_F(MetricsTest, TimeToDisable) { 458a2519bfa1b13957ce0466d353fcbc1be5ad80e13Thieu Le EXPECT_CALL(library_, 459a2519bfa1b13957ce0466d353fcbc1be5ad80e13Thieu Le SendToUMA("Network.Shill.Cellular.TimeToDisable", 460a2519bfa1b13957ce0466d353fcbc1be5ad80e13Thieu Le Ge(0), 461a2519bfa1b13957ce0466d353fcbc1be5ad80e13Thieu Le Metrics::kMetricTimeToDisableMillisecondsMin, 462a2519bfa1b13957ce0466d353fcbc1be5ad80e13Thieu Le Metrics::kMetricTimeToDisableMillisecondsMax, 463a2519bfa1b13957ce0466d353fcbc1be5ad80e13Thieu Le Metrics::kMetricTimeToDisableMillisecondsNumBuckets)); 464a2519bfa1b13957ce0466d353fcbc1be5ad80e13Thieu Le const int kInterfaceIndex = 1; 465a2519bfa1b13957ce0466d353fcbc1be5ad80e13Thieu Le metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 466a2519bfa1b13957ce0466d353fcbc1be5ad80e13Thieu Le metrics_.NotifyDeviceDisableStarted(kInterfaceIndex); 467a2519bfa1b13957ce0466d353fcbc1be5ad80e13Thieu Le metrics_.NotifyDeviceDisableFinished(kInterfaceIndex); 468a2519bfa1b13957ce0466d353fcbc1be5ad80e13Thieu Le} 469a2519bfa1b13957ce0466d353fcbc1be5ad80e13Thieu Le 470ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu LeTEST_F(MetricsTest, TimeToEnable) { 471ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le EXPECT_CALL(library_, 472ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le SendToUMA("Network.Shill.Cellular.TimeToEnable", 473ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le Ge(0), 474ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le Metrics::kMetricTimeToEnableMillisecondsMin, 475ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le Metrics::kMetricTimeToEnableMillisecondsMax, 476ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le Metrics::kMetricTimeToEnableMillisecondsNumBuckets)); 477ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le const int kInterfaceIndex = 1; 478ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 479ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le metrics_.NotifyDeviceEnableStarted(kInterfaceIndex); 480ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le metrics_.NotifyDeviceEnableFinished(kInterfaceIndex); 481ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le} 482ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le 483c8078a6c44d0e30b71642856ef46e0cf6c5edb46Thieu LeTEST_F(MetricsTest, TimeToInitialize) { 484c8078a6c44d0e30b71642856ef46e0cf6c5edb46Thieu Le EXPECT_CALL(library_, 485c8078a6c44d0e30b71642856ef46e0cf6c5edb46Thieu Le SendToUMA("Network.Shill.Cellular.TimeToInitialize", 486c8078a6c44d0e30b71642856ef46e0cf6c5edb46Thieu Le Ge(0), 487c8078a6c44d0e30b71642856ef46e0cf6c5edb46Thieu Le Metrics::kMetricTimeToInitializeMillisecondsMin, 488c8078a6c44d0e30b71642856ef46e0cf6c5edb46Thieu Le Metrics::kMetricTimeToInitializeMillisecondsMax, 489c8078a6c44d0e30b71642856ef46e0cf6c5edb46Thieu Le Metrics::kMetricTimeToInitializeMillisecondsNumBuckets)); 490c8078a6c44d0e30b71642856ef46e0cf6c5edb46Thieu Le const int kInterfaceIndex = 1; 491c8078a6c44d0e30b71642856ef46e0cf6c5edb46Thieu Le metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 492c8078a6c44d0e30b71642856ef46e0cf6c5edb46Thieu Le metrics_.NotifyDeviceInitialized(kInterfaceIndex); 493c8078a6c44d0e30b71642856ef46e0cf6c5edb46Thieu Le} 494c8078a6c44d0e30b71642856ef46e0cf6c5edb46Thieu Le 49518c1107512ccd6ff8460246f690fbffbdc381979Thieu LeTEST_F(MetricsTest, TimeToScan) { 49618c1107512ccd6ff8460246f690fbffbdc381979Thieu Le EXPECT_CALL(library_, 49718c1107512ccd6ff8460246f690fbffbdc381979Thieu Le SendToUMA("Network.Shill.Cellular.TimeToScan", 49818c1107512ccd6ff8460246f690fbffbdc381979Thieu Le Ge(0), 49918c1107512ccd6ff8460246f690fbffbdc381979Thieu Le Metrics::kMetricTimeToScanMillisecondsMin, 50018c1107512ccd6ff8460246f690fbffbdc381979Thieu Le Metrics::kMetricTimeToScanMillisecondsMax, 50118c1107512ccd6ff8460246f690fbffbdc381979Thieu Le Metrics::kMetricTimeToScanMillisecondsNumBuckets)); 50218c1107512ccd6ff8460246f690fbffbdc381979Thieu Le const int kInterfaceIndex = 1; 50318c1107512ccd6ff8460246f690fbffbdc381979Thieu Le metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 50418c1107512ccd6ff8460246f690fbffbdc381979Thieu Le metrics_.NotifyDeviceScanStarted(kInterfaceIndex); 50518c1107512ccd6ff8460246f690fbffbdc381979Thieu Le metrics_.NotifyDeviceScanFinished(kInterfaceIndex); 50618c1107512ccd6ff8460246f690fbffbdc381979Thieu Le} 50718c1107512ccd6ff8460246f690fbffbdc381979Thieu Le 50844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade GuthrieTEST_F(MetricsTest, TimeToScanAndConnect) { 50944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(library_, 51044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie SendToUMA("Network.Shill.Wifi.TimeToScan", 51144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Ge(0), 51244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToScanMillisecondsMin, 51344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToScanMillisecondsMax, 51444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToScanMillisecondsNumBuckets)); 51544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie const int kInterfaceIndex = 1; 51644f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie metrics_.RegisterDevice(kInterfaceIndex, Technology::kWifi); 51744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie metrics_.NotifyDeviceScanStarted(kInterfaceIndex); 51844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie metrics_.NotifyDeviceScanFinished(kInterfaceIndex); 51944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 52044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(library_, 52144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie SendToUMA("Network.Shill.Wifi.TimeToConnect", 52244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Ge(0), 52344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToConnectMillisecondsMin, 52444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToConnectMillisecondsMax, 52544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToConnectMillisecondsNumBuckets)); 52644f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(library_, 52744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie SendToUMA("Network.Shill.Wifi.TimeToScanAndConnect", 52844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Ge(0), 52944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToScanMillisecondsMin, 53044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToScanMillisecondsMax + 53144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToConnectMillisecondsMax, 53244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToScanMillisecondsNumBuckets + 53344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToConnectMillisecondsNumBuckets)); 53444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie metrics_.NotifyDeviceConnectStarted(kInterfaceIndex, false); 53544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie metrics_.NotifyDeviceConnectFinished(kInterfaceIndex); 53644f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie} 53744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 53844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade GuthrieTEST_F(MetricsTest, SpontaneousConnect) { 53944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie const int kInterfaceIndex = 1; 54044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie metrics_.RegisterDevice(kInterfaceIndex, Technology::kWifi); 54144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(library_, 54244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie SendToUMA("Network.Shill.Wifi.TimeToConnect", 54344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Ge(0), 54444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToConnectMillisecondsMin, 54544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToConnectMillisecondsMax, 54644f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToConnectMillisecondsNumBuckets)).Times(0); 54744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(library_, 54844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie SendToUMA("Network.Shill.Wifi.TimeToScanAndConnect", 54944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Ge(0), 55044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToScanMillisecondsMin, 55144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToScanMillisecondsMax + 55244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToConnectMillisecondsMax, 55344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToScanMillisecondsNumBuckets + 55444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Metrics::kMetricTimeToConnectMillisecondsNumBuckets)). 55544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie Times(0); 55644f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // This simulates a connection that is not scan-based. 55744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie metrics_.NotifyDeviceConnectFinished(kInterfaceIndex); 55844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie} 55944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 56044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade GuthrieTEST_F(MetricsTest, ResetConnectTimer) { 56144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie const int kInterfaceIndex = 1; 56244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie metrics_.RegisterDevice(kInterfaceIndex, Technology::kWifi); 5633b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart chromeos_metrics::TimerReporterMock* mock_scan_timer = 56444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie new chromeos_metrics::TimerReporterMock; 56544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie metrics_.set_time_to_scan_timer(kInterfaceIndex, mock_scan_timer); 5663b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart chromeos_metrics::TimerReporterMock* mock_connect_timer = 56744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie new chromeos_metrics::TimerReporterMock; 56844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie metrics_.set_time_to_connect_timer(kInterfaceIndex, mock_connect_timer); 5693b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart chromeos_metrics::TimerReporterMock* mock_scan_connect_timer = 57044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie new chromeos_metrics::TimerReporterMock; 57144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie metrics_.set_time_to_scan_connect_timer(kInterfaceIndex, 57244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie mock_scan_connect_timer); 57344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*mock_scan_timer, Reset()).Times(0); 57444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*mock_connect_timer, Reset()); 57544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*mock_scan_connect_timer, Reset()); 57644f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie metrics_.ResetConnectTimer(kInterfaceIndex); 57744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie} 57844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 579091c41cdbfbd0ffc4908d3231de88d48c345f52eWade GuthrieTEST_F(MetricsTest, TimeToScanNoStart) { 580091c41cdbfbd0ffc4908d3231de88d48c345f52eWade Guthrie EXPECT_CALL(library_, 581091c41cdbfbd0ffc4908d3231de88d48c345f52eWade Guthrie SendToUMA("Network.Shill.Cellular.TimeToScan", _, _, _, _)).Times(0); 582091c41cdbfbd0ffc4908d3231de88d48c345f52eWade Guthrie const int kInterfaceIndex = 1; 583091c41cdbfbd0ffc4908d3231de88d48c345f52eWade Guthrie metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 584091c41cdbfbd0ffc4908d3231de88d48c345f52eWade Guthrie metrics_.NotifyDeviceScanFinished(kInterfaceIndex); 585091c41cdbfbd0ffc4908d3231de88d48c345f52eWade Guthrie} 586091c41cdbfbd0ffc4908d3231de88d48c345f52eWade Guthrie 58718c1107512ccd6ff8460246f690fbffbdc381979Thieu LeTEST_F(MetricsTest, TimeToScanIgnore) { 58818c1107512ccd6ff8460246f690fbffbdc381979Thieu Le // Make sure TimeToScan is not sent if the elapsed time exceeds the max 58918c1107512ccd6ff8460246f690fbffbdc381979Thieu Le // value. This simulates the case where the device is in an area with no 59018c1107512ccd6ff8460246f690fbffbdc381979Thieu Le // service. 59118c1107512ccd6ff8460246f690fbffbdc381979Thieu Le const int kInterfaceIndex = 1; 59218c1107512ccd6ff8460246f690fbffbdc381979Thieu Le metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 59318c1107512ccd6ff8460246f690fbffbdc381979Thieu Le base::TimeDelta large_time_delta = 59418c1107512ccd6ff8460246f690fbffbdc381979Thieu Le base::TimeDelta::FromMilliseconds( 59518c1107512ccd6ff8460246f690fbffbdc381979Thieu Le Metrics::kMetricTimeToScanMillisecondsMax + 1); 5963b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart chromeos_metrics::TimerReporterMock* mock_time_to_scan_timer = 59718c1107512ccd6ff8460246f690fbffbdc381979Thieu Le new chromeos_metrics::TimerReporterMock; 59818c1107512ccd6ff8460246f690fbffbdc381979Thieu Le metrics_.set_time_to_scan_timer(kInterfaceIndex, mock_time_to_scan_timer); 599091c41cdbfbd0ffc4908d3231de88d48c345f52eWade Guthrie EXPECT_CALL(*mock_time_to_scan_timer, Stop()).WillOnce(Return(true)); 60018c1107512ccd6ff8460246f690fbffbdc381979Thieu Le EXPECT_CALL(*mock_time_to_scan_timer, GetElapsedTime(_)). 60118c1107512ccd6ff8460246f690fbffbdc381979Thieu Le WillOnce(DoAll(SetArgumentPointee<0>(large_time_delta), Return(true))); 60218c1107512ccd6ff8460246f690fbffbdc381979Thieu Le EXPECT_CALL(library_, SendToUMA(_, _, _, _, _)).Times(0); 60318c1107512ccd6ff8460246f690fbffbdc381979Thieu Le metrics_.NotifyDeviceScanStarted(kInterfaceIndex); 60418c1107512ccd6ff8460246f690fbffbdc381979Thieu Le metrics_.NotifyDeviceScanFinished(kInterfaceIndex); 60518c1107512ccd6ff8460246f690fbffbdc381979Thieu Le} 60618c1107512ccd6ff8460246f690fbffbdc381979Thieu Le 60708757aa8221a55004d3ab0a6405c8e0113554fa7Prathmesh PrabhuTEST_F(MetricsTest, Cellular3GPPRegistrationDelayedDropPosted) { 60808757aa8221a55004d3ab0a6405c8e0113554fa7Prathmesh Prabhu EXPECT_CALL(library_, 60908757aa8221a55004d3ab0a6405c8e0113554fa7Prathmesh Prabhu SendEnumToUMA(Metrics::kMetricCellular3GPPRegistrationDelayedDrop, 61008757aa8221a55004d3ab0a6405c8e0113554fa7Prathmesh Prabhu Metrics::kCellular3GPPRegistrationDelayedDropPosted, 61108757aa8221a55004d3ab0a6405c8e0113554fa7Prathmesh Prabhu Metrics::kCellular3GPPRegistrationDelayedDropMax)); 61208757aa8221a55004d3ab0a6405c8e0113554fa7Prathmesh Prabhu metrics_.Notify3GPPRegistrationDelayedDropPosted(); 61308757aa8221a55004d3ab0a6405c8e0113554fa7Prathmesh Prabhu Mock::VerifyAndClearExpectations(&library_); 61408757aa8221a55004d3ab0a6405c8e0113554fa7Prathmesh Prabhu 61508757aa8221a55004d3ab0a6405c8e0113554fa7Prathmesh Prabhu EXPECT_CALL(library_, 61608757aa8221a55004d3ab0a6405c8e0113554fa7Prathmesh Prabhu SendEnumToUMA(Metrics::kMetricCellular3GPPRegistrationDelayedDrop, 61708757aa8221a55004d3ab0a6405c8e0113554fa7Prathmesh Prabhu Metrics::kCellular3GPPRegistrationDelayedDropCanceled, 61808757aa8221a55004d3ab0a6405c8e0113554fa7Prathmesh Prabhu Metrics::kCellular3GPPRegistrationDelayedDropMax)); 61908757aa8221a55004d3ab0a6405c8e0113554fa7Prathmesh Prabhu metrics_.Notify3GPPRegistrationDelayedDropCanceled(); 62008757aa8221a55004d3ab0a6405c8e0113554fa7Prathmesh Prabhu} 62108757aa8221a55004d3ab0a6405c8e0113554fa7Prathmesh Prabhu 6227cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu LeTEST_F(MetricsTest, CellularAutoConnect) { 6237cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le EXPECT_CALL(library_, 6247cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le SendToUMA("Network.Shill.Cellular.TimeToConnect", 6257cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le Ge(0), 6267cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le Metrics::kMetricTimeToConnectMillisecondsMin, 6277cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le Metrics::kMetricTimeToConnectMillisecondsMax, 6287cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le Metrics::kMetricTimeToConnectMillisecondsNumBuckets)); 6297cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le EXPECT_CALL(library_, 6307cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le SendToUMA(Metrics::kMetricCellularAutoConnectTotalTime, 6317cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le Ge(0), 6327cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le Metrics::kMetricCellularAutoConnectTotalTimeMin, 6337cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le Metrics::kMetricCellularAutoConnectTotalTimeMax, 6347cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le Metrics::kMetricCellularAutoConnectTotalTimeNumBuckets)); 6357cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le EXPECT_CALL(library_, 6367cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le SendToUMA(Metrics::kMetricCellularAutoConnectTries, 6377cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le 2, 6387cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le Metrics::kMetricCellularAutoConnectTriesMin, 6397cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le Metrics::kMetricCellularAutoConnectTriesMax, 6407cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le Metrics::kMetricCellularAutoConnectTriesNumBuckets)); 6417cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le const int kInterfaceIndex = 1; 6427cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 6437cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le metrics_.NotifyDeviceConnectStarted(kInterfaceIndex, true); 6447cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le metrics_.NotifyDeviceConnectStarted(kInterfaceIndex, true); 6457cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le metrics_.NotifyDeviceConnectFinished(kInterfaceIndex); 6467cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le} 6477cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le 64826fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu LeTEST_F(MetricsTest, CellularDrop) { 6493b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart const char* kUMATechnologyStrings[] = { 650923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kNetworkTechnology1Xrtt, 651923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kNetworkTechnologyEdge, 652923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kNetworkTechnologyEvdo, 653923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kNetworkTechnologyGprs, 654923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kNetworkTechnologyGsm, 655923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kNetworkTechnologyHspa, 656923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kNetworkTechnologyHspaPlus, 657923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kNetworkTechnologyLte, 658923a5025a5e1138b052cbeffa60ea387d479696fBen Chan kNetworkTechnologyUmts, 65926fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le "Unknown" }; 66026fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le 6617fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint16_t signal_strength = 100; 6626c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le const int kInterfaceIndex = 1; 6636c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 66426fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le for (size_t index = 0; index < arraysize(kUMATechnologyStrings); ++index) { 66526fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le EXPECT_CALL(library_, 66626fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le SendEnumToUMA(Metrics::kMetricCellularDrop, 66726fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le index, 66826fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le Metrics::kCellularDropTechnologyMax)); 66926fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le EXPECT_CALL(library_, 67026fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le SendToUMA(Metrics::kMetricCellularSignalStrengthBeforeDrop, 67126fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le signal_strength, 67226fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le Metrics::kMetricCellularSignalStrengthBeforeDropMin, 67326fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le Metrics::kMetricCellularSignalStrengthBeforeDropMax, 67426fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le Metrics::kMetricCellularSignalStrengthBeforeDropNumBuckets)); 67509e0811c0d54facab2874cfac8b3563005220c2bmukesh agrawal metrics_.NotifyCellularDeviceDrop(kUMATechnologyStrings[index], 67626fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le signal_strength); 67726fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le Mock::VerifyAndClearExpectations(&library_); 67826fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le } 67926fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le} 68026fc01b466ef193b91f4d38d13ccf32b1aa60756Thieu Le 681b7aa5f705211f5a0e5ee8f2389f4592cace3011eThieu LeTEST_F(MetricsTest, CellularDeviceFailure) { 68290259aacb47485f30a6f26796300fc069905772fBertrand SIMONNET EXPECT_CALL(library_, SendEnumToUMA(Metrics::kMetricCellularFailure, 68390259aacb47485f30a6f26796300fc069905772fBertrand SIMONNET Metrics::kMetricCellularConnectionFailure, 68490259aacb47485f30a6f26796300fc069905772fBertrand SIMONNET Metrics::kMetricCellularMaxFailure)); 68590259aacb47485f30a6f26796300fc069905772fBertrand SIMONNET metrics_.NotifyCellularDeviceConnectionFailure(); 686b7aa5f705211f5a0e5ee8f2389f4592cace3011eThieu Le} 687b7aa5f705211f5a0e5ee8f2389f4592cace3011eThieu Le 68891fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu LeTEST_F(MetricsTest, CellularOutOfCreditsReason) { 68991fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le EXPECT_CALL(library_, 69091fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le SendEnumToUMA(Metrics::kMetricCellularOutOfCreditsReason, 69191fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le Metrics::kCellularOutOfCreditsReasonConnectDisconnectLoop, 69291fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le Metrics::kCellularOutOfCreditsReasonMax)); 69391fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le metrics_.NotifyCellularOutOfCredits( 69491fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le Metrics::kCellularOutOfCreditsReasonConnectDisconnectLoop); 69591fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le Mock::VerifyAndClearExpectations(&library_); 69691fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le 69791fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le EXPECT_CALL(library_, 69891fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le SendEnumToUMA(Metrics::kMetricCellularOutOfCreditsReason, 69991fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le Metrics::kCellularOutOfCreditsReasonTxCongested, 70091fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le Metrics::kCellularOutOfCreditsReasonMax)); 70191fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le metrics_.NotifyCellularOutOfCredits( 70291fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le Metrics::kCellularOutOfCreditsReasonTxCongested); 70391fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le Mock::VerifyAndClearExpectations(&library_); 70491fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le 70591fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le EXPECT_CALL(library_, 70691fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le SendEnumToUMA(Metrics::kMetricCellularOutOfCreditsReason, 70791fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le Metrics::kCellularOutOfCreditsReasonElongatedTimeWait, 70891fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le Metrics::kCellularOutOfCreditsReasonMax)); 70991fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le metrics_.NotifyCellularOutOfCredits( 71091fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le Metrics::kCellularOutOfCreditsReasonElongatedTimeWait); 71191fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le} 71291fccf6ff2ee20d77905ce71a7e9815b2e2c02d7Thieu Le 7135133b71eaa00535739ebbddd8a8f31cd8fcf33a8Thieu LeTEST_F(MetricsTest, CorruptedProfile) { 7145133b71eaa00535739ebbddd8a8f31cd8fcf33a8Thieu Le EXPECT_CALL(library_, SendEnumToUMA(Metrics::kMetricCorruptedProfile, 7155133b71eaa00535739ebbddd8a8f31cd8fcf33a8Thieu Le Metrics::kCorruptedProfile, 7165133b71eaa00535739ebbddd8a8f31cd8fcf33a8Thieu Le Metrics::kCorruptedProfileMax)); 7175133b71eaa00535739ebbddd8a8f31cd8fcf33a8Thieu Le metrics_.NotifyCorruptedProfile(); 7185133b71eaa00535739ebbddd8a8f31cd8fcf33a8Thieu Le} 7195133b71eaa00535739ebbddd8a8f31cd8fcf33a8Thieu Le 72094cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawalTEST_F(MetricsTest, Logging) { 72194cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal NiceScopedMockLog log; 72294cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal const int kVerboseLevel5 = -5; 72394cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal ScopeLogger::GetInstance()->EnableScopesByName("+metrics"); 72494cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal ScopeLogger::GetInstance()->set_verbose_level(-kVerboseLevel5); 72594cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal 72694cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal const string kEnumName("fake-enum"); 72794cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal const int kEnumValue = 1; 72894cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal const int kEnumMax = 12; 72994cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal EXPECT_CALL(log, Log(kVerboseLevel5, _, 730c9c31d8497c3f053c2160408cc386010fc125fadRebecca Silberstein "(metrics) Sending enum fake-enum with value 1.")); 73194cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal EXPECT_CALL(library_, SendEnumToUMA(kEnumName, kEnumValue, kEnumMax)); 73294cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal metrics_.SendEnumToUMA(kEnumName, kEnumValue, kEnumMax); 73394cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal 73494cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal const string kMetricName("fake-metric"); 73594cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal const int kMetricValue = 2; 73694cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal const int kHistogramMin = 0; 73794cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal const int kHistogramMax = 100; 73894cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal const int kHistogramBuckets = 10; 73994cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal EXPECT_CALL(log, Log(kVerboseLevel5, _, 740c9c31d8497c3f053c2160408cc386010fc125fadRebecca Silberstein "(metrics) Sending metric fake-metric with value 2.")); 74194cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal EXPECT_CALL(library_, SendToUMA(kMetricName, kMetricValue, kHistogramMin, 74294cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal kHistogramMax, kHistogramBuckets)); 74394cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal metrics_.SendToUMA(kMetricName, kMetricValue, 74494cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal kHistogramMin, kHistogramMax, kHistogramBuckets); 74594cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal 74694cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal ScopeLogger::GetInstance()->EnableScopesByName("-metrics"); 74794cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal ScopeLogger::GetInstance()->set_verbose_level(0); 74894cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal} 74994cde5868317c2f874f97cf9a31ad147c8058109mukesh agrawal 75039d4af0d78ed7c91bc52c5882877989f8d4fed5dPeter QiuTEST_F(MetricsTest, NotifyServicesOnSameNetwork) { 75139d4af0d78ed7c91bc52c5882877989f8d4fed5dPeter Qiu EXPECT_CALL(library_, 75239d4af0d78ed7c91bc52c5882877989f8d4fed5dPeter Qiu SendToUMA(Metrics::kMetricServicesOnSameNetwork, 75339d4af0d78ed7c91bc52c5882877989f8d4fed5dPeter Qiu 1, 75439d4af0d78ed7c91bc52c5882877989f8d4fed5dPeter Qiu Metrics::kMetricServicesOnSameNetworkMin, 75539d4af0d78ed7c91bc52c5882877989f8d4fed5dPeter Qiu Metrics::kMetricServicesOnSameNetworkMax, 75639d4af0d78ed7c91bc52c5882877989f8d4fed5dPeter Qiu Metrics::kMetricServicesOnSameNetworkNumBuckets)); 75739d4af0d78ed7c91bc52c5882877989f8d4fed5dPeter Qiu metrics_.NotifyServicesOnSameNetwork(1); 75839d4af0d78ed7c91bc52c5882877989f8d4fed5dPeter Qiu} 75939d4af0d78ed7c91bc52c5882877989f8d4fed5dPeter Qiu 760e783f1c2004e35db6eff036e5d7b3a5b99b724ffPeter QiuTEST_F(MetricsTest, NotifyUserInitiatedEvent) { 761e783f1c2004e35db6eff036e5d7b3a5b99b724ffPeter Qiu EXPECT_CALL(library_, 762e783f1c2004e35db6eff036e5d7b3a5b99b724ffPeter Qiu SendEnumToUMA(Metrics::kMetricUserInitiatedEvents, 763e783f1c2004e35db6eff036e5d7b3a5b99b724ffPeter Qiu Metrics::kUserInitiatedEventWifiScan, 764e783f1c2004e35db6eff036e5d7b3a5b99b724ffPeter Qiu Metrics::kUserInitiatedEventMax)); 765e783f1c2004e35db6eff036e5d7b3a5b99b724ffPeter Qiu metrics_.NotifyUserInitiatedEvent(Metrics::kUserInitiatedEventWifiScan); 766e783f1c2004e35db6eff036e5d7b3a5b99b724ffPeter Qiu} 767e783f1c2004e35db6eff036e5d7b3a5b99b724ffPeter Qiu 7688e43058d862502b49c769742f6d5e61e28286254Peter QiuTEST_F(MetricsTest, NotifyWifiTxBitrate) { 7698e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(library_, 7708e43058d862502b49c769742f6d5e61e28286254Peter Qiu SendToUMA(Metrics::kMetricWifiTxBitrate, 7718e43058d862502b49c769742f6d5e61e28286254Peter Qiu 1, 7728e43058d862502b49c769742f6d5e61e28286254Peter Qiu Metrics::kMetricWifiTxBitrateMin, 7738e43058d862502b49c769742f6d5e61e28286254Peter Qiu Metrics::kMetricWifiTxBitrateMax, 7748e43058d862502b49c769742f6d5e61e28286254Peter Qiu Metrics::kMetricWifiTxBitrateNumBuckets)); 7758e43058d862502b49c769742f6d5e61e28286254Peter Qiu metrics_.NotifyWifiTxBitrate(1); 7768e43058d862502b49c769742f6d5e61e28286254Peter Qiu} 7778e43058d862502b49c769742f6d5e61e28286254Peter Qiu 778dc4e099103a56f0427ed0969fea2c46c88ab2e9ePeter QiuTEST_F(MetricsTest, NotifyUserInitiatedConnectionResult) { 779dc4e099103a56f0427ed0969fea2c46c88ab2e9ePeter Qiu EXPECT_CALL(library_, 780dc4e099103a56f0427ed0969fea2c46c88ab2e9ePeter Qiu SendEnumToUMA(Metrics::kMetricWifiUserInitiatedConnectionResult, 781dc4e099103a56f0427ed0969fea2c46c88ab2e9ePeter Qiu Metrics::kUserInitiatedConnectionResultSuccess, 782dc4e099103a56f0427ed0969fea2c46c88ab2e9ePeter Qiu Metrics::kUserInitiatedConnectionResultMax)); 783dc4e099103a56f0427ed0969fea2c46c88ab2e9ePeter Qiu metrics_.NotifyUserInitiatedConnectionResult( 784dc4e099103a56f0427ed0969fea2c46c88ab2e9ePeter Qiu Metrics::kMetricWifiUserInitiatedConnectionResult, 785dc4e099103a56f0427ed0969fea2c46c88ab2e9ePeter Qiu Metrics::kUserInitiatedConnectionResultSuccess); 786dc4e099103a56f0427ed0969fea2c46c88ab2e9ePeter Qiu} 787dc4e099103a56f0427ed0969fea2c46c88ab2e9ePeter Qiu 788b9256f3d485e4c6c5c301a0aa00554059473b41dPeter QiuTEST_F(MetricsTest, NotifyFallbackDNSTestResult) { 789b9256f3d485e4c6c5c301a0aa00554059473b41dPeter Qiu EXPECT_CALL(library_, 790f18e7717c642dcfd6b4dbe1f01f50e2d9671f5cePeter Qiu SendEnumToUMA("Network.Shill.Wifi.FallbackDNSTestResult", 791f18e7717c642dcfd6b4dbe1f01f50e2d9671f5cePeter Qiu Metrics::kFallbackDNSTestResultSuccess, 792f18e7717c642dcfd6b4dbe1f01f50e2d9671f5cePeter Qiu Metrics::kFallbackDNSTestResultMax)); 793f18e7717c642dcfd6b4dbe1f01f50e2d9671f5cePeter Qiu metrics_.NotifyFallbackDNSTestResult(Technology::kWifi, 794f18e7717c642dcfd6b4dbe1f01f50e2d9671f5cePeter Qiu Metrics::kFallbackDNSTestResultSuccess); 795b9256f3d485e4c6c5c301a0aa00554059473b41dPeter Qiu} 796b9256f3d485e4c6c5c301a0aa00554059473b41dPeter Qiu 797dc335f81a9d0ffe8efd02a96d3cd17399a06e61ePeter QiuTEST_F(MetricsTest, NotifyNetworkProblemDetected) { 798dc335f81a9d0ffe8efd02a96d3cd17399a06e61ePeter Qiu EXPECT_CALL(library_, 799dc335f81a9d0ffe8efd02a96d3cd17399a06e61ePeter Qiu SendEnumToUMA("Network.Shill.Wifi.NetworkProblemDetected", 800dc335f81a9d0ffe8efd02a96d3cd17399a06e61ePeter Qiu Metrics::kNetworkProblemDNSFailure, 801dc335f81a9d0ffe8efd02a96d3cd17399a06e61ePeter Qiu Metrics::kNetworkProblemMax)); 802dc335f81a9d0ffe8efd02a96d3cd17399a06e61ePeter Qiu metrics_.NotifyNetworkProblemDetected(Technology::kWifi, 803dc335f81a9d0ffe8efd02a96d3cd17399a06e61ePeter Qiu Metrics::kNetworkProblemDNSFailure); 804dc335f81a9d0ffe8efd02a96d3cd17399a06e61ePeter Qiu} 805dc335f81a9d0ffe8efd02a96d3cd17399a06e61ePeter Qiu 8063bdf1abfba480415a4714108e615649f422197e0Paul StewartTEST_F(MetricsTest, NotifyDhcpClientStatus) { 8073bdf1abfba480415a4714108e615649f422197e0Paul Stewart EXPECT_CALL(library_, 808a72a79ca06e42b537a7785a00303c5af11d3f768Paul Stewart SendEnumToUMA("Network.Shill.DHCPClientStatus", 8093bdf1abfba480415a4714108e615649f422197e0Paul Stewart Metrics::kDhcpClientStatusReboot, 8103bdf1abfba480415a4714108e615649f422197e0Paul Stewart Metrics::kDhcpClientStatusMax)); 8113bdf1abfba480415a4714108e615649f422197e0Paul Stewart metrics_.NotifyDhcpClientStatus(Metrics::kDhcpClientStatusReboot); 8123bdf1abfba480415a4714108e615649f422197e0Paul Stewart} 8133bdf1abfba480415a4714108e615649f422197e0Paul Stewart 8149f5159e07028a01e1353d68bc19da9817a6785fePeter QiuTEST_F(MetricsTest, DeregisterDevice) { 8159f5159e07028a01e1353d68bc19da9817a6785fePeter Qiu const int kInterfaceIndex = 1; 8169f5159e07028a01e1353d68bc19da9817a6785fePeter Qiu metrics_.RegisterDevice(kInterfaceIndex, Technology::kCellular); 8179f5159e07028a01e1353d68bc19da9817a6785fePeter Qiu 8189f5159e07028a01e1353d68bc19da9817a6785fePeter Qiu EXPECT_CALL(library_, 8199f5159e07028a01e1353d68bc19da9817a6785fePeter Qiu SendEnumToUMA("Network.Shill.DeviceRemovedEvent", 8209f5159e07028a01e1353d68bc19da9817a6785fePeter Qiu Metrics::kDeviceTechnologyTypeCellular, 8219f5159e07028a01e1353d68bc19da9817a6785fePeter Qiu Metrics::kDeviceTechnologyTypeMax)); 8229f5159e07028a01e1353d68bc19da9817a6785fePeter Qiu metrics_.DeregisterDevice(kInterfaceIndex); 8239f5159e07028a01e1353d68bc19da9817a6785fePeter Qiu} 8249f5159e07028a01e1353d68bc19da9817a6785fePeter Qiu 8251964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(MetricsTest, NotifyWakeOnWiFiFeaturesEnabledState) { 8261964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan const Metrics::WakeOnWiFiFeaturesEnabledState state = 8271964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan Metrics::kWakeOnWiFiFeaturesEnabledStateNone; 8281964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL( 8291964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan library_, 8301964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan SendEnumToUMA("Network.Shill.WiFi.WakeOnWiFiFeaturesEnabledState", state, 8311964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan Metrics::kWakeOnWiFiFeaturesEnabledStateMax)); 8321964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan metrics_.NotifyWakeOnWiFiFeaturesEnabledState(state); 8331964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan} 8341964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 8351964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(MetricsTest, NotifyVerifyWakeOnWiFiSettingsResult) { 8361964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan const Metrics::VerifyWakeOnWiFiSettingsResult result = 8371964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan Metrics::kVerifyWakeOnWiFiSettingsResultSuccess; 8381964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL( 8391964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan library_, 8401964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan SendEnumToUMA("Network.Shill.WiFi.VerifyWakeOnWiFiSettingsResult", result, 8411964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan Metrics::kVerifyWakeOnWiFiSettingsResultMax)); 8421964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan metrics_.NotifyVerifyWakeOnWiFiSettingsResult(result); 8431964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan} 8441964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 8451964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(MetricsTest, NotifyConnectedToServiceAfterWake) { 8461964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan const Metrics::WiFiConnectionStatusAfterWake status = 8471964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan Metrics::kWiFiConnetionStatusAfterWakeOnWiFiEnabledWakeConnected; 8481964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(library_, 8491964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan SendEnumToUMA("Network.Shill.WiFi.WiFiConnectionStatusAfterWake", 8501964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan status, Metrics::kWiFiConnetionStatusAfterWakeMax)); 8511964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan metrics_.NotifyConnectedToServiceAfterWake(status); 8521964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan} 8531964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 854c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel TanTEST_F(MetricsTest, NotifyWakeOnWiFiThrottled) { 855c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan EXPECT_FALSE(metrics_.wake_on_wifi_throttled_); 856c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan metrics_.NotifyWakeOnWiFiThrottled(); 857c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan EXPECT_TRUE(metrics_.wake_on_wifi_throttled_); 858c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan} 859c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan 860c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel TanTEST_F(MetricsTest, NotifySuspendWithWakeOnWiFiEnabledDone) { 861c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan const Metrics::WakeOnWiFiThrottled result_true = 862c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan Metrics::kWakeOnWiFiThrottledTrue; 863c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan metrics_.wake_on_wifi_throttled_ = true; 864c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan EXPECT_CALL(library_, 865c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan SendEnumToUMA("Network.Shill.WiFi.WakeOnWiFiThrottled", 866c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan result_true, Metrics::kWakeOnWiFiThrottledMax)); 867c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan metrics_.NotifySuspendWithWakeOnWiFiEnabledDone(); 868c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan 869c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan const Metrics::WakeOnWiFiThrottled result_false = 870c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan Metrics::kWakeOnWiFiThrottledFalse; 871c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan metrics_.wake_on_wifi_throttled_ = false; 872c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan EXPECT_CALL(library_, 873c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan SendEnumToUMA("Network.Shill.WiFi.WakeOnWiFiThrottled", 874c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan result_false, Metrics::kWakeOnWiFiThrottledMax)); 875c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan metrics_.NotifySuspendWithWakeOnWiFiEnabledDone(); 876c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan} 877c36b410afd8d68a5ced58b3a937aa4efdde2aa7dSamuel Tan 878a49334304182db378741214a1a82e47351c3fddbSamuel TanTEST_F(MetricsTest, NotifySuspendActionsCompleted_Success) { 879a49334304182db378741214a1a82e47351c3fddbSamuel Tan base::TimeDelta non_zero_time_delta = base::TimeDelta::FromMilliseconds(1); 8803b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart chromeos_metrics::TimerMock* mock_time_suspend_actions_timer = 881a49334304182db378741214a1a82e47351c3fddbSamuel Tan new chromeos_metrics::TimerMock; 882a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.set_time_suspend_actions_timer(mock_time_suspend_actions_timer); 883a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.wake_reason_received_ = true; 884a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL(*mock_time_suspend_actions_timer, GetElapsedTime(_)) 885a49334304182db378741214a1a82e47351c3fddbSamuel Tan .WillOnce( 886a49334304182db378741214a1a82e47351c3fddbSamuel Tan DoAll(SetArgumentPointee<0>(non_zero_time_delta), Return(true))); 887a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL(*mock_time_suspend_actions_timer, HasStarted()) 888a49334304182db378741214a1a82e47351c3fddbSamuel Tan .WillOnce(Return(true)); 889a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL(library_, 890a49334304182db378741214a1a82e47351c3fddbSamuel Tan SendToUMA(Metrics::kMetricSuspendActionTimeTaken, 891a49334304182db378741214a1a82e47351c3fddbSamuel Tan non_zero_time_delta.InMilliseconds(), 892a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kMetricSuspendActionTimeTakenMillisecondsMin, 893a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kMetricSuspendActionTimeTakenMillisecondsMax, 894a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kTimerHistogramNumBuckets)); 895a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL(library_, SendEnumToUMA(Metrics::kMetricSuspendActionResult, 896a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kSuspendActionResultSuccess, 897a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kSuspendActionResultMax)); 898a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.NotifySuspendActionsCompleted(true); 899a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_FALSE(metrics_.wake_reason_received_); 900a49334304182db378741214a1a82e47351c3fddbSamuel Tan} 901a49334304182db378741214a1a82e47351c3fddbSamuel Tan 902a49334304182db378741214a1a82e47351c3fddbSamuel TanTEST_F(MetricsTest, NotifySuspendActionsCompleted_Failure) { 903a49334304182db378741214a1a82e47351c3fddbSamuel Tan base::TimeDelta non_zero_time_delta = base::TimeDelta::FromMilliseconds(1); 9043b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart chromeos_metrics::TimerMock* mock_time_suspend_actions_timer = 905a49334304182db378741214a1a82e47351c3fddbSamuel Tan new chromeos_metrics::TimerMock; 906a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.set_time_suspend_actions_timer(mock_time_suspend_actions_timer); 907a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.wake_reason_received_ = true; 908a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL(*mock_time_suspend_actions_timer, GetElapsedTime(_)) 909a49334304182db378741214a1a82e47351c3fddbSamuel Tan .WillOnce( 910a49334304182db378741214a1a82e47351c3fddbSamuel Tan DoAll(SetArgumentPointee<0>(non_zero_time_delta), Return(true))); 911a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL(*mock_time_suspend_actions_timer, HasStarted()) 912a49334304182db378741214a1a82e47351c3fddbSamuel Tan .WillOnce(Return(true)); 913a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL(library_, 914a49334304182db378741214a1a82e47351c3fddbSamuel Tan SendToUMA(Metrics::kMetricSuspendActionTimeTaken, 915a49334304182db378741214a1a82e47351c3fddbSamuel Tan non_zero_time_delta.InMilliseconds(), 916a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kMetricSuspendActionTimeTakenMillisecondsMin, 917a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kMetricSuspendActionTimeTakenMillisecondsMax, 918a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kTimerHistogramNumBuckets)); 919a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL(library_, SendEnumToUMA(Metrics::kMetricSuspendActionResult, 920a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kSuspendActionResultFailure, 921a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kSuspendActionResultMax)); 922a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.NotifySuspendActionsCompleted(false); 923a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_FALSE(metrics_.wake_reason_received_); 924a49334304182db378741214a1a82e47351c3fddbSamuel Tan} 925a49334304182db378741214a1a82e47351c3fddbSamuel Tan 926a49334304182db378741214a1a82e47351c3fddbSamuel TanTEST_F(MetricsTest, NotifyDarkResumeActionsCompleted_Success) { 927a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.num_scan_results_expected_in_dark_resume_ = 0; 928a49334304182db378741214a1a82e47351c3fddbSamuel Tan base::TimeDelta non_zero_time_delta = base::TimeDelta::FromMilliseconds(1); 9293b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart chromeos_metrics::TimerMock* mock_time_dark_resume_actions_timer = 930a49334304182db378741214a1a82e47351c3fddbSamuel Tan new chromeos_metrics::TimerMock; 931a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.set_time_dark_resume_actions_timer( 932a49334304182db378741214a1a82e47351c3fddbSamuel Tan mock_time_dark_resume_actions_timer); 933a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.wake_reason_received_ = true; 934029feaca0309984367c2f824957ee250ada45a78Samuel Tan const int non_zero_num_retries = 3; 935029feaca0309984367c2f824957ee250ada45a78Samuel Tan metrics_.dark_resume_scan_retries_ = non_zero_num_retries; 936a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL(*mock_time_dark_resume_actions_timer, GetElapsedTime(_)) 937a49334304182db378741214a1a82e47351c3fddbSamuel Tan .WillOnce( 938a49334304182db378741214a1a82e47351c3fddbSamuel Tan DoAll(SetArgumentPointee<0>(non_zero_time_delta), Return(true))); 939a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL(*mock_time_dark_resume_actions_timer, HasStarted()) 940a49334304182db378741214a1a82e47351c3fddbSamuel Tan .WillOnce(Return(true)); 941a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL( 942a49334304182db378741214a1a82e47351c3fddbSamuel Tan library_, 943a49334304182db378741214a1a82e47351c3fddbSamuel Tan SendToUMA(Metrics::kMetricDarkResumeActionTimeTaken, 944a49334304182db378741214a1a82e47351c3fddbSamuel Tan non_zero_time_delta.InMilliseconds(), 945a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kMetricDarkResumeActionTimeTakenMillisecondsMin, 946a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kMetricDarkResumeActionTimeTakenMillisecondsMax, 947a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kTimerHistogramNumBuckets)); 948a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL(library_, SendEnumToUMA(Metrics::kMetricDarkResumeActionResult, 949a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kDarkResumeActionResultSuccess, 950a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kDarkResumeActionResultMax)); 951a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL( 952a49334304182db378741214a1a82e47351c3fddbSamuel Tan library_, 953a49334304182db378741214a1a82e47351c3fddbSamuel Tan SendEnumToUMA(Metrics::kMetricDarkResumeUnmatchedScanResultReceived, 954a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kDarkResumeUnmatchedScanResultsReceivedFalse, 955a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kDarkResumeUnmatchedScanResultsReceivedMax)); 956029feaca0309984367c2f824957ee250ada45a78Samuel Tan EXPECT_CALL(library_, SendToUMA(Metrics::kMetricDarkResumeScanNumRetries, 957029feaca0309984367c2f824957ee250ada45a78Samuel Tan non_zero_num_retries, 958029feaca0309984367c2f824957ee250ada45a78Samuel Tan Metrics::kMetricDarkResumeScanNumRetriesMin, 959029feaca0309984367c2f824957ee250ada45a78Samuel Tan Metrics::kMetricDarkResumeScanNumRetriesMax, 960029feaca0309984367c2f824957ee250ada45a78Samuel Tan Metrics::kTimerHistogramNumBuckets)); 961a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.NotifyDarkResumeActionsCompleted(true); 962a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_FALSE(metrics_.wake_reason_received_); 963a49334304182db378741214a1a82e47351c3fddbSamuel Tan} 964a49334304182db378741214a1a82e47351c3fddbSamuel Tan 965a49334304182db378741214a1a82e47351c3fddbSamuel TanTEST_F(MetricsTest, NotifyDarkResumeActionsCompleted_Failure) { 966a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.num_scan_results_expected_in_dark_resume_ = 0; 967a49334304182db378741214a1a82e47351c3fddbSamuel Tan base::TimeDelta non_zero_time_delta = base::TimeDelta::FromMilliseconds(1); 9683b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart chromeos_metrics::TimerMock* mock_time_dark_resume_actions_timer = 969a49334304182db378741214a1a82e47351c3fddbSamuel Tan new chromeos_metrics::TimerMock; 970a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.set_time_dark_resume_actions_timer( 971a49334304182db378741214a1a82e47351c3fddbSamuel Tan mock_time_dark_resume_actions_timer); 972a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.wake_reason_received_ = true; 973029feaca0309984367c2f824957ee250ada45a78Samuel Tan const int non_zero_num_retries = 3; 974029feaca0309984367c2f824957ee250ada45a78Samuel Tan metrics_.dark_resume_scan_retries_ = non_zero_num_retries; 975a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL(*mock_time_dark_resume_actions_timer, GetElapsedTime(_)) 976a49334304182db378741214a1a82e47351c3fddbSamuel Tan .WillOnce( 977a49334304182db378741214a1a82e47351c3fddbSamuel Tan DoAll(SetArgumentPointee<0>(non_zero_time_delta), Return(true))); 978a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL(*mock_time_dark_resume_actions_timer, HasStarted()) 979a49334304182db378741214a1a82e47351c3fddbSamuel Tan .WillOnce(Return(true)); 980a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL( 981a49334304182db378741214a1a82e47351c3fddbSamuel Tan library_, 982a49334304182db378741214a1a82e47351c3fddbSamuel Tan SendToUMA(Metrics::kMetricDarkResumeActionTimeTaken, 983a49334304182db378741214a1a82e47351c3fddbSamuel Tan non_zero_time_delta.InMilliseconds(), 984a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kMetricDarkResumeActionTimeTakenMillisecondsMin, 985a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kMetricDarkResumeActionTimeTakenMillisecondsMax, 986a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kTimerHistogramNumBuckets)); 987a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL(library_, SendEnumToUMA(Metrics::kMetricDarkResumeActionResult, 988a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kDarkResumeActionResultFailure, 989a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kDarkResumeActionResultMax)); 990a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_CALL( 991a49334304182db378741214a1a82e47351c3fddbSamuel Tan library_, 992a49334304182db378741214a1a82e47351c3fddbSamuel Tan SendEnumToUMA(Metrics::kMetricDarkResumeUnmatchedScanResultReceived, 993a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kDarkResumeUnmatchedScanResultsReceivedFalse, 994a49334304182db378741214a1a82e47351c3fddbSamuel Tan Metrics::kDarkResumeUnmatchedScanResultsReceivedMax)); 995029feaca0309984367c2f824957ee250ada45a78Samuel Tan EXPECT_CALL(library_, SendToUMA(Metrics::kMetricDarkResumeScanNumRetries, 996029feaca0309984367c2f824957ee250ada45a78Samuel Tan non_zero_num_retries, 997029feaca0309984367c2f824957ee250ada45a78Samuel Tan Metrics::kMetricDarkResumeScanNumRetriesMin, 998029feaca0309984367c2f824957ee250ada45a78Samuel Tan Metrics::kMetricDarkResumeScanNumRetriesMax, 999029feaca0309984367c2f824957ee250ada45a78Samuel Tan Metrics::kTimerHistogramNumBuckets)); 1000a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.NotifyDarkResumeActionsCompleted(false); 1001a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_FALSE(metrics_.wake_reason_received_); 1002a49334304182db378741214a1a82e47351c3fddbSamuel Tan} 1003a49334304182db378741214a1a82e47351c3fddbSamuel Tan 1004a49334304182db378741214a1a82e47351c3fddbSamuel TanTEST_F(MetricsTest, NotifySuspendActionsStarted) { 1005a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.time_suspend_actions_timer->Stop(); 1006a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.wake_on_wifi_throttled_ = true; 1007a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.NotifySuspendActionsStarted(); 1008a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_TRUE(metrics_.time_suspend_actions_timer->HasStarted()); 1009a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_FALSE(metrics_.wake_on_wifi_throttled_); 1010a49334304182db378741214a1a82e47351c3fddbSamuel Tan} 1011a49334304182db378741214a1a82e47351c3fddbSamuel Tan 1012a49334304182db378741214a1a82e47351c3fddbSamuel TanTEST_F(MetricsTest, NotifyDarkResumeActionsStarted) { 1013a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.time_dark_resume_actions_timer->Stop(); 1014a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.num_scan_results_expected_in_dark_resume_ = 2; 1015029feaca0309984367c2f824957ee250ada45a78Samuel Tan metrics_.dark_resume_scan_retries_ = 3; 1016a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.NotifyDarkResumeActionsStarted(); 1017a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_TRUE(metrics_.time_dark_resume_actions_timer->HasStarted()); 1018a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_EQ(0, metrics_.num_scan_results_expected_in_dark_resume_); 1019029feaca0309984367c2f824957ee250ada45a78Samuel Tan EXPECT_EQ(0, metrics_.dark_resume_scan_retries_); 1020a49334304182db378741214a1a82e47351c3fddbSamuel Tan} 1021a49334304182db378741214a1a82e47351c3fddbSamuel Tan 1022a49334304182db378741214a1a82e47351c3fddbSamuel TanTEST_F(MetricsTest, NotifyDarkResumeInitiateScan) { 1023a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.num_scan_results_expected_in_dark_resume_ = 0; 1024a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.NotifyDarkResumeInitiateScan(); 1025a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_EQ(1, metrics_.num_scan_results_expected_in_dark_resume_); 1026a49334304182db378741214a1a82e47351c3fddbSamuel Tan} 1027a49334304182db378741214a1a82e47351c3fddbSamuel Tan 1028a49334304182db378741214a1a82e47351c3fddbSamuel TanTEST_F(MetricsTest, NotifyDarkResumeScanResultsReceived) { 1029a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.num_scan_results_expected_in_dark_resume_ = 1; 1030a49334304182db378741214a1a82e47351c3fddbSamuel Tan metrics_.NotifyDarkResumeScanResultsReceived(); 1031a49334304182db378741214a1a82e47351c3fddbSamuel Tan EXPECT_EQ(0, metrics_.num_scan_results_expected_in_dark_resume_); 1032a49334304182db378741214a1a82e47351c3fddbSamuel Tan} 1033a49334304182db378741214a1a82e47351c3fddbSamuel Tan 1034029feaca0309984367c2f824957ee250ada45a78Samuel TanTEST_F(MetricsTest, NotifyDarkResumeScanRetry) { 1035029feaca0309984367c2f824957ee250ada45a78Samuel Tan const int initial_num_retries = 2; 1036029feaca0309984367c2f824957ee250ada45a78Samuel Tan metrics_.dark_resume_scan_retries_ = initial_num_retries; 1037029feaca0309984367c2f824957ee250ada45a78Samuel Tan metrics_.NotifyDarkResumeScanRetry(); 1038029feaca0309984367c2f824957ee250ada45a78Samuel Tan EXPECT_EQ(initial_num_retries + 1, metrics_.dark_resume_scan_retries_); 1039029feaca0309984367c2f824957ee250ada45a78Samuel Tan} 1040029feaca0309984367c2f824957ee250ada45a78Samuel Tan 1041029feaca0309984367c2f824957ee250ada45a78Samuel TanTEST_F(MetricsTest, NotifyBeforeSuspendActions_InDarkResume) { 1042029feaca0309984367c2f824957ee250ada45a78Samuel Tan const bool in_dark_resume = true; 1043029feaca0309984367c2f824957ee250ada45a78Samuel Tan bool is_connected; 1044029feaca0309984367c2f824957ee250ada45a78Samuel Tan metrics_.dark_resume_scan_retries_ = 1; 1045029feaca0309984367c2f824957ee250ada45a78Samuel Tan 1046029feaca0309984367c2f824957ee250ada45a78Samuel Tan is_connected = true; 1047029feaca0309984367c2f824957ee250ada45a78Samuel Tan EXPECT_CALL(library_, 1048029feaca0309984367c2f824957ee250ada45a78Samuel Tan SendEnumToUMA(Metrics::kMetricDarkResumeScanRetryResult, 1049029feaca0309984367c2f824957ee250ada45a78Samuel Tan Metrics::kDarkResumeScanRetryResultConnected, 1050029feaca0309984367c2f824957ee250ada45a78Samuel Tan Metrics::kDarkResumeScanRetryResultMax)); 1051029feaca0309984367c2f824957ee250ada45a78Samuel Tan metrics_.NotifyBeforeSuspendActions(is_connected, in_dark_resume); 1052029feaca0309984367c2f824957ee250ada45a78Samuel Tan 1053029feaca0309984367c2f824957ee250ada45a78Samuel Tan is_connected = false; 1054029feaca0309984367c2f824957ee250ada45a78Samuel Tan EXPECT_CALL(library_, 1055029feaca0309984367c2f824957ee250ada45a78Samuel Tan SendEnumToUMA(Metrics::kMetricDarkResumeScanRetryResult, 1056029feaca0309984367c2f824957ee250ada45a78Samuel Tan Metrics::kDarkResumeScanRetryResultNotConnected, 1057029feaca0309984367c2f824957ee250ada45a78Samuel Tan Metrics::kDarkResumeScanRetryResultMax)); 1058029feaca0309984367c2f824957ee250ada45a78Samuel Tan metrics_.NotifyBeforeSuspendActions(is_connected, in_dark_resume); 1059029feaca0309984367c2f824957ee250ada45a78Samuel Tan} 1060029feaca0309984367c2f824957ee250ada45a78Samuel Tan 1061029feaca0309984367c2f824957ee250ada45a78Samuel TanTEST_F(MetricsTest, NotifyBeforeSuspendActions_NotInDarkResume) { 1062029feaca0309984367c2f824957ee250ada45a78Samuel Tan const bool in_dark_resume = false; 1063029feaca0309984367c2f824957ee250ada45a78Samuel Tan bool is_connected; 1064029feaca0309984367c2f824957ee250ada45a78Samuel Tan metrics_.dark_resume_scan_retries_ = 1; 1065029feaca0309984367c2f824957ee250ada45a78Samuel Tan 1066029feaca0309984367c2f824957ee250ada45a78Samuel Tan is_connected = true; 1067029feaca0309984367c2f824957ee250ada45a78Samuel Tan EXPECT_CALL(library_, SendEnumToUMA(_, _, _)).Times(0); 1068029feaca0309984367c2f824957ee250ada45a78Samuel Tan metrics_.NotifyBeforeSuspendActions(is_connected, in_dark_resume); 1069029feaca0309984367c2f824957ee250ada45a78Samuel Tan 1070029feaca0309984367c2f824957ee250ada45a78Samuel Tan is_connected = false; 1071029feaca0309984367c2f824957ee250ada45a78Samuel Tan EXPECT_CALL(library_, SendEnumToUMA(_, _, _)).Times(0); 1072029feaca0309984367c2f824957ee250ada45a78Samuel Tan metrics_.NotifyBeforeSuspendActions(is_connected, in_dark_resume); 1073029feaca0309984367c2f824957ee250ada45a78Samuel Tan} 1074029feaca0309984367c2f824957ee250ada45a78Samuel Tan 1075d1c7166402c414a851da721c2a3aaec713c25badSamuel TanTEST_F(MetricsTest, NotifyConnectionDiagnosticsIssue_Success) { 1076d1c7166402c414a851da721c2a3aaec713c25badSamuel Tan const string& issue = ConnectionDiagnostics::kIssueIPCollision; 1077d1c7166402c414a851da721c2a3aaec713c25badSamuel Tan EXPECT_CALL(library_, 1078d1c7166402c414a851da721c2a3aaec713c25badSamuel Tan SendEnumToUMA(Metrics::kMetricConnectionDiagnosticsIssue, 1079d1c7166402c414a851da721c2a3aaec713c25badSamuel Tan Metrics::kConnectionDiagnosticsIssueIPCollision, 1080d1c7166402c414a851da721c2a3aaec713c25badSamuel Tan Metrics::kConnectionDiagnosticsIssueMax)); 1081d1c7166402c414a851da721c2a3aaec713c25badSamuel Tan metrics_.NotifyConnectionDiagnosticsIssue(issue); 1082d1c7166402c414a851da721c2a3aaec713c25badSamuel Tan} 1083d1c7166402c414a851da721c2a3aaec713c25badSamuel Tan 1084d1c7166402c414a851da721c2a3aaec713c25badSamuel TanTEST_F(MetricsTest, NotifyConnectionDiagnosticsIssue_Failure) { 1085d1c7166402c414a851da721c2a3aaec713c25badSamuel Tan const string& invalid_issue = "Invalid issue string."; 1086d1c7166402c414a851da721c2a3aaec713c25badSamuel Tan EXPECT_CALL(library_, SendEnumToUMA(_, _, _)).Times(0); 1087d1c7166402c414a851da721c2a3aaec713c25badSamuel Tan metrics_.NotifyConnectionDiagnosticsIssue(invalid_issue); 1088d1c7166402c414a851da721c2a3aaec713c25badSamuel Tan} 1089d1c7166402c414a851da721c2a3aaec713c25badSamuel Tan 109085e050b4923878a57aec1415314d2b39ff233e00Thieu Le#ifndef NDEBUG 109185e050b4923878a57aec1415314d2b39ff233e00Thieu Le 109285e050b4923878a57aec1415314d2b39ff233e00Thieu Letypedef MetricsTest MetricsDeathTest; 109385e050b4923878a57aec1415314d2b39ff233e00Thieu Le 109485e050b4923878a57aec1415314d2b39ff233e00Thieu LeTEST_F(MetricsDeathTest, PortalDetectionResultToEnumDNSSuccess) { 10953d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein PortalDetector::Result result( 10963d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein ConnectivityTrial::Result(ConnectivityTrial::kPhaseDNS, 10973d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein ConnectivityTrial::kStatusSuccess), 10983d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein 0, true); 109985e050b4923878a57aec1415314d2b39ff233e00Thieu Le EXPECT_DEATH(Metrics::PortalDetectionResultToEnum(result), 110085e050b4923878a57aec1415314d2b39ff233e00Thieu Le "Final result status 1 is not allowed in the DNS phase"); 110185e050b4923878a57aec1415314d2b39ff233e00Thieu Le} 110285e050b4923878a57aec1415314d2b39ff233e00Thieu Le 110385e050b4923878a57aec1415314d2b39ff233e00Thieu LeTEST_F(MetricsDeathTest, PortalDetectionResultToEnumConnectionSuccess) { 11043d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein PortalDetector::Result result( 11053d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein ConnectivityTrial::Result(ConnectivityTrial::kPhaseConnection, 11063d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein ConnectivityTrial::kStatusSuccess), 11073d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein 0, true); 110885e050b4923878a57aec1415314d2b39ff233e00Thieu Le EXPECT_DEATH(Metrics::PortalDetectionResultToEnum(result), 110985e050b4923878a57aec1415314d2b39ff233e00Thieu Le "Final result status 1 is not allowed in the Connection phase"); 111085e050b4923878a57aec1415314d2b39ff233e00Thieu Le} 111185e050b4923878a57aec1415314d2b39ff233e00Thieu Le 111285e050b4923878a57aec1415314d2b39ff233e00Thieu LeTEST_F(MetricsDeathTest, PortalDetectionResultToEnumHTTPSuccess) { 11133d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein PortalDetector::Result result( 11143d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein ConnectivityTrial::Result(ConnectivityTrial::kPhaseHTTP, 11153d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein ConnectivityTrial::kStatusSuccess), 11163d49ea435a59436f762c2cc5e750ff27ece0d3c5Rebecca Silberstein 0, true); 111785e050b4923878a57aec1415314d2b39ff233e00Thieu Le EXPECT_DEATH(Metrics::PortalDetectionResultToEnum(result), 111885e050b4923878a57aec1415314d2b39ff233e00Thieu Le "Final result status 1 is not allowed in the HTTP phase"); 111985e050b4923878a57aec1415314d2b39ff233e00Thieu Le} 112085e050b4923878a57aec1415314d2b39ff233e00Thieu Le 112185e050b4923878a57aec1415314d2b39ff233e00Thieu Le#endif // NDEBUG 112285e050b4923878a57aec1415314d2b39ff233e00Thieu Le 112348e6d6d0ec0f90d9b2206f60c1ff2a825c5ce9c1Thieu Le} // namespace shill 1124