// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/webui/diagnostics_ui/diagnostics_metrics.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace ash {
namespace diagnostics {
namespace metrics {
namespace {
const char kDiagnosticsUmaFeatureFullPath[] =
"ChromeOS.FeatureUsage.DiagnosticsUi";
const char kDiagnosticsUmaFeatureUsetimeFullPath[] =
"ChromeOS.FeatureUsage.DiagnosticsUi.Usetime";
const base::TimeDelta kDefaultTime = base::Minutes(10);
class DiagnosticsMetricsTest : public testing::Test {
public:
DiagnosticsMetricsTest() = default;
~DiagnosticsMetricsTest() override = default;
void AdvanceClock(base::TimeDelta time) {
task_environment_.AdvanceClock(time);
}
protected:
base::test::TaskEnvironment task_environment_{
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
};
} // namespace
// DiagnosticsMetricsTest is part of the ash_unittests and will only be called
// when is_chromeos_ash is true. Eligible and enabled currently will always be
// true.
TEST_F(DiagnosticsMetricsTest, IsEligibleAndEnabled) {
DiagnosticsMetrics metrics;
EXPECT_TRUE(metrics.IsEligible());
EXPECT_TRUE(metrics.IsEnabled());
}
TEST_F(DiagnosticsMetricsTest, RecordUsage) {
base::HistogramTester histograms;
DiagnosticsMetrics metrics;
size_t expected_success = 0;
size_t expected_failure = 0;
// Before RecordUsage has been triggered both events should be zero.
histograms.ExpectBucketCount(
kDiagnosticsUmaFeatureFullPath,
feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess,
expected_success);
histograms.ExpectBucketCount(
kDiagnosticsUmaFeatureFullPath,
feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure,
expected_failure);
expected_failure += 1;
metrics.RecordUsage(false);
// After RecordUsage(false) has been triggered failure should increment.
histograms.ExpectBucketCount(
kDiagnosticsUmaFeatureFullPath,
feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess,
expected_success);
histograms.ExpectBucketCount(
kDiagnosticsUmaFeatureFullPath,
feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure,
expected_failure);
expected_success += 1;
metrics.RecordUsage(true);
// After RecordUsage(true) has been triggered success should increment.
histograms.ExpectBucketCount(
kDiagnosticsUmaFeatureFullPath,
feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess,
expected_success);
histograms.ExpectBucketCount(
kDiagnosticsUmaFeatureFullPath,
feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure,
expected_failure);
}
TEST_F(DiagnosticsMetricsTest, RecordUseTime) {
base::HistogramTester histograms;
DiagnosticsMetrics metrics;
size_t expected_use_time_record_count = 0;
// Initial state for usage timing.
EXPECT_FALSE(metrics.GetSuccessfulUsageStartedForTesting());
histograms.ExpectTimeBucketCount(kDiagnosticsUmaFeatureUsetimeFullPath,
/** sample */ base::Minutes(0),
expected_use_time_record_count);
metrics.RecordUsage(false);
AdvanceClock(kDefaultTime);
metrics.StopSuccessfulUsage();
// Usetime is related to successful usage only.
EXPECT_FALSE(metrics.GetSuccessfulUsageStartedForTesting());
histograms.ExpectTimeBucketCount(kDiagnosticsUmaFeatureUsetimeFullPath,
/** sample */ kDefaultTime,
expected_use_time_record_count);
// Start recording `Usetime`.
expected_use_time_record_count += 1;
metrics.RecordUsage(true);
EXPECT_TRUE(metrics.GetSuccessfulUsageStartedForTesting());
// Move clock and stop recording `Usetime`.
AdvanceClock(kDefaultTime);
metrics.StopSuccessfulUsage();
EXPECT_FALSE(metrics.GetSuccessfulUsageStartedForTesting());
histograms.ExpectTimeBucketCount(kDiagnosticsUmaFeatureUsetimeFullPath,
/** sample */ kDefaultTime,
expected_use_time_record_count);
}
} // namespace metrics
} // namespace diagnostics
} // namespace ash