// 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/message_loop/message_loop_current.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/run_loop.h"
#include "base/strings/string16.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/default_clock.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "chrome/browser/android/android_theme_resources.h"
#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h"
#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h"
#include "chrome/browser/infobars/mock_infobar_service.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_ui_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 "chrome/test/base/testing_profile.h"
#include "components/blacklist/opt_out_blacklist/opt_out_blacklist_data.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/content/previews_decider_impl.h"
#include "components/previews/content/previews_ui_service.h"
#include "components/previews/core/previews_experiments.h"
#include "components/previews/core/previews_features.h"
#include "components/previews/core/previews_logger.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/navigation_simulator.h"
#include "content/public/test/test_renderer_host.h"
#include "content/public/test/web_contents_tester.h"
#include "services/network/test/test_network_quality_tracker.h"
#include "services/network/test/test_shared_url_loader_factory.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.StalePreviewTimestampShown histogram.
const char kUMAPreviewsStalePreviewTimestamp[] =
    "Previews.StalePreviewTimestampShown";

// Dummy method for creating TestPreviewsUIService.
bool IsPreviewsEnabled(previews::PreviewsType type) {
  return true;
}

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:
  friend class content::WebContentsUserData<TestPreviewsWebContentsObserver>;
  content::ReloadType last_navigation_reload_type_;
  WEB_CONTENTS_USER_DATA_KEY_DECL();
};

WEB_CONTENTS_USER_DATA_KEY_IMPL(TestPreviewsWebContentsObserver)

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 (PreviewsUITabHelper::OptOutEventKey() == event_key)
      callback_.Run();
  }

  base::Callback<void()> callback_;
};

class TestPreviewsLogger : public previews::PreviewsLogger {
 public:
  TestPreviewsLogger() {}
  ~TestPreviewsLogger() override {}

  // previews::PreviewsLogger:
  void LogMessage(const std::string& event_type,
                  const std::string& event_description,
                  const GURL& url,
                  base::Time time,
                  uint64_t page_id) override {
    event_type_ = event_type;
    event_description_ = event_description;
  }

  // Exposed passed in params of LogMessage for testing.
  std::string event_type() const { return event_type_; }
  std::string event_description() const { return event_description_; }

