172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/base_paths.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/rlz/rlz.h" 103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/search_engines/search_terms_data.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/search_engines/template_url.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Simple implementation of SearchTermsData. 153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass TestSearchTermsData : public SearchTermsData { 163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick explicit TestSearchTermsData(const char* google_base_url) 183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : google_base_url_(google_base_url) { 193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual std::string GoogleBaseURLValue() const { 223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return google_base_url_; 233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual std::string GetApplicationLocale() const { 263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return "yy"; 273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) 303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Returns the value for the Chrome Omnibox rlz. 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual string16 GetRlzParameterValue() const { 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return string16(); 333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string google_base_url_; 383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DISALLOW_COPY_AND_ASSIGN(TestSearchTermsData); 403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TemplateURLTest : public testing::Test { 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void TearDown() { 453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TemplateURLRef::SetGoogleBaseURL(NULL); 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void CheckSuggestBaseURL(const char* base_url, 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* base_suggest_url) const { 503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TestSearchTermsData search_terms_data(base_url); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_STREQ(base_suggest_url, 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick search_terms_data.GoogleBaseSuggestURLValue().c_str()); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, Defaults) { 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL url; 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(url.show_in_default_list()); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(url.safe_for_autoreplace()); 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(0, url.prepopulate_id()); 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, TestValidWithComplete) { 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef ref("{searchTerms}", 0, 0); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.IsValid()); 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, URLRefTestSearchTerms) { 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct SearchTermsCase { 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* url; 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const string16 terms; 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* output; 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } search_term_cases[] = { 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { "http://foo{searchTerms}", ASCIIToUTF16("sea rch/bar"), 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "http://foosea%20rch/bar" }, 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { "http://foo{searchTerms}?boo=abc", ASCIIToUTF16("sea rch/bar"), 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foosea%20rch/bar?boo=abc" }, 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { "http://foo/?boo={searchTerms}", ASCIIToUTF16("sea rch/bar"), 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo/?boo=sea+rch%2Fbar" }, 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { "http://en.wikipedia.org/{searchTerms}", ASCIIToUTF16("wiki/?"), 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://en.wikipedia.org/wiki/%3F" } 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(search_term_cases); ++i) { 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const SearchTermsCase& value = search_term_cases[i]; 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL t_url; 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef ref(value.url, 0, 0); 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.IsValid()); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.SupportsReplacement()); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL result = GURL(ref.ReplaceSearchTerms(t_url, value.terms, 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16())); 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(result.is_valid()); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(value.output, result.spec()); 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, URLRefTestCount) { 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL t_url; 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef ref("http://foo{searchTerms}{count?}", 0, 0); 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.IsValid()); 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.SupportsReplacement()); 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL result = GURL(ref.ReplaceSearchTerms(t_url, ASCIIToUTF16("X"), 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16())); 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(result.is_valid()); 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ("http://foox/", result.spec()); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, URLRefTestCount2) { 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL t_url; 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef ref("http://foo{searchTerms}{count}", 0, 0); 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.IsValid()); 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.SupportsReplacement()); 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL result = GURL(ref.ReplaceSearchTerms(t_url, ASCIIToUTF16("X"), 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16())); 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(result.is_valid()); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ("http://foox10/", result.spec()); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, URLRefTestIndices) { 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL t_url; 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef ref("http://foo{searchTerms}x{startIndex?}y{startPage?}", 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1, 2); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.IsValid()); 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.SupportsReplacement()); 12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL result = GURL(ref.ReplaceSearchTerms(t_url, ASCIIToUTF16("X"), 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16())); 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(result.is_valid()); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ("http://fooxxy/", result.spec()); 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, URLRefTestIndices2) { 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL t_url; 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef ref("http://foo{searchTerms}x{startIndex}y{startPage}", 1, 2); 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.IsValid()); 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.SupportsReplacement()); 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL result = GURL(ref.ReplaceSearchTerms(t_url, ASCIIToUTF16("X"), 13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16())); 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(result.is_valid()); 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ("http://fooxx1y2/", result.spec()); 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, URLRefTestEncoding) { 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL t_url; 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef ref( 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo{searchTerms}x{inputEncoding?}y{outputEncoding?}a", 1, 2); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.IsValid()); 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.SupportsReplacement()); 14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL result = GURL(ref.ReplaceSearchTerms(t_url, ASCIIToUTF16("X"), 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16())); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(result.is_valid()); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ("http://fooxxutf-8ya/", result.spec()); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, InputEncodingBeforeSearchTerm) { 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL t_url; 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef ref( 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foox{inputEncoding?}a{searchTerms}y{outputEncoding?}b", 1, 2); 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.IsValid()); 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.SupportsReplacement()); 16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL result = GURL(ref.ReplaceSearchTerms(t_url, ASCIIToUTF16("X"), 16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16())); 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(result.is_valid()); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ("http://fooxutf-8axyb/", result.spec()); 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, URLRefTestEncoding2) { 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL t_url; 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef ref( 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo{searchTerms}x{inputEncoding}y{outputEncoding}a", 1, 2); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.IsValid()); 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.SupportsReplacement()); 17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL result = GURL(ref.ReplaceSearchTerms(t_url, ASCIIToUTF16("X"), 17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16())); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(result.is_valid()); 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ("http://fooxxutf-8yutf-8a/", result.spec()); 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(TemplateURLTest, URLRefTestSearchTermsUsingTermsData) { 1793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick struct SearchTermsCase { 1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const char* url; 18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const string16 terms; 1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const char* output; 1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } search_term_cases[] = { 18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { "{google:baseURL}{language}{searchTerms}", string16(), 1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "http://example.com/e/yy" }, 18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { "{google:baseSuggestURL}{searchTerms}", string16(), 1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "http://clients1.example.com/complete/" } 1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TestSearchTermsData search_terms_data("http://example.com/e/"); 1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (size_t i = 0; i < ARRAYSIZE_UNSAFE(search_term_cases); ++i) { 1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const SearchTermsCase& value = search_term_cases[i]; 1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TemplateURL t_url; 1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TemplateURLRef ref(value.url, 0, 0); 1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ref.IsValid()); 1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ref.SupportsReplacement()); 1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL result = GURL(ref.ReplaceSearchTermsUsingTermsData( 1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick t_url, value.terms, 20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16(), 2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick search_terms_data)); 2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(result.is_valid()); 2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(value.output, result.spec()); 2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, URLRefTermToWide) { 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct ToWideCase { 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* encoded_search_term; 21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const string16 expected_decoded_term; 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } to_wide_cases[] = { 21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen {"hello+world", ASCIIToUTF16("hello world")}, 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Test some big-5 input. 21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen {"%a7A%A6%6e+to+you", WideToUTF16(L"\x4f60\x597d to you")}, 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Test some UTF-8 input. We should fall back to this when the encoding 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // doesn't look like big-5. We have a '5' in the middle, which is an invalid 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Big-5 trailing byte. 21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen {"%e4%bd%a05%e5%a5%bd+to+you", WideToUTF16(L"\x4f60\x35\x597d to you")}, 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Undecodable input should stay escaped. 22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen {"%91%01+abcd", WideToUTF16(L"%91%01 abcd")}, 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure we convert %2B to +. 22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen {"C%2B%2B", ASCIIToUTF16("C++")}, 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // C%2B is escaped as C%252B, make sure we unescape it properly. 22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen {"C%252B", ASCIIToUTF16("C%2B")}, 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL t_url; 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set one input encoding: big-5. This is so we can test fallback to UTF-8. 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<std::string> encodings; 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch encodings.push_back("big-5"); 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch t_url.set_input_encodings(encodings); 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef ref("http://foo?q={searchTerms}", 1, 2); 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.IsValid()); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.SupportsReplacement()); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(to_wide_cases); i++) { 23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen string16 result = ref.SearchTermToString16(t_url, 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch to_wide_cases[i].encoded_search_term); 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(to_wide_cases[i].expected_decoded_term, result); 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(TemplateURLTest, SetFavicon) { 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL url; 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL favicon_url("http://favicon.url"); 249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen url.SetFaviconURL(favicon_url); 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1U, url.image_refs().size()); 251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(favicon_url == url.GetFaviconURL()); 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL favicon_url2("http://favicon2.url"); 254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen url.SetFaviconURL(favicon_url2); 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1U, url.image_refs().size()); 256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(favicon_url2 == url.GetFaviconURL()); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, DisplayURLToURLRef) { 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct TestData { 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string url; 26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const string16 expected_result; 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } data[] = { 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://foo{searchTerms}x{inputEncoding}y{outputEncoding}a", 26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASCIIToUTF16("http://foo%sx{inputEncoding}y{outputEncoding}a") }, 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://X", 26772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASCIIToUTF16("http://X") }, 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://foo{searchTerms", 26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASCIIToUTF16("http://foo{searchTerms") }, 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://foo{searchTerms}{language}", 27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASCIIToUTF16("http://foo%s{language}") }, 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) { 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef ref(data[i].url, 1, 2); 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(data[i].expected_result, ref.DisplayURL()); 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(data[i].url, 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef::DisplayURLToURLRef(ref.DisplayURL())); 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, ReplaceSearchTerms) { 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct TestData { 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string url; 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string expected_result; 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } data[] = { 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://foo/{language}{searchTerms}{inputEncoding}", 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo/{language}XUTF-8" }, 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://foo/{language}{inputEncoding}{searchTerms}", 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo/{language}UTF-8X" }, 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://foo/{searchTerms}{language}{inputEncoding}", 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo/X{language}UTF-8" }, 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://foo/{searchTerms}{inputEncoding}{language}", 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo/XUTF-8{language}" }, 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://foo/{inputEncoding}{searchTerms}{language}", 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo/UTF-8X{language}" }, 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://foo/{inputEncoding}{language}{searchTerms}", 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo/UTF-8{language}X" }, 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://foo/{language}a{searchTerms}a{inputEncoding}a", 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo/{language}aXaUTF-8a" }, 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://foo/{language}a{inputEncoding}a{searchTerms}a", 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo/{language}aUTF-8aXa" }, 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://foo/{searchTerms}a{language}a{inputEncoding}a", 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo/Xa{language}aUTF-8a" }, 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://foo/{searchTerms}a{inputEncoding}a{language}a", 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo/XaUTF-8a{language}a" }, 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://foo/{inputEncoding}a{searchTerms}a{language}a", 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo/UTF-8aXa{language}a" }, 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://foo/{inputEncoding}a{language}a{searchTerms}a", 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo/UTF-8a{language}aXa" }, 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL turl; 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch turl.add_input_encoding("UTF-8"); 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) { 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef ref(data[i].url, 1, 2); 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(ref.IsValid()); 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(ref.SupportsReplacement()); 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string expected_result = data[i].expected_result; 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ReplaceSubstringsAfterOffset(&expected_result, 0, "{language}", 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_browser_process->GetApplicationLocale()); 32072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL result = GURL(ref.ReplaceSearchTerms(turl, ASCIIToUTF16("X"), 32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16())); 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(result.is_valid()); 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(expected_result, result.spec()); 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests replacing search terms in various encodings and making sure the 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// generated URL matches the expected value. 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, ReplaceArbitrarySearchTerms) { 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct TestData { 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string encoding; 33372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const string16 search_term; 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string url; 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string expected_result; 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } data[] = { 33772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { "BIG5", WideToUTF16(L"\x60BD"), 33872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "http://foo/?{searchTerms}{inputEncoding}", 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo/?%B1~BIG5" }, 34072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { "UTF-8", ASCIIToUTF16("blah"), 34172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "http://foo/?{searchTerms}{inputEncoding}", 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://foo/?blahUTF-8" }, 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) { 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL turl; 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch turl.add_input_encoding(data[i].encoding); 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef ref(data[i].url, 1, 2); 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL result = GURL(ref.ReplaceSearchTerms(turl, 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data[i].search_term, TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, 35072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen string16())); 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(result.is_valid()); 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(data[i].expected_result, result.spec()); 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, Suggestions) { 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct TestData { 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const int accepted_suggestion; 35972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const string16 original_query_for_suggestion; 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string expected_result; 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } data[] = { 36272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16(), 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://bar/foo?q=foobar" }, 36472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, ASCIIToUTF16("foo"), 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://bar/foo?q=foobar" }, 36672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { TemplateURLRef::NO_SUGGESTION_CHOSEN, string16(), 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://bar/foo?aq=f&q=foobar" }, 36872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { TemplateURLRef::NO_SUGGESTION_CHOSEN, ASCIIToUTF16("foo"), 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://bar/foo?aq=f&q=foobar" }, 37072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { 0, string16(), "http://bar/foo?aq=0&oq=&q=foobar" }, 37172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { 1, ASCIIToUTF16("foo"), "http://bar/foo?aq=1&oq=foo&q=foobar" }, 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL turl; 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch turl.add_input_encoding("UTF-8"); 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef ref("http://bar/foo?{google:acceptedSuggestion}" 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "{google:originalQueryForSuggestion}q={searchTerms}", 1, 2); 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.IsValid()); 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.SupportsReplacement()); 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) { 38072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GURL result = GURL(ref.ReplaceSearchTerms(turl, ASCIIToUTF16("foobar"), 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data[i].accepted_suggestion, data[i].original_query_for_suggestion)); 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(result.is_valid()); 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(data[i].expected_result, result.spec()); 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, RLZ) { 38972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen string16 rlz_string; 3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(GOOGLE_CHROME_BUILD) 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RLZTracker::GetAccessPointRlz(rlz_lib::CHROME_OMNIBOX, &rlz_string); 3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL t_url; 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef ref("http://bar/?{google:RLZ}{searchTerms}", 1, 2); 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.IsValid()); 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ref.SupportsReplacement()); 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL result(ref.ReplaceSearchTerms(t_url, L"x", 39972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16())); 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(result.is_valid()); 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string expected_url = "http://bar/?"; 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!rlz_string.empty()) { 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch expected_url += "rlz=" + WideToUTF8(rlz_string) + "&"; 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch expected_url += "x"; 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(expected_url, result.spec()); 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, HostAndSearchTermKey) { 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct TestData { 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string url; 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string host; 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string path; 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string search_term_key; 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } data[] = { 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://blah/?foo=bar&q={searchTerms}&b=x", "blah", "/", "q"}, 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // No query key should result in empty values. 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://blah/{searchTerms}", "", "", ""}, 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // No term should result in empty values. 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://blah/", "", "", ""}, 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Multiple terms should result in empty values. 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://blah/?q={searchTerms}&x={searchTerms}", "", "", ""}, 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Term in the host shouldn't match. 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://{searchTerms}", "", "", ""}, 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://blah/?q={searchTerms}", "blah", "/", "q"}, 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Single term with extra chars in value should match. 434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://blah/?q=stock:{searchTerms}", "blah", "/", "q"}, 435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL t_url; 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) { 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch t_url.SetURL(data[i].url, 0, 0); 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(data[i].host, t_url.url()->GetHost()); 441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(data[i].path, t_url.url()->GetPath()); 442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(data[i].search_term_key, t_url.url()->GetSearchTermKey()); 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, GoogleBaseSuggestURL) { 447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const struct { 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* const base_url; 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* const base_suggest_url; 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } data[] = { 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://google.com/", "http://clients1.google.com/complete/", }, 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://www.google.com/", "http://clients1.google.com/complete/", }, 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://www.google.co.uk/", "http://clients1.google.co.uk/complete/", }, 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://www.google.com.by/", 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "http://clients1.google.com.by/complete/", }, 456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "http://google.com/intl/xx/", "http://clients1.google.com/complete/", }, 457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) 460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckSuggestBaseURL(data[i].base_url, data[i].base_suggest_url); 461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 463c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, Keyword) { 464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURL t_url; 465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch t_url.SetURL("http://www.google.com/search", 0, 0); 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(t_url.autogenerate_keyword()); 46772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen t_url.set_keyword(ASCIIToUTF16("foo")); 46872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(ASCIIToUTF16("foo"), t_url.keyword()); 469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch t_url.set_autogenerate_keyword(true); 470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(t_url.autogenerate_keyword()); 47172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(ASCIIToUTF16("google.com"), t_url.keyword()); 47272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen t_url.set_keyword(ASCIIToUTF16("foo")); 473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(t_url.autogenerate_keyword()); 47472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(ASCIIToUTF16("foo"), t_url.keyword()); 475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 477c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, ParseParameterKnown) { 478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string parsed_url("{searchTerms}"); 479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef url_ref(parsed_url, 0, 0); 480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef::Replacements replacements; 481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(url_ref.ParseParameter(0, 12, &parsed_url, &replacements)); 482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(std::string(), parsed_url); 483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1U, replacements.size()); 484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(static_cast<size_t>(0), replacements[0].index); 485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(TemplateURLRef::SEARCH_TERMS, replacements[0].type); 486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 488c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, ParseParameterUnknown) { 489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string parsed_url("{}"); 490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef url_ref(parsed_url, 0, 0); 491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef::Replacements replacements; 492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(url_ref.ParseParameter(0, 1, &parsed_url, &replacements)); 493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ("{}", parsed_url); 494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(replacements.empty()); 495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 497c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, ParseURLEmpty) { 498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef url_ref("", 0, 0); 499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef::Replacements replacements; 500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool valid = false; 501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(std::string(), url_ref.ParseURL("", &replacements, &valid)); 502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(replacements.empty()); 503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(valid); 504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 506c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, ParseURLNoTemplateEnd) { 507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef url_ref("{", 0, 0); 508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef::Replacements replacements; 509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool valid = false; 510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(std::string(), url_ref.ParseURL("{", &replacements, &valid)); 511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(replacements.empty()); 512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(valid); 513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 515c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, ParseURLNoKnownParameters) { 516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef url_ref("{}", 0, 0); 517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef::Replacements replacements; 518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool valid = false; 519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ("{}", url_ref.ParseURL("{}", &replacements, &valid)); 520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(replacements.empty()); 521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(valid); 522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 524c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, ParseURLTwoParameters) { 525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef url_ref("{}{{%s}}", 0, 0); 526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef::Replacements replacements; 527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool valid = false; 528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ("{}{}", 529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url_ref.ParseURL("{}{{searchTerms}}", &replacements, &valid)); 530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1U, replacements.size()); 531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(static_cast<size_t>(3), replacements[0].index); 532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(TemplateURLRef::SEARCH_TERMS, replacements[0].type); 533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(valid); 534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 536c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TemplateURLTest, ParseURLNestedParameter) { 537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef url_ref("{%s", 0, 0); 538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TemplateURLRef::Replacements replacements; 539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool valid = false; 540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ("{", url_ref.ParseURL("{{searchTerms}", &replacements, &valid)); 541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1U, replacements.size()); 542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(static_cast<size_t>(1), replacements[0].index); 543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(TemplateURLRef::SEARCH_TERMS, replacements[0].type); 544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(valid); 545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 546