| 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 <vector> | 10 #include <vector> |
| 10 | 11 |
| 11 #include "build/build_config.h" | 12 #include "build/build_config.h" |
| 12 #include "components/pref_registry/testing_pref_service_syncable.h" | 13 #include "components/pref_registry/testing_pref_service_syncable.h" |
| 13 #include "components/prefs/scoped_user_pref_update.h" | 14 #include "components/prefs/scoped_user_pref_update.h" |
| 14 #include "components/translate/core/browser/translate_download_manager.h" | 15 #include "components/translate/core/browser/translate_download_manager.h" |
| 16 #include "components/translate/core/browser/translate_prefs.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 16 | 18 |
| 17 namespace { | 19 namespace { |
| 18 | 20 |
| 19 const char kTestLanguage[] = "en"; | 21 const char kTestLanguage[] = "en"; |
| 20 | 22 |
| 21 } // namespace | 23 } // namespace |
| 22 | 24 |
| 23 namespace translate { | 25 namespace translate { |
| 24 | 26 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 40 // Filippino: synonym to 'tl' | 42 // Filippino: synonym to 'tl' |
| 41 accept_languages.push_back("fil"); | 43 accept_languages.push_back("fil"); |
| 42 // General Chinese is not used as Translate language, but not filtered | 44 // General Chinese is not used as Translate language, but not filtered |
| 43 // when merging. | 45 // when merging. |
| 44 accept_languages.push_back("zh"); | 46 accept_languages.push_back("zh"); |
| 45 // Chinese with a sub code is acceptable for the blocked-language list. | 47 // Chinese with a sub code is acceptable for the blocked-language list. |
| 46 accept_languages.push_back("zh-TW"); | 48 accept_languages.push_back("zh-TW"); |
| 47 | 49 |
| 48 std::vector<std::string> blocked_languages; | 50 std::vector<std::string> blocked_languages; |
| 49 | 51 |
| 50 TranslatePrefs::CreateBlockedLanguages(&blocked_languages, | 52 TranslatePrefs::CreateBlockedLanguages( |
| 51 blacklisted_languages, | 53 &blocked_languages, blacklisted_languages, accept_languages); |
| 52 accept_languages); | |
| 53 | 54 |
| 54 // The order of the elements cannot be determined. | 55 // The order of the elements cannot be determined. |
| 55 std::vector<std::string> expected; | 56 std::vector<std::string> expected; |
| 56 expected.push_back("en"); | 57 expected.push_back("en"); |
| 57 expected.push_back("fr"); | 58 expected.push_back("fr"); |
| 58 expected.push_back("iw"); | 59 expected.push_back("iw"); |
| 59 expected.push_back("ht"); | 60 expected.push_back("ht"); |
| 60 expected.push_back("it"); | 61 expected.push_back("it"); |
| 61 expected.push_back("ja"); | 62 expected.push_back("ja"); |
| 62 expected.push_back("tl"); | 63 expected.push_back("tl"); |
| 63 expected.push_back("zh"); | 64 expected.push_back("zh"); |
| 64 expected.push_back("zh-TW"); | 65 expected.push_back("zh-TW"); |
| 65 | 66 |
| 66 EXPECT_EQ(expected.size(), blocked_languages.size()); | 67 EXPECT_EQ(expected.size(), blocked_languages.size()); |
| 67 for (std::vector<std::string>::const_iterator it = expected.begin(); | 68 for (std::vector<std::string>::const_iterator it = expected.begin(); |
| 68 it != expected.end(); ++it) { | 69 it != expected.end(); ++it) { |
| 69 EXPECT_NE(blocked_languages.end(), | 70 EXPECT_NE(blocked_languages.end(), std::find(blocked_languages.begin(), |
| 70 std::find(blocked_languages.begin(), | 71 blocked_languages.end(), *it)); |
| 71 blocked_languages.end(), | |
| 72 *it)); | |
| 73 } | 72 } |
| 74 } | 73 } |
| 75 | 74 |
| 76 TEST(TranslatePrefsTest, CreateBlockedLanguagesNonEnglishUI) { | 75 TEST(TranslatePrefsTest, CreateBlockedLanguagesNonEnglishUI) { |
| 77 std::vector<std::string> blacklisted_languages; | 76 std::vector<std::string> blacklisted_languages; |
| 78 blacklisted_languages.push_back("fr"); | 77 blacklisted_languages.push_back("fr"); |
| 79 | 78 |
| 80 std::vector<std::string> accept_languages; | 79 std::vector<std::string> accept_languages; |
| 81 accept_languages.push_back("en"); | 80 accept_languages.push_back("en"); |
| 82 accept_languages.push_back("ja"); | 81 accept_languages.push_back("ja"); |
| 83 accept_languages.push_back("zh"); | 82 accept_languages.push_back("zh"); |
| 84 | 83 |
| 85 // Run in an English locale. | 84 // Run in an English locale. |
| 86 { | 85 { |
| 87 TranslateDownloadManager::GetInstance()->set_application_locale("en"); | 86 TranslateDownloadManager::GetInstance()->set_application_locale("en"); |
| 88 std::vector<std::string> blocked_languages; | 87 std::vector<std::string> blocked_languages; |
| 89 TranslatePrefs::CreateBlockedLanguages(&blocked_languages, | 88 TranslatePrefs::CreateBlockedLanguages( |
| 90 blacklisted_languages, | 89 &blocked_languages, blacklisted_languages, accept_languages); |
| 91 accept_languages); | |
| 92 std::vector<std::string> expected; | 90 std::vector<std::string> expected; |
| 93 expected.push_back("en"); | 91 expected.push_back("en"); |
| 94 expected.push_back("fr"); | 92 expected.push_back("fr"); |
| 95 expected.push_back("ja"); | 93 expected.push_back("ja"); |
| 96 expected.push_back("zh"); | 94 expected.push_back("zh"); |
| 97 | 95 |
| 98 EXPECT_EQ(expected.size(), blocked_languages.size()); | 96 EXPECT_EQ(expected.size(), blocked_languages.size()); |
| 99 for (std::vector<std::string>::const_iterator it = expected.begin(); | 97 for (std::vector<std::string>::const_iterator it = expected.begin(); |
| 100 it != expected.end(); ++it) { | 98 it != expected.end(); ++it) { |
| 101 EXPECT_NE(blocked_languages.end(), | 99 EXPECT_NE( |
| 102 std::find(blocked_languages.begin(), | 100 blocked_languages.end(), |
| 103 blocked_languages.end(), | 101 std::find(blocked_languages.begin(), blocked_languages.end(), *it)); |
| 104 *it)); | |
| 105 } | 102 } |
| 106 } | 103 } |
| 107 | 104 |
| 108 // Run in a Japanese locale. | 105 // Run in a Japanese locale. |
| 109 // English should not be included in the result even though Accept Languages | 106 // English should not be included in the result even though Accept Languages |
| 110 // has English because the UI is not English. | 107 // has English because the UI is not English. |
| 111 { | 108 { |
| 112 TranslateDownloadManager::GetInstance()->set_application_locale("ja"); | 109 TranslateDownloadManager::GetInstance()->set_application_locale("ja"); |
| 113 std::vector<std::string> blocked_languages; | 110 std::vector<std::string> blocked_languages; |
| 114 TranslatePrefs::CreateBlockedLanguages(&blocked_languages, | 111 TranslatePrefs::CreateBlockedLanguages( |
| 115 blacklisted_languages, | 112 &blocked_languages, blacklisted_languages, accept_languages); |
| 116 accept_languages); | |
| 117 std::vector<std::string> expected; | 113 std::vector<std::string> expected; |
| 118 expected.push_back("fr"); | 114 expected.push_back("fr"); |
| 119 expected.push_back("ja"); | 115 expected.push_back("ja"); |
| 120 expected.push_back("zh"); | 116 expected.push_back("zh"); |
| 121 | 117 |
| 122 EXPECT_EQ(expected.size(), blocked_languages.size()); | 118 EXPECT_EQ(expected.size(), blocked_languages.size()); |
| 123 for (std::vector<std::string>::const_iterator it = expected.begin(); | 119 for (std::vector<std::string>::const_iterator it = expected.begin(); |
| 124 it != expected.end(); ++it) { | 120 it != expected.end(); ++it) { |
| 125 EXPECT_NE(blocked_languages.end(), | 121 EXPECT_NE( |
| 126 std::find(blocked_languages.begin(), | 122 blocked_languages.end(), |
| 127 blocked_languages.end(), | 123 std::find(blocked_languages.begin(), blocked_languages.end(), *it)); |
| 128 *it)); | |
| 129 } | 124 } |
| 130 } | 125 } |
| 131 } | 126 } |
| 132 | 127 |
| 133 class TranslatePrefTest : public testing::Test { | 128 class TranslatePrefTest : public testing::Test { |
| 134 protected: | 129 protected: |
| 135 TranslatePrefTest() : prefs_(new user_prefs::TestingPrefServiceSyncable()) { | 130 TranslatePrefTest() : prefs_(new user_prefs::TestingPrefServiceSyncable()) { |
| 136 #if defined(OS_CHROMEOS) | 131 #if defined(OS_CHROMEOS) |
| 137 const char* preferred_languages_prefs = | 132 const char* preferred_languages_prefs = |
| 138 "settings.language.preferred_languages"; | 133 "settings.language.preferred_languages"; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 149 void SetLastDeniedTime(const std::string& language, base::Time time) { | 144 void SetLastDeniedTime(const std::string& language, base::Time time) { |
| 150 DenialTimeUpdate update(prefs_.get(), language, 2); | 145 DenialTimeUpdate update(prefs_.get(), language, 2); |
| 151 update.AddDenialTime(time); | 146 update.AddDenialTime(time); |
| 152 } | 147 } |
| 153 | 148 |
| 154 base::Time GetLastDeniedTime(const std::string& language) { | 149 base::Time GetLastDeniedTime(const std::string& language) { |
| 155 DenialTimeUpdate update(prefs_.get(), language, 2); | 150 DenialTimeUpdate update(prefs_.get(), language, 2); |
| 156 return update.GetOldestDenialTime(); | 151 return update.GetOldestDenialTime(); |
| 157 } | 152 } |
| 158 | 153 |
| 154 void SetUp() override { |
| 155 base::FeatureList::ClearInstanceForTesting(); |
| 156 base::FeatureList::SetInstance(base::WrapUnique(new base::FeatureList())); |
| 157 } |
| 158 |
| 159 void TurnOnTranslate2016Q2UIFlag() { |
| 160 base::FeatureList::ClearInstanceForTesting(); |
| 161 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); |
| 162 feature_list->InitializeFromCommandLine(translate::kTranslateUI2016Q2.name, |
| 163 std::string()); |
| 164 base::FeatureList::SetInstance(std::move(feature_list)); |
| 165 } |
| 166 |
| 159 std::unique_ptr<user_prefs::TestingPrefServiceSyncable> prefs_; | 167 std::unique_ptr<user_prefs::TestingPrefServiceSyncable> prefs_; |
| 160 std::unique_ptr<translate::TranslatePrefs> translate_prefs_; | 168 std::unique_ptr<translate::TranslatePrefs> translate_prefs_; |
| 161 | 169 |
| 162 // Shared time constants. | 170 // Shared time constants. |
| 163 base::Time now_; | 171 base::Time now_; |
| 164 base::Time two_days_ago_; | 172 base::Time two_days_ago_; |
| 165 }; | 173 }; |
| 166 | 174 |
| 175 TEST_F(TranslatePrefTest, IsTooOftenDeniedIn2016Q2UI) { |
| 176 TurnOnTranslate2016Q2UIFlag(); |
| 177 |
| 178 translate_prefs_->ResetDenialState(); |
| 179 EXPECT_FALSE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); |
| 180 |
| 181 for (int i = 0; i < 3; i++) { |
| 182 translate_prefs_->IncrementTranslationDeniedCount(kTestLanguage); |
| 183 EXPECT_FALSE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); |
| 184 } |
| 185 |
| 186 translate_prefs_->IncrementTranslationDeniedCount(kTestLanguage); |
| 187 EXPECT_TRUE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); |
| 188 } |
| 189 |
| 190 TEST_F(TranslatePrefTest, IsTooOftenIgnoredIn2016Q2UI) { |
| 191 TurnOnTranslate2016Q2UIFlag(); |
| 192 |
| 193 translate_prefs_->ResetDenialState(); |
| 194 EXPECT_FALSE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); |
| 195 |
| 196 for (int i = 0; i < 10; i++) { |
| 197 translate_prefs_->IncrementTranslationIgnoredCount(kTestLanguage); |
| 198 EXPECT_FALSE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); |
| 199 } |
| 200 |
| 201 translate_prefs_->IncrementTranslationIgnoredCount(kTestLanguage); |
| 202 EXPECT_TRUE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); |
| 203 } |
| 204 |
| 167 TEST_F(TranslatePrefTest, UpdateLastDeniedTime) { | 205 TEST_F(TranslatePrefTest, UpdateLastDeniedTime) { |
| 168 // Test that denials with more than 24 hours difference between them do not | 206 // Test that denials with more than 24 hours difference between them do not |
| 169 // block the language. | 207 // block the language. |
| 170 translate_prefs_->ResetDenialState(); | 208 translate_prefs_->ResetDenialState(); |
| 171 SetLastDeniedTime(kTestLanguage, two_days_ago_); | 209 SetLastDeniedTime(kTestLanguage, two_days_ago_); |
| 172 ASSERT_FALSE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); | 210 ASSERT_FALSE(translate_prefs_->IsTooOftenDenied(kTestLanguage)); |
| 173 translate_prefs_->UpdateLastDeniedTime(kTestLanguage); | 211 translate_prefs_->UpdateLastDeniedTime(kTestLanguage); |
| 174 base::Time last_denied = GetLastDeniedTime(kTestLanguage); | 212 base::Time last_denied = GetLastDeniedTime(kTestLanguage); |
| 175 EXPECT_FALSE(last_denied.is_max()); | 213 EXPECT_FALSE(last_denied.is_max()); |
| 176 EXPECT_GE(last_denied, now_); | 214 EXPECT_GE(last_denied, now_); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 TEST_F(TranslatePrefTest, DenialTimeUpdate_DefaultTimeIsNull) { | 246 TEST_F(TranslatePrefTest, DenialTimeUpdate_DefaultTimeIsNull) { |
| 209 DenialTimeUpdate update(prefs_.get(), kTestLanguage, 2); | 247 DenialTimeUpdate update(prefs_.get(), kTestLanguage, 2); |
| 210 EXPECT_TRUE(update.GetOldestDenialTime().is_null()); | 248 EXPECT_TRUE(update.GetOldestDenialTime().is_null()); |
| 211 } | 249 } |
| 212 | 250 |
| 213 // Test that non-existing entries automatically create a ListValue. | 251 // Test that non-existing entries automatically create a ListValue. |
| 214 TEST_F(TranslatePrefTest, DenialTimeUpdate_ForceListExistence) { | 252 TEST_F(TranslatePrefTest, DenialTimeUpdate_ForceListExistence) { |
| 215 DictionaryPrefUpdate dict_update( | 253 DictionaryPrefUpdate dict_update( |
| 216 prefs_.get(), TranslatePrefs::kPrefTranslateLastDeniedTimeForLanguage); | 254 prefs_.get(), TranslatePrefs::kPrefTranslateLastDeniedTimeForLanguage); |
| 217 base::DictionaryValue* denial_dict = dict_update.Get(); | 255 base::DictionaryValue* denial_dict = dict_update.Get(); |
| 218 ASSERT_TRUE(denial_dict); | 256 EXPECT_TRUE(denial_dict); |
| 219 | 257 |
| 220 base::ListValue* list_value = nullptr; | 258 base::ListValue* list_value = nullptr; |
| 221 bool has_list = denial_dict->GetList(kTestLanguage, &list_value); | 259 bool has_list = denial_dict->GetList(kTestLanguage, &list_value); |
| 222 ASSERT_FALSE(has_list); | 260 EXPECT_FALSE(has_list); |
| 223 | 261 |
| 224 // Calling GetDenialTimes will force creation of a properly populated list. | 262 // Calling GetDenialTimes will force creation of a properly populated list. |
| 225 DenialTimeUpdate update(prefs_.get(), kTestLanguage, 2); | 263 DenialTimeUpdate update(prefs_.get(), kTestLanguage, 2); |
| 226 base::ListValue* time_list = update.GetDenialTimes(); | 264 base::ListValue* time_list = update.GetDenialTimes(); |
| 227 ASSERT_TRUE(time_list); | 265 EXPECT_TRUE(time_list); |
| 228 EXPECT_EQ(0U, time_list->GetSize()); | 266 EXPECT_EQ(0U, time_list->GetSize()); |
| 229 } | 267 } |
| 230 | 268 |
| 231 // Test that an existing update time record (which is a double in a dict) | 269 // Test that an existing update time record (which is a double in a dict) |
| 232 // is automatically migrated to a list of update times instead. | 270 // is automatically migrated to a list of update times instead. |
| 233 TEST_F(TranslatePrefTest, DenialTimeUpdate_Migrate) { | 271 TEST_F(TranslatePrefTest, DenialTimeUpdate_Migrate) { |
| 234 translate_prefs_->ResetDenialState(); | 272 translate_prefs_->ResetDenialState(); |
| 235 DictionaryPrefUpdate dict_update( | 273 DictionaryPrefUpdate dict_update( |
| 236 prefs_.get(), TranslatePrefs::kPrefTranslateLastDeniedTimeForLanguage); | 274 prefs_.get(), TranslatePrefs::kPrefTranslateLastDeniedTimeForLanguage); |
| 237 base::DictionaryValue* denial_dict = dict_update.Get(); | 275 base::DictionaryValue* denial_dict = dict_update.Get(); |
| 238 ASSERT_TRUE(denial_dict); | 276 EXPECT_TRUE(denial_dict); |
| 239 denial_dict->SetDouble(kTestLanguage, two_days_ago_.ToJsTime()); | 277 denial_dict->SetDouble(kTestLanguage, two_days_ago_.ToJsTime()); |
| 240 | 278 |
| 241 base::ListValue* list_value = nullptr; | 279 base::ListValue* list_value = nullptr; |
| 242 bool has_list = denial_dict->GetList(kTestLanguage, &list_value); | 280 bool has_list = denial_dict->GetList(kTestLanguage, &list_value); |
| 243 ASSERT_FALSE(has_list); | 281 EXPECT_FALSE(has_list); |
| 244 | 282 |
| 245 // Calling GetDenialTimes will force creation of a properly populated list. | 283 // Calling GetDenialTimes will force creation of a properly populated list. |
| 246 DenialTimeUpdate update(prefs_.get(), kTestLanguage, 2); | 284 DenialTimeUpdate update(prefs_.get(), kTestLanguage, 2); |
| 247 base::ListValue* time_list = update.GetDenialTimes(); | 285 base::ListValue* time_list = update.GetDenialTimes(); |
| 248 ASSERT_TRUE(time_list); | 286 EXPECT_TRUE(time_list); |
| 249 | 287 |
| 250 has_list = denial_dict->GetList(kTestLanguage, &list_value); | 288 has_list = denial_dict->GetList(kTestLanguage, &list_value); |
| 251 ASSERT_TRUE(has_list); | 289 EXPECT_TRUE(has_list); |
| 252 EXPECT_EQ(time_list, list_value); | 290 EXPECT_EQ(time_list, list_value); |
| 253 EXPECT_EQ(1U, time_list->GetSize()); | 291 EXPECT_EQ(1U, time_list->GetSize()); |
| 254 EXPECT_EQ(two_days_ago_, update.GetOldestDenialTime()); | 292 EXPECT_EQ(two_days_ago_, update.GetOldestDenialTime()); |
| 255 } | 293 } |
| 256 | 294 |
| 257 TEST_F(TranslatePrefTest, DenialTimeUpdate_SlidingWindow) { | 295 TEST_F(TranslatePrefTest, DenialTimeUpdate_SlidingWindow) { |
| 258 DenialTimeUpdate update(prefs_.get(), kTestLanguage, 4); | 296 DenialTimeUpdate update(prefs_.get(), kTestLanguage, 4); |
| 259 | 297 |
| 260 update.AddDenialTime(now_ - base::TimeDelta::FromMinutes(5)); | 298 update.AddDenialTime(now_ - base::TimeDelta::FromMinutes(5)); |
| 261 EXPECT_EQ(update.GetOldestDenialTime(), | 299 EXPECT_EQ(update.GetOldestDenialTime(), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 276 update.AddDenialTime(now_); | 314 update.AddDenialTime(now_); |
| 277 EXPECT_EQ(update.GetOldestDenialTime(), | 315 EXPECT_EQ(update.GetOldestDenialTime(), |
| 278 now_ - base::TimeDelta::FromMinutes(3)); | 316 now_ - base::TimeDelta::FromMinutes(3)); |
| 279 | 317 |
| 280 update.AddDenialTime(now_); | 318 update.AddDenialTime(now_); |
| 281 EXPECT_EQ(update.GetOldestDenialTime(), | 319 EXPECT_EQ(update.GetOldestDenialTime(), |
| 282 now_ - base::TimeDelta::FromMinutes(2)); | 320 now_ - base::TimeDelta::FromMinutes(2)); |
| 283 } | 321 } |
| 284 | 322 |
| 285 } // namespace translate | 323 } // namespace translate |
| OLD | NEW |