// Copyright 2014 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 "components/search/search.h" #include "base/metrics/field_trial.h" #include "base/metrics/statistics_recorder.h" #include "components/variations/entropy_provider.h" #include "testing/gtest/include/gtest/gtest.h" namespace search { class EmbeddedSearchFieldTrialTest : public testing::Test { protected: void SetUp() override { field_trial_list_.reset(new base::FieldTrialList( new metrics::SHA1EntropyProvider("42"))); base::StatisticsRecorder::Initialize(); } private: scoped_ptr field_trial_list_; }; TEST_F(EmbeddedSearchFieldTrialTest, GetFieldTrialInfoEmptyAndValid) { FieldTrialFlags flags; EXPECT_TRUE(GetFieldTrialInfo(&flags)); EXPECT_EQ(0ul, flags.size()); ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("EmbeddedSearch", "Group77")); EXPECT_TRUE(GetFieldTrialInfo(&flags)); EXPECT_EQ(0ul, flags.size()); } TEST_F(EmbeddedSearchFieldTrialTest, GetFieldTrialInfoInvalidNumber) { FieldTrialFlags flags; ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("EmbeddedSearch", "Group77.2")); EXPECT_TRUE(GetFieldTrialInfo(&flags)); EXPECT_EQ(0ul, flags.size()); } TEST_F(EmbeddedSearchFieldTrialTest, GetFieldTrialInfoInvalidName) { FieldTrialFlags flags; ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("EmbeddedSearch", "Invalid77")); EXPECT_TRUE(GetFieldTrialInfo(&flags)); EXPECT_EQ(0ul, flags.size()); } TEST_F(EmbeddedSearchFieldTrialTest, GetFieldTrialInfoValidGroup) { FieldTrialFlags flags; ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("EmbeddedSearch", "Group77")); EXPECT_TRUE(GetFieldTrialInfo(&flags)); EXPECT_EQ(0ul, flags.size()); } TEST_F(EmbeddedSearchFieldTrialTest, GetFieldTrialInfoValidFlag) { FieldTrialFlags flags; EXPECT_EQ(9999ul, GetUInt64ValueForFlagWithDefault("foo", 9999, flags)); ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("EmbeddedSearch", "Group77 foo:6")); EXPECT_TRUE(GetFieldTrialInfo(&flags)); EXPECT_EQ(1ul, flags.size()); EXPECT_EQ(6ul, GetUInt64ValueForFlagWithDefault("foo", 9999, flags)); } TEST_F(EmbeddedSearchFieldTrialTest, GetFieldTrialInfoNewName) { FieldTrialFlags flags; EXPECT_EQ(9999ul, GetUInt64ValueForFlagWithDefault("foo", 9999, flags)); ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("EmbeddedSearch", "Group77 foo:6")); EXPECT_TRUE(GetFieldTrialInfo(&flags)); EXPECT_EQ(1ul, flags.size()); EXPECT_EQ(6ul, GetUInt64ValueForFlagWithDefault("foo", 9999, flags)); } TEST_F(EmbeddedSearchFieldTrialTest, GetFieldTrialInfoNewNameOverridesOld) { FieldTrialFlags flags; EXPECT_EQ(9999ul, GetUInt64ValueForFlagWithDefault("foo", 9999, flags)); ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("EmbeddedSearch", "Group77 foo:6")); ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("InstantExtended", "Group78 foo:5")); EXPECT_TRUE(GetFieldTrialInfo(&flags)); EXPECT_EQ(1ul, flags.size()); EXPECT_EQ(6ul, GetUInt64ValueForFlagWithDefault("foo", 9999, flags)); } TEST_F(EmbeddedSearchFieldTrialTest, GetFieldTrialInfoLotsOfFlags) { FieldTrialFlags flags; ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( "EmbeddedSearch", "Group77 bar:1 baz:7 cat:dogs")); EXPECT_TRUE(GetFieldTrialInfo(&flags)); EXPECT_EQ(3ul, flags.size()); EXPECT_EQ(true, GetBoolValueForFlagWithDefault("bar", false, flags)); EXPECT_EQ(7ul, GetUInt64ValueForFlagWithDefault("baz", 0, flags)); EXPECT_EQ("dogs", GetStringValueForFlagWithDefault("cat", std::string(), flags)); EXPECT_EQ("default", GetStringValueForFlagWithDefault("moose", "default", flags)); } TEST_F(EmbeddedSearchFieldTrialTest, GetFieldTrialInfoDisabled) { FieldTrialFlags flags; ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( "EmbeddedSearch", "Group77 bar:1 baz:7 cat:dogs DISABLED")); EXPECT_FALSE(GetFieldTrialInfo(&flags)); EXPECT_EQ(0ul, flags.size()); } TEST_F(EmbeddedSearchFieldTrialTest, GetFieldTrialInfoControlFlags) { FieldTrialFlags flags; ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( "EmbeddedSearch", "Control77 bar:1 baz:7 cat:dogs")); EXPECT_TRUE(GetFieldTrialInfo(&flags)); EXPECT_EQ(3ul, flags.size()); } #if !defined(OS_IOS) && !defined(OS_ANDROID) typedef EmbeddedSearchFieldTrialTest SearchTest; TEST_F(SearchTest, ShouldPrefetchSearchResults_InstantExtendedAPIEnabled) { ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("EmbeddedSearch", "Group1 espv:2")); EXPECT_EQ(2ul, EmbeddedSearchPageVersion()); EXPECT_TRUE(ShouldPrefetchSearchResults()); } TEST_F(SearchTest, ShouldPrefetchSearchResults_Default) { EXPECT_TRUE(ShouldPrefetchSearchResults()); } TEST_F(SearchTest, ShouldReuseInstantSearchBasePage_Default) { EXPECT_TRUE(ShouldReuseInstantSearchBasePage()); } TEST_F(SearchTest, ShouldAllowPrefetchNonDefaultMatch_DisabledViaFieldTrial) { ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( "EmbeddedSearch", "Group1 espv:89 allow_prefetch_non_default_match:0")); EXPECT_FALSE(ShouldAllowPrefetchNonDefaultMatch()); EXPECT_EQ(89ul, EmbeddedSearchPageVersion()); } TEST_F(SearchTest, ShouldAllowPrefetchNonDefaultMatch_EnabledViaFieldTrial) { ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( "EmbeddedSearch", "Group1 espv:80 allow_prefetch_non_default_match:1")); EXPECT_TRUE(ShouldAllowPrefetchNonDefaultMatch()); EXPECT_EQ(80ul, EmbeddedSearchPageVersion()); } TEST_F(SearchTest, ForceInstantResultsParam) { ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("EmbeddedSearch", "Group1 espv:2")); EXPECT_TRUE(IsInstantExtendedAPIEnabled()); EXPECT_EQ("ion=1&", ForceInstantResultsParam(true)); EXPECT_EQ(std::string(), ForceInstantResultsParam(false)); } typedef EmbeddedSearchFieldTrialTest InstantExtendedEnabledParamTest; TEST_F(InstantExtendedEnabledParamTest, QueryExtractionDisabled) { ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("EmbeddedSearch", "Group1 espv:12")); // Make sure InstantExtendedEnabledParam() returns an empty string for search // requests. EXPECT_FALSE(IsQueryExtractionEnabled()); EXPECT_EQ("", InstantExtendedEnabledParam(true)); EXPECT_EQ("espv=12&", InstantExtendedEnabledParam(false)); } TEST_F(InstantExtendedEnabledParamTest, QueryExtractionEnabled) { ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( "EmbeddedSearch", "Group1 espv:10 query_extraction:1")); EXPECT_TRUE(IsQueryExtractionEnabled()); // Make sure InstantExtendedEnabledParam() returns a non-empty param string // for search requests. EXPECT_EQ("espv=10&", InstantExtendedEnabledParam(true)); EXPECT_EQ("espv=10&", InstantExtendedEnabledParam(false)); } TEST_F(InstantExtendedEnabledParamTest, UseDefaultEmbeddedSearchPageVersion) { ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( "EmbeddedSearch", "Group1 espv:-1 query_extraction:1")); EXPECT_TRUE(IsQueryExtractionEnabled()); EXPECT_EQ("espv=2&", InstantExtendedEnabledParam(true)); EXPECT_EQ("espv=2&", InstantExtendedEnabledParam(false)); } typedef EmbeddedSearchFieldTrialTest IsQueryExtractionEnabledTest; TEST_F(IsQueryExtractionEnabledTest, NotSet) { ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("EmbeddedSearch", "Group1 espv:2")); EXPECT_TRUE(IsInstantExtendedAPIEnabled()); EXPECT_FALSE(IsQueryExtractionEnabled()); EXPECT_EQ(2ul, EmbeddedSearchPageVersion()); } TEST_F(IsQueryExtractionEnabledTest, EnabledViaFieldTrial) { ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( "EmbeddedSearch", "Group1 espv:2 query_extraction:1")); EXPECT_TRUE(IsInstantExtendedAPIEnabled()); EXPECT_TRUE(IsQueryExtractionEnabled()); EXPECT_EQ(2ul, EmbeddedSearchPageVersion()); } TEST_F(IsQueryExtractionEnabledTest, DisabledViaFieldTrial) { ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( "EmbeddedSearch", "Group1 espv:2 query_extraction:0")); EXPECT_TRUE(IsInstantExtendedAPIEnabled()); EXPECT_FALSE(IsQueryExtractionEnabled()); EXPECT_EQ(2ul, EmbeddedSearchPageVersion()); } TEST_F(IsQueryExtractionEnabledTest, EnabledViaCommandLine) { EnableQueryExtractionForTesting(); ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( "EmbeddedSearch", "Group1 espv:2 query_extraction:0")); EXPECT_TRUE(IsInstantExtendedAPIEnabled()); EXPECT_TRUE(IsQueryExtractionEnabled()); EXPECT_EQ(2ul, EmbeddedSearchPageVersion()); } #endif // !defined(OS_IOS) && !defined(OS_ANDROID) } // namespace search