blob: 147b0a6fa6815cd51e03a01f02f6d2dfefb8d146 [file] [log] [blame]
// Copyright 2016 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/previews/previews_infobar_delegate.h"
#include <map>
#include <memory>
#include <string>
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/feature_list.h"
#include "base/memory/ptr_util.h"
#include "base/metrics/field_trial.h"
#include "base/metrics/field_trial_param_associator.h"
#include "base/metrics/field_trial_params.h"
#include "base/optional.h"
#include "base/strings/string16.h"
#include "base/test/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
#include "chrome/browser/android/android_theme_resources.h"
#include "chrome/browser/infobars/infobar_service.h"
#include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.h"
#include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings_factory.h"
#include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h"
#include "chrome/browser/page_load_metrics/page_load_tracker.h"
#include "chrome/browser/previews/previews_infobar_tab_helper.h"
#include "chrome/grit/generated_resources.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "chrome/test/base/testing_browser_process.h"
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_config_test_utils.h"
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h"
#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
#include "components/infobars/core/confirm_infobar_delegate.h"
#include "components/infobars/core/infobar.h"
#include "components/infobars/core/infobar_delegate.h"
#include "components/network_time/network_time_test_utils.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/previews/core/previews_experiments.h"
#include "components/previews/core/previews_features.h"
#include "components/proxy_config/proxy_config_pref_names.h"
#include "components/variations/variations_associated_data.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/reload_type.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
#include "content/public/common/referrer.h"
#include "content/public/test/test_renderer_host.h"
#include "content/public/test/web_contents_tester.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/page_transition_types.h"
#include "ui/base/window_open_disposition.h"
namespace {
const char kTestUrl[] = "http://www.test.com/";
// Key of the UMA Previews.InfoBarAction.LoFi histogram.
const char kUMAPreviewsInfoBarActionLoFi[] = "Previews.InfoBarAction.LoFi";
// Key of the UMA Previews.InfoBarAction.Offline histogram.
const char kUMAPreviewsInfoBarActionOffline[] =
"Previews.InfoBarAction.Offline";
// Key of the UMA Previews.InfoBarAction.LitePage histogram.
const char kUMAPreviewsInfoBarActionLitePage[] =
"Previews.InfoBarAction.LitePage";
// Key of the UMA Previews.InfoBarTimestamp histogram.
const char kUMAPreviewsInfoBarTimestamp[] = "Previews.InfoBarTimestamp";
class TestPreviewsWebContentsObserver
: public content::WebContentsObserver,
public content::WebContentsUserData<TestPreviewsWebContentsObserver> {
public:
explicit TestPreviewsWebContentsObserver(content::WebContents* web_contents)
: content::WebContentsObserver(web_contents),
last_navigation_reload_type_(content::ReloadType::NONE) {}
~TestPreviewsWebContentsObserver() override {}
content::ReloadType last_navigation_reload_type() {
return last_navigation_reload_type_;
}
void DidFinishNavigation(
content::NavigationHandle* navigation_handle) override {
last_navigation_reload_type_ = navigation_handle->GetReloadType();
}
private:
content::ReloadType last_navigation_reload_type_;
};
class TestOptOutObserver : public page_load_metrics::PageLoadMetricsObserver {
public:
explicit TestOptOutObserver(const base::Callback<void()>& callback)
: callback_(callback) {}
~TestOptOutObserver() override {}
void OnEventOccurred(const void* const event_key) override {
if (PreviewsInfoBarDelegate::OptOutEventKey() == event_key)
callback_.Run();
}
base::Callback<void()> callback_;
};
} // namespace
DEFINE_WEB_CONTENTS_USER_DATA_KEY(TestPreviewsWebContentsObserver);
class PreviewsInfoBarDelegateUnitTest
: public page_load_metrics::PageLoadMetricsObserverTestHarness {
protected:
PreviewsInfoBarDelegateUnitTest()
: opt_out_called_(false),
field_trial_list_(new base::FieldTrialList(nullptr)),
tester_(new base::HistogramTester()) {}
void SetUp() override {
PageLoadMetricsObserverTestHarness::SetUp();
InfoBarService::CreateForWebContents(web_contents());
PreviewsInfoBarTabHelper::CreateForWebContents(web_contents());
TestPreviewsWebContentsObserver::CreateForWebContents(web_contents());
drp_test_context_ =
data_reduction_proxy::DataReductionProxyTestContext::Builder()
.WithMockConfig()
.SkipSettingsInitialization()
.Build();
auto* data_reduction_proxy_settings =
DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
web_contents()->GetBrowserContext());
PrefRegistrySimple* registry =
drp_test_context_->pref_service()->registry();
registry->RegisterDictionaryPref(proxy_config::prefs::kProxy);
data_reduction_proxy_settings
->set_data_reduction_proxy_enabled_pref_name_for_test(
drp_test_context_->GetDataReductionProxyEnabledPrefName());
data_reduction_proxy_settings->InitDataReductionProxySettings(
drp_test_context_->io_data(), drp_test_context_->pref_service(),
drp_test_context_->request_context_getter(),
base::WrapUnique(new data_reduction_proxy::DataStore()),
base::ThreadTaskRunnerHandle::Get(),
base::ThreadTaskRunnerHandle::Get());
TestingBrowserProcess::GetGlobal()->SetLocalState(
drp_test_context_->pref_service());
network_time::NetworkTimeTracker::RegisterPrefs(registry);
}
void TearDown() override {
drp_test_context_->DestroySettings();
ChromeRenderViewHostTestHarness::TearDown();
TestingBrowserProcess::GetGlobal()->SetLocalState(nullptr);
}
PreviewsInfoBarDelegate* CreateInfoBar(previews::PreviewsType type,
base::Time previews_freshness,
bool is_data_saver_user,
bool is_reload) {
PreviewsInfoBarDelegate::Create(
web_contents(), type, previews_freshness, is_data_saver_user, is_reload,
base::Bind(&PreviewsInfoBarDelegateUnitTest::OnDismissPreviewsInfobar,
base::Unretained(this)));
InfoBarService* infobar_service =
InfoBarService::FromWebContents(web_contents());
EXPECT_EQ(1U, infobar_service->infobar_count());
return static_cast<PreviewsInfoBarDelegate*>(
infobar_service->infobar_at(0)->delegate());
}
void EnableStalePreviewsTimestamp(
const std::map<std::string, std::string>& variation_params) {
field_trial_list_.reset();
field_trial_list_.reset(new base::FieldTrialList(nullptr));
base::FieldTrialParamAssociator::GetInstance()->ClearAllParamsForTesting();
const std::string kTrialName = "TrialName";
const std::string kGroupName = "GroupName";
base::AssociateFieldTrialParams(kTrialName, kGroupName, variation_params);
base::FieldTrial* field_trial =
base::FieldTrialList::CreateFieldTrial(kTrialName, kGroupName);
std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
feature_list->RegisterFieldTrialOverride(
previews::features::kStalePreviewsTimestamp.name,
base::FeatureList::OVERRIDE_ENABLE_FEATURE, field_trial);
scoped_feature_list_.InitWithFeatureList(std::move(feature_list));
}
void TestStalePreviews(
int staleness_in_minutes,
bool is_reload,
base::string16 expected_timestamp,
PreviewsInfoBarDelegate::PreviewsInfoBarTimestamp expected_bucket) {
PreviewsInfoBarDelegate* infobar = CreateInfoBar(
previews::PreviewsType::LITE_PAGE,
base::Time::Now() - base::TimeDelta::FromMinutes(staleness_in_minutes),
true /* is_data_saver_user */, is_reload);
EXPECT_EQ(expected_timestamp, infobar->GetTimestampText());
tester_->ExpectBucketCount(kUMAPreviewsInfoBarTimestamp, expected_bucket,
1);
// Dismiss the infobar.
InfoBarService::FromWebContents(web_contents())->RemoveAllInfoBars(false);
PreviewsInfoBarTabHelper::FromWebContents(web_contents())
->set_displayed_preview_infobar(false);
}
void OnDismissPreviewsInfobar(bool user_opt_out) {
user_opt_out_ = user_opt_out;
}
InfoBarService* infobar_service() {
return InfoBarService::FromWebContents(web_contents());
}
void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override {
tracker->AddObserver(base::MakeUnique<TestOptOutObserver>(base::Bind(
&PreviewsInfoBarDelegateUnitTest::OptOut, base::Unretained(this))));
}
void OptOut() { opt_out_called_ = true; }
bool opt_out_called_;
std::unique_ptr<data_reduction_proxy::DataReductionProxyTestContext>
drp_test_context_;
base::Optional<bool> user_opt_out_;
std::unique_ptr<base::FieldTrialList> field_trial_list_;
base::test::ScopedFeatureList scoped_feature_list_;
std::unique_ptr<base::HistogramTester> tester_;
};
TEST_F(PreviewsInfoBarDelegateUnitTest, InfobarTestNavigationDismissal) {
CreateInfoBar(previews::PreviewsType::LOFI, base::Time(),
true /* is_data_saver_user */, false /* is_reload */);
// Try showing a second infobar. Another should not be shown since the page
// has not navigated.
PreviewsInfoBarDelegate::Create(
web_contents(), previews::PreviewsType::LOFI,
base::Time() /* previews_freshness */, true /* is_data_saver_user */,
false /* is_reload */,
PreviewsInfoBarDelegate::OnDismissPreviewsInfobarCallback());
EXPECT_EQ(1U, infobar_service()->infobar_count());
// Navigate and make sure the infobar is dismissed.
NavigateAndCommit(GURL(kTestUrl));
EXPECT_EQ(0U, infobar_service()->infobar_count());
EXPECT_FALSE(user_opt_out_.value());
tester_->ExpectBucketCount(
kUMAPreviewsInfoBarActionLoFi,
PreviewsInfoBarDelegate::INFOBAR_DISMISSED_BY_NAVIGATION, 1);
}
TEST_F(PreviewsInfoBarDelegateUnitTest, InfobarTestReloadDismissal) {
// Navigate to test URL, so we can reload later.
NavigateAndCommit(GURL(kTestUrl));
CreateInfoBar(previews::PreviewsType::LOFI, base::Time(),
true /* is_data_saver_user */, false /* is_reload */);
// Try showing a second infobar. Another should not be shown since the page
// has not navigated.
PreviewsInfoBarDelegate::Create(
web_contents(), previews::PreviewsType::LOFI,
base::Time() /* previews_freshness */, true /* is_data_saver_user */,
false /* is_reload */,
PreviewsInfoBarDelegate::OnDismissPreviewsInfobarCallback());
EXPECT_EQ(1U, infobar_service()->infobar_count());
// Navigate to test URL as a reload to dismiss the infobar.
controller().LoadURL(GURL(kTestUrl), content::Referrer(),
ui::PAGE_TRANSITION_RELOAD, std::string());
content::WebContentsTester::For(web_contents())->CommitPendingNavigation();
EXPECT_EQ(0U, infobar_service()->infobar_count());
EXPECT_FALSE(user_opt_out_.value());
tester_->ExpectBucketCount(
kUMAPreviewsInfoBarActionLoFi,
PreviewsInfoBarDelegate::INFOBAR_DISMISSED_BY_RELOAD, 1);
EXPECT_FALSE(opt_out_called_);
}
TEST_F(PreviewsInfoBarDelegateUnitTest, InfobarTestUserDismissal) {
ConfirmInfoBarDelegate* infobar =
CreateInfoBar(previews::PreviewsType::LOFI, base::Time(),
true /* is_data_saver_user */, false /* is_reload */);
// Simulate dismissing the infobar.
infobar->InfoBarDismissed();
infobar_service()->infobar_at(0)->RemoveSelf();
EXPECT_EQ(0U, infobar_service()->infobar_count());
tester_->ExpectBucketCount(kUMAPreviewsInfoBarActionLoFi,
PreviewsInfoBarDelegate::INFOBAR_DISMISSED_BY_USER,
1);
EXPECT_FALSE(user_opt_out_.value());
}
TEST_F(PreviewsInfoBarDelegateUnitTest, InfobarTestTabClosedDismissal) {
CreateInfoBar(previews::PreviewsType::LOFI, base::Time(),
true /* is_data_saver_user */, false /* is_reload */);
// Delete the infobar without any other infobar actions.
infobar_service()->infobar_at(0)->RemoveSelf();
EXPECT_EQ(0U, infobar_service()->infobar_count());
tester_->ExpectBucketCount(
kUMAPreviewsInfoBarActionLoFi,
PreviewsInfoBarDelegate::INFOBAR_DISMISSED_BY_TAB_CLOSURE, 1);
EXPECT_FALSE(user_opt_out_.value());
}
TEST_F(PreviewsInfoBarDelegateUnitTest, InfobarTestClickLinkLoFi) {
NavigateAndCommit(GURL(kTestUrl));
const struct {
bool using_previews_blacklist;
} tests[] = {
{true}, {false},
};
for (const auto test : tests) {
opt_out_called_ = false;
tester_.reset(new base::HistogramTester());
field_trial_list_.reset();
field_trial_list_.reset(new base::FieldTrialList(nullptr));
if (test.using_previews_blacklist) {
base::FieldTrialList::CreateFieldTrial(
"DataReductionProxyPreviewsBlackListTransition", "Enabled_");
}
// Call Reload and CommitPendingNavigation to force DidFinishNavigation.
web_contents()->GetController().Reload(content::ReloadType::NORMAL, true);
content::WebContentsTester::For(web_contents())->CommitPendingNavigation();
ConfirmInfoBarDelegate* infobar =
CreateInfoBar(previews::PreviewsType::LOFI, base::Time(),
true /* is_data_saver_user */, false /* is_reload */);
// Simulate clicking the infobar link.
if (infobar->LinkClicked(WindowOpenDisposition::CURRENT_TAB))
infobar_service()->infobar_at(0)->RemoveSelf();
EXPECT_EQ(0U, infobar_service()->infobar_count());
tester_->ExpectBucketCount(
kUMAPreviewsInfoBarActionLoFi,
PreviewsInfoBarDelegate::INFOBAR_LOAD_ORIGINAL_CLICKED, 1);
EXPECT_TRUE(user_opt_out_.value());
EXPECT_TRUE(opt_out_called_);
}
}
TEST_F(PreviewsInfoBarDelegateUnitTest, InfobarTestClickLinkLitePage) {
NavigateAndCommit(GURL(kTestUrl));
ConfirmInfoBarDelegate* infobar =
CreateInfoBar(previews::PreviewsType::LITE_PAGE, base::Time(),
true /* is_data_saver_user */, false /* is_reload */);
// Simulate clicking the infobar link.
if (infobar->LinkClicked(WindowOpenDisposition::CURRENT_TAB))
infobar_service()->infobar_at(0)->RemoveSelf();
EXPECT_EQ(0U, infobar_service()->infobar_count());
tester_->ExpectBucketCount(
kUMAPreviewsInfoBarActionLitePage,
PreviewsInfoBarDelegate::INFOBAR_LOAD_ORIGINAL_CLICKED, 1);
content::WebContentsTester::For(web_contents())->CommitPendingNavigation();
EXPECT_EQ(content::ReloadType::DISABLE_PREVIEWS,
TestPreviewsWebContentsObserver::FromWebContents(web_contents())
->last_navigation_reload_type());
EXPECT_TRUE(opt_out_called_);
}
TEST_F(PreviewsInfoBarDelegateUnitTest, InfobarTestShownOncePerNavigation) {
ConfirmInfoBarDelegate* infobar =
CreateInfoBar(previews::PreviewsType::LOFI, base::Time(),
true /* is_data_saver_user */, false /* is_reload */);
// Simulate dismissing the infobar.
infobar->InfoBarDismissed();
infobar_service()->infobar_at(0)->RemoveSelf();
EXPECT_EQ(0U, infobar_service()->infobar_count());
PreviewsInfoBarDelegate::Create(
web_contents(), previews::PreviewsType::LOFI,
base::Time() /* previews_freshness */, true /* is_data_saver_user */,
false /* is_reload */,
PreviewsInfoBarDelegate::OnDismissPreviewsInfobarCallback());
// Infobar should not be shown again since a navigation hasn't happened.
EXPECT_EQ(0U, infobar_service()->infobar_count());
// Navigate and show infobar again.
NavigateAndCommit(GURL(kTestUrl));
CreateInfoBar(previews::PreviewsType::LOFI, base::Time(),
true /* is_data_saver_user */, false /* is_reload */);
}
TEST_F(PreviewsInfoBarDelegateUnitTest, LoFiInfobarTest) {
ConfirmInfoBarDelegate* infobar =
CreateInfoBar(previews::PreviewsType::LOFI, base::Time(),
true /* is_data_saver_user */, false /* is_reload */);
tester_->ExpectUniqueSample(kUMAPreviewsInfoBarActionLoFi,
PreviewsInfoBarDelegate::INFOBAR_SHOWN, 1);
ASSERT_TRUE(infobar);
ASSERT_EQ(l10n_util::GetStringUTF16(IDS_PREVIEWS_INFOBAR_SAVED_DATA_TITLE),
infobar->GetMessageText());
ASSERT_EQ(l10n_util::GetStringUTF16(IDS_PREVIEWS_INFOBAR_LINK),
infobar->GetLinkText());
#if defined(OS_ANDROID)
ASSERT_EQ(IDR_ANDROID_INFOBAR_PREVIEWS, infobar->GetIconId());
#else
ASSERT_EQ(PreviewsInfoBarDelegate::kNoIconID, infobar->GetIconId());
#endif
}
TEST_F(PreviewsInfoBarDelegateUnitTest, PreviewInfobarTest) {
PreviewsInfoBarDelegate* infobar =
CreateInfoBar(previews::PreviewsType::LITE_PAGE, base::Time(),
true /* is_data_saver_user */, false /* is_reload */);
tester_->ExpectUniqueSample(kUMAPreviewsInfoBarActionLitePage,
PreviewsInfoBarDelegate::INFOBAR_SHOWN, 1);
// Check the strings.
ASSERT_TRUE(infobar);
ASSERT_EQ(l10n_util::GetStringUTF16(IDS_PREVIEWS_INFOBAR_SAVED_DATA_TITLE),
infobar->GetMessageText());
ASSERT_EQ(l10n_util::GetStringUTF16(IDS_PREVIEWS_INFOBAR_LINK),
infobar->GetLinkText());
ASSERT_EQ(base::string16(), infobar->GetTimestampText());
#if defined(OS_ANDROID)
ASSERT_EQ(IDR_ANDROID_INFOBAR_PREVIEWS, infobar->GetIconId());
#else
ASSERT_EQ(PreviewsInfoBarDelegate::kNoIconID, infobar->GetIconId());
#endif
}
TEST_F(PreviewsInfoBarDelegateUnitTest, OfflineInfobarNonDataSaverUserTest) {
PreviewsInfoBarDelegate* infobar =
CreateInfoBar(previews::PreviewsType::OFFLINE, base::Time(),
false /* is_data_saver_user */, false /* is_reload */);
tester_->ExpectUniqueSample(kUMAPreviewsInfoBarActionOffline,
PreviewsInfoBarDelegate::INFOBAR_SHOWN, 1);
// Check the strings.
ASSERT_TRUE(infobar);
ASSERT_EQ(l10n_util::GetStringUTF16(IDS_PREVIEWS_INFOBAR_FASTER_PAGE_TITLE),
infobar->GetMessageText());
ASSERT_EQ(l10n_util::GetStringUTF16(IDS_PREVIEWS_INFOBAR_LINK),
infobar->GetLinkText());
ASSERT_EQ(base::string16(), infobar->GetTimestampText());
#if defined(OS_ANDROID)
ASSERT_EQ(IDR_ANDROID_INFOBAR_PREVIEWS, infobar->GetIconId());
#else
ASSERT_EQ(PreviewsInfoBarDelegate::kNoIconID, infobar->GetIconId());
#endif
}
TEST_F(PreviewsInfoBarDelegateUnitTest, OfflineInfobarDataSaverUserTest) {
PreviewsInfoBarDelegate* infobar =
CreateInfoBar(previews::PreviewsType::OFFLINE, base::Time(),
true /* is_data_saver_user */, false /* is_reload */);
tester_->ExpectUniqueSample(kUMAPreviewsInfoBarActionOffline,
PreviewsInfoBarDelegate::INFOBAR_SHOWN, 1);
// Check the strings.
ASSERT_TRUE(infobar);
ASSERT_EQ(l10n_util::GetStringUTF16(IDS_PREVIEWS_INFOBAR_SAVED_DATA_TITLE),
infobar->GetMessageText());
ASSERT_EQ(l10n_util::GetStringUTF16(IDS_PREVIEWS_INFOBAR_LINK),
infobar->GetLinkText());
ASSERT_EQ(base::string16(), infobar->GetTimestampText());
#if defined(OS_ANDROID)
ASSERT_EQ(IDR_ANDROID_INFOBAR_PREVIEWS, infobar->GetIconId());
#else
ASSERT_EQ(PreviewsInfoBarDelegate::kNoIconID, infobar->GetIconId());
#endif
}
TEST_F(PreviewsInfoBarDelegateUnitTest, OfflineInfobarDisablesLoFi) {
NavigateAndCommit(GURL(kTestUrl));
ConfirmInfoBarDelegate* infobar =
CreateInfoBar(previews::PreviewsType::OFFLINE, base::Time(),
true /* is_data_saver_user */, false /* is_reload */);
tester_->ExpectUniqueSample(kUMAPreviewsInfoBarActionOffline,
PreviewsInfoBarDelegate::INFOBAR_SHOWN, 1);
// Simulate clicking the infobar link.
if (infobar->LinkClicked(WindowOpenDisposition::CURRENT_TAB))
infobar_service()->infobar_at(0)->RemoveSelf();
EXPECT_EQ(0U, infobar_service()->infobar_count());
content::WebContentsTester::For(web_contents())->CommitPendingNavigation();
EXPECT_EQ(content::ReloadType::DISABLE_PREVIEWS,
TestPreviewsWebContentsObserver::FromWebContents(web_contents())
->last_navigation_reload_type());
EXPECT_TRUE(opt_out_called_);
}
TEST_F(PreviewsInfoBarDelegateUnitTest, PreviewInfobarTimestampMinutesTest) {
// Use default params.
std::map<std::string, std::string> variation_params;
EnableStalePreviewsTimestamp(variation_params);
int staleness_in_minutes = 5;
TestStalePreviews(
staleness_in_minutes, false /* is_reload */,
l10n_util::GetStringFUTF16(IDS_PREVIEWS_INFOBAR_TIMESTAMP_MINUTES,
base::IntToString16(staleness_in_minutes)),
PreviewsInfoBarDelegate::TIMESTAMP_SHOWN);
}
TEST_F(PreviewsInfoBarDelegateUnitTest, PreviewInfobarTimestampHourTest) {
// Use default variation_params.
std::map<std::string, std::string> variation_params;
EnableStalePreviewsTimestamp(variation_params);
int staleness_in_minutes = 65;
TestStalePreviews(
staleness_in_minutes, false /* is_reload */,
l10n_util::GetStringUTF16(IDS_PREVIEWS_INFOBAR_TIMESTAMP_ONE_HOUR),
PreviewsInfoBarDelegate::TIMESTAMP_SHOWN);
}
TEST_F(PreviewsInfoBarDelegateUnitTest, PreviewInfobarTimestampHoursTest) {
// Use default variation_params.
std::map<std::string, std::string> variation_params;
EnableStalePreviewsTimestamp(variation_params);
int staleness_in_hours = 2;
TestStalePreviews(
staleness_in_hours * 60, false /* is_reload */,
l10n_util::GetStringFUTF16(IDS_PREVIEWS_INFOBAR_TIMESTAMP_HOURS,
base::IntToString16(staleness_in_hours)),
PreviewsInfoBarDelegate::TIMESTAMP_SHOWN);
}
TEST_F(PreviewsInfoBarDelegateUnitTest, PreviewInfobarTimestampFinchParamsUMA) {
std::map<std::string, std::string> variation_params;
variation_params["min_staleness_in_minutes"] = "1";
variation_params["max_staleness_in_minutes"] = "5";
EnableStalePreviewsTimestamp(variation_params);
TestStalePreviews(
1, false /* is_reload */,
l10n_util::GetStringFUTF16(IDS_PREVIEWS_INFOBAR_TIMESTAMP_MINUTES,
base::IntToString16(1)),
PreviewsInfoBarDelegate::TIMESTAMP_SHOWN);
TestStalePreviews(
6, false /* is_reload */, base::string16(),
PreviewsInfoBarDelegate::TIMESTAMP_NOT_SHOWN_STALENESS_GREATER_THAN_MAX);
}
TEST_F(PreviewsInfoBarDelegateUnitTest, PreviewInfobarTimestampUMA) {
// Use default params.
std::map<std::string, std::string> variation_params;
EnableStalePreviewsTimestamp(variation_params);
TestStalePreviews(
1, false /* is_reload */, base::string16(),
PreviewsInfoBarDelegate::TIMESTAMP_NOT_SHOWN_PREVIEW_NOT_STALE);
TestStalePreviews(
-1, false /* is_reload */, base::string16(),
PreviewsInfoBarDelegate::TIMESTAMP_NOT_SHOWN_STALENESS_NEGATIVE);
TestStalePreviews(
1441, false /* is_reload */, base::string16(),
PreviewsInfoBarDelegate::TIMESTAMP_NOT_SHOWN_STALENESS_GREATER_THAN_MAX);
}
TEST_F(PreviewsInfoBarDelegateUnitTest, PreviewInfobarTimestampReloadTest) {
// Use default params.
std::map<std::string, std::string> variation_params;
EnableStalePreviewsTimestamp(variation_params);
int staleness_in_minutes = 5;
TestStalePreviews(
staleness_in_minutes, false /* is_reload */,
l10n_util::GetStringFUTF16(IDS_PREVIEWS_INFOBAR_TIMESTAMP_MINUTES,
base::IntToString16(staleness_in_minutes)),
PreviewsInfoBarDelegate::TIMESTAMP_SHOWN);
staleness_in_minutes = 1;
TestStalePreviews(
staleness_in_minutes, true /* is_reload */,
l10n_util::GetStringUTF16(IDS_PREVIEWS_INFOBAR_TIMESTAMP_UPDATED_NOW),
PreviewsInfoBarDelegate::TIMESTAMP_UPDATED_NOW_SHOWN);
}