| // Copyright 2021 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/metrics/power/power_metrics_reporter.h" |
| |
| #include <memory> |
| |
| #include "base/test/metrics/histogram_tester.h" |
| #include "base/test/task_environment.h" |
| #include "base/time/time.h" |
| #include "build/build_config.h" |
| #include "chrome/browser/lifetime/browser_shutdown.h" |
| #include "chrome/browser/metrics/power/power_details_provider.h" |
| #include "chrome/browser/metrics/usage_scenario/usage_scenario_data_store.h" |
| #include "chrome/browser/performance_monitor/process_monitor.h" |
| #include "components/ukm/test_ukm_recorder.h" |
| #include "services/metrics/public/cpp/metrics_utils.h" |
| #include "services/metrics/public/cpp/ukm_builders.h" |
| #include "services/metrics/public/cpp/ukm_source_id.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace { |
| |
| constexpr const char* kBatteryDischargeRateHistogramName = |
| "Power.BatteryDischargeRate2"; |
| constexpr const char* kBatteryDischargeModeHistogramName = |
| "Power.BatteryDischargeMode"; |
| constexpr const char* kMainScreenBrightnessHistogramName = |
| "Power.MainScreenBrightness2"; |
| constexpr const char* kMainScreenBrightnessAvailableHistogramName = |
| "Power.MainScreenBrightnessAvailable"; |
| |
| constexpr base::TimeDelta kExpectedMetricsCollectionInterval = |
| base::Seconds(120); |
| constexpr double kTolerableTimeElapsedRatio = 0.10; |
| constexpr double kTolerablePositiveDrift = 1 + kTolerableTimeElapsedRatio; |
| constexpr double kTolerableNegativeDrift = 1 - kTolerableTimeElapsedRatio; |
| |
| performance_monitor::ProcessMonitor::Metrics GetFakeProcessMetrics() { |
| performance_monitor::ProcessMonitor::Metrics metrics; |
| metrics.cpu_usage = 5; |
| return metrics; |
| } |
| |
| using UkmEntry = ukm::builders::PowerUsageScenariosIntervalData; |
| |
| class PowerMetricsReporterAccess : public PowerMetricsReporter { |
| public: |
| // Expose members of PowerMetricsReporter publicly on |
| // PowerMetricsReporterAccess. |
| using PowerMetricsReporter::BatteryDischargeMode; |
| using PowerMetricsReporter::ReportBatteryHistograms; |
| using PowerMetricsReporter::ReportHistograms; |
| }; |
| |
| // TODO(sebmarchand|etiennep): Move this to a test util file. |
| class FakeBatteryLevelProvider : public BatteryLevelProvider { |
| public: |
| explicit FakeBatteryLevelProvider( |
| std::queue<BatteryLevelProvider::BatteryState>* battery_states) |
| : battery_states_(battery_states) {} |
| |
| void GetBatteryState( |
| base::OnceCallback<void(const BatteryState&)> callback) override { |
| DCHECK(!battery_states_->empty()); |
| BatteryLevelProvider::BatteryState state = battery_states_->front(); |
| battery_states_->pop(); |
| std::move(callback).Run(state); |
| } |
| |
| private: |
| std::queue<BatteryLevelProvider::BatteryState>* battery_states_; |
| }; |
| |
| class TestProcessMonitor : public performance_monitor::ProcessMonitor { |
| public: |
| TestProcessMonitor() = default; |
| TestProcessMonitor(const TestProcessMonitor& rhs) = delete; |
| TestProcessMonitor& operator=(const TestProcessMonitor& rhs) = delete; |
| ~TestProcessMonitor() override = default; |
| |
| // Call OnAggregatedMetricsSampled for all the observers with |metrics| as an |
| // argument. |
| void NotifyObserversForOnAggregatedMetricsSampled(const Metrics& metrics) { |
| for (auto& obs : GetObserversForTesting()) |
| obs.OnAggregatedMetricsSampled(metrics); |
| } |
| }; |
| |
| class TestUsageScenarioDataStoreImpl : public UsageScenarioDataStoreImpl { |
| public: |
| TestUsageScenarioDataStoreImpl() = default; |
| TestUsageScenarioDataStoreImpl(const TestUsageScenarioDataStoreImpl& rhs) = |
| delete; |
| TestUsageScenarioDataStoreImpl& operator=( |
| const TestUsageScenarioDataStoreImpl& rhs) = delete; |
| ~TestUsageScenarioDataStoreImpl() override = default; |
| |
| IntervalData ResetIntervalData() override { return fake_data_; } |
| |
| void SetIntervalDataToReturn(IntervalData data) { fake_data_ = data; } |
| |
| private: |
| IntervalData fake_data_; |
| }; |
| |
| class TestPowerDetailsProvider : public PowerDetailsProvider { |
| public: |
| TestPowerDetailsProvider() = default; |
| explicit TestPowerDetailsProvider(double return_value) |
| : brightness_to_return_(return_value) {} |
| TestPowerDetailsProvider(const TestPowerDetailsProvider& rhs) = delete; |
| TestPowerDetailsProvider& operator=(const TestPowerDetailsProvider& rhs) = |
| delete; |
| ~TestPowerDetailsProvider() override = default; |
| |
| absl::optional<double> GetMainScreenBrightnessLevel() override { |
| return brightness_to_return_; |
| } |
| |
| void set_brightness_to_return(absl::optional<double> brightness_to_return) { |
| brightness_to_return_ = brightness_to_return; |
| } |
| |
| private: |
| absl::optional<double> brightness_to_return_; |
| }; |
| |
| // This doesn't use the typical {class being tested}Test name pattern because |
| // there's already a PowerMetricsReporterTest class in the chromeos namespace |
| // and this conflicts with it. |
| class PowerMetricsReporterUnitTest : public testing::Test { |
| public: |
| PowerMetricsReporterUnitTest() = default; |
| PowerMetricsReporterUnitTest(const PowerMetricsReporterUnitTest& rhs) = |
| delete; |
| PowerMetricsReporterUnitTest& operator=( |
| const PowerMetricsReporterUnitTest& rhs) = delete; |
| ~PowerMetricsReporterUnitTest() override = default; |
| |
| void SetUp() override { |
| // Start with a full battery. |
| battery_states_.push(BatteryLevelProvider::BatteryState{ |
| 1, 1, 1.0, true, base::TimeTicks::Now()}); |
| std::unique_ptr<BatteryLevelProvider> battery_provider = |
| std::make_unique<FakeBatteryLevelProvider>(&battery_states_); |
| battery_provider_ = battery_provider.get(); |
| base::RunLoop run_loop; |
| power_metrics_reporter_ = std::make_unique<PowerMetricsReporter>( |
| data_store_.AsWeakPtr(), std::move(battery_provider)); |
| power_metrics_reporter_->set_power_details_provider_for_testing( |
| std::make_unique<TestPowerDetailsProvider>()); |
| power_metrics_reporter_->OnFirstSampleForTesting(run_loop.QuitClosure()); |
| run_loop.Run(); |
| } |
| |
| void WaitForNextSample( |
| const performance_monitor::ProcessMonitor::Metrics& metrics) { |
| base::RunLoop run_loop; |
| power_metrics_reporter_->OnNextSampleForTesting(run_loop.QuitClosure()); |
| process_monitor_.NotifyObserversForOnAggregatedMetricsSampled(metrics); |
| run_loop.Run(); |
| } |
| |
| protected: |
| base::test::TaskEnvironment task_environment_{ |
| base::test::TaskEnvironment::TimeSource::MOCK_TIME}; |
| TestProcessMonitor process_monitor_; |
| TestUsageScenarioDataStoreImpl data_store_; |
| std::queue<BatteryLevelProvider::BatteryState> battery_states_; |
| std::unique_ptr<PowerMetricsReporter> power_metrics_reporter_; |
| BatteryLevelProvider* battery_provider_; |
| base::HistogramTester histogram_tester_; |
| ukm::TestAutoSetUkmRecorder test_ukm_recorder_; |
| }; |
| |
| } // namespace |
| |
| TEST_F(PowerMetricsReporterUnitTest, UKMs) { |
| UsageScenarioDataStore::IntervalData fake_interval_data; |
| |
| int fake_value = 42; |
| fake_interval_data.uptime_at_interval_end = base::Hours(++fake_value); |
| fake_interval_data.max_tab_count = ++fake_value; |
| fake_interval_data.max_visible_window_count = ++fake_value; |
| fake_interval_data.top_level_navigation_count = ++fake_value; |
| fake_interval_data.tabs_closed_during_interval = ++fake_value; |
| fake_interval_data.user_interaction_count = ++fake_value; |
| fake_interval_data.time_playing_video_full_screen_single_monitor = |
| base::Seconds(++fake_value); |
| fake_interval_data.time_with_open_webrtc_connection = |
| base::Seconds(++fake_value); |
| fake_interval_data.source_id_for_longest_visible_origin = |
| ukm::ConvertToSourceId(42, ukm::SourceIdType::NAVIGATION_ID); |
| fake_interval_data.source_id_for_longest_visible_origin_duration = |
| base::Seconds(++fake_value); |
| fake_interval_data.time_playing_video_in_visible_tab = |
| base::Seconds(++fake_value); |
| fake_interval_data.time_since_last_user_interaction_with_browser = |
| base::Seconds(++fake_value); |
| fake_interval_data.time_capturing_video = base::Seconds(++fake_value); |
| fake_interval_data.time_playing_audio = base::Seconds(++fake_value); |
| fake_interval_data.longest_visible_origin_duration = |
| base::Seconds(++fake_value); |
| fake_interval_data.sleep_events = 0; |
| |
| task_environment_.FastForwardBy(kExpectedMetricsCollectionInterval); |
| // Pretend that the battery has dropped by 50% in 2 minutes, for a rate of |
| // 25% per minute. |
| battery_states_.push(BatteryLevelProvider::BatteryState{ |
| 1, 1, 0.50, true, base::TimeTicks::Now()}); |
| |
| data_store_.SetIntervalDataToReturn(fake_interval_data); |
| |
| performance_monitor::ProcessMonitor::Metrics fake_metrics = {}; |
| fake_metrics.cpu_usage = ++fake_value * 0.01; |
| #if defined(OS_MAC) |
| fake_metrics.idle_wakeups = ++fake_value; |
| fake_metrics.package_idle_wakeups = ++fake_value; |
| fake_metrics.energy_impact = ++fake_value; |
| #endif |
| |
| WaitForNextSample(fake_metrics); |
| |
| auto entries = test_ukm_recorder_.GetEntriesByName( |
| ukm::builders::PowerUsageScenariosIntervalData::kEntryName); |
| EXPECT_EQ(1u, entries.size()); |
| |
| EXPECT_EQ(entries[0]->source_id, |
| fake_interval_data.source_id_for_longest_visible_origin); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kUptimeSecondsName, |
| ukm::GetExponentialBucketMinForUserTiming( |
| fake_interval_data.uptime_at_interval_end.InSeconds())); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kBatteryDischargeRateName, 2500); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kBatteryDischargeModeName, |
| static_cast<int64_t>( |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kCPUTimeMsName, |
| kExpectedMetricsCollectionInterval.InSeconds() * 1000 * |
| fake_metrics.cpu_usage); |
| #if defined(OS_MAC) |
| test_ukm_recorder_.ExpectEntryMetric(entries[0], UkmEntry::kIdleWakeUpsName, |
| fake_metrics.idle_wakeups); |
| test_ukm_recorder_.ExpectEntryMetric(entries[0], UkmEntry::kPackageExitsName, |
| fake_metrics.package_idle_wakeups); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kEnergyImpactScoreName, fake_metrics.energy_impact); |
| #endif |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kMaxTabCountName, |
| ukm::GetExponentialBucketMinForCounts1000( |
| fake_interval_data.max_tab_count)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kMaxVisibleWindowCountName, |
| ukm::GetExponentialBucketMin(fake_interval_data.max_visible_window_count, |
| 1.05)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kTabClosedName, |
| ukm::GetExponentialBucketMinForCounts1000( |
| fake_interval_data.tabs_closed_during_interval)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kTopLevelNavigationEventsName, |
| ukm::GetExponentialBucketMinForCounts1000( |
| fake_interval_data.top_level_navigation_count)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kUserInteractionCountName, |
| ukm::GetExponentialBucketMinForCounts1000( |
| fake_interval_data.user_interaction_count)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kFullscreenVideoSingleMonitorSecondsName, |
| PowerMetricsReporter::GetBucketForSampleForTesting( |
| fake_interval_data.time_playing_video_full_screen_single_monitor)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kTimeWithOpenWebRTCConnectionSecondsName, |
| PowerMetricsReporter::GetBucketForSampleForTesting( |
| fake_interval_data.time_with_open_webrtc_connection)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kTimePlayingVideoInVisibleTabName, |
| PowerMetricsReporter::GetBucketForSampleForTesting( |
| fake_interval_data.time_playing_video_in_visible_tab)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kIntervalDurationSecondsName, |
| kExpectedMetricsCollectionInterval.InSeconds()); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kTimeSinceInteractionWithBrowserSecondsName, |
| PowerMetricsReporter::GetBucketForSampleForTesting( |
| fake_interval_data.time_since_last_user_interaction_with_browser)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kVideoCaptureSecondsName, |
| PowerMetricsReporter::GetBucketForSampleForTesting( |
| fake_interval_data.time_capturing_video)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kBrowserShuttingDownName, false); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kPlayingAudioSecondsName, |
| PowerMetricsReporter::GetBucketForSampleForTesting( |
| fake_interval_data.time_playing_audio)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kOriginVisibilityTimeSecondsName, |
| PowerMetricsReporter::GetBucketForSampleForTesting( |
| fake_interval_data.longest_visible_origin_duration)); |
| EXPECT_EQ(nullptr, |
| test_ukm_recorder_.GetEntryMetric( |
| entries[0], UkmEntry::kMainScreenBrightnessPercentName)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kDeviceSleptDuringIntervalName, false); |
| |
| histogram_tester_.ExpectUniqueSample(kBatteryDischargeRateHistogramName, 2500, |
| 1); |
| histogram_tester_.ExpectUniqueSample( |
| kBatteryDischargeModeHistogramName, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, UKMsBrowserShuttingDown) { |
| const ukm::SourceId kTestSourceId = |
| ukm::ConvertToSourceId(42, ukm::SourceIdType::NAVIGATION_ID); |
| UsageScenarioDataStore::IntervalData fake_interval_data = {}; |
| fake_interval_data.source_id_for_longest_visible_origin = kTestSourceId; |
| task_environment_.FastForwardBy(kExpectedMetricsCollectionInterval); |
| battery_states_.push(BatteryLevelProvider::BatteryState{ |
| 1, 1, 0.50, true, base::TimeTicks::Now()}); |
| data_store_.SetIntervalDataToReturn(fake_interval_data); |
| |
| performance_monitor::ProcessMonitor::Metrics fake_metrics = {}; |
| fake_metrics.cpu_usage = 0.5; |
| #if defined(OS_MAC) |
| fake_metrics.idle_wakeups = 42; |
| fake_metrics.package_idle_wakeups = 43; |
| fake_metrics.energy_impact = 44; |
| #endif |
| |
| { |
| auto fake_shutdown = browser_shutdown::SetShutdownTypeForTesting( |
| browser_shutdown::ShutdownType::kBrowserExit); |
| EXPECT_TRUE(browser_shutdown::HasShutdownStarted()); |
| WaitForNextSample(fake_metrics); |
| } |
| |
| auto entries = test_ukm_recorder_.GetEntriesByName( |
| ukm::builders::PowerUsageScenariosIntervalData::kEntryName); |
| EXPECT_EQ(1u, entries.size()); |
| |
| EXPECT_EQ(entries[0]->source_id, kTestSourceId); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kBrowserShuttingDownName, true); |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, UKMsPluggedIn) { |
| // Update the latest reported battery state to pretend that the system isn't |
| // running on battery. |
| power_metrics_reporter_->battery_state_for_testing().on_battery = false; |
| |
| task_environment_.FastForwardBy(kExpectedMetricsCollectionInterval); |
| // Push a battery state that indicates that the system is still not running |
| // on battery. |
| battery_states_.push(BatteryLevelProvider::BatteryState{ |
| 1, 1, 1.0, /* on_battery - */ false, base::TimeTicks::Now()}); |
| |
| UsageScenarioDataStore::IntervalData fake_interval_data; |
| fake_interval_data.source_id_for_longest_visible_origin = |
| ukm::ConvertToSourceId(42, ukm::SourceIdType::NAVIGATION_ID); |
| data_store_.SetIntervalDataToReturn(fake_interval_data); |
| |
| WaitForNextSample({}); |
| |
| auto entries = test_ukm_recorder_.GetEntriesByName( |
| ukm::builders::PowerUsageScenariosIntervalData::kEntryName); |
| EXPECT_EQ(1u, entries.size()); |
| EXPECT_FALSE(test_ukm_recorder_.EntryHasMetric( |
| entries[0], UkmEntry::kBatteryDischargeRateName)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kBatteryDischargeModeName, |
| static_cast<int64_t>( |
| PowerMetricsReporterAccess::BatteryDischargeMode::kPluggedIn)); |
| |
| histogram_tester_.ExpectTotalCount(kBatteryDischargeRateHistogramName, 0); |
| histogram_tester_.ExpectUniqueSample( |
| kBatteryDischargeModeHistogramName, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kPluggedIn, 1); |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, UKMsBatteryStateChanges) { |
| task_environment_.FastForwardBy(kExpectedMetricsCollectionInterval); |
| // The initial battery state indicates that the system is running on battery, |
| // pretends that this has changed. |
| battery_states_.push(BatteryLevelProvider::BatteryState{ |
| 1, 1, 1.0, /* on_battery - */ false, base::TimeTicks::Now()}); |
| |
| UsageScenarioDataStore::IntervalData fake_interval_data; |
| fake_interval_data.source_id_for_longest_visible_origin = |
| ukm::ConvertToSourceId(42, ukm::SourceIdType::NAVIGATION_ID); |
| data_store_.SetIntervalDataToReturn(fake_interval_data); |
| |
| WaitForNextSample({}); |
| |
| auto entries = test_ukm_recorder_.GetEntriesByName( |
| ukm::builders::PowerUsageScenariosIntervalData::kEntryName); |
| EXPECT_EQ(1u, entries.size()); |
| EXPECT_FALSE(test_ukm_recorder_.EntryHasMetric( |
| entries[0], UkmEntry::kBatteryDischargeRateName)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kBatteryDischargeModeName, |
| static_cast<int64_t>( |
| PowerMetricsReporterAccess::BatteryDischargeMode::kStateChanged)); |
| |
| histogram_tester_.ExpectTotalCount(kBatteryDischargeRateHistogramName, 0); |
| histogram_tester_.ExpectUniqueSample( |
| kBatteryDischargeModeHistogramName, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kStateChanged, 1); |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, UKMsBatteryStateUnavailable) { |
| task_environment_.FastForwardBy(kExpectedMetricsCollectionInterval); |
| // A nullopt battery value indicates that the battery level is unavailable. |
| battery_states_.push(BatteryLevelProvider::BatteryState{ |
| 1, 1, absl::nullopt, true, base::TimeTicks::Now()}); |
| |
| UsageScenarioDataStore::IntervalData fake_interval_data; |
| fake_interval_data.source_id_for_longest_visible_origin = |
| ukm::ConvertToSourceId(42, ukm::SourceIdType::NAVIGATION_ID); |
| data_store_.SetIntervalDataToReturn(fake_interval_data); |
| |
| WaitForNextSample({}); |
| |
| auto entries = test_ukm_recorder_.GetEntriesByName( |
| ukm::builders::PowerUsageScenariosIntervalData::kEntryName); |
| EXPECT_EQ(1u, entries.size()); |
| EXPECT_FALSE(test_ukm_recorder_.EntryHasMetric( |
| entries[0], UkmEntry::kBatteryDischargeRateName)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kBatteryDischargeModeName, |
| static_cast<int64_t>(PowerMetricsReporterAccess::BatteryDischargeMode:: |
| kChargeLevelUnavailable)); |
| |
| histogram_tester_.ExpectTotalCount(kBatteryDischargeRateHistogramName, 0); |
| histogram_tester_.ExpectUniqueSample( |
| kBatteryDischargeModeHistogramName, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kChargeLevelUnavailable, |
| 1); |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, UKMsNoBattery) { |
| task_environment_.FastForwardBy(kExpectedMetricsCollectionInterval); |
| // Indicates that the system has no battery interface. |
| battery_states_.push(BatteryLevelProvider::BatteryState{ |
| 0, 0, 1.0, false, base::TimeTicks::Now()}); |
| |
| UsageScenarioDataStore::IntervalData fake_interval_data; |
| fake_interval_data.source_id_for_longest_visible_origin = |
| ukm::ConvertToSourceId(42, ukm::SourceIdType::NAVIGATION_ID); |
| data_store_.SetIntervalDataToReturn(fake_interval_data); |
| |
| WaitForNextSample({}); |
| |
| auto entries = test_ukm_recorder_.GetEntriesByName( |
| ukm::builders::PowerUsageScenariosIntervalData::kEntryName); |
| EXPECT_EQ(1u, entries.size()); |
| EXPECT_FALSE(test_ukm_recorder_.EntryHasMetric( |
| entries[0], UkmEntry::kBatteryDischargeRateName)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kBatteryDischargeModeName, |
| static_cast<int64_t>( |
| PowerMetricsReporterAccess::BatteryDischargeMode::kNoBattery)); |
| |
| histogram_tester_.ExpectTotalCount(kBatteryDischargeRateHistogramName, 0); |
| histogram_tester_.ExpectUniqueSample( |
| kBatteryDischargeModeHistogramName, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kNoBattery, 1); |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, UKMsBatteryStateIncrease) { |
| // Set the initial battery level at 50%. |
| power_metrics_reporter_->battery_state_for_testing().charge_level = 0.5; |
| |
| task_environment_.FastForwardBy(kExpectedMetricsCollectionInterval); |
| // Set the new battery state at 100%. |
| battery_states_.push(BatteryLevelProvider::BatteryState{ |
| 1, 1, 1.0, true, base::TimeTicks::Now()}); |
| |
| UsageScenarioDataStore::IntervalData fake_interval_data; |
| fake_interval_data.source_id_for_longest_visible_origin = |
| ukm::ConvertToSourceId(42, ukm::SourceIdType::NAVIGATION_ID); |
| data_store_.SetIntervalDataToReturn(fake_interval_data); |
| |
| WaitForNextSample({}); |
| |
| auto entries = test_ukm_recorder_.GetEntriesByName( |
| ukm::builders::PowerUsageScenariosIntervalData::kEntryName); |
| EXPECT_EQ(1u, entries.size()); |
| // An increase in charge level is reported as an invalid discharge rate. |
| EXPECT_FALSE(test_ukm_recorder_.EntryHasMetric( |
| entries[0], UkmEntry::kBatteryDischargeRateName)); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kBatteryDischargeModeName, |
| static_cast<int64_t>(PowerMetricsReporterAccess::BatteryDischargeMode:: |
| kInvalidDischargeRate)); |
| |
| histogram_tester_.ExpectTotalCount(kBatteryDischargeRateHistogramName, 0); |
| histogram_tester_.ExpectUniqueSample( |
| kBatteryDischargeModeHistogramName, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kInvalidDischargeRate, |
| 1); |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, SuffixedHistograms_ZeroWindow) { |
| UsageScenarioDataStore::IntervalData interval_data; |
| interval_data.max_tab_count = 0; |
| |
| PowerMetricsReporterAccess::ReportHistograms( |
| interval_data, GetFakeProcessMetrics(), |
| kExpectedMetricsCollectionInterval, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 2500); |
| |
| // Non-suffixed histograms. |
| histogram_tester_.ExpectUniqueSample("Power.BatteryDischargeRate2", 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample("PerformanceMonitor.AverageCPU2.Total", |
| 500, 1); |
| |
| // Suffixed histograms. |
| histogram_tester_.ExpectUniqueSample("Power.BatteryDischargeRate2.ZeroWindow", |
| 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode.ZeroWindow", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "PerformanceMonitor.AverageCPU2.Total.ZeroWindow", 500, 1); |
| |
| // Note: For simplicity, this test only verifies that one of the |
| // PerformanceMonitor.* histograms is recorded correctly. |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, SuffixedHistograms_AllTabsHidden) { |
| UsageScenarioDataStore::IntervalData interval_data; |
| interval_data.max_tab_count = 1; |
| interval_data.max_visible_window_count = 0; |
| // Values below should be ignored. |
| interval_data.time_capturing_video = base::Seconds(1); |
| interval_data.time_playing_video_full_screen_single_monitor = |
| base::Seconds(1); |
| interval_data.time_playing_video_in_visible_tab = base::Seconds(1); |
| interval_data.time_playing_audio = base::Seconds(1); |
| interval_data.top_level_navigation_count = 1; |
| interval_data.user_interaction_count = 1; |
| |
| PowerMetricsReporterAccess::ReportHistograms( |
| interval_data, GetFakeProcessMetrics(), |
| kExpectedMetricsCollectionInterval, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 2500); |
| |
| // Non-suffixed histograms. |
| histogram_tester_.ExpectUniqueSample("Power.BatteryDischargeRate2", 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample("PerformanceMonitor.AverageCPU2.Total", |
| 500, 1); |
| |
| // Suffixed histograms. |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeRate2.AllTabsHidden", 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode.AllTabsHidden", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "PerformanceMonitor.AverageCPU2.Total.AllTabsHidden", 500, 1); |
| |
| // Note: For simplicity, this test only verifies that one of the |
| // PerformanceMonitor.* histograms is recorded correctly. |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, SuffixedHistograms_VideoCapture) { |
| UsageScenarioDataStore::IntervalData interval_data; |
| interval_data.max_tab_count = 1; |
| interval_data.max_visible_window_count = 1; |
| interval_data.time_capturing_video = base::Seconds(1); |
| // Values below should be ignored. |
| interval_data.time_playing_video_full_screen_single_monitor = |
| base::Seconds(1); |
| interval_data.time_playing_video_in_visible_tab = base::Seconds(1); |
| interval_data.time_playing_audio = base::Seconds(1); |
| interval_data.top_level_navigation_count = 1; |
| interval_data.user_interaction_count = 1; |
| |
| PowerMetricsReporterAccess::ReportHistograms( |
| interval_data, GetFakeProcessMetrics(), |
| kExpectedMetricsCollectionInterval, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 2500); |
| |
| // Non-suffixed histograms. |
| histogram_tester_.ExpectUniqueSample("Power.BatteryDischargeRate2", 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample("PerformanceMonitor.AverageCPU2.Total", |
| 500, 1); |
| |
| // Suffixed histograms. |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeRate2.VideoCapture", 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode.VideoCapture", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "PerformanceMonitor.AverageCPU2.Total.VideoCapture", 500, 1); |
| |
| // Note: For simplicity, this test only verifies that one of the |
| // PerformanceMonitor.* histograms is recorded correctly. |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, SuffixedHistograms_FullscreenVideo) { |
| UsageScenarioDataStore::IntervalData interval_data; |
| interval_data.max_tab_count = 1; |
| interval_data.max_visible_window_count = 1; |
| interval_data.time_capturing_video = base::TimeDelta(); |
| interval_data.time_playing_video_full_screen_single_monitor = |
| base::Seconds(1); |
| // Values below should be ignored. |
| interval_data.time_playing_video_in_visible_tab = base::Seconds(1); |
| interval_data.time_playing_audio = base::Seconds(1); |
| interval_data.top_level_navigation_count = 1; |
| interval_data.user_interaction_count = 1; |
| |
| PowerMetricsReporterAccess::ReportHistograms( |
| interval_data, GetFakeProcessMetrics(), |
| kExpectedMetricsCollectionInterval, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 2500); |
| |
| // Non-suffixed histograms. |
| histogram_tester_.ExpectUniqueSample("Power.BatteryDischargeRate2", 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample("PerformanceMonitor.AverageCPU2.Total", |
| 500, 1); |
| |
| // Suffixed histograms. |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeRate2.FullscreenVideo", 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode.FullscreenVideo", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "PerformanceMonitor.AverageCPU2.Total.FullscreenVideo", 500, 1); |
| |
| // Note: For simplicity, this test only verifies that one of the |
| // PerformanceMonitor.* histograms is recorded correctly. |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, |
| SuffixedHistograms_EmbeddedVideo_NoNavigation) { |
| UsageScenarioDataStore::IntervalData interval_data; |
| interval_data.max_tab_count = 1; |
| interval_data.max_visible_window_count = 1; |
| interval_data.time_capturing_video = base::TimeDelta(); |
| interval_data.time_playing_video_full_screen_single_monitor = |
| base::TimeDelta(); |
| interval_data.top_level_navigation_count = 0; |
| interval_data.time_playing_video_in_visible_tab = base::Seconds(1); |
| // Values below should be ignored. |
| interval_data.time_playing_audio = base::Seconds(1); |
| interval_data.user_interaction_count = 1; |
| |
| PowerMetricsReporterAccess::ReportHistograms( |
| interval_data, GetFakeProcessMetrics(), |
| kExpectedMetricsCollectionInterval, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 2500); |
| |
| // Non-suffixed histograms. |
| histogram_tester_.ExpectUniqueSample("Power.BatteryDischargeRate2", 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample("PerformanceMonitor.AverageCPU2.Total", |
| 500, 1); |
| |
| // Suffixed histograms. |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeRate2.EmbeddedVideo_NoNavigation", 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode.EmbeddedVideo_NoNavigation", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "PerformanceMonitor.AverageCPU2.Total.EmbeddedVideo_NoNavigation", 500, |
| 1); |
| |
| // Note: For simplicity, this test only verifies that one of the |
| // PerformanceMonitor.* histograms is recorded correctly. |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, |
| SuffixedHistograms_EmbeddedVideo_WithNavigation) { |
| UsageScenarioDataStore::IntervalData interval_data; |
| interval_data.max_tab_count = 1; |
| interval_data.max_visible_window_count = 1; |
| interval_data.time_capturing_video = base::TimeDelta(); |
| interval_data.time_playing_video_full_screen_single_monitor = |
| base::TimeDelta(); |
| interval_data.top_level_navigation_count = 1; |
| interval_data.time_playing_video_in_visible_tab = base::Seconds(1); |
| // Values below should be ignored. |
| interval_data.time_playing_audio = base::Seconds(1); |
| interval_data.user_interaction_count = 1; |
| |
| PowerMetricsReporterAccess::ReportHistograms( |
| interval_data, GetFakeProcessMetrics(), |
| kExpectedMetricsCollectionInterval, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 2500); |
| |
| // Non-suffixed histograms. |
| histogram_tester_.ExpectUniqueSample("Power.BatteryDischargeRate2", 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample("PerformanceMonitor.AverageCPU2.Total", |
| 500, 1); |
| |
| // Suffixed histograms. |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeRate2.EmbeddedVideo_WithNavigation", 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode.EmbeddedVideo_WithNavigation", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "PerformanceMonitor.AverageCPU2.Total.EmbeddedVideo_WithNavigation", 500, |
| 1); |
| |
| // Note: For simplicity, this test only verifies that one of the |
| // PerformanceMonitor.* histograms is recorded correctly. |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, SuffixedHistograms_Audio) { |
| UsageScenarioDataStore::IntervalData interval_data; |
| interval_data.max_tab_count = 1; |
| interval_data.max_visible_window_count = 1; |
| interval_data.time_capturing_video = base::TimeDelta(); |
| interval_data.time_playing_video_full_screen_single_monitor = |
| base::TimeDelta(); |
| interval_data.time_playing_video_in_visible_tab = base::TimeDelta(); |
| interval_data.time_playing_audio = base::Seconds(1); |
| // Values below should be ignored. |
| interval_data.user_interaction_count = 1; |
| interval_data.top_level_navigation_count = 1; |
| |
| PowerMetricsReporterAccess::ReportHistograms( |
| interval_data, GetFakeProcessMetrics(), |
| kExpectedMetricsCollectionInterval, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 2500); |
| |
| // Non-suffixed histograms. |
| histogram_tester_.ExpectUniqueSample("Power.BatteryDischargeRate2", 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample("PerformanceMonitor.AverageCPU2.Total", |
| 500, 1); |
| |
| // Suffixed histograms. |
| histogram_tester_.ExpectUniqueSample("Power.BatteryDischargeRate2.Audio", |
| 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode.Audio", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "PerformanceMonitor.AverageCPU2.Total.Audio", 500, 1); |
| |
| // Note: For simplicity, this test only verifies that one of the |
| // PerformanceMonitor.* histograms is recorded correctly. |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, SuffixedHistograms_Navigation) { |
| UsageScenarioDataStore::IntervalData interval_data; |
| interval_data.max_tab_count = 1; |
| interval_data.max_visible_window_count = 1; |
| interval_data.time_capturing_video = base::TimeDelta(); |
| interval_data.time_playing_video_full_screen_single_monitor = |
| base::TimeDelta(); |
| interval_data.time_playing_video_in_visible_tab = base::TimeDelta(); |
| interval_data.time_playing_audio = base::TimeDelta(); |
| interval_data.top_level_navigation_count = 1; |
| // Values below should be ignored. |
| interval_data.user_interaction_count = 1; |
| |
| PowerMetricsReporterAccess::ReportHistograms( |
| interval_data, GetFakeProcessMetrics(), |
| kExpectedMetricsCollectionInterval, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 2500); |
| |
| // Non-suffixed histograms. |
| histogram_tester_.ExpectUniqueSample("Power.BatteryDischargeRate2", 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample("PerformanceMonitor.AverageCPU2.Total", |
| 500, 1); |
| |
| // Suffixed histograms. |
| histogram_tester_.ExpectUniqueSample("Power.BatteryDischargeRate2.Navigation", |
| 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode.Navigation", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "PerformanceMonitor.AverageCPU2.Total.Navigation", 500, 1); |
| |
| // Note: For simplicity, this test only verifies that one of the |
| // PerformanceMonitor.* histograms is recorded correctly. |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, SuffixedHistograms_Interaction) { |
| UsageScenarioDataStore::IntervalData interval_data; |
| interval_data.max_tab_count = 1; |
| interval_data.max_visible_window_count = 1; |
| interval_data.time_capturing_video = base::TimeDelta(); |
| interval_data.time_playing_video_full_screen_single_monitor = |
| base::TimeDelta(); |
| interval_data.time_playing_video_in_visible_tab = base::TimeDelta(); |
| interval_data.time_playing_audio = base::TimeDelta(); |
| interval_data.top_level_navigation_count = 0; |
| interval_data.user_interaction_count = 1; |
| |
| PowerMetricsReporterAccess::ReportHistograms( |
| interval_data, GetFakeProcessMetrics(), |
| kExpectedMetricsCollectionInterval, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 2500); |
| |
| // Non-suffixed histograms. |
| histogram_tester_.ExpectUniqueSample("Power.BatteryDischargeRate2", 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample("PerformanceMonitor.AverageCPU2.Total", |
| 500, 1); |
| |
| // Suffixed histograms. |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeRate2.Interaction", 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode.Interaction", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "PerformanceMonitor.AverageCPU2.Total.Interaction", 500, 1); |
| |
| // Note: For simplicity, this test only verifies that one of the |
| // PerformanceMonitor.* histograms is recorded correctly. |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, SuffixedHistograms_Passive) { |
| UsageScenarioDataStore::IntervalData interval_data; |
| interval_data.max_tab_count = 1; |
| interval_data.max_visible_window_count = 1; |
| interval_data.time_capturing_video = base::TimeDelta(); |
| interval_data.time_playing_video_full_screen_single_monitor = |
| base::TimeDelta(); |
| interval_data.time_playing_video_in_visible_tab = base::TimeDelta(); |
| interval_data.time_playing_audio = base::TimeDelta(); |
| interval_data.top_level_navigation_count = 0; |
| interval_data.user_interaction_count = 0; |
| |
| PowerMetricsReporterAccess::ReportHistograms( |
| interval_data, GetFakeProcessMetrics(), |
| kExpectedMetricsCollectionInterval, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 2500); |
| |
| // Non-suffixed histograms. |
| histogram_tester_.ExpectUniqueSample("Power.BatteryDischargeRate2", 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample("PerformanceMonitor.AverageCPU2.Total", |
| 500, 1); |
| |
| // Suffixed histograms. |
| histogram_tester_.ExpectUniqueSample("Power.BatteryDischargeRate2.Passive", |
| 2500, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "Power.BatteryDischargeMode.Passive", |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| histogram_tester_.ExpectUniqueSample( |
| "PerformanceMonitor.AverageCPU2.Total.Passive", 500, 1); |
| |
| // Note: For simplicity, this test only verifies that one of the |
| // PerformanceMonitor.* histograms is recorded correctly. |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, BatteryDischargeCaptureIsTooEarly) { |
| UsageScenarioDataStore::IntervalData interval_data; |
| |
| PowerMetricsReporterAccess::ReportBatteryHistograms( |
| (kExpectedMetricsCollectionInterval * kTolerableNegativeDrift) - |
| base::Seconds(1), |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 2500, |
| PowerMetricsReporter::GetSuffixesForTesting(interval_data)); |
| |
| histogram_tester_.ExpectTotalCount(kBatteryDischargeRateHistogramName, 0); |
| histogram_tester_.ExpectUniqueSample( |
| kBatteryDischargeModeHistogramName, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kInvalidInterval, 1); |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, BatteryDischargeCaptureIsEarly) { |
| UsageScenarioDataStore::IntervalData interval_data; |
| |
| PowerMetricsReporterAccess::ReportBatteryHistograms( |
| (kExpectedMetricsCollectionInterval * kTolerableNegativeDrift) + |
| base::Seconds(1), |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 2500, |
| PowerMetricsReporter::GetSuffixesForTesting(interval_data)); |
| |
| histogram_tester_.ExpectUniqueSample(kBatteryDischargeRateHistogramName, 2500, |
| 1); |
| histogram_tester_.ExpectUniqueSample( |
| kBatteryDischargeModeHistogramName, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, BatteryDischargeCaptureIsTooLate) { |
| UsageScenarioDataStore::IntervalData interval_data; |
| |
| PowerMetricsReporterAccess::ReportBatteryHistograms( |
| (kExpectedMetricsCollectionInterval * kTolerablePositiveDrift) + |
| base::Seconds(1), |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 2500, |
| PowerMetricsReporter::GetSuffixesForTesting(interval_data)); |
| |
| histogram_tester_.ExpectTotalCount(kBatteryDischargeRateHistogramName, 0); |
| histogram_tester_.ExpectUniqueSample( |
| kBatteryDischargeModeHistogramName, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kInvalidInterval, 1); |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, BatteryDischargeCaptureIsLate) { |
| UsageScenarioDataStore::IntervalData interval_data; |
| |
| PowerMetricsReporterAccess::ReportBatteryHistograms( |
| (kExpectedMetricsCollectionInterval * kTolerablePositiveDrift) - |
| base::Seconds(1), |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 2500, |
| PowerMetricsReporter::GetSuffixesForTesting(interval_data)); |
| |
| histogram_tester_.ExpectUniqueSample(kBatteryDischargeRateHistogramName, 2500, |
| 1); |
| histogram_tester_.ExpectUniqueSample( |
| kBatteryDischargeModeHistogramName, |
| PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1); |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, UKMsNoTab) { |
| UsageScenarioDataStore::IntervalData fake_interval_data; |
| |
| fake_interval_data.max_tab_count = 0; |
| fake_interval_data.max_visible_window_count = 0; |
| fake_interval_data.source_id_for_longest_visible_origin = |
| ukm::kInvalidSourceId; |
| |
| task_environment_.FastForwardBy(kExpectedMetricsCollectionInterval); |
| battery_states_.push(BatteryLevelProvider::BatteryState{ |
| 1, 1, 0.50, true, base::TimeTicks::Now()}); |
| |
| data_store_.SetIntervalDataToReturn(fake_interval_data); |
| |
| WaitForNextSample(GetFakeProcessMetrics()); |
| |
| auto entries = test_ukm_recorder_.GetEntriesByName( |
| ukm::builders::PowerUsageScenariosIntervalData::kEntryName); |
| EXPECT_EQ(1u, entries.size()); |
| |
| EXPECT_EQ(entries[0]->source_id, ukm::kInvalidSourceId); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kUptimeSecondsName, |
| ukm::GetExponentialBucketMinForUserTiming( |
| fake_interval_data.uptime_at_interval_end.InSeconds())); |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, DurationsLongerThanIntervalAreCapped) { |
| UsageScenarioDataStore::IntervalData fake_interval_data; |
| |
| fake_interval_data.time_playing_video_full_screen_single_monitor = |
| kExpectedMetricsCollectionInterval * 100; |
| |
| task_environment_.FastForwardBy(kExpectedMetricsCollectionInterval); |
| battery_states_.push(BatteryLevelProvider::BatteryState{ |
| 1, 1, 0.50, true, base::TimeTicks::Now()}); |
| data_store_.SetIntervalDataToReturn(fake_interval_data); |
| |
| WaitForNextSample(GetFakeProcessMetrics()); |
| |
| auto entries = test_ukm_recorder_.GetEntriesByName( |
| ukm::builders::PowerUsageScenariosIntervalData::kEntryName); |
| EXPECT_EQ(1u, entries.size()); |
| |
| EXPECT_EQ(entries[0]->source_id, ukm::kInvalidSourceId); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kFullscreenVideoSingleMonitorSecondsName, |
| // Every value greater than |kExpectedMetricsCollectionInterval| should |
| // fall in the same overflow bucket. |
| PowerMetricsReporter::GetBucketForSampleForTesting( |
| kExpectedMetricsCollectionInterval * 2)); |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, UKMBrightnessLevel) { |
| const double kFakeBrightnessLevel = 0.64; |
| power_metrics_reporter_->set_power_details_provider_for_testing( |
| std::make_unique<TestPowerDetailsProvider>(kFakeBrightnessLevel)); |
| task_environment_.FastForwardBy(kExpectedMetricsCollectionInterval); |
| battery_states_.push(BatteryLevelProvider::BatteryState{ |
| 0, 0, 1.0, false, base::TimeTicks::Now()}); |
| |
| UsageScenarioDataStore::IntervalData fake_interval_data; |
| fake_interval_data.source_id_for_longest_visible_origin = |
| ukm::ConvertToSourceId(42, ukm::SourceIdType::NAVIGATION_ID); |
| data_store_.SetIntervalDataToReturn(fake_interval_data); |
| WaitForNextSample({}); |
| |
| auto entries = test_ukm_recorder_.GetEntriesByName( |
| ukm::builders::PowerUsageScenariosIntervalData::kEntryName); |
| EXPECT_EQ(1u, entries.size()); |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kMainScreenBrightnessPercentName, 60); |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, UKMsWithSleepEvent) { |
| UsageScenarioDataStore::IntervalData fake_interval_data = {}; |
| fake_interval_data.sleep_events = 1; |
| task_environment_.FastForwardBy(kExpectedMetricsCollectionInterval); |
| battery_states_.push(BatteryLevelProvider::BatteryState{ |
| 1, 1, 0.50, true, base::TimeTicks::Now()}); |
| data_store_.SetIntervalDataToReturn(fake_interval_data); |
| performance_monitor::ProcessMonitor::Metrics fake_metrics = {}; |
| WaitForNextSample(fake_metrics); |
| |
| auto entries = test_ukm_recorder_.GetEntriesByName( |
| ukm::builders::PowerUsageScenariosIntervalData::kEntryName); |
| EXPECT_EQ(1u, entries.size()); |
| |
| test_ukm_recorder_.ExpectEntryMetric( |
| entries[0], UkmEntry::kDeviceSleptDuringIntervalName, true); |
| } |
| |
| TEST_F(PowerMetricsReporterUnitTest, MainScreenBrightnessHistogram) { |
| std::unique_ptr<PowerDetailsProvider> detail_provider = |
| std::make_unique<TestPowerDetailsProvider>(); |
| TestPowerDetailsProvider* detail_provider_raw = |
| static_cast<TestPowerDetailsProvider*>(detail_provider.get()); |
| power_metrics_reporter_->set_power_details_provider_for_testing( |
| std::move(detail_provider)); |
| |
| UsageScenarioDataStore::IntervalData fake_interval_data = {}; |
| |
| task_environment_.FastForwardBy(kExpectedMetricsCollectionInterval); |
| battery_states_.push(BatteryLevelProvider::BatteryState{ |
| 1, 1, 0.50, true, base::TimeTicks::Now()}); |
| data_store_.SetIntervalDataToReturn(fake_interval_data); |
| |
| performance_monitor::ProcessMonitor::Metrics fake_metrics = |
| GetFakeProcessMetrics(); |
| WaitForNextSample(fake_metrics); |
| |
| histogram_tester_.ExpectTotalCount(kMainScreenBrightnessHistogramName, 0); |
| histogram_tester_.ExpectBucketCount( |
| kMainScreenBrightnessAvailableHistogramName, false, 1); |
| |
| double kBrightnessValue = 0.5; |
| detail_provider_raw->set_brightness_to_return(kBrightnessValue); |
| |
| task_environment_.FastForwardBy(kExpectedMetricsCollectionInterval); |
| battery_states_.push(BatteryLevelProvider::BatteryState{ |
| 1, 1, 0.50, true, base::TimeTicks::Now()}); |
| data_store_.SetIntervalDataToReturn(fake_interval_data); |
| WaitForNextSample(fake_metrics); |
| |
| histogram_tester_.ExpectBucketCount(kMainScreenBrightnessHistogramName, |
| kBrightnessValue * 100, 1); |
| histogram_tester_.ExpectBucketCount( |
| kMainScreenBrightnessAvailableHistogramName, true, 1); |
| } |