blob: 0b35f8b3b7c9186298cd016f3d992e94cb8cb682 [file] [log] [blame]
// Copyright 2023 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/supervised_user/supervised_user_navigation_throttle.h"
#include <memory>
#include "base/test/metrics/histogram_tester.h"
#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "components/safe_search_api/fake_url_checker_client.h"
#include "components/supervised_user/core/browser/supervised_user_service.h"
#include "components/supervised_user/core/browser/supervised_user_url_filter.h"
#include "components/supervised_user/core/browser/supervised_user_utils.h"
#include "components/supervised_user/core/common/supervised_user_constants.h"
#include "components/supervised_user/test_support/kids_management_api_server_mock.h"
#include "content/public/browser/navigation_throttle.h"
#include "content/public/test/mock_navigation_handle.h"
#include "content/public/test/navigation_simulator.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace supervised_user {
namespace {
static const char* kExampleURL = "https://example.com/";
class MockSupervisedUserURLFilter
: public supervised_user::SupervisedUserURLFilter {
public:
explicit MockSupervisedUserURLFilter(PrefService& prefs)
: supervised_user::SupervisedUserURLFilter(
prefs,
std::make_unique<safe_search_api::FakeURLCheckerClient>(),
base::BindRepeating([](const GURL& url) { return false; })) {}
MOCK_METHOD(FilteringBehavior,
GetFilteringBehaviorForURL,
(const GURL& url,
supervised_user::FilteringBehaviorReason* reason),
(override));
};
} // namespace
class SupervisedUserNavigationThrottleTest
: public ChromeRenderViewHostTestHarness {
public:
void SetUp() override {
ChromeRenderViewHostTestHarness::SetUp();
profile()->SetIsSupervisedProfile();
ASSERT_TRUE(profile()->IsChild());
}
std::unique_ptr<SupervisedUserNavigationThrottle> CreateNavigationThrottle(
const GURL& url) {
navigation_handle_ =
std::make_unique<::testing::NiceMock<content::MockNavigationHandle>>(
url, main_rfh());
return SupervisedUserNavigationThrottle::MaybeCreateThrottleFor(
navigation_handle_.get());
}
supervised_user::SupervisedUserURLFilter* GetSupervisedUserURLFilter() {
return SupervisedUserServiceFactory::GetForProfile(profile())
->GetURLFilter();
}
base::HistogramTester* histogram_tester() { return &histogram_tester_; }
private:
std::unique_ptr<content::MockNavigationHandle> navigation_handle_;
base::HistogramTester histogram_tester_;
};
TEST_F(SupervisedUserNavigationThrottleTest, AllowedUrlsRecordedInAllowBucket) {
GURL allowed_url(kExampleURL);
std::map<std::string, bool> hosts{{allowed_url.host(), true}};
GetSupervisedUserURLFilter()->SetManualHosts(std::move(hosts));
CreateNavigationThrottle(allowed_url)->WillStartRequest();
histogram_tester()->ExpectBucketCount(
supervised_user::kSupervisedUserTopLevelURLFilteringResultHistogramName,
supervised_user::SupervisedUserFilterTopLevelResult::kAllow, 1);
}
TEST_F(SupervisedUserNavigationThrottleTest,
BlocklistedUrlsRecordedInBlockManualBucket) {
GURL blocked_url(kExampleURL);
std::map<std::string, bool> hosts;
hosts[blocked_url.host()] = false;
GetSupervisedUserURLFilter()->SetManualHosts(std::move(hosts));
ASSERT_EQ(
supervised_user::FilteringBehavior::kBlock,
GetSupervisedUserURLFilter()->GetFilteringBehaviorForURL(blocked_url));
CreateNavigationThrottle(blocked_url)->WillStartRequest();
histogram_tester()->ExpectBucketCount(
supervised_user::kSupervisedUserTopLevelURLFilteringResultHistogramName,
supervised_user::SupervisedUserFilterTopLevelResult::kBlockManual, 1);
}
TEST_F(SupervisedUserNavigationThrottleTest,
AllSitesBlockedRecordedInBlockNotInAllowlistBucket) {
GetSupervisedUserURLFilter()->SetDefaultFilteringBehavior(
supervised_user::FilteringBehavior::kBlock);
CreateNavigationThrottle(GURL(kExampleURL))->WillStartRequest();
histogram_tester()->ExpectBucketCount(
supervised_user::kSupervisedUserTopLevelURLFilteringResultHistogramName,
supervised_user::SupervisedUserFilterTopLevelResult::kBlockNotInAllowlist,
1);
}
TEST_F(SupervisedUserNavigationThrottleTest,
BlockedMatureSitesRecordedInBlockSafeSitesBucket) {
std::unique_ptr<MockSupervisedUserURLFilter> mock_url_filter =
std::make_unique<MockSupervisedUserURLFilter>(*profile()->GetPrefs());
ON_CALL(*mock_url_filter, GetFilteringBehaviorForURL(testing::_, testing::_))
.WillByDefault([](const GURL& url,
supervised_user::FilteringBehaviorReason* reason) {
*reason = supervised_user::FilteringBehaviorReason::ASYNC_CHECKER;
return supervised_user::FilteringBehavior::kBlock;
});
SupervisedUserServiceFactory::GetForProfile(profile())
->SetURLFilterForTesting(std::move(mock_url_filter));
CreateNavigationThrottle(GURL(kExampleURL))->WillStartRequest();
histogram_tester()->ExpectBucketCount(
supervised_user::kSupervisedUserTopLevelURLFilteringResultHistogramName,
supervised_user::SupervisedUserFilterTopLevelResult::kBlockSafeSites, 1);
}
} // namespace supervised_user