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

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

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