blob: a9af717838d3a98beb71777bc513ce7454cbe218 [file] [log] [blame]
// Copyright 2019 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/page_load_metrics/observers/security_state_page_load_metrics_observer.h"
#include <memory>
#include "base/test/simple_test_tick_clock.h"
#include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h"
#include "chrome/browser/ssl/security_state_tab_helper.h"
#include "chrome/browser/ssl/tls_deprecation_config.h"
#include "chrome/browser/ssl/tls_deprecation_config.pb.h"
#include "chrome/browser/ssl/tls_deprecation_test_utils.h"
#include "components/page_load_metrics/browser/page_load_tracker.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/navigation_simulator.h"
#include "ui/base/scoped_visibility_tracker.h"
class SecurityStatePageLoadMetricsObserverTest
: public page_load_metrics::PageLoadMetricsObserverTestHarness {
public:
SecurityStatePageLoadMetricsObserverTest()
: page_load_metrics::PageLoadMetricsObserverTestHarness() {
clock_ = std::make_unique<base::SimpleTestTickClock>();
clock_->SetNowTicks(base::TimeTicks::Now());
}
~SecurityStatePageLoadMetricsObserverTest() override {}
void SetUp() override {
page_load_metrics::PageLoadMetricsObserverTestHarness::SetUp();
SecurityStateTabHelper::CreateForWebContents(web_contents());
helper_ = SecurityStateTabHelper::FromWebContents(web_contents());
}
void AdvancePageDuration(base::TimeDelta delta) { clock_->Advance(delta); }
protected:
void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override {
// Currently does not support testing Site Engagement metrics.
tracker->AddObserver(
std::make_unique<SecurityStatePageLoadMetricsObserver>(nullptr));
// Swap out the ui::ScopedVisibilityTracker to use the test clock.
ui::ScopedVisibilityTracker visibility_tracker(clock_.get(), true);
tracker->SetVisibilityTrackerForTesting(visibility_tracker);
}
SecurityStateTabHelper* security_state_tab_helper() { return helper_; }
private:
SecurityStateTabHelper* helper_;
// The clock used by the ui::ScopedVisibilityTracker.
std::unique_ptr<base::SimpleTestTickClock> clock_;
DISALLOW_COPY_AND_ASSIGN(SecurityStatePageLoadMetricsObserverTest);
};
TEST_F(SecurityStatePageLoadMetricsObserverTest, LegacyTLSMetrics) {
InitializeEmptyLegacyTLSConfig();
auto navigation =
CreateLegacyTLSNavigation(GURL(kLegacyTLSDefaultURL), web_contents());
navigation->Commit();
tester()->histogram_tester().ExpectBucketCount("Security.LegacyTLS.OnCommit",
true, 1);
const base::TimeDelta kMinForegroundTime =
base::TimeDelta::FromMilliseconds(10);
AdvancePageDuration(kMinForegroundTime);
navigation->Reload(web_contents());
tester()->histogram_tester().ExpectBucketCount(
"Security.PageEndReason.LegacyTLS_Triggered",
page_load_metrics::END_RELOAD, 1);
auto samples = tester()->histogram_tester().GetAllSamples(
"Security.TimeOnPage2.LegacyTLS_Triggered");
EXPECT_EQ(1u, samples.size());
EXPECT_LE(kMinForegroundTime.InMilliseconds(), samples.front().min);
}
TEST_F(SecurityStatePageLoadMetricsObserverTest, LegacyTLSControlSiteMetrics) {
InitializeLegacyTLSConfigWithControl();
auto navigation =
CreateLegacyTLSNavigation(GURL(kLegacyTLSControlURL), web_contents());
navigation->Commit();
tester()->histogram_tester().ExpectBucketCount("Security.LegacyTLS.OnCommit",
false, 1);
const base::TimeDelta kMinForegroundTime =
base::TimeDelta::FromMilliseconds(10);
AdvancePageDuration(kMinForegroundTime);
navigation->Reload(web_contents());
tester()->histogram_tester().ExpectBucketCount(
"Security.PageEndReason.LegacyTLS_NotTriggered",
page_load_metrics::END_RELOAD, 1);
auto samples = tester()->histogram_tester().GetAllSamples(
"Security.TimeOnPage2.LegacyTLS_NotTriggered");
EXPECT_EQ(1u, samples.size());
EXPECT_LE(kMinForegroundTime.InMilliseconds(), samples.front().min);
}
TEST_F(SecurityStatePageLoadMetricsObserverTest, LegacyTLSGoodSiteMetrics) {
InitializeEmptyLegacyTLSConfig();
auto navigation =
CreateNonlegacyTLSNavigation(GURL("https://good.test"), web_contents());
navigation->Commit();
tester()->histogram_tester().ExpectBucketCount("Security.LegacyTLS.OnCommit",
false, 1);
const base::TimeDelta kMinForegroundTime =
base::TimeDelta::FromMilliseconds(10);
AdvancePageDuration(kMinForegroundTime);
navigation->Reload(web_contents());
tester()->histogram_tester().ExpectBucketCount(
"Security.PageEndReason.LegacyTLS_NotTriggered",
page_load_metrics::END_RELOAD, 1);
auto samples = tester()->histogram_tester().GetAllSamples(
"Security.TimeOnPage2.LegacyTLS_NotTriggered");
EXPECT_EQ(1u, samples.size());
EXPECT_LE(kMinForegroundTime.InMilliseconds(), samples.front().min);
}