blob: 45332c34be1f6eab11b18798723d81e522e05caf [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_BACK_FORWARD_CACHE_TEST_UTIL_H_
#define CONTENT_BROWSER_BACK_FORWARD_CACHE_TEST_UTIL_H_
#include <vector>
#include "base/location.h"
#include "base/test/metrics/histogram_tester.h"
#include "components/ukm/test_ukm_recorder.h"
#include "content/browser/renderer_host/back_forward_cache_metrics.h"
#include "content/public/browser/back_forward_cache.h"
#include "third_party/blink/public/common/scheduler/web_scheduler_tracked_feature.h"
namespace content {
// `BackForwardCacheMetricsTestMatcher` provides common matchers and
// expectations to help make test assertions on BackForwardCache-related
// metrics.
//
// This class tries to remove the efforts to reset HistogramTester by keeping
// local copies of expected metrics in expected_* members such that subsequent
// calls to Expect*() won't need to take previous metrics into account.
//
// For example:
// ...
// DoActionCauseFeatureA();
// // The implementation compares {FeatureA} with metrics from
// // `histogram_tester()`, which is {FeatureA}.
// // FeatureA will be stored in in `expected_blocklisted_features_`.
// ExpectBlocklistedFeature(FeatureA);
//
// // `histogram_tester()` keeps FeatureA and continues to accumulate metrics.
//
// DoActionCauseFeatureB();
// // The implementation compares {FeatureA, FeatureB} with accumulated
// // metrics from `histogram_tester()`, which is also {FeatureA, FeatureB}.
// ExpectBlocklistedFeature(FeatureB);
//
class BackForwardCacheMetricsTestMatcher {
protected:
using UkmMetrics = ukm::TestUkmRecorder::HumanReadableUkmMetrics;
BackForwardCacheMetricsTestMatcher();
~BackForwardCacheMetricsTestMatcher();
// Disables checking metrics that are recorded regardless of the domains. By
// default, this class' Expect* function checks the metrics both for the
// specific domain and for all domains at the same time. In the case when the
// test results need to be different, call this function.
void DisableCheckingMetricsForAllSites();
// Tests that the observed outcomes match the current expected outcomes
// without adding any new expected outcomes.
void ExpectOutcomeDidNotChange(base::Location location);
void ExpectRestored(base::Location location);
void ExpectNotRestored(
std::vector<BackForwardCacheMetrics::NotRestoredReason> not_restored,
std::vector<blink::scheduler::WebSchedulerTrackedFeature> block_listed,
const std::vector<ShouldSwapBrowsingInstance>& not_swapped,
const std::vector<BackForwardCache::DisabledReason>&
disabled_for_render_frame_host,
const std::vector<uint64_t>& disallow_activation,
base::Location location);
void ExpectNotRestoredDidNotChange(base::Location location);
void ExpectBlocklistedFeature(
blink::scheduler::WebSchedulerTrackedFeature feature,
base::Location location);
void ExpectBrowsingInstanceNotSwappedReason(ShouldSwapBrowsingInstance reason,
base::Location location);
void ExpectEvictedAfterCommitted(
std::vector<BackForwardCacheMetrics::EvictedAfterDocumentRestoredReason>
reasons,
base::Location location);
template <typename T>
void ExpectBucketCount(base::StringPiece name,
T sample,
base::HistogramBase::Count expected_count) {
histogram_tester().ExpectBucketCount(name, sample, expected_count);
}
// Implementation needs to provide access to their own ukm_recorder.
// Note that TestAutoSetUkmRecorder's ctor requires a sequenced context.
virtual const ukm::TestAutoSetUkmRecorder& ukm_recorder() = 0;
// Implementation needs to provide access to their own histogram_tester.
// Note that HistogramTester accumulates all data after it is constructed.
virtual const base::HistogramTester& histogram_tester() = 0;
private:
// Adds a new outcome to the set of expected outcomes (restored or not) and
// tests that it occurred.
void ExpectOutcome(BackForwardCacheMetrics::HistoryNavigationOutcome outcome,
base::Location location);
void ExpectReasons(
std::vector<BackForwardCacheMetrics::NotRestoredReason> not_restored,
std::vector<blink::scheduler::WebSchedulerTrackedFeature> block_listed,
const std::vector<ShouldSwapBrowsingInstance>& not_swapped,
const std::vector<BackForwardCache::DisabledReason>&
disabled_for_render_frame_host,
const std::vector<uint64_t>& disallow_activation,
base::Location location);
void ExpectNotRestoredReasons(
std::vector<BackForwardCacheMetrics::NotRestoredReason> reasons,
base::Location location);
void ExpectBlocklistedFeatures(
std::vector<blink::scheduler::WebSchedulerTrackedFeature> features,
base::Location location);
void ExpectDisabledWithReasons(
const std::vector<BackForwardCache::DisabledReason>& reasons,
base::Location location);
void ExpectDisallowActivationReasons(const std::vector<uint64_t>& reasons,
base::Location location);
void ExpectBrowsingInstanceNotSwappedReasons(
const std::vector<ShouldSwapBrowsingInstance>& reasons,
base::Location location);
std::vector<base::Bucket> expected_outcomes_;
std::vector<base::Bucket> expected_not_restored_;
std::vector<base::Bucket> expected_blocklisted_features_;
std::vector<base::Bucket> expected_disabled_reasons_;
std::vector<base::Bucket> expected_disallow_activation_reasons_;
std::vector<base::Bucket> expected_browsing_instance_not_swapped_reasons_;
std::vector<base::Bucket> expected_eviction_after_committing_;
std::vector<UkmMetrics> expected_ukm_outcomes_;
std::vector<UkmMetrics> expected_ukm_not_restored_reasons_;
// Indicates whether metrics for all sites regardless of the domains are
// checked or not.
bool check_all_sites_ = true;
};
} // namespace content
#endif // CONTENT_BROWSER_BACK_FORWARD_CACHE_TEST_UTIL_H_