blob: 9a3da01f6ecb807b4dd6245c758d704b089f3223 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/omnibox/browser/unscoped_extension_provider.h"
#include <stddef.h>
#include <map>
#include <memory>
#include <utility>
#include "base/command_line.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/task_environment.h"
#include "components/omnibox/browser/autocomplete_scheme_classifier.h"
#include "components/omnibox/browser/mock_autocomplete_provider_client.h"
#include "components/omnibox/browser/test_scheme_classifier.h"
#include "components/search_engines/search_engines_switches.h"
#include "components/search_engines/search_engines_test_environment.h"
#include "components/search_engines/template_url.h"
#include "components/search_engines/template_url_service.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/metrics_proto/omnibox_event.pb.h"
#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
#include "url/gurl.h"
#include "url/url_constants.h"
using base::ASCIIToUTF16;
using ::testing::_;
class UnscopedExtensionProviderTest : public testing::Test {
public:
class MockUnscopedExtensionProviderDelegate
: public UnscopedExtensionProviderDelegate {
public:
MockUnscopedExtensionProviderDelegate() = default;
MockUnscopedExtensionProviderDelegate(
const MockUnscopedExtensionProviderDelegate&) = delete;
MockUnscopedExtensionProviderDelegate& operator=(
const MockUnscopedExtensionProviderDelegate&) = delete;
~MockUnscopedExtensionProviderDelegate() override = default;
MOCK_METHOD(bool,
Start,
(const AutocompleteInput&, bool, std::set<std::string>),
(override));
MOCK_METHOD(void, IncrementRequestId, (), (override));
};
protected:
UnscopedExtensionProviderTest() = default;
void SetUp() override;
void InitProvider(
std::unique_ptr<MockUnscopedExtensionProviderDelegate> mock_delegate);
base::test::TaskEnvironment task_environment_;
search_engines::SearchEnginesTestEnvironment search_engines_test_environment_;
std::unique_ptr<MockAutocompleteProviderClient> client_;
// The provider is initialized by calling `InitProvider()` in
// the tests after the expectations have been set on the delegate.
scoped_refptr<UnscopedExtensionProvider> extension_provider_;
};
void UnscopedExtensionProviderTest::SetUp() {
client_ = std::make_unique<MockAutocompleteProviderClient>();
client_->set_template_url_service(
search_engines_test_environment_.template_url_service());
}
void UnscopedExtensionProviderTest::InitProvider(
std::unique_ptr<MockUnscopedExtensionProviderDelegate> mock_delegate) {
client_->set_unscoped_extension_provider_delegate(std::move(mock_delegate));
extension_provider_ = new UnscopedExtensionProvider(client_.get(), nullptr);
}
TEST_F(UnscopedExtensionProviderTest, RunsAndIncrementsRequestIdWithChanges) {
std::unique_ptr<MockUnscopedExtensionProviderDelegate> mock_delegate =
std::make_unique<MockUnscopedExtensionProviderDelegate>();
client_->GetTemplateURLService()->AddToUnscopedModeExtensionIds("id");
AutocompleteInput input(u"input", metrics::OmniboxEventProto::OTHER,
TestSchemeClassifier());
input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_DEFAULT);
input.set_omit_asynchronous_matches(false);
EXPECT_CALL(*mock_delegate, IncrementRequestId);
EXPECT_CALL(*mock_delegate, Start);
InitProvider(std::move(mock_delegate));
extension_provider_->Start(input, /*minimal_changes=*/false);
}
TEST_F(UnscopedExtensionProviderTest,
RunsAndMaintainsRequestIdWithMinimalChanges) {
std::unique_ptr<MockUnscopedExtensionProviderDelegate> mock_delegate =
std::make_unique<MockUnscopedExtensionProviderDelegate>();
client_->GetTemplateURLService()->AddToUnscopedModeExtensionIds("id");
AutocompleteInput input(u"input", metrics::OmniboxEventProto::OTHER,
TestSchemeClassifier());
input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_DEFAULT);
EXPECT_CALL(*mock_delegate, IncrementRequestId).Times(0);
EXPECT_CALL(*mock_delegate, Start);
InitProvider(std::move(mock_delegate));
extension_provider_->Start(input, /*minimal_changes=*/true);
}
TEST_F(UnscopedExtensionProviderTest,
DoesNotRunWithChangesAndOmitAsyncMatches) {
std::unique_ptr<MockUnscopedExtensionProviderDelegate> mock_delegate =
std::make_unique<MockUnscopedExtensionProviderDelegate>();
client_->GetTemplateURLService()->AddToUnscopedModeExtensionIds("id");
AutocompleteInput input(u"input", metrics::OmniboxEventProto::OTHER,
TestSchemeClassifier());
input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_DEFAULT);
input.set_omit_asynchronous_matches(true);
EXPECT_CALL(*mock_delegate, IncrementRequestId).Times(0);
EXPECT_CALL(*mock_delegate, Start).Times(0);
InitProvider(std::move(mock_delegate));
extension_provider_->Start(input, /*minimal_changes=*/false);
}
TEST_F(UnscopedExtensionProviderTest, DoesNotRunOnFocus) {
std::unique_ptr<MockUnscopedExtensionProviderDelegate> mock_delegate =
std::make_unique<MockUnscopedExtensionProviderDelegate>();
client_->GetTemplateURLService()->AddToUnscopedModeExtensionIds("id");
AutocompleteInput input(u"input", metrics::OmniboxEventProto::OTHER,
TestSchemeClassifier());
input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_FOCUS);
EXPECT_CALL(*mock_delegate, IncrementRequestId).Times(0);
EXPECT_CALL(*mock_delegate, Start).Times(0);
InitProvider(std::move(mock_delegate));
extension_provider_->Start(input, /*minimal_changes=*/false);
}
TEST_F(UnscopedExtensionProviderTest, DoesNotRunWithNoUnscopedExtensions) {
std::unique_ptr<MockUnscopedExtensionProviderDelegate> mock_delegate =
std::make_unique<MockUnscopedExtensionProviderDelegate>();
AutocompleteInput input(u"input", metrics::OmniboxEventProto::OTHER,
TestSchemeClassifier());
input.set_focus_type(metrics::OmniboxFocusType::INTERACTION_DEFAULT);
EXPECT_CALL(*mock_delegate, IncrementRequestId).Times(0);
EXPECT_CALL(*mock_delegate, Start).Times(0);
InitProvider(std::move(mock_delegate));
extension_provider_->Start(input, /*minimal_changes=*/true);
}