| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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_manager.h" | 5 #include "components/translate/core/browser/translate_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/json/json_reader.h" | 9 #include "base/json/json_reader.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| 11 #include "base/run_loop.h" | 11 #include "base/run_loop.h" |
| 12 #include "base/test/histogram_tester.h" | 12 #include "base/test/histogram_tester.h" |
| 13 #include "base/test/scoped_feature_list.h" | 13 #include "base/test/scoped_feature_list.h" |
| 14 #include "build/build_config.h" | 14 #include "build/build_config.h" |
| 15 #include "components/infobars/core/infobar.h" | 15 #include "components/infobars/core/infobar.h" |
| 16 #include "components/metrics/proto/translate_event.pb.h" |
| 16 #include "components/pref_registry/pref_registry_syncable.h" | 17 #include "components/pref_registry/pref_registry_syncable.h" |
| 17 #include "components/sync_preferences/testing_pref_service_syncable.h" | 18 #include "components/sync_preferences/testing_pref_service_syncable.h" |
| 18 #include "components/translate/core/browser/mock_translate_driver.h" | 19 #include "components/translate/core/browser/mock_translate_driver.h" |
| 19 #include "components/translate/core/browser/mock_translate_ranker.h" | 20 #include "components/translate/core/browser/mock_translate_ranker.h" |
| 20 #include "components/translate/core/browser/translate_browser_metrics.h" | 21 #include "components/translate/core/browser/translate_browser_metrics.h" |
| 21 #include "components/translate/core/browser/translate_client.h" | 22 #include "components/translate/core/browser/translate_client.h" |
| 22 #include "components/translate/core/browser/translate_download_manager.h" | 23 #include "components/translate/core/browser/translate_download_manager.h" |
| 23 #include "components/translate/core/browser/translate_pref_names.h" | 24 #include "components/translate/core/browser/translate_pref_names.h" |
| 24 #include "components/translate/core/browser/translate_prefs.h" | 25 #include "components/translate/core/browser/translate_prefs.h" |
| 25 #include "components/variations/variations_associated_data.h" | 26 #include "components/variations/variations_associated_data.h" |
| 26 #include "net/base/network_change_notifier.h" | 27 #include "net/base/network_change_notifier.h" |
| 27 #include "testing/gmock/include/gmock/gmock.h" | 28 #include "testing/gmock/include/gmock/gmock.h" |
| 28 #include "testing/gtest/include/gtest/gtest.h" | 29 #include "testing/gtest/include/gtest/gtest.h" |
| 29 | 30 |
| 30 using testing::_; | 31 using testing::_; |
| 31 using testing::Return; | 32 using testing::Return; |
| 32 using testing::SetArgPointee; | 33 using testing::SetArgPointee; |
| 34 using testing::Pointee; |
| 33 | 35 |
| 34 namespace translate { | 36 namespace translate { |
| 35 | 37 |
| 36 namespace { | 38 namespace { |
| 37 | 39 |
| 38 const char kTrialName[] = "MyTrial"; | 40 const char kTrialName[] = "MyTrial"; |
| 39 | 41 |
| 40 #if defined(OS_CHROMEOS) | 42 #if defined(OS_CHROMEOS) |
| 41 const char kLanguagePreferredLanguages[] = | 43 const char kLanguagePreferredLanguages[] = |
| 42 "settings.language.preferred_languages"; | 44 "settings.language.preferred_languages"; |
| 43 #else | 45 #else |
| 44 const char* kLanguagePreferredLanguages = nullptr; | 46 const char* kLanguagePreferredLanguages = nullptr; |
| 45 #endif | 47 #endif |
| 46 const char kAcceptLanguages[] = "intl.accept_languages"; | 48 const char kAcceptLanguages[] = "intl.accept_languages"; |
| 47 | 49 |
| 48 // Overrides NetworkChangeNotifier, simulatng connection type changes for tests. | 50 // Overrides NetworkChangeNotifier, simulating connection type changes |
| 51 // for tests. |
| 49 // TODO(groby): Combine with similar code in ResourceRequestAllowedNotifierTest. | 52 // TODO(groby): Combine with similar code in ResourceRequestAllowedNotifierTest. |
| 50 class TestNetworkChangeNotifier : public net::NetworkChangeNotifier { | 53 class TestNetworkChangeNotifier : public net::NetworkChangeNotifier { |
| 51 public: | 54 public: |
| 52 TestNetworkChangeNotifier() | 55 TestNetworkChangeNotifier() |
| 53 : net::NetworkChangeNotifier(), | 56 : net::NetworkChangeNotifier(), |
| 54 connection_type_to_return_( | 57 connection_type_to_return_( |
| 55 net::NetworkChangeNotifier::CONNECTION_UNKNOWN) {} | 58 net::NetworkChangeNotifier::CONNECTION_UNKNOWN) {} |
| 56 | 59 |
| 57 // Simulates a change of the connection type to |type|. This will notify any | 60 // Simulates a change of the connection type to |type|. This will notify any |
| 58 // objects that are NetworkChangeNotifiers. | 61 // objects that are NetworkChangeNotifiers. |
| 59 void SimulateNetworkConnectionChange( | 62 void SimulateNetworkConnectionChange( |
| 60 net::NetworkChangeNotifier::ConnectionType type) { | 63 net::NetworkChangeNotifier::ConnectionType type) { |
| 61 connection_type_to_return_ = type; | 64 connection_type_to_return_ = type; |
| 62 net::NetworkChangeNotifier::NotifyObserversOfConnectionTypeChangeForTests( | 65 net::NetworkChangeNotifier::NotifyObserversOfConnectionTypeChangeForTests( |
| 63 connection_type_to_return_); | 66 connection_type_to_return_); |
| 64 base::RunLoop().RunUntilIdle(); | 67 base::RunLoop().RunUntilIdle(); |
| 65 } | 68 } |
| 66 | 69 |
| 67 void SimulateOffline() { | 70 void SimulateOffline() { |
| 68 connection_type_to_return_ =net::NetworkChangeNotifier::CONNECTION_NONE; | 71 connection_type_to_return_ = net::NetworkChangeNotifier::CONNECTION_NONE; |
| 69 } | 72 } |
| 70 | 73 |
| 71 void SimulateOnline() { | 74 void SimulateOnline() { |
| 72 connection_type_to_return_ = net::NetworkChangeNotifier::CONNECTION_UNKNOWN; | 75 connection_type_to_return_ = net::NetworkChangeNotifier::CONNECTION_UNKNOWN; |
| 73 } | 76 } |
| 74 | 77 |
| 75 private: | 78 private: |
| 76 ConnectionType GetCurrentConnectionType() const override { | 79 ConnectionType GetCurrentConnectionType() const override { |
| 77 return connection_type_to_return_; | 80 return connection_type_to_return_; |
| 78 } | 81 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 | 124 |
| 122 MOCK_METHOD1(IsTranslatableURL, bool(const GURL&)); | 125 MOCK_METHOD1(IsTranslatableURL, bool(const GURL&)); |
| 123 MOCK_METHOD1(ShowReportLanguageDetectionErrorUI, | 126 MOCK_METHOD1(ShowReportLanguageDetectionErrorUI, |
| 124 void(const GURL& report_url)); | 127 void(const GURL& report_url)); |
| 125 | 128 |
| 126 private: | 129 private: |
| 127 TranslateDriver* driver_; | 130 TranslateDriver* driver_; |
| 128 PrefService* prefs_; | 131 PrefService* prefs_; |
| 129 }; | 132 }; |
| 130 | 133 |
| 134 // Compares TranslateEventProto on a restricted set of fields. |
| 135 MATCHER_P(EqualsTranslateEventProto, translate_event, "") { |
| 136 const metrics::TranslateEventProto& tep(translate_event); |
| 137 return (arg.source_language() == tep.source_language() && |
| 138 arg.target_language() == tep.target_language() && |
| 139 arg.event_type() == tep.event_type()); |
| 140 } |
| 141 |
| 131 } // namespace | 142 } // namespace |
| 132 | 143 |
| 133 namespace testing { | 144 namespace testing { |
| 134 | 145 |
| 135 class TranslateManagerTest : public ::testing::Test { | 146 class TranslateManagerTest : public ::testing::Test { |
| 136 protected: | 147 protected: |
| 137 TranslateManagerTest() | 148 TranslateManagerTest() |
| 138 : translate_prefs_(&prefs_, | 149 : translate_prefs_(&prefs_, |
| 139 kAcceptLanguages, | 150 kAcceptLanguages, |
| 140 kLanguagePreferredLanguages), | 151 kLanguagePreferredLanguages), |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 | 194 |
| 184 std::unique_ptr<base::Value> CreateProfileFromJSON(const char* json) { | 195 std::unique_ptr<base::Value> CreateProfileFromJSON(const char* json) { |
| 185 int error_code = 0; | 196 int error_code = 0; |
| 186 std::string error_msg; | 197 std::string error_msg; |
| 187 int error_line = 0; | 198 int error_line = 0; |
| 188 int error_column = 0; | 199 int error_column = 0; |
| 189 | 200 |
| 190 std::unique_ptr<base::Value> profile(base::JSONReader::ReadAndReturnError( | 201 std::unique_ptr<base::Value> profile(base::JSONReader::ReadAndReturnError( |
| 191 json, 0, &error_code, &error_msg, &error_line, &error_column)); | 202 json, 0, &error_code, &error_msg, &error_line, &error_column)); |
| 192 | 203 |
| 193 EXPECT_EQ(0, error_code) << error_msg << " at " << error_line << ":" | 204 EXPECT_EQ(0, error_code) |
| 194 << error_column << std::endl | 205 << error_msg << " at " << error_line << ":" << error_column << std::endl |
| 195 << json; | 206 << json; |
| 196 return profile; | 207 return profile; |
| 197 } | 208 } |
| 198 | 209 |
| 199 void TurnOnTranslateByULP() { | 210 void TurnOnTranslateByULP() { |
| 200 scoped_refptr<base::FieldTrial> trial( | 211 scoped_refptr<base::FieldTrial> trial( |
| 201 CreateFieldTrial(kTrialName, 100, "Enabled", NULL)); | 212 CreateFieldTrial(kTrialName, 100, "Enabled", NULL)); |
| 202 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); | 213 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); |
| 203 feature_list->RegisterFieldTrialOverride( | 214 feature_list->RegisterFieldTrialOverride( |
| 204 translate::kTranslateLanguageByULP.name, | 215 translate::kTranslateLanguageByULP.name, |
| 205 base::FeatureList::OVERRIDE_ENABLE_FEATURE, trial.get()); | 216 base::FeatureList::OVERRIDE_ENABLE_FEATURE, trial.get()); |
| 206 scoped_feature_list_.InitWithFeatureList(std::move(feature_list)); | 217 scoped_feature_list_.InitWithFeatureList(std::move(feature_list)); |
| 207 } | 218 } |
| 208 | 219 |
| 209 scoped_refptr<base::FieldTrial> CreateFieldTrial( | 220 scoped_refptr<base::FieldTrial> CreateFieldTrial( |
| 210 const std::string& trial_name, | 221 const std::string& trial_name, |
| 211 int total_probability, | 222 int total_probability, |
| 212 const std::string& default_group_name, | 223 const std::string& default_group_name, |
| 213 int* default_group_number) { | 224 int* default_group_number) { |
| 214 return base::FieldTrialList::FactoryGetFieldTrial( | 225 return base::FieldTrialList::FactoryGetFieldTrial( |
| 215 trial_name, total_probability, default_group_name, | 226 trial_name, total_probability, default_group_name, |
| 216 base::FieldTrialList::kNoExpirationYear, 1, 1, | 227 base::FieldTrialList::kNoExpirationYear, 1, 1, |
| 217 base::FieldTrial::SESSION_RANDOMIZED, default_group_number); | 228 base::FieldTrial::SESSION_RANDOMIZED, default_group_number); |
| 218 } | 229 } |
| 219 | 230 |
| 231 void SetHasLanguageChanged(bool has_language_changed) { |
| 232 translate_manager_->GetLanguageState().LanguageDetermined("de", true); |
| 233 translate_manager_->GetLanguageState().DidNavigate(false, true, false); |
| 234 translate_manager_->GetLanguageState().LanguageDetermined( |
| 235 has_language_changed ? "en" : "de", true); |
| 236 EXPECT_EQ(has_language_changed, |
| 237 translate_manager_->GetLanguageState().HasLanguageChanged()); |
| 238 } |
| 239 |
| 240 void SetLanguageTooOftenDenied(const std::string& language) { |
| 241 if (base::FeatureList::IsEnabled(kTranslateUI2016Q2)) { |
| 242 translate_prefs_.ResetDenialState(); |
| 243 for (int i = 0; i < 4; i++) { |
| 244 translate_prefs_.IncrementTranslationDeniedCount(language); |
| 245 } |
| 246 } else { |
| 247 translate_prefs_.UpdateLastDeniedTime(language); |
| 248 translate_prefs_.UpdateLastDeniedTime(language); |
| 249 } |
| 250 |
| 251 EXPECT_TRUE(translate_prefs_.IsTooOftenDenied(language)); |
| 252 EXPECT_FALSE(translate_prefs_.IsTooOftenDenied("other_language")); |
| 253 } |
| 254 |
| 220 // Functions to help TEST_F in subclass to access private functions in | 255 // Functions to help TEST_F in subclass to access private functions in |
| 221 // TranslteManager so we can unit test them. | 256 // TranslateManager so we can unit test them. |
| 222 std::string CallGetTargetLanguageFromULP() { | 257 std::string CallGetTargetLanguageFromULP() { |
| 223 return TranslateManager::GetTargetLanguageFromULP(&translate_prefs_); | 258 return TranslateManager::GetTargetLanguageFromULP(&translate_prefs_); |
| 224 } | 259 } |
| 225 bool CallLanguageInULP(const std::string& language) { | 260 bool CallLanguageInULP(const std::string& language) { |
| 226 return translate_manager_->LanguageInULP(language); | 261 return translate_manager_->LanguageInULP(language); |
| 227 } | 262 } |
| 263 void InitTranslateEvent(const std::string& src_lang, |
| 264 const std::string& dst_lang) { |
| 265 translate_manager_->InitTranslateEvent(src_lang, dst_lang, |
| 266 translate_prefs_); |
| 267 } |
| 228 | 268 |
| 229 sync_preferences::TestingPrefServiceSyncable prefs_; | 269 sync_preferences::TestingPrefServiceSyncable prefs_; |
| 230 | 270 |
| 231 // TODO(groby): request TranslatePrefs from |mock_translate_client_| instead. | 271 // TODO(groby): request TranslatePrefs from |mock_translate_client_| instead. |
| 232 TranslatePrefs translate_prefs_; | 272 TranslatePrefs translate_prefs_; |
| 233 TranslateDownloadManager* manager_; | 273 TranslateDownloadManager* manager_; |
| 234 | 274 |
| 235 TestNetworkChangeNotifier network_notifier_; | 275 TestNetworkChangeNotifier network_notifier_; |
| 236 translate::testing::MockTranslateDriver driver_; | 276 translate::testing::MockTranslateDriver driver_; |
| 237 translate::testing::MockTranslateRanker mock_translate_ranker_; | 277 translate::testing::MockTranslateRanker mock_translate_ranker_; |
| 238 ::testing::NiceMock<MockTranslateClient> mock_translate_client_; | 278 ::testing::NiceMock<MockTranslateClient> mock_translate_client_; |
| 239 std::unique_ptr<TranslateManager> translate_manager_; | 279 std::unique_ptr<TranslateManager> translate_manager_; |
| 240 std::unique_ptr<base::FieldTrialList> field_trial_list_; | 280 std::unique_ptr<base::FieldTrialList> field_trial_list_; |
| 241 base::test::ScopedFeatureList scoped_feature_list_; | 281 base::test::ScopedFeatureList scoped_feature_list_; |
| 242 }; | 282 }; |
| 243 | 283 |
| 244 | |
| 245 // Target language comes from application locale if the locale's language | 284 // Target language comes from application locale if the locale's language |
| 246 // is supported. | 285 // is supported. |
| 247 TEST_F(TranslateManagerTest, GetTargetLanguageDefaultsToAppLocale) { | 286 TEST_F(TranslateManagerTest, GetTargetLanguageDefaultsToAppLocale) { |
| 248 // Ensure the locale is set to a supported language. | 287 // Ensure the locale is set to a supported language. |
| 249 ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("en")); | 288 ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("en")); |
| 250 manager_->set_application_locale("en"); | 289 manager_->set_application_locale("en"); |
| 251 EXPECT_EQ("en", TranslateManager::GetTargetLanguage(&translate_prefs_)); | 290 EXPECT_EQ("en", TranslateManager::GetTargetLanguage(&translate_prefs_)); |
| 252 | 291 |
| 253 // Try a second supported language. | 292 // Try a second supported language. |
| 254 ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("de")); | 293 ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("de")); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 1); | 368 1); |
| 330 } | 369 } |
| 331 | 370 |
| 332 // Utility function to set the threshold params | 371 // Utility function to set the threshold params |
| 333 void ChangeThresholdInParams( | 372 void ChangeThresholdInParams( |
| 334 const char* initiate_translation_confidence_threshold, | 373 const char* initiate_translation_confidence_threshold, |
| 335 const char* initiate_translation_probability_threshold, | 374 const char* initiate_translation_probability_threshold, |
| 336 const char* target_language_confidence_threshold, | 375 const char* target_language_confidence_threshold, |
| 337 const char* target_language_probability_threshold) { | 376 const char* target_language_probability_threshold) { |
| 338 ASSERT_TRUE(variations::AssociateVariationParams( | 377 ASSERT_TRUE(variations::AssociateVariationParams( |
| 339 kTrialName, "Enabled", {{"initiate_translation_ulp_confidence_threshold", | 378 kTrialName, "Enabled", |
| 340 initiate_translation_confidence_threshold}, | 379 {{"initiate_translation_ulp_confidence_threshold", |
| 341 {"initiate_translation_ulp_probability_threshold", | 380 initiate_translation_confidence_threshold}, |
| 342 initiate_translation_probability_threshold}, | 381 {"initiate_translation_ulp_probability_threshold", |
| 343 {"target_language_ulp_confidence_threshold", | 382 initiate_translation_probability_threshold}, |
| 344 target_language_confidence_threshold}, | 383 {"target_language_ulp_confidence_threshold", |
| 345 {"target_language_ulp_probability_threshold", | 384 target_language_confidence_threshold}, |
| 346 target_language_probability_threshold}})); | 385 {"target_language_ulp_probability_threshold", |
| 386 target_language_probability_threshold}})); |
| 347 } | 387 } |
| 348 | 388 |
| 349 // Normal ULP in Json | 389 // Normal ULP in Json |
| 350 const char ulp_1[] = | 390 const char ulp_1[] = |
| 351 "{\n" | 391 "{\n" |
| 352 " \"reading\": {\n" | 392 " \"reading\": {\n" |
| 353 " \"confidence\": 0.8,\n" | 393 " \"confidence\": 0.8,\n" |
| 354 " \"preference\": [\n" | 394 " \"preference\": [\n" |
| 355 " {\n" | 395 " {\n" |
| 356 " \"language\": \"fr\",\n" | 396 " \"language\": \"fr\",\n" |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 // to 0.9. | 496 // to 0.9. |
| 457 EXPECT_FALSE(CallLanguageInULP("fr")); | 497 EXPECT_FALSE(CallLanguageInULP("fr")); |
| 458 EXPECT_FALSE(CallLanguageInULP("pt")); | 498 EXPECT_FALSE(CallLanguageInULP("pt")); |
| 459 EXPECT_FALSE(CallLanguageInULP("zh-TW")); | 499 EXPECT_FALSE(CallLanguageInULP("zh-TW")); |
| 460 } | 500 } |
| 461 | 501 |
| 462 TEST_F(TranslateManagerTest, | 502 TEST_F(TranslateManagerTest, |
| 463 TestLanguageInULPLowConfidenceThresholdFromConfig) { | 503 TestLanguageInULPLowConfidenceThresholdFromConfig) { |
| 464 PrepareULPTest(ulp_1, true); | 504 PrepareULPTest(ulp_1, true); |
| 465 ChangeThresholdInParams("0.79", "0.39", "", ""); | 505 ChangeThresholdInParams("0.79", "0.39", "", ""); |
| 466 // Both "fr" and "pt" should reutrn true because the confidence threshold is | 506 // Both "fr" and "pt" should return true because the confidence threshold is |
| 467 // 0.79 and lower than 0.8 and the probability threshold is lower than both | 507 // 0.79 and lower than 0.8 and the probability threshold is lower than both |
| 468 // the one with "fr" (0.6) and "pt-PT" (0.4). | 508 // the one with "fr" (0.6) and "pt-PT" (0.4). |
| 469 EXPECT_TRUE(CallLanguageInULP("fr")); | 509 EXPECT_TRUE(CallLanguageInULP("fr")); |
| 470 EXPECT_TRUE(CallLanguageInULP("pt")); | 510 EXPECT_TRUE(CallLanguageInULP("pt")); |
| 471 EXPECT_FALSE(CallLanguageInULP("zh-TW")); | 511 EXPECT_FALSE(CallLanguageInULP("zh-TW")); |
| 472 } | 512 } |
| 473 | 513 |
| 514 TEST_F(TranslateManagerTest, TestRecordTranslateEvent) { |
| 515 PrepareTranslateManager(); |
| 516 const std::string locale = "zh-TW"; |
| 517 const std::string page_lang = "zh-CN"; |
| 518 metrics::TranslateEventProto expected_tep; |
| 519 expected_tep.set_target_language(locale); |
| 520 expected_tep.set_source_language(page_lang); |
| 521 EXPECT_CALL( |
| 522 mock_translate_ranker_, |
| 523 RecordTranslateEvent(metrics::TranslateEventProto::USER_ACCEPT, _, |
| 524 Pointee(EqualsTranslateEventProto(expected_tep)))) |
| 525 .Times(1); |
| 526 |
| 527 InitTranslateEvent(page_lang, locale); |
| 528 translate_manager_->RecordTranslateEvent( |
| 529 metrics::TranslateEventProto::USER_ACCEPT); |
| 530 } |
| 531 |
| 532 TEST_F(TranslateManagerTest, TestShouldOverrideDecision) { |
| 533 PrepareTranslateManager(); |
| 534 const int kEventType = 1; |
| 535 EXPECT_CALL( |
| 536 mock_translate_ranker_, |
| 537 ShouldOverrideDecision( |
| 538 kEventType, _, |
| 539 Pointee(EqualsTranslateEventProto(metrics::TranslateEventProto())))) |
| 540 .WillOnce(Return(false)); |
| 541 EXPECT_FALSE(translate_manager_->ShouldOverrideDecision(kEventType)); |
| 542 |
| 543 EXPECT_CALL( |
| 544 mock_translate_ranker_, |
| 545 ShouldOverrideDecision( |
| 546 kEventType, _, |
| 547 Pointee(EqualsTranslateEventProto(metrics::TranslateEventProto())))) |
| 548 .WillOnce(Return(true)); |
| 549 EXPECT_TRUE(translate_manager_->ShouldOverrideDecision(kEventType)); |
| 550 } |
| 551 |
| 552 TEST_F(TranslateManagerTest, ShouldSuppressBubbleUI_Default) { |
| 553 PrepareTranslateManager(); |
| 554 SetHasLanguageChanged(true); |
| 555 EXPECT_FALSE(translate_manager_->ShouldSuppressBubbleUI(false, "en")); |
| 556 EXPECT_FALSE(translate_manager_->ShouldSuppressBubbleUI(true, "en")); |
| 557 } |
| 558 |
| 559 TEST_F(TranslateManagerTest, ShouldSuppressBubbleUI_HasLanguageChangedFalse) { |
| 560 PrepareTranslateManager(); |
| 561 SetHasLanguageChanged(false); |
| 562 EXPECT_CALL( |
| 563 mock_translate_ranker_, |
| 564 ShouldOverrideDecision( |
| 565 metrics::TranslateEventProto::MATCHES_PREVIOUS_LANGUAGE, _, _)) |
| 566 .WillOnce(Return(false)); |
| 567 EXPECT_TRUE(translate_manager_->ShouldSuppressBubbleUI(false, "en")); |
| 568 |
| 569 EXPECT_CALL(mock_translate_ranker_, ShouldOverrideDecision(_, _, _)) |
| 570 .WillOnce(Return(false)); |
| 571 |
| 572 EXPECT_TRUE(translate_manager_->ShouldSuppressBubbleUI(true, "en")); |
| 573 } |
| 574 |
| 575 TEST_F(TranslateManagerTest, ShouldSuppressBubbleUI_NewUI) { |
| 576 PrepareTranslateManager(); |
| 577 base::test::ScopedFeatureList scoped_feature_list; |
| 578 scoped_feature_list.InitAndEnableFeature(translate::kTranslateUI2016Q2); |
| 579 SetHasLanguageChanged(false); |
| 580 EXPECT_FALSE(translate_manager_->ShouldSuppressBubbleUI(false, "en")); |
| 581 } |
| 582 |
| 583 TEST_F(TranslateManagerTest, ShouldSuppressBubbleUI_IsTooOftenDenied) { |
| 584 PrepareTranslateManager(); |
| 585 SetHasLanguageChanged(true); |
| 586 SetLanguageTooOftenDenied("en"); |
| 587 EXPECT_CALL( |
| 588 mock_translate_ranker_, |
| 589 ShouldOverrideDecision( |
| 590 metrics::TranslateEventProto::LANGUAGE_DISABLED_BY_AUTO_BLACKLIST, _, |
| 591 _)) |
| 592 .WillOnce(Return(false)); |
| 593 EXPECT_TRUE(translate_manager_->ShouldSuppressBubbleUI(false, "en")); |
| 594 EXPECT_FALSE(translate_manager_->ShouldSuppressBubbleUI(false, "de")); |
| 595 EXPECT_FALSE(translate_manager_->ShouldSuppressBubbleUI(true, "en")); |
| 596 } |
| 597 |
| 598 TEST_F(TranslateManagerTest, ShouldSuppressBubbleUI_Override) { |
| 599 PrepareTranslateManager(); |
| 600 EXPECT_CALL( |
| 601 mock_translate_ranker_, |
| 602 ShouldOverrideDecision( |
| 603 metrics::TranslateEventProto::MATCHES_PREVIOUS_LANGUAGE, _, _)) |
| 604 .WillOnce(Return(true)); |
| 605 EXPECT_CALL( |
| 606 mock_translate_ranker_, |
| 607 ShouldOverrideDecision( |
| 608 metrics::TranslateEventProto::LANGUAGE_DISABLED_BY_AUTO_BLACKLIST, _, |
| 609 _)) |
| 610 .WillOnce(Return(true)); |
| 611 SetHasLanguageChanged(false); |
| 612 SetLanguageTooOftenDenied("en"); |
| 613 EXPECT_FALSE(translate_manager_->ShouldSuppressBubbleUI(false, "en")); |
| 614 } |
| 615 |
| 474 } // namespace testing | 616 } // namespace testing |
| 475 | 617 |
| 476 } // namespace translate | 618 } // namespace translate |
| OLD | NEW |