chromium/chrome/browser/offline_pages/offline_page_navigation_throttle_unittest.cc

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/offline_pages/offline_page_navigation_throttle.h"

#include <memory>

#include "base/test/metrics/histogram_tester.h"
#include "content/public/test/mock_navigation_handle.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace offline_pages {
namespace {

class OfflinePageNavigationThrottleTest : public testing::Test {
 public:
  void SetUp() override {
    histogram_tester_ = std::make_unique<base::HistogramTester>();
  }

  base::HistogramTester* histogram_tester() { return histogram_tester_.get(); }

  // Creates a MockNavigationHandle and configures it based on the input param
  std::unique_ptr<content::MockNavigationHandle> MakeMockNavigationHandle(
      bool is_renderer_initiated,
      bool has_offline_headers) {
    std::unique_ptr<content::MockNavigationHandle> navigation_handle =
        std::make_unique<content::MockNavigationHandle>();
    navigation_handle->set_is_renderer_initiated(is_renderer_initiated);

    net::HttpRequestHeaders request_headers;
    if (has_offline_headers)
      request_headers.SetHeader(
          "X-Chrome-offline",
          "persist=1 reason=file_url_intent intent_url=not_a_real_file");
    navigation_handle->set_request_headers(request_headers);

    return navigation_handle;
  }

 private:
  std::unique_ptr<base::HistogramTester> histogram_tester_;
};

TEST_F(OfflinePageNavigationThrottleTest, CancelOfflineRequestFromRenderer) {
  std::unique_ptr<content::MockNavigationHandle> navigation_handle =
      MakeMockNavigationHandle(/*is_renderer_initiated=*/true,
                               /*has_offline_headers=*/true);

  std::unique_ptr<content::NavigationThrottle> navigation_throttle =
      OfflinePageNavigationThrottle::MaybeCreateThrottleFor(
          navigation_handle.get());

  // Checks that a non-null OfflinePageNavigationThrottle was created, and a
  // value of true was logged to UMA.
  ASSERT_NE(navigation_throttle, nullptr);
  histogram_tester()->ExpectUniqueSample(
      kOfflinePagesDidNavigationThrottleCancelNavigation, true, 1);

  // Ensure that the created throttle specifies to cancel and ignore the
  // navigation request.
  content::NavigationThrottle::ThrottleCheckResult throttle_check_result =
      navigation_throttle->WillStartRequest();
  EXPECT_EQ(throttle_check_result.action(),
            content::NavigationThrottle::CANCEL_AND_IGNORE);
}

TEST_F(OfflinePageNavigationThrottleTest, AllowOfflineRequestFromBrowser) {
  std::unique_ptr<content::MockNavigationHandle> navigation_handle =
      MakeMockNavigationHandle(/*is_renderer_initiated=*/false,
                               /*has_offline_headers=*/true);

  std::unique_ptr<content::NavigationThrottle> navigation_throttle =
      OfflinePageNavigationThrottle::MaybeCreateThrottleFor(
          navigation_handle.get());

  // Checks that a OfflinePageNavigationThrottle wasn't created and instead a
  // nullptr was returned. Additionally checks that a value of false was logged
  // to UMA.
  EXPECT_EQ(navigation_throttle, nullptr);
  histogram_tester()->ExpectUniqueSample(
      kOfflinePagesDidNavigationThrottleCancelNavigation, false, 1);
}

TEST_F(OfflinePageNavigationThrottleTest, AllowRegularRequestFromRenderer) {
  std::unique_ptr<content::MockNavigationHandle> navigation_handle =
      MakeMockNavigationHandle(/*is_renderer_initiated=*/true,
                               /*has_offline_headers=*/false);

  std::unique_ptr<content::NavigationThrottle> navigation_throttle =
      OfflinePageNavigationThrottle::MaybeCreateThrottleFor(
          navigation_handle.get());

  // Checks that a OfflinePageNavigationThrottle wasn't created and instead a
  // nullptr was returned. Additionally checks that a value of false was logged
  // to UMA.
  EXPECT_EQ(navigation_throttle, nullptr);
  histogram_tester()->ExpectUniqueSample(
      kOfflinePagesDidNavigationThrottleCancelNavigation, false, 1);
}

TEST_F(OfflinePageNavigationThrottleTest, AllowRegularRequestFromBrowser) {
  std::unique_ptr<content::MockNavigationHandle> navigation_handle =
      MakeMockNavigationHandle(/*is_renderer_initiated=*/false,
                               /*has_offline_headers=*/false);

  std::unique_ptr<content::NavigationThrottle> navigation_throttle =
      OfflinePageNavigationThrottle::MaybeCreateThrottleFor(
          navigation_handle.get());

  // Checks that a OfflinePageNavigationThrottle wasn't created and instead a
  // nullptr was returned. Additionally checks that a value of false was logged
  // to UMA.
  EXPECT_EQ(navigation_throttle, nullptr);
  histogram_tester()->ExpectUniqueSample(
      kOfflinePagesDidNavigationThrottleCancelNavigation, false, 1);
}

}  // namespace
}  // namespace offline_pages