blob: b8ae257988a03498ac231c454df2352f5942e2be [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/mock_unscoped_extension_provider_delegate.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 {
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, Stop);
EXPECT_CALL(*mock_delegate, Start);
InitProvider(std::move(mock_delegate));
extension_provider_->Start(input, /*minimal_changes=*/false);
}
TEST_F(UnscopedExtensionProviderTest,
DoesNotRunAndMaintainsRequestIdWithMinimalChanges) {
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, Stop);
EXPECT_CALL(*mock_delegate, Start).Times(0);
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, Stop);
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, Stop);
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, Stop);
EXPECT_CALL(*mock_delegate, Start).Times(0);
InitProvider(std::move(mock_delegate));
extension_provider_->Start(input, /*minimal_changes=*/true);
}