1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/search/search.h"
6
7#include "base/command_line.h"
8#include "base/memory/scoped_ptr.h"
9#include "base/metrics/field_trial.h"
10#include "base/metrics/statistics_recorder.h"
11#include "chrome/common/chrome_switches.h"
12#include "components/search/search.h"
13#include "components/search/search_switches.h"
14#include "components/variations/entropy_provider.h"
15#include "testing/gtest/include/gtest/gtest.h"
16
17namespace chrome {
18
19namespace {
20
21TEST(SearchTest, QueryExtractionEnabled) {
22  // Query extraction is always enabled on mobile.
23  EXPECT_TRUE(IsQueryExtractionEnabled());
24}
25
26class SearchUtilTest : public testing::Test {
27 protected:
28  virtual void SetUp() {
29    field_trial_list_.reset(new base::FieldTrialList(
30        new metrics::SHA1EntropyProvider("42")));
31    base::StatisticsRecorder::Initialize();
32  }
33
34 private:
35  scoped_ptr<base::FieldTrialList> field_trial_list_;
36};
37
38TEST_F(SearchUtilTest, UseDefaultEmbeddedSearchPageVersion) {
39  ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
40      "EmbeddedSearch", "Group1 espv:-1 query_extraction:1"));
41  EXPECT_TRUE(IsQueryExtractionEnabled());
42  EXPECT_EQ("espv=1&", InstantExtendedEnabledParam(true));
43  EXPECT_EQ("espv=1&", InstantExtendedEnabledParam(false));
44}
45
46TEST_F(SearchUtilTest, ShouldPrefetchSearchResults_InstantExtendedAPIEnabled) {
47  ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
48      "EmbeddedSearch",
49      "Group1 espv:2 prefetch_results:1"));
50  EXPECT_TRUE(ShouldPrefetchSearchResults());
51  EXPECT_TRUE(IsInstantExtendedAPIEnabled());
52  EXPECT_EQ(2ul, EmbeddedSearchPageVersion());
53}
54
55TEST_F(SearchUtilTest, ShouldPrefetchSearchResults_InstantExtendedAPIDisabled) {
56  ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
57      "EmbeddedSearch",
58      "Group1 espv:1 prefetch_results:1"));
59  EXPECT_FALSE(ShouldPrefetchSearchResults());
60  EXPECT_FALSE(IsInstantExtendedAPIEnabled());
61  EXPECT_EQ(1ul, EmbeddedSearchPageVersion());
62}
63
64TEST_F(SearchUtilTest, ShouldPrefetchSearchResults_DisabledViaFieldTrials) {
65  ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
66      "EmbeddedSearch",
67      "Group1 espv:2 prefetch_results:0"));
68  EXPECT_FALSE(ShouldPrefetchSearchResults());
69  EXPECT_EQ(2ul, EmbeddedSearchPageVersion());
70}
71
72TEST_F(SearchUtilTest, ShouldPrefetchSearchResults_EnabledViaCommandLine) {
73  CommandLine::ForCurrentProcess()->AppendSwitch(
74      switches::kPrefetchSearchResults);
75  // Command-line enable should override Finch.
76  ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
77      "EmbeddedSearch", "Group1 espv:2 prefetch_results:0"));
78  EXPECT_TRUE(ShouldPrefetchSearchResults());
79  EXPECT_EQ(2ul, EmbeddedSearchPageVersion());
80}
81
82TEST_F(SearchUtilTest,
83       ShouldReuseInstantSearchBasePage_PrefetchResultsFlagDisabled) {
84  ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
85      "EmbeddedSearch",
86      "Group1 espv:2 prefetch_results:0 reuse_instant_search_base_page:1"));
87  EXPECT_FALSE(ShouldPrefetchSearchResults());
88  EXPECT_FALSE(ShouldReuseInstantSearchBasePage());
89  EXPECT_EQ(2ul, EmbeddedSearchPageVersion());
90}
91
92TEST_F(SearchUtilTest, ShouldReuseInstantSearchBasePage_EnabledViaFieldTrial) {
93  ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
94      "EmbeddedSearch",
95      "Group1 espv:2 prefetch_results:1 reuse_instant_search_base_page:1"));
96  EXPECT_TRUE(ShouldReuseInstantSearchBasePage());
97  EXPECT_EQ(2ul, EmbeddedSearchPageVersion());
98}
99
100TEST_F(SearchUtilTest, ShouldReuseInstantSearchBasePage_DisabledViaFieldTrial) {
101  ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
102      "EmbeddedSearch",
103      "Group1 espv:2 prefetch_results:1 reuse_instant_search_base_page:0"));
104  EXPECT_FALSE(ShouldReuseInstantSearchBasePage());
105  EXPECT_EQ(2ul, EmbeddedSearchPageVersion());
106}
107
108}  // namespace
109
110}  // namespace chrome
111