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 "components/omnibox/answers_cache.h"
6
7#include "base/strings/utf_string_conversions.h"
8#include "testing/gtest/include/gtest/gtest.h"
9
10TEST(AnswersCacheTest, CacheStartsEmpty) {
11  AnswersCache cache(1);
12  EXPECT_TRUE(cache.empty());
13}
14
15TEST(AnswersCacheTest, UpdatePopulatesCache) {
16  AnswersCache cache(1);
17  cache.UpdateRecentAnswers(base::ASCIIToUTF16("weather los angeles"),
18                            base::ASCIIToUTF16("2334"));
19  EXPECT_FALSE(cache.empty());
20}
21
22TEST(AnswersCacheTest, GetWillRetrieveMatchingInfo) {
23  AnswersCache cache(1);
24
25  base::string16 full_query_text = base::ASCIIToUTF16("weather los angeles");
26  base::string16 query_type = base::ASCIIToUTF16("2334");
27  cache.UpdateRecentAnswers(full_query_text, query_type);
28
29  // Partial prefixes retrieve info.
30  AnswersQueryData data = cache.GetTopAnswerEntry(full_query_text.substr(0, 8));
31  EXPECT_EQ(full_query_text, data.full_query_text);
32  EXPECT_EQ(query_type, data.query_type);
33
34  // Mismatched prefix retrieves empty data.
35  data = cache.GetTopAnswerEntry(full_query_text.substr(1, 8));
36  EXPECT_TRUE(data.full_query_text.empty() && data.query_type.empty());
37
38  // Full match retrieves info.
39  data = cache.GetTopAnswerEntry(full_query_text);
40  EXPECT_EQ(full_query_text, data.full_query_text);
41  EXPECT_EQ(query_type, data.query_type);
42}
43
44TEST(AnswersCacheTest, MatchMostRecent) {
45  AnswersCache cache(2);
46
47  base::string16 query_weather_la = base::ASCIIToUTF16("weather los angeles");
48  base::string16 query_weather_lv = base::ASCIIToUTF16("weather las vegas");
49  base::string16 query_type = base::ASCIIToUTF16("2334");
50
51  cache.UpdateRecentAnswers(query_weather_lv, query_type);
52  cache.UpdateRecentAnswers(query_weather_la, query_type);
53
54  // "weather los angeles" is most recent match to "weather l".
55  AnswersQueryData data =
56      cache.GetTopAnswerEntry(base::ASCIIToUTF16("weather l"));
57  EXPECT_EQ(query_weather_la, data.full_query_text);
58
59  // Update recency for "weather las vegas".
60  cache.GetTopAnswerEntry(query_weather_lv);
61
62  // "weather las vegas" should now be the most recent match to "weather l".
63  data = cache.GetTopAnswerEntry(base::ASCIIToUTF16("weather l"));
64  EXPECT_EQ(query_weather_lv, data.full_query_text);
65}
66
67TEST(AnswersCacheTest, LeastRecentItemIsEvicted) {
68  AnswersCache cache(2);
69
70  base::string16 query_weather_la = base::ASCIIToUTF16("weather los angeles");
71  base::string16 query_weather_lv = base::ASCIIToUTF16("weather las vegas");
72  base::string16 query_weather_lb = base::ASCIIToUTF16("weather long beach");
73  base::string16 query_type = base::ASCIIToUTF16("2334");
74
75  cache.UpdateRecentAnswers(query_weather_lb, query_type);
76  cache.UpdateRecentAnswers(query_weather_lv, query_type);
77  EXPECT_FALSE(
78      cache.GetTopAnswerEntry(query_weather_lb).full_query_text.empty());
79  EXPECT_FALSE(
80      cache.GetTopAnswerEntry(query_weather_lv).full_query_text.empty());
81  EXPECT_TRUE(
82      cache.GetTopAnswerEntry(query_weather_la).full_query_text.empty());
83
84  cache.UpdateRecentAnswers(query_weather_la, query_type);
85  EXPECT_TRUE(
86      cache.GetTopAnswerEntry(query_weather_lb).full_query_text.empty());
87  EXPECT_FALSE(
88      cache.GetTopAnswerEntry(query_weather_lv).full_query_text.empty());
89  EXPECT_FALSE(
90      cache.GetTopAnswerEntry(query_weather_la).full_query_text.empty());
91}
92
93TEST(AnswersCacheTest, DuplicateEntries) {
94  AnswersCache cache(2);
95
96  base::string16 query_weather_lv = base::ASCIIToUTF16("weather las vegas");
97  base::string16 query_weather_lb = base::ASCIIToUTF16("weather long beach");
98  base::string16 query_weather_l = base::ASCIIToUTF16("weather l");
99  base::string16 query_type = base::ASCIIToUTF16("2334");
100
101  cache.UpdateRecentAnswers(query_weather_lb, query_type);
102  cache.UpdateRecentAnswers(query_weather_lv, query_type);
103
104  // Test that duplicate entries update recency.
105  cache.UpdateRecentAnswers(query_weather_lb, query_type);
106  EXPECT_EQ(query_weather_lb,
107            cache.GetTopAnswerEntry(query_weather_l).full_query_text);
108
109  // Test duplicate do not evict other entries. LV should still be in cache.
110  cache.UpdateRecentAnswers(query_weather_lb, query_type);
111  EXPECT_FALSE(
112      cache.GetTopAnswerEntry(query_weather_lv).full_query_text.empty());
113}
114