 private:
  // Passed in parameters of LogMessage.
  std::string event_type_;
  std::string event_description_;
};

}  // namespace

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();
    MockInfoBarService::CreateForWebContents(web_contents());
    PreviewsUITabHelper::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->InitDataReductionProxySettings(
        drp_test_context_->io_data(), drp_test_context_->pref_service(),
        drp_test_context_->request_context_getter(), profile(),
        base::MakeRefCounted<network::TestSharedURLLoaderFactory>(),
        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);

    std::unique_ptr<TestPreviewsLogger> previews_logger =
        std::make_unique<TestPreviewsLogger>();
    previews_logger_ = previews_logger.get();
    std::unique_ptr<previews::PreviewsDeciderImpl> decider =
        std::make_unique<previews::PreviewsDeciderImpl>(
            base::DefaultClock::GetInstance());
    previews_decider_impl_ = decider.get();
    test_network_quality_tracker_ =
        std::make_unique<network::TestNetworkQualityTracker>();
    previews_ui_service_ = std::make_unique<previews::PreviewsUIService>(
        std::move(decider), nullptr /* previews_opt_out_store */,
        nullptr /* previews_opt_guide */,
        base::BindRepeating(&IsPreviewsEnabled), std::move(previews_logger),
        blacklist::BlacklistData::AllowedTypesAndVersions(),
        test_network_quality_tracker_.get());
    base::RunLoop().RunUntilIdle();
  }

  void TearDown() override {
    previews_ui_service_.reset();
    drp_test_context_->DestroySettings();
    ChromeRenderViewHostTestHarness::TearDown();
    TestingBrowserProcess::GetGlobal()->SetLocalState(nullptr);
  }

  PreviewsInfoBarDelegate* CreateInfoBar(previews::PreviewsType type,
                                         bool is_data_saver_user) {
    PreviewsInfoBarDelegate::Create(web_contents(), type, is_data_saver_user,
                                    previews_ui_service_.get());

    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();

    scoped_feature_list_.InitAndEnableFeatureWithParameters(
        previews::features::kStalePreviewsTimestamp, variation_params);
  }

  void TestStalePreviews(
      int staleness_in_minutes,
      bool is_reload,
      base::string16 expected_timestamp,
      PreviewsUITabHelper::PreviewsStalePreviewTimestamp expected_bucket) {
    PreviewsUITabHelper::FromWebContents(web_contents())
        ->SetStalePreviewsStateForTesting(
            base::Time::Now() -
                base::TimeDelta::FromMinutes(staleness_in_minutes),
            is_reload);

    PreviewsInfoBarDelegate* infobar = CreateInfoBar(
        previews::PreviewsType::LITE_PAGE, true /* is_data_saver_user */);
    EXPECT_EQ(expected_timestamp, infobar->GetStalePreviewTimestampText());
    tester_->ExpectBucketCount(kUMAPreviewsStalePreviewTimestamp,
                               expected_bucket, 1);

    // Dismiss the infobar.
    infobar_service()->RemoveAllInfoBars(false);
    PreviewsUITabHelper::FromWebContents(web_contents())
        ->set_displayed_preview_ui(false);
  }

  InfoBarService* infobar_service() {
    return InfoBarService::FromWebContents(web_contents());
  }

  // Expose previews_logger_ raw pointer to test results.
  TestPreviewsLogger* previews_logger() const { return previews_logger_; }

  void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override {
    tracker->AddObserver(std::make_unique<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_;

  std::unique_ptr<base::FieldTrialList> field_trial_list_;
  base::test::ScopedFeatureList scoped_feature_list_;
  std::unique_ptr<base::HistogramTester> tester_;

  TestPreviewsLogger* previews_logger_;
  previews::PreviewsDeciderImpl* previews_decider_impl_;
  std::unique_ptr<previews::PreviewsUIService> previews_ui_service_;
  std::unique_ptr<network::NetworkQualityTracker> test_network_quality_tracker_;
};

// TODO(crbug/782740): Test temporarily disabled on Windows because it crashes
// on trybots.
#if defined(OS_WIN)
#define DISABLE_ON_WINDOWS(x) DISABLED_##x
#else
#define DISABLE_ON_WINDOWS(x) x
#endif
TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(InfobarTestNavigationDismissal)) {
  CreateInfoBar(previews::PreviewsType::LOFI, true /* is_data_saver_user */);

  // Try showing a second infobar. Another should not be shown since the page
  // has not navigated.
  PreviewsInfoBarDelegate::Create(web_contents(), previews::PreviewsType::LOFI,
                                  true /* is_data_saver_user */,
                                  previews_ui_service_.get());
  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());

  tester_->ExpectBucketCount(
      kUMAPreviewsInfoBarActionLoFi,
      PreviewsInfoBarDelegate::INFOBAR_DISMISSED_BY_NAVIGATION, 1);
}

TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(InfobarTestReloadDismissal)) {
  // Navigate to test URL, so we can reload later.
  NavigateAndCommit(GURL(kTestUrl));

  CreateInfoBar(previews::PreviewsType::LOFI, true /* is_data_saver_user */);

  // Try showing a second infobar. Another should not be shown since the page
  // has not navigated.
  PreviewsInfoBarDelegate::Create(web_contents(), previews::PreviewsType::LOFI,
                                  true /* is_data_saver_user */,
                                  previews_ui_service_.get());
  EXPECT_EQ(1U, infobar_service()->infobar_count());

  // Navigate to test URL as a reload to dismiss the infobar.
  content::NavigationSimulator::Reload(web_contents());

  EXPECT_EQ(0U, infobar_service()->infobar_count());

  tester_->ExpectBucketCount(
      kUMAPreviewsInfoBarActionLoFi,
      PreviewsInfoBarDelegate::INFOBAR_DISMISSED_BY_RELOAD, 1);

  EXPECT_FALSE(opt_out_called_);
}

TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(InfobarTestUserDismissal)) {
  ConfirmInfoBarDelegate* infobar = CreateInfoBar(
      previews::PreviewsType::LOFI, true /* is_data_saver_user */);

  // 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);
}

TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(InfobarTestTabClosedDismissal)) {
  CreateInfoBar(previews::PreviewsType::LOFI, true /* is_data_saver_user */);

  // 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);
}

TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(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 to force DidFinishNavigation.
    content::NavigationSimulator::Reload(web_contents());
    ConfirmInfoBarDelegate* infobar = CreateInfoBar(
        previews::PreviewsType::LOFI, true /* is_data_saver_user */);

    // 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(opt_out_called_);
  }
}

TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(InfobarTestClickLinkLitePage)) {
  NavigateAndCommit(GURL(kTestUrl));
  ConfirmInfoBarDelegate* infobar = CreateInfoBar(
      previews::PreviewsType::LITE_PAGE, true /* is_data_saver_user */);

  // 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);

  std::unique_ptr<content::NavigationSimulator> simulator =
      content::NavigationSimulator::CreateFromPending(web_contents());
  simulator->Commit();

  EXPECT_EQ(content::ReloadType::ORIGINAL_REQUEST_URL,
            TestPreviewsWebContentsObserver::FromWebContents(web_contents())
                ->last_navigation_reload_type());

  EXPECT_TRUE(opt_out_called_);
}

TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(InfobarTestShownOncePerNavigation)) {
  ConfirmInfoBarDelegate* infobar = CreateInfoBar(
      previews::PreviewsType::LOFI, true /* is_data_saver_user */);

  // 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,
                                  true /* is_data_saver_user */,
                                  previews_ui_service_.get());

  // 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, true /* is_data_saver_user */);
}

TEST_F(PreviewsInfoBarDelegateUnitTest, DISABLE_ON_WINDOWS(LoFiInfobarTest)) {
  ConfirmInfoBarDelegate* infobar = CreateInfoBar(
      previews::PreviewsType::LOFI, true /* is_data_saver_user */);

  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,
       DISABLE_ON_WINDOWS(PreviewInfobarTest)) {
  PreviewsInfoBarDelegate* infobar = CreateInfoBar(
      previews::PreviewsType::LITE_PAGE, true /* is_data_saver_user */);

  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->GetStalePreviewTimestampText());
#if defined(OS_ANDROID)
  ASSERT_EQ(IDR_ANDROID_INFOBAR_PREVIEWS, infobar->GetIconId());
#else
  ASSERT_EQ(PreviewsInfoBarDelegate::kNoIconID, infobar->GetIconId());
#endif
}

TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(OfflineInfobarNonDataSaverUserTest)) {
  PreviewsInfoBarDelegate* infobar = CreateInfoBar(
      previews::PreviewsType::OFFLINE, false /* is_data_saver_user */);

  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->GetStalePreviewTimestampText());
#if defined(OS_ANDROID)
  ASSERT_EQ(IDR_ANDROID_INFOBAR_PREVIEWS, infobar->GetIconId());
#else
  ASSERT_EQ(PreviewsInfoBarDelegate::kNoIconID, infobar->GetIconId());
#endif
}

TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(OfflineInfobarDataSaverUserTest)) {
  PreviewsInfoBarDelegate* infobar = CreateInfoBar(
      previews::PreviewsType::OFFLINE, true /* is_data_saver_user */);

  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->GetStalePreviewTimestampText());
#if defined(OS_ANDROID)
  ASSERT_EQ(IDR_ANDROID_INFOBAR_PREVIEWS, infobar->GetIconId());
#else
  ASSERT_EQ(PreviewsInfoBarDelegate::kNoIconID, infobar->GetIconId());
#endif
}

TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(OfflineInfobarDisablesLoFi)) {
  NavigateAndCommit(GURL(kTestUrl));

  ConfirmInfoBarDelegate* infobar = CreateInfoBar(
      previews::PreviewsType::OFFLINE, true /* is_data_saver_user */);

  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());

  std::unique_ptr<content::NavigationSimulator> simulator =
      content::NavigationSimulator::CreateFromPending(web_contents());
  simulator->Commit();

  EXPECT_EQ(content::ReloadType::ORIGINAL_REQUEST_URL,
            TestPreviewsWebContentsObserver::FromWebContents(web_contents())
                ->last_navigation_reload_type());

  EXPECT_TRUE(opt_out_called_);
}

TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(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::NumberToString16(staleness_in_minutes)),
      PreviewsUITabHelper::PreviewsStalePreviewTimestamp::kTimestampShown);
}

TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(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),
      PreviewsUITabHelper::PreviewsStalePreviewTimestamp::kTimestampShown);
}

TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(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::NumberToString16(staleness_in_hours)),
      PreviewsUITabHelper::PreviewsStalePreviewTimestamp::kTimestampShown);
}

TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(PreviewInfobarTimestampFinchParamsUMA)) {
  std::map<std::string, std::string> variation_params;
  variation_params["min_staleness_in_minutes"] = "2";
  variation_params["max_staleness_in_minutes"] = "5";
  EnableStalePreviewsTimestamp(variation_params);

  TestStalePreviews(
      2, false /* is_reload */,
      l10n_util::GetStringFUTF16(IDS_PREVIEWS_INFOBAR_TIMESTAMP_MINUTES,
                                 base::NumberToString16(2)),
      PreviewsUITabHelper::PreviewsStalePreviewTimestamp::kTimestampShown);

  TestStalePreviews(6, false /* is_reload */, base::string16(),
                    PreviewsUITabHelper::PreviewsStalePreviewTimestamp::
                        kTimestampNotShownStalenessGreaterThanMax);
}

TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(PreviewInfobarTimestampUMA)) {
  // Use default params.
  std::map<std::string, std::string> variation_params;
  EnableStalePreviewsTimestamp(variation_params);

  TestStalePreviews(1, false /* is_reload */, base::string16(),
                    PreviewsUITabHelper::PreviewsStalePreviewTimestamp::
                        kTimestampNotShownPreviewNotStale);
  TestStalePreviews(-1, false /* is_reload */, base::string16(),
                    PreviewsUITabHelper::PreviewsStalePreviewTimestamp::
                        kTimestampNotShownStalenessNegative);
  TestStalePreviews(1441, false /* is_reload */, base::string16(),
                    PreviewsUITabHelper::PreviewsStalePreviewTimestamp::
                        kTimestampNotShownStalenessGreaterThanMax);
}

TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(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::NumberToString16(staleness_in_minutes)),
      PreviewsUITabHelper::PreviewsStalePreviewTimestamp::kTimestampShown);

  staleness_in_minutes = 1;
  TestStalePreviews(
      staleness_in_minutes, true /* is_reload */,
      l10n_util::GetStringUTF16(IDS_PREVIEWS_INFOBAR_TIMESTAMP_UPDATED_NOW),
      PreviewsUITabHelper::PreviewsStalePreviewTimestamp::
          kTimestampUpdatedNowShown);
}

TEST_F(PreviewsInfoBarDelegateUnitTest,
       DISABLE_ON_WINDOWS(CreateInfoBarLogPreviewsInfoBarType)) {
  const previews::PreviewsType expected_type = previews::PreviewsType::LOFI;
  const std::string expected_event = "InfoBar";
  const std::string expected_description =
      previews::GetStringNameForType(expected_type) + " InfoBar shown";

  CreateInfoBar(expected_type, false /* is_data_saver_user */
                );
  EXPECT_EQ(expected_event, previews_logger()->event_type());
  EXPECT_EQ(expected_description, previews_logger()->event_description());
}
