Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Side by Side Diff: components/translate/core/browser/translate_ranker_impl_unittest.cc

Issue 2890843003: Simplify TranslateRanker API. (Closed)
Patch Set: Rebase Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/translate/core/browser/translate_ranker_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/translate/core/browser/translate_ranker_impl.h" 5 #include "components/translate/core/browser/translate_ranker_impl.h"
6 6
7 #include <initializer_list> 7 #include <initializer_list>
8 #include <memory> 8 #include <memory>
9 9
10 #include "base/feature_list.h" 10 #include "base/feature_list.h"
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/run_loop.h" 12 #include "base/run_loop.h"
13 #include "base/strings/stringprintf.h" 13 #include "base/strings/stringprintf.h"
14 #include "base/task_scheduler/post_task.h" 14 #include "base/task_scheduler/post_task.h"
15 #include "base/test/scoped_feature_list.h" 15 #include "base/test/scoped_feature_list.h"
16 #include "base/test/scoped_task_environment.h" 16 #include "base/test/scoped_task_environment.h"
17 #include "components/metrics/proto/translate_event.pb.h" 17 #include "components/metrics/proto/translate_event.pb.h"
18 #include "components/metrics/proto/ukm/source.pb.h" 18 #include "components/metrics/proto/ukm/source.pb.h"
19 #include "components/prefs/scoped_user_pref_update.h"
20 #include "components/sync_preferences/testing_pref_service_syncable.h"
21 #include "components/translate/core/browser/proto/ranker_model.pb.h" 19 #include "components/translate/core/browser/proto/ranker_model.pb.h"
22 #include "components/translate/core/browser/proto/translate_ranker_model.pb.h" 20 #include "components/translate/core/browser/proto/translate_ranker_model.pb.h"
23 #include "components/translate/core/browser/ranker_model.h" 21 #include "components/translate/core/browser/ranker_model.h"
24 #include "components/translate/core/browser/translate_download_manager.h"
25 #include "components/translate/core/browser/translate_prefs.h"
26 #include "components/ukm/test_ukm_recorder.h" 22 #include "components/ukm/test_ukm_recorder.h"
27 #include "components/ukm/ukm_source.h" 23 #include "components/ukm/ukm_source.h"
28 #include "net/url_request/test_url_fetcher_factory.h" 24 #include "net/url_request/test_url_fetcher_factory.h"
29 #include "net/url_request/url_request_test_util.h" 25 #include "net/url_request/url_request_test_util.h"
30 #include "testing/gtest/include/gtest/gtest.h" 26 #include "testing/gtest/include/gtest/gtest.h"
31 #include "url/gurl.h" 27 #include "url/gurl.h"
32 28
33 namespace { 29 namespace {
34 30
35 using translate::kTranslateRankerEnforcement; 31 using translate::kTranslateRankerEnforcement;
36 using translate::kTranslateRankerQuery; 32 using translate::kTranslateRankerQuery;
37 using translate::kTranslateRankerDecisionOverride; 33 using translate::kTranslateRankerDecisionOverride;
38 using translate::TranslateDownloadManager;
39 using translate::TranslateRankerFeatures; 34 using translate::TranslateRankerFeatures;
40 using translate::TranslatePrefs;
41 using translate::TranslateRankerImpl; 35 using translate::TranslateRankerImpl;
42 36
43 constexpr uint32_t kModelVersion = 1234; 37 constexpr uint32_t kModelVersion = 1234;
44 38
45 class TranslateRankerImplTest : public ::testing::Test { 39 class TranslateRankerImplTest : public ::testing::Test {
46 protected: 40 protected:
47 TranslateRankerImplTest(); 41 TranslateRankerImplTest();
48 42
49 void SetUp() override;
50
51 void TearDown() override;
52
53 // Initializes the explicitly |enabled| and |disabled| features for this test. 43 // Initializes the explicitly |enabled| and |disabled| features for this test.
54 void InitFeatures(const std::initializer_list<base::Feature>& enabled, 44 void InitFeatures(const std::initializer_list<base::Feature>& enabled,
55 const std::initializer_list<base::Feature>& disabled); 45 const std::initializer_list<base::Feature>& disabled);
56 46
57 // Returns a TranslateRankerImpl object with |threshold| for testing. 47 // Returns a TranslateRankerImpl object with |threshold| for testing. The
48 // returned ranker is configured with an empty cache path and URL and will not
49 // invoke the model loader.
58 std::unique_ptr<TranslateRankerImpl> GetRankerForTest(float threshold); 50 std::unique_ptr<TranslateRankerImpl> GetRankerForTest(float threshold);
59 51
60 // Implements the same sigmoid function used by TranslateRankerImpl. 52 // Implements the same sigmoid function used by TranslateRankerImpl.
61 static double Sigmoid(double x); 53 static double Sigmoid(double x);
62 54
63 // Returns a translate event initialized with the given parameters. 55 // Returns a translate event initialized with the given parameters.
64 static metrics::TranslateEventProto CreateTranslateEvent( 56 static metrics::TranslateEventProto CreateTranslateEvent(
65 const std::string& src_lang, 57 const std::string& src_lang,
66 const std::string& dst_lang, 58 const std::string& dst_lang,
59 const std::string& country,
67 int accept_count, 60 int accept_count,
68 int decline_count, 61 int decline_count,
69 int ignore_count); 62 int ignore_count);
70 63
71 // The platform-specific name of the preferred language pref. 64 // Returns a translate event initialized with the given parameters.
72 static const char* const kPreferredLanguagePref; 65 static metrics::TranslateEventProto CreateDefaultTranslateEvent();
73
74 // Prefs.
75 std::unique_ptr<sync_preferences::TestingPrefServiceSyncable> prefs_;
76 std::unique_ptr<translate::TranslatePrefs> translate_prefs_;
77 66
78 ukm::TestUkmRecorder* GetTestUkmRecorder() { return &test_ukm_recorder_; } 67 ukm::TestUkmRecorder* GetTestUkmRecorder() { return &test_ukm_recorder_; }
79 metrics::TranslateEventProto tep1_ = 68 metrics::TranslateEventProto translate_event1_ =
80 CreateTranslateEvent("fr", "en", 1, 0, 3); 69 CreateTranslateEvent("fr", "en", "de", 1, 0, 3);
81 metrics::TranslateEventProto tep2_ = 70 metrics::TranslateEventProto translate_event2_ =
82 CreateTranslateEvent("jp", "en", 2, 0, 3); 71 CreateTranslateEvent("jp", "en", "de", 2, 0, 3);
83 metrics::TranslateEventProto tep3_ = 72 metrics::TranslateEventProto translate_event3_ =
84 CreateTranslateEvent("es", "de", 4, 5, 6); 73 CreateTranslateEvent("es", "de", "de", 4, 5, 6);
85 74
86 private: 75 private:
87 ukm::TestUkmRecorder test_ukm_recorder_; 76 ukm::TestUkmRecorder test_ukm_recorder_;
88 77
89 // Override the default URL fetcher to return custom responses for tests.
90 net::TestURLFetcherFactory url_fetcher_factory_;
91
92 // Used to initialize the translate download manager.
93 scoped_refptr<net::TestURLRequestContextGetter> request_context_;
94
95 // Sets up the task scheduling/task-runner environment for each test. 78 // Sets up the task scheduling/task-runner environment for each test.
96 base::test::ScopedTaskEnvironment scoped_task_environment_; 79 base::test::ScopedTaskEnvironment scoped_task_environment_;
97 80
98 // Manages the enabling/disabling of features within the scope of a test. 81 // Manages the enabling/disabling of features within the scope of a test.
99 base::test::ScopedFeatureList scoped_feature_list_; 82 base::test::ScopedFeatureList scoped_feature_list_;
100 83
101 // Cache and reset the application locale for each test.
102 std::string locale_;
103
104 DISALLOW_COPY_AND_ASSIGN(TranslateRankerImplTest); 84 DISALLOW_COPY_AND_ASSIGN(TranslateRankerImplTest);
105 }; 85 };
106 86
107 const char* const TranslateRankerImplTest::kPreferredLanguagePref =
108 #if defined(OS_CHROMEOS)
109 "settings.language.preferred_languages";
110 #else
111 nullptr;
112 #endif
113
114 TranslateRankerImplTest::TranslateRankerImplTest() {} 87 TranslateRankerImplTest::TranslateRankerImplTest() {}
115 88
116 void TranslateRankerImplTest::SetUp() {
117 // Setup the translate download manager.
118 locale_ = TranslateDownloadManager::GetInstance()->application_locale();
119 request_context_ =
120 new net::TestURLRequestContextGetter(base::ThreadTaskRunnerHandle::Get());
121 TranslateDownloadManager::GetInstance()->set_application_locale("zh-CN");
122 TranslateDownloadManager::GetInstance()->set_request_context(
123 request_context_.get());
124
125 // Setup a 50/50 accepted/denied count for "english" when initialize the
126 // prefs and translate prefs.
127 base::DictionaryValue lang_count;
128 lang_count.SetInteger("en", 50);
129 prefs_.reset(new sync_preferences::TestingPrefServiceSyncable());
130 TranslatePrefs::RegisterProfilePrefs(prefs_->registry());
131 prefs_->Set(TranslatePrefs::kPrefTranslateAcceptedCount, lang_count);
132 prefs_->Set(TranslatePrefs::kPrefTranslateDeniedCount, lang_count);
133 translate_prefs_.reset(new TranslatePrefs(
134 prefs_.get(), "intl.accept_languages", kPreferredLanguagePref));
135 translate_prefs_->SetCountry("de");
136 }
137
138 void TranslateRankerImplTest::TearDown() {
139 base::RunLoop().RunUntilIdle();
140 TranslateDownloadManager::GetInstance()->set_application_locale(locale_);
141 TranslateDownloadManager::GetInstance()->set_request_context(nullptr);
142 }
143
144 void TranslateRankerImplTest::InitFeatures( 89 void TranslateRankerImplTest::InitFeatures(
145 const std::initializer_list<base::Feature>& enabled, 90 const std::initializer_list<base::Feature>& enabled,
146 const std::initializer_list<base::Feature>& disabled) { 91 const std::initializer_list<base::Feature>& disabled) {
147 scoped_feature_list_.InitWithFeatures(enabled, disabled); 92 scoped_feature_list_.InitWithFeatures(enabled, disabled);
148 } 93 }
149 94
150 std::unique_ptr<TranslateRankerImpl> TranslateRankerImplTest::GetRankerForTest( 95 std::unique_ptr<TranslateRankerImpl> TranslateRankerImplTest::GetRankerForTest(
151 float threshold) { 96 float threshold) {
152 auto model = base::MakeUnique<chrome_intelligence::RankerModel>(); 97 auto model = base::MakeUnique<chrome_intelligence::RankerModel>();
153 model->mutable_proto()->mutable_translate()->set_version(kModelVersion); 98 model->mutable_proto()->mutable_translate()->set_version(kModelVersion);
(...skipping 15 matching lines...) Expand all
169 src_language_weight["zh"] = 0.06f; 114 src_language_weight["zh"] = 0.06f;
170 115
171 auto& target_language_weight = *details->mutable_target_language_weight(); 116 auto& target_language_weight = *details->mutable_target_language_weight();
172 target_language_weight["UNKNOWN"] = 0.00f; 117 target_language_weight["UNKNOWN"] = 0.00f;
173 118
174 auto& country_weight = *details->mutable_country_weight(); 119 auto& country_weight = *details->mutable_country_weight();
175 country_weight["de"] = 0.07f; 120 country_weight["de"] = 0.07f;
176 country_weight["ca"] = 0.08f; 121 country_weight["ca"] = 0.08f;
177 country_weight["cn"] = 0.09f; 122 country_weight["cn"] = 0.09f;
178 123
179 auto& locale_weight = *details->mutable_locale_weight();
180 locale_weight["en-us"] = 0.10f;
181 locale_weight["en-ca"] = 0.11f;
182 locale_weight["zh-cn"] = 0.12f; // Normalized to lowercase.
183
184 auto impl = base::MakeUnique<TranslateRankerImpl>(base::FilePath(), GURL(), 124 auto impl = base::MakeUnique<TranslateRankerImpl>(base::FilePath(), GURL(),
185 GetTestUkmRecorder()); 125 GetTestUkmRecorder());
186 impl->OnModelAvailable(std::move(model)); 126 impl->OnModelAvailable(std::move(model));
187 base::RunLoop().RunUntilIdle(); 127 base::RunLoop().RunUntilIdle();
188 return impl; 128 return impl;
189 } 129 }
190 130
191 // static 131 // static
192 double TranslateRankerImplTest::Sigmoid(double x) { 132 double TranslateRankerImplTest::Sigmoid(double x) {
193 return 1.0 / (1.0 + exp(-x)); 133 return 1.0 / (1.0 + exp(-x));
194 } 134 }
195 135
196 // static 136 // static
197 metrics::TranslateEventProto TranslateRankerImplTest::CreateTranslateEvent( 137 metrics::TranslateEventProto TranslateRankerImplTest::CreateTranslateEvent(
198 const std::string& src_lang, 138 const std::string& src_lang,
199 const std::string& dst_lang, 139 const std::string& dst_lang,
140 const std::string& country,
200 int accept_count, 141 int accept_count,
201 int decline_count, 142 int decline_count,
202 int ignore_count) { 143 int ignore_count) {
203 metrics::TranslateEventProto translate_event; 144 metrics::TranslateEventProto translate_event;
204 translate_event.set_source_language(src_lang); 145 translate_event.set_source_language(src_lang);
205 translate_event.set_target_language(dst_lang); 146 translate_event.set_target_language(dst_lang);
147 translate_event.set_country(country);
206 translate_event.set_accept_count(accept_count); 148 translate_event.set_accept_count(accept_count);
207 translate_event.set_decline_count(decline_count); 149 translate_event.set_decline_count(decline_count);
208 translate_event.set_ignore_count(ignore_count); 150 translate_event.set_ignore_count(ignore_count);
209 return translate_event; 151 return translate_event;
210 } 152 }
211 153
154 // static
155 metrics::TranslateEventProto
156 TranslateRankerImplTest::CreateDefaultTranslateEvent() {
157 return TranslateRankerImplTest::CreateTranslateEvent("en", "fr", "de", 50, 50,
158 0);
159 }
160
212 } // namespace 161 } // namespace
213 162
214 TEST_F(TranslateRankerImplTest, GetVersion) { 163 TEST_F(TranslateRankerImplTest, GetVersion) {
215 InitFeatures({kTranslateRankerQuery}, {}); 164 InitFeatures({kTranslateRankerQuery}, {});
216 auto ranker = GetRankerForTest(0.01f); 165 auto ranker = GetRankerForTest(0.01f);
217 EXPECT_TRUE(ranker->CheckModelLoaderForTesting()); 166 EXPECT_TRUE(ranker->CheckModelLoaderForTesting());
218 EXPECT_EQ(kModelVersion, ranker->GetModelVersion()); 167 EXPECT_EQ(kModelVersion, ranker->GetModelVersion());
219 } 168 }
220 169
221 TEST_F(TranslateRankerImplTest, ModelLoaderQueryNotEnabled) { 170 TEST_F(TranslateRankerImplTest, ModelLoaderQueryNotEnabled) {
222 // If Query is not enabled, the ranker should not try to load the model. 171 // If Query is not enabled, the ranker should not try to load the model.
223 InitFeatures({}, {kTranslateRankerQuery}); 172 InitFeatures({}, {kTranslateRankerQuery});
224 auto ranker = GetRankerForTest(0.01f); 173 auto ranker = GetRankerForTest(0.01f);
225 EXPECT_FALSE(ranker->CheckModelLoaderForTesting()); 174 EXPECT_FALSE(ranker->CheckModelLoaderForTesting());
226 } 175 }
227 176
228 TEST_F(TranslateRankerImplTest, GetModelDecision) { 177 TEST_F(TranslateRankerImplTest, GetModelDecision) {
229 InitFeatures({kTranslateRankerEnforcement}, {}); 178 InitFeatures({kTranslateRankerEnforcement}, {});
230 // Calculate the score using: a 50:50 accept/decline ratio; the one-hot 179 // Calculate the score using: a 50:50 accept/decline ratio; the one-hot
231 // values for the src lang, dest lang, locale and counry; and, the bias. 180 // values for the src lang, dest lang, and country; and, the bias.
232 double expected_score = 181 double expected_score =
233 Sigmoid(50.0 * 0.13f + // accept count * weight 182 Sigmoid(50.0 * 0.13f + // accept count * weight
234 50.0 * -0.14f + // decline count * weight 183 50.0 * -0.14f + // decline count * weight
235 0.0 * 0.00f + // ignore count * (default) weight 184 0.0 * 0.00f + // ignore count * (default) weight
236 0.5 * 0.02f + // accept ratio * weight 185 0.5 * 0.02f + // accept ratio * weight
237 0.5 * 0.03f + // decline ratio * weight 186 0.5 * 0.03f + // decline ratio * weight
238 0.0 * 0.00f + // ignore ratio * (default) weight 187 0.0 * 0.00f + // ignore ratio * (default) weight
239 1.0 * 0.04f + // one-hot src-language "en" * weight 188 1.0 * 0.04f + // one-hot src-language "en" * weight
240 1.0 * 0.00f + // one-hot dst-language "fr" * weight 189 1.0 * 0.00f + // one-hot dst-language "fr" * weight
241 1.0 * 0.07f + // one-hot country "de" * weight 190 1.0 * 0.07f + // one-hot country "de" * weight
242 1.0 * 0.12f + // one-hot locale "zh-CN" * weight
243 0.5f); // bias 191 0.5f); // bias
244 TranslateRankerFeatures features(50, 50, 0, "en", "fr", "de", "zh-CN"); 192 metrics::TranslateEventProto translate_event = CreateDefaultTranslateEvent();
245 193
246 const float epsilon = 0.001f; 194 const float epsilon = 0.001f;
247 auto ranker = GetRankerForTest(expected_score + epsilon); 195 auto ranker = GetRankerForTest(expected_score + epsilon);
248 EXPECT_FALSE(ranker->GetModelDecision(features)); 196 EXPECT_FALSE(ranker->GetModelDecision(translate_event));
249 197
250 ranker = GetRankerForTest(expected_score - epsilon); 198 ranker = GetRankerForTest(expected_score - epsilon);
251 EXPECT_TRUE(ranker->GetModelDecision(features)); 199 EXPECT_TRUE(ranker->GetModelDecision(translate_event));
252 200
253 ranker = GetRankerForTest(0.0); 201 ranker = GetRankerForTest(0.0);
254 EXPECT_EQ(expected_score >= 0.5, ranker->GetModelDecision(features)); 202 EXPECT_EQ(expected_score >= 0.5, ranker->GetModelDecision(translate_event));
255 } 203 }
256 204
257 TEST_F(TranslateRankerImplTest, ShouldOfferTranslation_AllEnabled) { 205 TEST_F(TranslateRankerImplTest, ShouldOfferTranslation_AllEnabled) {
258 InitFeatures({kTranslateRankerQuery, kTranslateRankerEnforcement, 206 InitFeatures({kTranslateRankerQuery, kTranslateRankerEnforcement,
259 kTranslateRankerDecisionOverride}, 207 kTranslateRankerDecisionOverride},
260 {}); 208 {});
261 metrics::TranslateEventProto tep; 209 metrics::TranslateEventProto translate_event = CreateDefaultTranslateEvent();
262 210
263 // With a threshold of 0.99, en->fr is not over the threshold. 211 // With a threshold of 0.99, en->fr is not over the threshold.
264 EXPECT_FALSE(GetRankerForTest(0.99f)->ShouldOfferTranslation( 212 EXPECT_FALSE(
265 *translate_prefs_, "en", "fr", &tep)); 213 GetRankerForTest(0.99f)->ShouldOfferTranslation(&translate_event));
266 EXPECT_NE(0U, tep.ranker_request_timestamp_sec()); 214 EXPECT_NE(0U, translate_event.ranker_request_timestamp_sec());
267 EXPECT_EQ(kModelVersion, tep.ranker_version()); 215 EXPECT_EQ(kModelVersion, translate_event.ranker_version());
268 EXPECT_EQ(metrics::TranslateEventProto::DONT_SHOW, tep.ranker_response()); 216 EXPECT_EQ(metrics::TranslateEventProto::DONT_SHOW,
217 translate_event.ranker_response());
269 218
270 // With a threshold of 0.01, en-fr is over the threshold. 219 // With a threshold of 0.01, en-fr is over the threshold.
271 tep.Clear(); 220 translate_event.Clear();
272 EXPECT_TRUE(GetRankerForTest(0.01f)->ShouldOfferTranslation( 221 EXPECT_TRUE(
273 *translate_prefs_, "en", "fr", &tep)); 222 GetRankerForTest(0.01f)->ShouldOfferTranslation(&translate_event));
274 EXPECT_EQ(metrics::TranslateEventProto::SHOW, tep.ranker_response()); 223 EXPECT_EQ(metrics::TranslateEventProto::SHOW,
224 translate_event.ranker_response());
275 } 225 }
276 TEST_F(TranslateRankerImplTest, ShouldOfferTranslation_AllDisabled) { 226 TEST_F(TranslateRankerImplTest, ShouldOfferTranslation_AllDisabled) {
277 InitFeatures({}, {kTranslateRankerQuery, kTranslateRankerEnforcement, 227 InitFeatures({}, {kTranslateRankerQuery, kTranslateRankerEnforcement,
278 kTranslateRankerDecisionOverride}); 228 kTranslateRankerDecisionOverride});
279 metrics::TranslateEventProto tep; 229 metrics::TranslateEventProto translate_event = CreateDefaultTranslateEvent();
280 // If query and other flags are turned off, returns true and do not query the 230 // If query and other flags are turned off, returns true and do not query the
281 // ranker. 231 // ranker.
282 EXPECT_TRUE(GetRankerForTest(0.5f)->ShouldOfferTranslation(*translate_prefs_, 232 EXPECT_TRUE(GetRankerForTest(0.5f)->ShouldOfferTranslation(&translate_event));
283 "en", "fr", &tep)); 233 EXPECT_NE(0U, translate_event.ranker_request_timestamp_sec());
284 EXPECT_NE(0U, tep.ranker_request_timestamp_sec()); 234 EXPECT_EQ(kModelVersion, translate_event.ranker_version());
285 EXPECT_EQ(kModelVersion, tep.ranker_version()); 235 EXPECT_EQ(metrics::TranslateEventProto::NOT_QUERIED,
286 EXPECT_EQ(metrics::TranslateEventProto::NOT_QUERIED, tep.ranker_response()); 236 translate_event.ranker_response());
287 } 237 }
288 238
289 TEST_F(TranslateRankerImplTest, ShouldOfferTranslation_QueryOnly) { 239 TEST_F(TranslateRankerImplTest, ShouldOfferTranslation_QueryOnly) {
290 InitFeatures({kTranslateRankerQuery}, 240 InitFeatures({kTranslateRankerQuery},
291 {kTranslateRankerEnforcement, kTranslateRankerDecisionOverride}); 241 {kTranslateRankerEnforcement, kTranslateRankerDecisionOverride});
292 metrics::TranslateEventProto tep; 242 metrics::TranslateEventProto translate_event = CreateDefaultTranslateEvent();
293 // If enforcement is turned off, returns true even if the decision 243 // If enforcement is turned off, returns true even if the decision
294 // is not to show. 244 // is not to show.
295 EXPECT_TRUE(GetRankerForTest(0.99f)->ShouldOfferTranslation( 245 EXPECT_TRUE(
296 *translate_prefs_, "en", "fr", &tep)); 246 GetRankerForTest(0.99f)->ShouldOfferTranslation(&translate_event));
297 EXPECT_NE(0U, tep.ranker_request_timestamp_sec()); 247 EXPECT_NE(0U, translate_event.ranker_request_timestamp_sec());
298 EXPECT_EQ(kModelVersion, tep.ranker_version()); 248 EXPECT_EQ(kModelVersion, translate_event.ranker_version());
299 EXPECT_EQ(metrics::TranslateEventProto::DONT_SHOW, tep.ranker_response()); 249 EXPECT_EQ(metrics::TranslateEventProto::DONT_SHOW,
250 translate_event.ranker_response());
300 } 251 }
301 252
302 TEST_F(TranslateRankerImplTest, ShouldOfferTranslation_EnforcementOnly) { 253 TEST_F(TranslateRankerImplTest, ShouldOfferTranslation_EnforcementOnly) {
303 InitFeatures({kTranslateRankerEnforcement}, 254 InitFeatures({kTranslateRankerEnforcement},
304 {kTranslateRankerQuery, kTranslateRankerDecisionOverride}); 255 {kTranslateRankerQuery, kTranslateRankerDecisionOverride});
305 metrics::TranslateEventProto tep; 256 metrics::TranslateEventProto translate_event = CreateDefaultTranslateEvent();
306 // If either enforcement or decision override are turned on, returns the 257 // If either enforcement or decision override are turned on, returns the
307 // ranker decision. 258 // ranker decision.
308 EXPECT_FALSE(GetRankerForTest(0.99f)->ShouldOfferTranslation( 259 EXPECT_FALSE(
309 *translate_prefs_, "en", "fr", &tep)); 260 GetRankerForTest(0.99f)->ShouldOfferTranslation(&translate_event));
310 EXPECT_NE(0U, tep.ranker_request_timestamp_sec()); 261 EXPECT_NE(0U, translate_event.ranker_request_timestamp_sec());
311 EXPECT_EQ(kModelVersion, tep.ranker_version()); 262 EXPECT_EQ(kModelVersion, translate_event.ranker_version());
312 EXPECT_EQ(metrics::TranslateEventProto::DONT_SHOW, tep.ranker_response()); 263 EXPECT_EQ(metrics::TranslateEventProto::DONT_SHOW,
264 translate_event.ranker_response());
313 } 265 }
314 266
315 TEST_F(TranslateRankerImplTest, ShouldOfferTranslation_OverrideOnly) { 267 TEST_F(TranslateRankerImplTest, ShouldOfferTranslation_OverrideOnly) {
316 InitFeatures({kTranslateRankerDecisionOverride}, 268 InitFeatures({kTranslateRankerDecisionOverride},
317 {kTranslateRankerQuery, kTranslateRankerEnforcement}); 269 {kTranslateRankerQuery, kTranslateRankerEnforcement});
318 metrics::TranslateEventProto tep; 270 metrics::TranslateEventProto translate_event = CreateDefaultTranslateEvent();
319 // If either enforcement or decision override are turned on, returns the 271 // If either enforcement or decision override are turned on, returns the
320 // ranker decision. 272 // ranker decision.
321 EXPECT_FALSE(GetRankerForTest(0.99f)->ShouldOfferTranslation( 273 EXPECT_FALSE(
322 *translate_prefs_, "en", "fr", &tep)); 274 GetRankerForTest(0.99f)->ShouldOfferTranslation(&translate_event));
323 EXPECT_NE(0U, tep.ranker_request_timestamp_sec()); 275 EXPECT_NE(0U, translate_event.ranker_request_timestamp_sec());
324 EXPECT_EQ(kModelVersion, tep.ranker_version()); 276 EXPECT_EQ(kModelVersion, translate_event.ranker_version());
325 EXPECT_EQ(metrics::TranslateEventProto::DONT_SHOW, tep.ranker_response()); 277 EXPECT_EQ(metrics::TranslateEventProto::DONT_SHOW,
278 translate_event.ranker_response());
326 } 279 }
327 280
328 TEST_F(TranslateRankerImplTest, ShouldOfferTranslation_NoModel) { 281 TEST_F(TranslateRankerImplTest, ShouldOfferTranslation_NoModel) {
329 auto ranker = 282 auto ranker =
330 base::MakeUnique<TranslateRankerImpl>(base::FilePath(), GURL(), nullptr); 283 base::MakeUnique<TranslateRankerImpl>(base::FilePath(), GURL(), nullptr);
331 InitFeatures({kTranslateRankerDecisionOverride, kTranslateRankerQuery, 284 InitFeatures({kTranslateRankerDecisionOverride, kTranslateRankerQuery,
332 kTranslateRankerEnforcement}, 285 kTranslateRankerEnforcement},
333 {}); 286 {});
334 metrics::TranslateEventProto tep; 287 metrics::TranslateEventProto translate_event = CreateDefaultTranslateEvent();
335 // If we don't have a model, returns true. 288 // If we don't have a model, returns true.
336 EXPECT_TRUE( 289 EXPECT_TRUE(ranker->ShouldOfferTranslation(&translate_event));
337 ranker->ShouldOfferTranslation(*translate_prefs_, "en", "fr", &tep)); 290 EXPECT_NE(0U, translate_event.ranker_request_timestamp_sec());
338 EXPECT_NE(0U, tep.ranker_request_timestamp_sec()); 291 EXPECT_EQ(0U, translate_event.ranker_version());
339 EXPECT_EQ(0U, tep.ranker_version()); 292 EXPECT_EQ(metrics::TranslateEventProto::NOT_QUERIED,
340 EXPECT_EQ(metrics::TranslateEventProto::NOT_QUERIED, tep.ranker_response()); 293 translate_event.ranker_response());
341 } 294 }
342 295
343 TEST_F(TranslateRankerImplTest, RecordAndFlushEvents) { 296 TEST_F(TranslateRankerImplTest, RecordAndFlushEvents) {
344 std::unique_ptr<translate::TranslateRanker> ranker = GetRankerForTest(0.0f); 297 std::unique_ptr<translate::TranslateRanker> ranker = GetRankerForTest(0.0f);
345 std::vector<metrics::TranslateEventProto> flushed_events; 298 std::vector<metrics::TranslateEventProto> flushed_events;
346 299
347 GURL url0("https://www.google.com"); 300 GURL url0("https://www.google.com");
348 GURL url1("https://www.gmail.com"); 301 GURL url1("https://www.gmail.com");
349 302
350 // Check that flushing an empty cache will return an empty vector. 303 // Check that flushing an empty cache will return an empty vector.
351 ranker->FlushTranslateEvents(&flushed_events); 304 ranker->FlushTranslateEvents(&flushed_events);
352 EXPECT_EQ(0U, flushed_events.size()); 305 EXPECT_EQ(0U, flushed_events.size());
353 306
354 ranker->RecordTranslateEvent(0, url0, &tep1_); 307 ranker->RecordTranslateEvent(0, url0, &translate_event1_);
355 ranker->RecordTranslateEvent(1, GURL(), &tep2_); 308 ranker->RecordTranslateEvent(1, GURL(), &translate_event2_);
356 ranker->RecordTranslateEvent(2, url1, &tep3_); 309 ranker->RecordTranslateEvent(2, url1, &translate_event3_);
357 310
358 // Capture the data and verify that it is as expected. 311 // Capture the data and verify that it is as expected.
359 ranker->FlushTranslateEvents(&flushed_events); 312 ranker->FlushTranslateEvents(&flushed_events);
360 EXPECT_EQ(3U, flushed_events.size()); 313 EXPECT_EQ(3U, flushed_events.size());
361 ASSERT_EQ(tep1_.source_language(), flushed_events[0].source_language()); 314 ASSERT_EQ(translate_event1_.source_language(),
315 flushed_events[0].source_language());
362 ASSERT_EQ(0, flushed_events[0].event_type()); 316 ASSERT_EQ(0, flushed_events[0].event_type());
363 ASSERT_EQ(tep2_.source_language(), flushed_events[1].source_language()); 317 ASSERT_EQ(translate_event2_.source_language(),
318 flushed_events[1].source_language());
364 ASSERT_EQ(1, flushed_events[1].event_type()); 319 ASSERT_EQ(1, flushed_events[1].event_type());
365 ASSERT_EQ(tep3_.source_language(), flushed_events[2].source_language()); 320 ASSERT_EQ(translate_event3_.source_language(),
321 flushed_events[2].source_language());
366 ASSERT_EQ(2, flushed_events[2].event_type()); 322 ASSERT_EQ(2, flushed_events[2].event_type());
367 323
368 // Check that the cache has been cleared. 324 // Check that the cache has been cleared.
369 ranker->FlushTranslateEvents(&flushed_events); 325 ranker->FlushTranslateEvents(&flushed_events);
370 EXPECT_EQ(0U, flushed_events.size()); 326 EXPECT_EQ(0U, flushed_events.size());
371 327
372 ASSERT_EQ(2U, GetTestUkmRecorder()->sources_count()); 328 ASSERT_EQ(2U, GetTestUkmRecorder()->sources_count());
373 EXPECT_EQ( 329 EXPECT_EQ(
374 url0.spec(), 330 url0.spec(),
375 GetTestUkmRecorder()->GetSourceForUrl(url0.spec().c_str())->url().spec()); 331 GetTestUkmRecorder()->GetSourceForUrl(url0.spec().c_str())->url().spec());
376 EXPECT_EQ( 332 EXPECT_EQ(
377 url1.spec(), 333 url1.spec(),
378 GetTestUkmRecorder()->GetSourceForUrl(url1.spec().c_str())->url().spec()); 334 GetTestUkmRecorder()->GetSourceForUrl(url1.spec().c_str())->url().spec());
379 } 335 }
380 336
381 TEST_F(TranslateRankerImplTest, LoggingDisabledViaOverride) { 337 TEST_F(TranslateRankerImplTest, LoggingDisabledViaOverride) {
382 std::unique_ptr<translate::TranslateRankerImpl> ranker = 338 std::unique_ptr<translate::TranslateRankerImpl> ranker =
383 GetRankerForTest(0.0f); 339 GetRankerForTest(0.0f);
384 std::vector<metrics::TranslateEventProto> flushed_events; 340 std::vector<metrics::TranslateEventProto> flushed_events;
385 341
386 ranker->FlushTranslateEvents(&flushed_events); 342 ranker->FlushTranslateEvents(&flushed_events);
387 EXPECT_EQ(0U, flushed_events.size()); 343 EXPECT_EQ(0U, flushed_events.size());
388 344
389 ranker->RecordTranslateEvent(0, GURL(), &tep1_); 345 ranker->RecordTranslateEvent(0, GURL(), &translate_event1_);
390 ranker->RecordTranslateEvent(1, GURL(), &tep2_); 346 ranker->RecordTranslateEvent(1, GURL(), &translate_event2_);
391 ranker->RecordTranslateEvent(2, GURL(), &tep3_); 347 ranker->RecordTranslateEvent(2, GURL(), &translate_event3_);
392 348
393 // Logging is enabled by default, so events should be cached. 349 // Logging is enabled by default, so events should be cached.
394 ranker->FlushTranslateEvents(&flushed_events); 350 ranker->FlushTranslateEvents(&flushed_events);
395 EXPECT_EQ(3U, flushed_events.size()); 351 EXPECT_EQ(3U, flushed_events.size());
396 352
397 // Override the feature setting to disable logging. 353 // Override the feature setting to disable logging.
398 ranker->EnableLogging(false); 354 ranker->EnableLogging(false);
399 355
400 ranker->RecordTranslateEvent(0, GURL(), &tep1_); 356 ranker->RecordTranslateEvent(0, GURL(), &translate_event1_);
401 ranker->RecordTranslateEvent(1, GURL(), &tep2_); 357 ranker->RecordTranslateEvent(1, GURL(), &translate_event2_);
402 ranker->RecordTranslateEvent(2, GURL(), &tep3_); 358 ranker->RecordTranslateEvent(2, GURL(), &translate_event3_);
403 359
404 // Logging is disabled, so no events should be cached. 360 // Logging is disabled, so no events should be cached.
405 ranker->FlushTranslateEvents(&flushed_events); 361 ranker->FlushTranslateEvents(&flushed_events);
406 EXPECT_EQ(0U, flushed_events.size()); 362 EXPECT_EQ(0U, flushed_events.size());
407 } 363 }
408 364
409 TEST_F(TranslateRankerImplTest, ShouldOverrideDecision_OverrideDisabled) { 365 TEST_F(TranslateRankerImplTest, ShouldOverrideDecision_OverrideDisabled) {
410 InitFeatures({}, {kTranslateRankerDecisionOverride}); 366 InitFeatures({}, {kTranslateRankerDecisionOverride});
411 std::unique_ptr<translate::TranslateRankerImpl> ranker = 367 std::unique_ptr<translate::TranslateRankerImpl> ranker =
412 GetRankerForTest(0.0f); 368 GetRankerForTest(0.0f);
413 const int kEventType = 12; 369 const int kEventType = 12;
414 metrics::TranslateEventProto tep = CreateTranslateEvent("fr", "en", 1, 0, 3); 370 metrics::TranslateEventProto translate_event = CreateDefaultTranslateEvent();
415 371
416 EXPECT_FALSE(ranker->ShouldOverrideDecision(kEventType, GURL(), &tep)); 372 EXPECT_FALSE(
373 ranker->ShouldOverrideDecision(kEventType, GURL(), &translate_event));
417 374
418 std::vector<metrics::TranslateEventProto> flushed_events; 375 std::vector<metrics::TranslateEventProto> flushed_events;
419 ranker->FlushTranslateEvents(&flushed_events); 376 ranker->FlushTranslateEvents(&flushed_events);
420 EXPECT_EQ(1U, flushed_events.size()); 377 EXPECT_EQ(1U, flushed_events.size());
421 ASSERT_EQ(tep.source_language(), flushed_events[0].source_language()); 378 ASSERT_EQ(translate_event.source_language(),
379 flushed_events[0].source_language());
422 ASSERT_EQ(kEventType, flushed_events[0].event_type()); 380 ASSERT_EQ(kEventType, flushed_events[0].event_type());
423 } 381 }
424 382
425 TEST_F(TranslateRankerImplTest, ShouldOverrideDecision_OverrideEnabled) { 383 TEST_F(TranslateRankerImplTest, ShouldOverrideDecision_OverrideEnabled) {
426 InitFeatures({kTranslateRankerDecisionOverride}, {}); 384 InitFeatures({kTranslateRankerDecisionOverride}, {});
427 std::unique_ptr<translate::TranslateRankerImpl> ranker = 385 std::unique_ptr<translate::TranslateRankerImpl> ranker =
428 GetRankerForTest(0.0f); 386 GetRankerForTest(0.0f);
429 metrics::TranslateEventProto tep = CreateTranslateEvent("fr", "en", 1, 0, 3); 387 metrics::TranslateEventProto translate_event = CreateDefaultTranslateEvent();
430 388
431 EXPECT_TRUE(ranker->ShouldOverrideDecision(1, GURL(), &tep)); 389 EXPECT_TRUE(ranker->ShouldOverrideDecision(1, GURL(), &translate_event));
432 EXPECT_TRUE(ranker->ShouldOverrideDecision(2, GURL(), &tep)); 390 EXPECT_TRUE(ranker->ShouldOverrideDecision(2, GURL(), &translate_event));
433 391
434 std::vector<metrics::TranslateEventProto> flushed_events; 392 std::vector<metrics::TranslateEventProto> flushed_events;
435 ranker->FlushTranslateEvents(&flushed_events); 393 ranker->FlushTranslateEvents(&flushed_events);
436 EXPECT_EQ(0U, flushed_events.size()); 394 EXPECT_EQ(0U, flushed_events.size());
437 ASSERT_EQ(2, tep.decision_overrides_size()); 395 ASSERT_EQ(2, translate_event.decision_overrides_size());
438 ASSERT_EQ(1, tep.decision_overrides(0)); 396 ASSERT_EQ(1, translate_event.decision_overrides(0));
439 ASSERT_EQ(2, tep.decision_overrides(1)); 397 ASSERT_EQ(2, translate_event.decision_overrides(1));
440 ASSERT_EQ(0, tep.event_type()); 398 ASSERT_EQ(0, translate_event.event_type());
441 } 399 }
OLDNEW
« no previous file with comments | « components/translate/core/browser/translate_ranker_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698