198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// 298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// Copyright (C) 2017 The Android Open Source Project 398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// 498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// Licensed under the Apache License, Version 2.0 (the "License"); 598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// you may not use this file except in compliance with the License. 698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// You may obtain a copy of the License at 798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// 898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// http://www.apache.org/licenses/LICENSE-2.0 998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// 1098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// Unless required by applicable law or agreed to in writing, software 1198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// distributed under the License is distributed on an "AS IS" BASIS, 1298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// See the License for the specific language governing permissions and 1498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// limitations under the License. 1598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// 1698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 1798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu#include "update_engine/metrics_reporter_omaha.h" 1898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 1998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu#include <memory> 2098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu#include <string> 2198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 2298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu#include <base/time/time.h> 2398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu#include <gmock/gmock.h> 2498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu#include <gtest/gtest.h> 2598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu#include <metrics/metrics_library_mock.h> 2698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 2798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu#include "update_engine/common/fake_clock.h" 2898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu#include "update_engine/common/fake_prefs.h" 2998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu#include "update_engine/fake_system_state.h" 3098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 3198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuusing base::TimeDelta; 3298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuusing testing::AnyNumber; 3398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuusing testing::_; 3498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 3598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xunamespace chromeos_update_engine { 3698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuclass MetricsReporterOmahaTest : public ::testing::Test { 3798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu protected: 3898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu MetricsReporterOmahaTest() = default; 3998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 4098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu // Reset the metrics_lib_ to a mock library. 4198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu void SetUp() override { 4298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu mock_metrics_lib_ = new testing::NiceMock<MetricsLibraryMock>(); 4398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu reporter_.metrics_lib_.reset(mock_metrics_lib_); 4498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu } 4598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 4698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu testing::NiceMock<MetricsLibraryMock>* mock_metrics_lib_; 4798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu MetricsReporterOmaha reporter_; 4898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu}; 4998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 5098333a8a1aa7c8197b350b113a9912baab4a051fTianjie XuTEST_F(MetricsReporterOmahaTest, ReportDailyMetrics) { 5198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu TimeDelta age = TimeDelta::FromDays(10); 5298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL(*mock_metrics_lib_, 5398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA(metrics::kMetricDailyOSAgeDays, _, _, _, _)) 5498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 5598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 5698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu reporter_.ReportDailyMetrics(age); 5798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu} 5898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 5998333a8a1aa7c8197b350b113a9912baab4a051fTianjie XuTEST_F(MetricsReporterOmahaTest, ReportUpdateCheckMetrics) { 6098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu FakeSystemState fake_system_state; 6198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu FakeClock fake_clock; 6298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu FakePrefs fake_prefs; 6398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 6498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu // We need to execute the report twice to test the time since last report. 6598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu fake_system_state.set_clock(&fake_clock); 6698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu fake_system_state.set_prefs(&fake_prefs); 6798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu fake_clock.SetWallclockTime(base::Time::FromInternalValue(1000000)); 6898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu fake_clock.SetMonotonicTime(base::Time::FromInternalValue(1000000)); 6998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 7098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::CheckResult result = metrics::CheckResult::kUpdateAvailable; 7198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::CheckReaction reaction = metrics::CheckReaction::kIgnored; 7298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::DownloadErrorCode error_code = 7398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::DownloadErrorCode::kHttpStatus200; 7498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 7598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL( 7698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu *mock_metrics_lib_, 7798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendEnumToUMA(metrics::kMetricCheckResult, static_cast<int>(result), _)) 7898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(2); 7998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL(*mock_metrics_lib_, 8098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendEnumToUMA( 8198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::kMetricCheckReaction, static_cast<int>(reaction), _)) 8298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(2); 8398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL(*mock_metrics_lib_, 8498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendSparseToUMA(metrics::kMetricCheckDownloadErrorCode, 8598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu static_cast<int>(error_code))) 8698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(2); 8798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 8898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL( 8998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu *mock_metrics_lib_, 9098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA(metrics::kMetricCheckTimeSinceLastCheckMinutes, 1, _, _, _)) 9198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 9298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL( 9398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu *mock_metrics_lib_, 9498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA( 9598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::kMetricCheckTimeSinceLastCheckUptimeMinutes, 1, _, _, _)) 9698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 9798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 9898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu reporter_.ReportUpdateCheckMetrics( 9998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu &fake_system_state, result, reaction, error_code); 10098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 10198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu // Advance the clock by 1 minute and report the same metrics again. 10298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu fake_clock.SetWallclockTime(base::Time::FromInternalValue(61000000)); 10398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu fake_clock.SetMonotonicTime(base::Time::FromInternalValue(61000000)); 10498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu reporter_.ReportUpdateCheckMetrics( 10598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu &fake_system_state, result, reaction, error_code); 10698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu} 10798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 10898333a8a1aa7c8197b350b113a9912baab4a051fTianjie XuTEST_F(MetricsReporterOmahaTest, 10998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu ReportAbnormallyTerminatedUpdateAttemptMetrics) { 11098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL(*mock_metrics_lib_, 11198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendEnumToUMA(metrics::kMetricAttemptResult, 11298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu static_cast<int>( 11398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::AttemptResult::kAbnormalTermination), 11498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _)) 11598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 11698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 11798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu reporter_.ReportAbnormallyTerminatedUpdateAttemptMetrics(); 11898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu} 11998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 12098333a8a1aa7c8197b350b113a9912baab4a051fTianjie XuTEST_F(MetricsReporterOmahaTest, ReportUpdateAttemptMetrics) { 12198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu FakeSystemState fake_system_state; 12298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu FakeClock fake_clock; 12398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu FakePrefs fake_prefs; 12498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 12598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu fake_system_state.set_clock(&fake_clock); 12698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu fake_system_state.set_prefs(&fake_prefs); 12798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu fake_clock.SetWallclockTime(base::Time::FromInternalValue(1000000)); 12898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu fake_clock.SetMonotonicTime(base::Time::FromInternalValue(1000000)); 12998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 13098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu int attempt_number = 1; 13198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu PayloadType payload_type = kPayloadTypeFull; 13298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu TimeDelta duration = TimeDelta::FromMinutes(1000); 13398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu TimeDelta duration_uptime = TimeDelta::FromMinutes(1000); 13498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 13598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu int64_t payload_size = 100 * kNumBytesInOneMiB; 1361f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu 13798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::AttemptResult attempt_result = 13898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::AttemptResult::kInternalError; 13998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu ErrorCode internal_error_code = ErrorCode::kDownloadInvalidMetadataSignature; 14098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 14198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL(*mock_metrics_lib_, 14298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA(metrics::kMetricAttemptNumber, attempt_number, _, _, _)) 14398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(2); 14498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL(*mock_metrics_lib_, 14598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendEnumToUMA(metrics::kMetricAttemptPayloadType, 14698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu static_cast<int>(payload_type), 14798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _)) 14898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(2); 14998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL(*mock_metrics_lib_, 15098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA(metrics::kMetricAttemptDurationMinutes, 15198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu duration.InMinutes(), 15298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _, 15398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _, 15498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _)) 15598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(2); 15698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL(*mock_metrics_lib_, 15798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA(metrics::kMetricAttemptDurationUptimeMinutes, 15898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu duration_uptime.InMinutes(), 15998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _, 16098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _, 16198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _)) 16298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(2); 16398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 16498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 16598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu // Check the report of attempt result. 16698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL( 16798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu *mock_metrics_lib_, 16898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendEnumToUMA( 16998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::kMetricAttemptResult, static_cast<int>(attempt_result), _)) 17098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(2); 17198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL(*mock_metrics_lib_, 17298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendEnumToUMA(metrics::kMetricAttemptInternalErrorCode, 17398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu static_cast<int>(internal_error_code), 17498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _)) 17598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(2); 17698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL(*mock_metrics_lib_, 1771f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu SendToUMA(metrics::kMetricAttemptPayloadSizeMiB, 100, _, _, _)) 17898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(2); 17998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 18098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu // Check the duration between two reports. 18198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL( 18298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu *mock_metrics_lib_, 18398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA(metrics::kMetricAttemptTimeSinceLastAttemptMinutes, 1, _, _, _)) 18498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 18598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL( 18698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu *mock_metrics_lib_, 18798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA( 18898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::kMetricAttemptTimeSinceLastAttemptUptimeMinutes, 1, _, _, _)) 18998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 19098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 19198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu reporter_.ReportUpdateAttemptMetrics(&fake_system_state, 19298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu attempt_number, 19398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu payload_type, 19498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu duration, 19598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu duration_uptime, 19698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu payload_size, 19798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu attempt_result, 1981f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu internal_error_code); 19998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 20098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu // Advance the clock by 1 minute and report the same metrics again. 20198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu fake_clock.SetWallclockTime(base::Time::FromInternalValue(61000000)); 20298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu fake_clock.SetMonotonicTime(base::Time::FromInternalValue(61000000)); 20398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu reporter_.ReportUpdateAttemptMetrics(&fake_system_state, 20498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu attempt_number, 20598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu payload_type, 20698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu duration, 20798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu duration_uptime, 20898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu payload_size, 20998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu attempt_result, 2101f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu internal_error_code); 2111f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu} 2121f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu 2131f93d098d6d6c341ed7471352fda80c936471a17Tianjie XuTEST_F(MetricsReporterOmahaTest, ReportUpdateAttemptDownloadMetrics) { 2141f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu int64_t payload_bytes_downloaded = 200 * kNumBytesInOneMiB; 2151f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu int64_t payload_download_speed_bps = 100 * 1000; 2161f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu DownloadSource download_source = kDownloadSourceHttpServer; 2171f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu metrics::DownloadErrorCode payload_download_error_code = 2181f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu metrics::DownloadErrorCode::kDownloadError; 2191f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu metrics::ConnectionType connection_type = metrics::ConnectionType::kCellular; 2201f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu 2211f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu EXPECT_CALL( 2221f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu *mock_metrics_lib_, 2231f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu SendToUMA(metrics::kMetricAttemptPayloadBytesDownloadedMiB, 200, _, _, _)) 2241f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu .Times(1); 2251f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu EXPECT_CALL( 2261f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu *mock_metrics_lib_, 2271f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu SendToUMA(metrics::kMetricAttemptPayloadDownloadSpeedKBps, 100, _, _, _)) 2281f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu .Times(1); 2291f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu EXPECT_CALL(*mock_metrics_lib_, 2301f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu SendEnumToUMA(metrics::kMetricAttemptDownloadSource, 2311f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu static_cast<int>(download_source), 2321f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu _)) 2331f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu .Times(1); 2341f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu EXPECT_CALL(*mock_metrics_lib_, 2351f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu SendSparseToUMA(metrics::kMetricAttemptDownloadErrorCode, 2361f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu static_cast<int>(payload_download_error_code))) 2371f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu .Times(1); 2381f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu EXPECT_CALL(*mock_metrics_lib_, 2391f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu SendEnumToUMA(metrics::kMetricAttemptConnectionType, 2401f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu static_cast<int>(connection_type), 2411f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu _)) 2421f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu .Times(1); 2431f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu 2441f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu reporter_.ReportUpdateAttemptDownloadMetrics(payload_bytes_downloaded, 2451f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu payload_download_speed_bps, 2461f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu download_source, 2471f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu payload_download_error_code, 2481f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu connection_type); 24998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu} 25098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 25198333a8a1aa7c8197b350b113a9912baab4a051fTianjie XuTEST_F(MetricsReporterOmahaTest, ReportSuccessfulUpdateMetrics) { 25298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu int attempt_count = 3; 25398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu int updates_abandoned_count = 2; 25498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu PayloadType payload_type = kPayloadTypeDelta; 25598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu int64_t payload_size = 200 * kNumBytesInOneMiB; 25698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu int64_t num_bytes_downloaded[kNumDownloadSources] = {}; 25798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu // 200MiB payload downloaded from HttpsServer. 25898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu num_bytes_downloaded[0] = 200 * kNumBytesInOneMiB; 25998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu int download_overhead_percentage = 20; 26098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu TimeDelta total_duration = TimeDelta::FromMinutes(30); 26198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu int reboot_count = 2; 26298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu int url_switch_count = 2; 26398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 26498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL( 26598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu *mock_metrics_lib_, 26698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA(metrics::kMetricSuccessfulUpdatePayloadSizeMiB, 200, _, _, _)) 26798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 26898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 26998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu // Check the report to both BytesDownloadedMiBHttpsServer and 27098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu // BytesDownloadedMiB 27198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu std::string DownloadedMiBMetric = 27298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::kMetricSuccessfulUpdateBytesDownloadedMiB; 27398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu DownloadedMiBMetric += "HttpsServer"; 27498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL(*mock_metrics_lib_, SendToUMA(DownloadedMiBMetric, 200, _, _, _)) 27598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 27698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL( 27798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu *mock_metrics_lib_, 27898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA( 27998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::kMetricSuccessfulUpdateBytesDownloadedMiB, 200, _, _, _)) 28098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 28198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 28298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL( 28398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu *mock_metrics_lib_, 28498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA( 28598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::kMetricSuccessfulUpdateDownloadSourcesUsed, 1, _, _, _)) 28698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 28798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL( 28898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu *mock_metrics_lib_, 28998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA(metrics::kMetricSuccessfulUpdateDownloadOverheadPercentage, 29098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 20, 29198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _, 29298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _, 29398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _)); 29498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 29598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL(*mock_metrics_lib_, 29698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA(metrics::kMetricSuccessfulUpdateUrlSwitchCount, 29798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu url_switch_count, 29898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _, 29998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _, 30098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _)) 30198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 30298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL( 30398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu *mock_metrics_lib_, 30498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA( 30598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::kMetricSuccessfulUpdateTotalDurationMinutes, 30, _, _, _)) 30698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 30798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL( 30898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu *mock_metrics_lib_, 30998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA( 31098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::kMetricSuccessfulUpdateRebootCount, reboot_count, _, _, _)) 31198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 31298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL(*mock_metrics_lib_, 31398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendEnumToUMA( 31498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::kMetricSuccessfulUpdatePayloadType, payload_type, _)) 31598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 31698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL( 31798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu *mock_metrics_lib_, 31898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA( 31998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::kMetricSuccessfulUpdateAttemptCount, attempt_count, _, _, _)) 32098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 32198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL(*mock_metrics_lib_, 32298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA(metrics::kMetricSuccessfulUpdateUpdatesAbandonedCount, 32398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu updates_abandoned_count, 32498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _, 32598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _, 32698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _)) 32798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 32898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 32998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu reporter_.ReportSuccessfulUpdateMetrics(attempt_count, 33098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu updates_abandoned_count, 33198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu payload_type, 33298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu payload_size, 33398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu num_bytes_downloaded, 33498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu download_overhead_percentage, 33598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu total_duration, 33698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu reboot_count, 33798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu url_switch_count); 33898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu} 33998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 34098333a8a1aa7c8197b350b113a9912baab4a051fTianjie XuTEST_F(MetricsReporterOmahaTest, ReportRollbackMetrics) { 34198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::RollbackResult result = metrics::RollbackResult::kSuccess; 34298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL(*mock_metrics_lib_, 34398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendEnumToUMA( 34498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::kMetricRollbackResult, static_cast<int>(result), _)) 34598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 34698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 34798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu reporter_.ReportRollbackMetrics(result); 34898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu} 34998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 35098333a8a1aa7c8197b350b113a9912baab4a051fTianjie XuTEST_F(MetricsReporterOmahaTest, ReportCertificateCheckMetrics) { 35198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu ServerToCheck server_to_check = ServerToCheck::kUpdate; 35298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu CertificateCheckResult result = CertificateCheckResult::kValid; 35398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL(*mock_metrics_lib_, 35498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendEnumToUMA(metrics::kMetricCertificateCheckUpdateCheck, 35598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu static_cast<int>(result), 35698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu _)) 35798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 35898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 35998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu reporter_.ReportCertificateCheckMetrics(server_to_check, result); 36098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu} 36198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 36298333a8a1aa7c8197b350b113a9912baab4a051fTianjie XuTEST_F(MetricsReporterOmahaTest, ReportFailedUpdateCount) { 36398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu int target_attempt = 3; 36498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL( 36598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu *mock_metrics_lib_, 36698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA(metrics::kMetricFailedUpdateCount, target_attempt, _, _, _)) 36798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 36898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 36998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu reporter_.ReportFailedUpdateCount(target_attempt); 37098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu} 37198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 37298333a8a1aa7c8197b350b113a9912baab4a051fTianjie XuTEST_F(MetricsReporterOmahaTest, ReportTimeToReboot) { 37398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu int time_to_reboot_minutes = 1000; 37498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL( 37598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu *mock_metrics_lib_, 37698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendToUMA( 37798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu metrics::kMetricTimeToRebootMinutes, time_to_reboot_minutes, _, _, _)) 37898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 37998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 38098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu reporter_.ReportTimeToReboot(time_to_reboot_minutes); 38198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu} 38298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 38398333a8a1aa7c8197b350b113a9912baab4a051fTianjie XuTEST_F(MetricsReporterOmahaTest, ReportInstallDateProvisioningSource) { 38498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu int source = 2; 38598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu int max = 5; 38698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu EXPECT_CALL( 38798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu *mock_metrics_lib_, 38898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu SendEnumToUMA(metrics::kMetricInstallDateProvisioningSource, source, max)) 38998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu .Times(1); 39098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 39198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu reporter_.ReportInstallDateProvisioningSource(source, max); 39298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu} 39398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 39498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu} // namespace chromeos_update_engine 395