Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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_prefs.h" | 5 #include "components/translate/core/browser/translate_prefs.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "base/json/json_reader.h" | |
| 12 #include "base/test/scoped_feature_list.h" | 13 #include "base/test/scoped_feature_list.h" |
| 14 #include "base/values.h" | |
| 13 #include "build/build_config.h" | 15 #include "build/build_config.h" |
| 14 #include "components/pref_registry/testing_pref_service_syncable.h" | 16 #include "components/pref_registry/testing_pref_service_syncable.h" |
| 15 #include "components/prefs/scoped_user_pref_update.h" | 17 #include "components/prefs/scoped_user_pref_update.h" |
| 16 #include "components/translate/core/browser/translate_download_manager.h" | 18 #include "components/translate/core/browser/translate_download_manager.h" |
| 17 #include "components/translate/core/browser/translate_prefs.h" | 19 #include "components/translate/core/browser/translate_prefs.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 21 |
| 20 namespace { | 22 namespace { |
| 21 | 23 |
| 22 const char kTestLanguage[] = "en"; | 24 const char kTestLanguage[] = "en"; |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 44 void SetLastDeniedTime(const std::string& language, base::Time time) { | 46 void SetLastDeniedTime(const std::string& language, base::Time time) { |
| 45 DenialTimeUpdate update(prefs_.get(), language, 2); | 47 DenialTimeUpdate update(prefs_.get(), language, 2); |
| 46 update.AddDenialTime(time); | 48 update.AddDenialTime(time); |
| 47 } | 49 } |
| 48 | 50 |
| 49 base::Time GetLastDeniedTime(const std::string& language) { | 51 base::Time GetLastDeniedTime(const std::string& language) { |
| 50 DenialTimeUpdate update(prefs_.get(), language, 2); | 52 DenialTimeUpdate update(prefs_.get(), language, 2); |
| 51 return update.GetOldestDenialTime(); | 53 return update.GetOldestDenialTime(); |
| 52 } | 54 } |
| 53 | 55 |
| 54 void TurnOnTranslate2016Q2UIFlag() { | |
| 55 scoped_feature_list_.InitAndEnableFeature(translate::kTranslateUI2016Q2); | |
| 56 } | |
| 57 | |
| 58 base::test::ScopedFeatureList scoped_feature_list_; | |
| 59 std::unique_ptr<user_prefs::TestingPrefServiceSyncable> prefs_; | 56 std::unique_ptr<user_prefs::TestingPrefServiceSyncable> prefs_; |
| 60 std::unique_ptr<translate::TranslatePrefs> translate_prefs_; | 57 std::unique_ptr<translate::TranslatePrefs> translate_prefs_; |
| 61 | 58 |
| 62 // Shared time constants. | 59 // Shared time constants. |
| 63 base::Time now_; | 60 base::Time now_; |
| 64 base::Time two_days_ago_; | 61 base::Time two_days_ago_; |
| 65 }; | 62 }; |
| 66 | 63 |
| 67 TEST_F(TranslatePrefTest, IsTooOftenDeniedIn2016Q2UI) { | 64 TEST_F(TranslatePrefTest, IsTooOftenDeniedIn2016Q2UI) { |
| 68 TurnOnTranslate2016Q2UIFlag(); | 65 base::test::ScopedFeatureList scoped_feature_list; |
| 66 scoped_feature_list.InitAndEnableFeature(translate::kTranslateUI2016Q2); | |
| 69 | 67 |
| 70 translate_prefs_->ResetDenialState(); | 68 translate_prefs_->ResetDenialState(); |
| 71 EXPECT_FALSE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); | 69 EXPECT_FALSE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); |
| 72 | 70 |
| 73 for (int i = 0; i < 3; i++) { | 71 for (int i = 0; i < 3; i++) { |
| 74 translate_prefs_->IncrementTranslationDeniedCount(kTestLanguage); | 72 translate_prefs_->IncrementTranslationDeniedCount(kTestLanguage); |
| 75 EXPECT_FALSE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); | 73 EXPECT_FALSE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); |
| 76 } | 74 } |
| 77 | 75 |
| 78 translate_prefs_->IncrementTranslationDeniedCount(kTestLanguage); | 76 translate_prefs_->IncrementTranslationDeniedCount(kTestLanguage); |
| 79 EXPECT_TRUE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); | 77 EXPECT_TRUE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); |
| 80 } | 78 } |
| 81 | 79 |
| 82 TEST_F(TranslatePrefTest, IsTooOftenIgnoredIn2016Q2UI) { | 80 TEST_F(TranslatePrefTest, IsTooOftenIgnoredIn2016Q2UI) { |
| 83 TurnOnTranslate2016Q2UIFlag(); | 81 base::test::ScopedFeatureList scoped_feature_list; |
| 82 scoped_feature_list.InitAndEnableFeature(translate::kTranslateUI2016Q2); | |
| 84 | 83 |
| 85 translate_prefs_->ResetDenialState(); | 84 translate_prefs_->ResetDenialState(); |
| 86 EXPECT_FALSE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); | 85 EXPECT_FALSE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); |
| 87 | 86 |
| 88 for (int i = 0; i < 10; i++) { | 87 for (int i = 0; i < 10; i++) { |
| 89 translate_prefs_->IncrementTranslationIgnoredCount(kTestLanguage); | 88 translate_prefs_->IncrementTranslationIgnoredCount(kTestLanguage); |
| 90 EXPECT_FALSE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); | 89 EXPECT_FALSE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); |
| 91 } | 90 } |
| 92 | 91 |
| 93 translate_prefs_->IncrementTranslationIgnoredCount(kTestLanguage); | 92 translate_prefs_->IncrementTranslationIgnoredCount(kTestLanguage); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 205 | 204 |
| 206 update.AddDenialTime(now_); | 205 update.AddDenialTime(now_); |
| 207 EXPECT_EQ(update.GetOldestDenialTime(), | 206 EXPECT_EQ(update.GetOldestDenialTime(), |
| 208 now_ - base::TimeDelta::FromMinutes(3)); | 207 now_ - base::TimeDelta::FromMinutes(3)); |
| 209 | 208 |
| 210 update.AddDenialTime(now_); | 209 update.AddDenialTime(now_); |
| 211 EXPECT_EQ(update.GetOldestDenialTime(), | 210 EXPECT_EQ(update.GetOldestDenialTime(), |
| 212 now_ - base::TimeDelta::FromMinutes(2)); | 211 now_ - base::TimeDelta::FromMinutes(2)); |
| 213 } | 212 } |
| 214 | 213 |
| 214 TEST_F(TranslatePrefTest, ULPPrefs) { | |
| 215 // Mock the pref. | |
| 216 // Case 1: well formed ULP. | |
| 217 const char json1[] = | |
| 218 "{\n" | |
| 219 " \"reading\": {\n" | |
| 220 " \"confidence\": 0.8,\n" | |
| 221 " \"preference\": [\n" | |
| 222 " {\n" | |
| 223 " \"language\": \"en-AU\",\n" | |
| 224 " \"probability\": 0.4\n" | |
| 225 " }, {\n" | |
| 226 " \"language\": \"fr\",\n" | |
| 227 " \"probability\": 0.6\n" | |
| 228 " }\n" | |
| 229 " ]\n" | |
| 230 " }\n" | |
| 231 "}"; | |
| 232 int error_code = 0; | |
| 233 std::string error_msg; | |
| 234 int error_line = 0; | |
| 235 int error_column = 0; | |
| 236 std::unique_ptr<base::Value> profile(base::JSONReader::ReadAndReturnError( | |
| 237 json1, 0, &error_code, &error_msg, &error_line, &error_column)); | |
| 238 ASSERT_EQ(0, error_code) << error_msg << " at " << error_line << ":" | |
| 239 << error_column << std::endl | |
| 240 << json1; | |
| 241 | |
| 242 prefs_->SetUserPref(TranslatePrefs::kPrefLanguageProfile, profile.release()); | |
| 243 | |
| 244 TranslatePrefs::LanguageAndProbabilityList list; | |
| 245 EXPECT_EQ(0.8, translate_prefs_->GetReadingFromUserLanguageProfile(&list)); | |
| 246 EXPECT_EQ(2UL, list.size()); | |
|
Lei Zhang
2016/11/17 07:03:28
This should be an ASSERT_EQ(), otherwise if this f
| |
| 247 // the order in the ULP is wrong, and our code will sort it and make the | |
| 248 // larger | |
| 249 // one first. | |
| 250 EXPECT_EQ("fr", list[0].first); | |
| 251 EXPECT_EQ(0.6, list[0].second); | |
| 252 EXPECT_EQ("en", list[1].first); // the "en-AU" should be normalize to "en" | |
| 253 EXPECT_EQ(0.4, list[1].second); | |
| 254 | |
| 255 // Case 2: ill-formed ULP. | |
| 256 // Test if the ULP lacking some fields the code will gracefully ignore those | |
| 257 // items without crash. | |
| 258 const char json2[] = | |
| 259 "{\n" | |
| 260 " \"reading\": {\n" | |
| 261 " \"confidence\": 0.3,\n" | |
| 262 " \"preference\": [\n" | |
| 263 " {\n" // The first one do not have probability. Won't be counted. | |
| 264 " \"language\": \"th\"\n" | |
| 265 " }, {\n" | |
| 266 " \"language\": \"zh-TW\",\n" | |
| 267 " \"probability\": 0.4\n" | |
| 268 " }, {\n" // The third one has no language nor probability. Won't be | |
| 269 // counted. | |
| 270 " }, {\n" // The forth one has 'pt-BR' which is not supported by | |
| 271 // Translate. | |
| 272 // Should be normalize to 'pt' | |
| 273 " \"language\": \"pt-BR\",\n" | |
| 274 " \"probability\": 0.1\n" | |
| 275 " }, {\n" // The fifth one has no language. Won't be counted. | |
| 276 " \"probability\": 0.1\n" | |
| 277 " }\n" | |
| 278 " ]\n" | |
| 279 " }\n" | |
| 280 "}"; | |
| 281 | |
| 282 profile.reset(base::JSONReader::ReadAndReturnError(json2, 0, &error_code, | |
| 283 &error_msg, &error_line, | |
| 284 &error_column) | |
| 285 .release()); | |
| 286 ASSERT_EQ(0, error_code) << error_msg << " at " << error_line << ":" | |
| 287 << error_column << std::endl | |
| 288 << json2; | |
| 289 | |
| 290 prefs_->SetUserPref(TranslatePrefs::kPrefLanguageProfile, profile.release()); | |
| 291 | |
| 292 list.clear(); | |
| 293 EXPECT_EQ(0.3, translate_prefs_->GetReadingFromUserLanguageProfile(&list)); | |
| 294 EXPECT_EQ(2UL, list.size()); | |
| 295 EXPECT_EQ("zh-TW", list[0].first); | |
| 296 EXPECT_EQ(0.4, list[0].second); | |
| 297 EXPECT_EQ("pt", list[1].first); // the "pt-BR" should be normalize to "pt" | |
| 298 EXPECT_EQ(0.1, list[1].second); | |
| 299 | |
| 300 // Case 3: Language Code normalization and reordering. | |
| 301 const char json3[] = | |
| 302 "{\n" | |
| 303 " \"reading\": {\n" | |
| 304 " \"confidence\": 0.8,\n" | |
| 305 " \"preference\": [\n" | |
| 306 " {\n" | |
| 307 " \"language\": \"fr\",\n" | |
| 308 " \"probability\": 0.4\n" | |
| 309 " }, {\n" | |
| 310 " \"language\": \"en-US\",\n" | |
| 311 " \"probability\": 0.31\n" | |
| 312 " }, {\n" | |
| 313 " \"language\": \"en-GB\",\n" | |
| 314 " \"probability\": 0.29\n" | |
| 315 " }\n" | |
| 316 " ]\n" | |
| 317 " }\n" | |
| 318 "}"; | |
| 319 profile.reset(base::JSONReader::ReadAndReturnError(json3, 0, &error_code, | |
| 320 &error_msg, &error_line, | |
| 321 &error_column) | |
| 322 .release()); | |
| 323 ASSERT_EQ(0, error_code) << error_msg << " at " << error_line << ":" | |
| 324 << error_column << std::endl | |
| 325 << json3; | |
| 326 | |
| 327 prefs_->SetUserPref(TranslatePrefs::kPrefLanguageProfile, profile.release()); | |
| 328 | |
| 329 list.clear(); | |
| 330 EXPECT_EQ(0.8, translate_prefs_->GetReadingFromUserLanguageProfile(&list)); | |
| 331 EXPECT_EQ(2UL, list.size()); | |
| 332 EXPECT_EQ("en", list[0].first); // en-US and en-GB will be normalize into en | |
| 333 EXPECT_EQ(0.6, | |
| 334 list[0].second); // and their probability will add to gether be 0.6 | |
| 335 EXPECT_EQ("fr", list[1].first); // fr will move down to the 2nd one | |
| 336 EXPECT_EQ(0.4, list[1].second); | |
| 337 } | |
| 338 | |
| 215 } // namespace translate | 339 } // namespace translate |
| OLD | NEW |