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