| 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/metrics/proto/translate_event.pb.h" |
| 17 #include "components/pref_registry/pref_registry_syncable.h" | 17 #include "components/pref_registry/pref_registry_syncable.h" |
| 18 #include "components/sync_preferences/testing_pref_service_syncable.h" | 18 #include "components/sync_preferences/testing_pref_service_syncable.h" |
| 19 #include "components/translate/core/browser/mock_translate_client.h" |
| 19 #include "components/translate/core/browser/mock_translate_driver.h" | 20 #include "components/translate/core/browser/mock_translate_driver.h" |
| 20 #include "components/translate/core/browser/mock_translate_ranker.h" | 21 #include "components/translate/core/browser/mock_translate_ranker.h" |
| 21 #include "components/translate/core/browser/translate_browser_metrics.h" | 22 #include "components/translate/core/browser/translate_browser_metrics.h" |
| 22 #include "components/translate/core/browser/translate_client.h" | 23 #include "components/translate/core/browser/translate_client.h" |
| 23 #include "components/translate/core/browser/translate_download_manager.h" | 24 #include "components/translate/core/browser/translate_download_manager.h" |
| 24 #include "components/translate/core/browser/translate_pref_names.h" | 25 #include "components/translate/core/browser/translate_pref_names.h" |
| 25 #include "components/translate/core/browser/translate_prefs.h" | 26 #include "components/translate/core/browser/translate_prefs.h" |
| 26 #include "components/variations/variations_associated_data.h" | 27 #include "components/variations/variations_associated_data.h" |
| 27 #include "net/base/network_change_notifier.h" | 28 #include "net/base/network_change_notifier.h" |
| 28 #include "testing/gmock/include/gmock/gmock.h" | 29 #include "testing/gmock/include/gmock/gmock.h" |
| 29 #include "testing/gtest/include/gtest/gtest.h" | 30 #include "testing/gtest/include/gtest/gtest.h" |
| 30 | 31 |
| 31 using testing::_; | 32 using testing::_; |
| 32 using testing::Return; | 33 using testing::Return; |
| 33 using testing::SetArgPointee; | 34 using testing::SetArgPointee; |
| 34 using testing::Pointee; | 35 using testing::Pointee; |
| 35 | 36 |
| 36 namespace translate { | 37 namespace translate { |
| 37 | 38 |
| 38 namespace { | 39 namespace { |
| 39 | 40 |
| 40 const char kTrialName[] = "MyTrial"; | 41 const char kTrialName[] = "MyTrial"; |
| 41 | 42 |
| 42 #if defined(OS_CHROMEOS) | |
| 43 const char kLanguagePreferredLanguages[] = | |
| 44 "settings.language.preferred_languages"; | |
| 45 #else | |
| 46 const char* kLanguagePreferredLanguages = nullptr; | |
| 47 #endif | |
| 48 const char kAcceptLanguages[] = "intl.accept_languages"; | |
| 49 | |
| 50 // Overrides NetworkChangeNotifier, simulating connection type changes | 43 // Overrides NetworkChangeNotifier, simulating connection type changes |
| 51 // for tests. | 44 // for tests. |
| 52 // TODO(groby): Combine with similar code in ResourceRequestAllowedNotifierTest. | 45 // TODO(groby): Combine with similar code in ResourceRequestAllowedNotifierTest. |
| 53 class TestNetworkChangeNotifier : public net::NetworkChangeNotifier { | 46 class TestNetworkChangeNotifier : public net::NetworkChangeNotifier { |
| 54 public: | 47 public: |
| 55 TestNetworkChangeNotifier() | 48 TestNetworkChangeNotifier() |
| 56 : net::NetworkChangeNotifier(), | 49 : net::NetworkChangeNotifier(), |
| 57 connection_type_to_return_( | 50 connection_type_to_return_( |
| 58 net::NetworkChangeNotifier::CONNECTION_UNKNOWN) {} | 51 net::NetworkChangeNotifier::CONNECTION_UNKNOWN) {} |
| 59 | 52 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 80 return connection_type_to_return_; | 73 return connection_type_to_return_; |
| 81 } | 74 } |
| 82 | 75 |
| 83 // The currently simulated network connection type. If this is set to | 76 // The currently simulated network connection type. If this is set to |
| 84 // CONNECTION_NONE, then NetworkChangeNotifier::IsOffline will return true. | 77 // CONNECTION_NONE, then NetworkChangeNotifier::IsOffline will return true. |
| 85 net::NetworkChangeNotifier::ConnectionType connection_type_to_return_; | 78 net::NetworkChangeNotifier::ConnectionType connection_type_to_return_; |
| 86 | 79 |
| 87 DISALLOW_COPY_AND_ASSIGN(TestNetworkChangeNotifier); | 80 DISALLOW_COPY_AND_ASSIGN(TestNetworkChangeNotifier); |
| 88 }; | 81 }; |
| 89 | 82 |
| 90 // TODO(groby): Combine with MockTranslateClient in TranslateUiDelegateTest. | |
| 91 class MockTranslateClient : public TranslateClient { | |
| 92 public: | |
| 93 MockTranslateClient(TranslateDriver* driver, PrefService* prefs) | |
| 94 : driver_(driver), prefs_(prefs) {} | |
| 95 | |
| 96 // TODO(groby): Does TranslateClient need a virtual dtor? | |
| 97 virtual ~MockTranslateClient() {} | |
| 98 | |
| 99 TranslateDriver* GetTranslateDriver() { return driver_; } | |
| 100 PrefService* GetPrefs() { return prefs_; } | |
| 101 | |
| 102 std::unique_ptr<TranslatePrefs> GetTranslatePrefs() { | |
| 103 return base::MakeUnique<TranslatePrefs>(prefs_, kAcceptLanguages, | |
| 104 kLanguagePreferredLanguages); | |
| 105 } | |
| 106 MOCK_METHOD0(GetTranslateAcceptLanguages, TranslateAcceptLanguages*()); | |
| 107 MOCK_CONST_METHOD0(GetInfobarIconID, int()); | |
| 108 | |
| 109 #if !defined(USE_AURA) | |
| 110 MOCK_CONST_METHOD1(CreateInfoBarMock, | |
| 111 infobars::InfoBar*(TranslateInfoBarDelegate*)); | |
| 112 std::unique_ptr<infobars::InfoBar> CreateInfoBar( | |
| 113 std::unique_ptr<TranslateInfoBarDelegate> delegate) const { | |
| 114 return base::WrapUnique(CreateInfoBarMock(std::move(delegate).get())); | |
| 115 } | |
| 116 #endif | |
| 117 | |
| 118 MOCK_METHOD5(ShowTranslateUI, | |
| 119 void(translate::TranslateStep, | |
| 120 const std::string&, | |
| 121 const std::string&, | |
| 122 TranslateErrors::Type, | |
| 123 bool)); | |
| 124 | |
| 125 MOCK_METHOD1(IsTranslatableURL, bool(const GURL&)); | |
| 126 MOCK_METHOD1(ShowReportLanguageDetectionErrorUI, | |
| 127 void(const GURL& report_url)); | |
| 128 | |
| 129 private: | |
| 130 TranslateDriver* driver_; | |
| 131 PrefService* prefs_; | |
| 132 }; | |
| 133 | |
| 134 // Compares TranslateEventProto on a restricted set of fields. | 83 // Compares TranslateEventProto on a restricted set of fields. |
| 135 MATCHER_P(EqualsTranslateEventProto, translate_event, "") { | 84 MATCHER_P(EqualsTranslateEventProto, translate_event, "") { |
| 136 const metrics::TranslateEventProto& tep(translate_event); | 85 const metrics::TranslateEventProto& tep(translate_event); |
| 137 return (arg.source_language() == tep.source_language() && | 86 return (arg.source_language() == tep.source_language() && |
| 138 arg.target_language() == tep.target_language() && | 87 arg.target_language() == tep.target_language() && |
| 139 arg.event_type() == tep.event_type()); | 88 arg.event_type() == tep.event_type()); |
| 140 } | 89 } |
| 141 | 90 |
| 142 } // namespace | 91 } // namespace |
| 143 | 92 |
| 144 namespace testing { | 93 namespace testing { |
| 145 | 94 |
| 146 class TranslateManagerTest : public ::testing::Test { | 95 class TranslateManagerTest : public ::testing::Test { |
| 147 protected: | 96 protected: |
| 148 TranslateManagerTest() | 97 TranslateManagerTest() |
| 149 : translate_prefs_(&prefs_, | 98 : translate_prefs_(&prefs_, |
| 150 kAcceptLanguages, | 99 accept_languages_prefs, |
| 151 kLanguagePreferredLanguages), | 100 preferred_languages_prefs), |
| 152 manager_(TranslateDownloadManager::GetInstance()), | 101 manager_(TranslateDownloadManager::GetInstance()), |
| 153 mock_translate_client_(&driver_, &prefs_), | 102 mock_translate_client_(&driver_, &prefs_), |
| 154 field_trial_list_(new base::FieldTrialList(nullptr)) {} | 103 field_trial_list_(new base::FieldTrialList(nullptr)) {} |
| 155 | 104 |
| 156 void SetUp() override { | 105 void SetUp() override { |
| 157 // Ensure we're not requesting a server-side translate language list. | 106 // Ensure we're not requesting a server-side translate language list. |
| 158 TranslateLanguageList::DisableUpdate(); | 107 TranslateLanguageList::DisableUpdate(); |
| 159 prefs_.registry()->RegisterStringPref(kAcceptLanguages, std::string()); | 108 prefs_.registry()->RegisterStringPref(accept_languages_prefs, |
| 109 std::string()); |
| 160 #if defined(OS_CHROMEOS) | 110 #if defined(OS_CHROMEOS) |
| 161 prefs_.registry()->RegisterStringPref(kLanguagePreferredLanguages, | 111 prefs_.registry()->RegisterStringPref(preferred_languages_prefs, |
| 162 std::string()); | 112 std::string()); |
| 163 #endif | 113 #endif |
| 164 TranslatePrefs::RegisterProfilePrefs(prefs_.registry()); | 114 TranslatePrefs::RegisterProfilePrefs(prefs_.registry()); |
| 165 // TODO(groby): Figure out RegisterProfilePrefs() should register this. | 115 // TODO(groby): Figure out RegisterProfilePrefs() should register this. |
| 166 prefs_.registry()->RegisterBooleanPref( | 116 prefs_.registry()->RegisterBooleanPref( |
| 167 prefs::kEnableTranslate, true, | 117 prefs::kEnableTranslate, true, |
| 168 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); | 118 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
| 169 manager_->ResetForTesting(); | 119 manager_->ResetForTesting(); |
| 170 } | 120 } |
| 171 | 121 |
| 172 void TearDown() override { | 122 void TearDown() override { |
| 173 manager_->ResetForTesting(); | 123 manager_->ResetForTesting(); |
| 174 variations::testing::ClearAllVariationParams(); | 124 variations::testing::ClearAllVariationParams(); |
| 175 } | 125 } |
| 176 | 126 |
| 177 // Utility function to prepare translate_manager_ for testing. | 127 // Utility function to prepare translate_manager_ for testing. |
| 178 void PrepareTranslateManager() { | 128 void PrepareTranslateManager() { |
| 179 TranslateManager::SetIgnoreMissingKeyForTesting(true); | 129 TranslateManager::SetIgnoreMissingKeyForTesting(true); |
| 180 translate_manager_.reset(new translate::TranslateManager( | 130 translate_manager_.reset(new translate::TranslateManager( |
| 181 &mock_translate_client_, &mock_translate_ranker_, kAcceptLanguages)); | 131 &mock_translate_client_, &mock_translate_ranker_, |
| 132 accept_languages_prefs)); |
| 182 } | 133 } |
| 183 | 134 |
| 184 // Prepare the test for ULP related tests. | 135 // Prepare the test for ULP related tests. |
| 185 // Put the ulp json into profile. | 136 // Put the ulp json into profile. |
| 186 void PrepareULPTest(const char* ulp_json, bool turn_on_feature) { | 137 void PrepareULPTest(const char* ulp_json, bool turn_on_feature) { |
| 187 PrepareTranslateManager(); | 138 PrepareTranslateManager(); |
| 188 std::unique_ptr<base::Value> profile(CreateProfileFromJSON(ulp_json)); | 139 std::unique_ptr<base::Value> profile(CreateProfileFromJSON(ulp_json)); |
| 189 prefs_.SetUserPref(TranslatePrefs::kPrefLanguageProfile, | 140 prefs_.SetUserPref(TranslatePrefs::kPrefLanguageProfile, |
| 190 std::move(profile)); | 141 std::move(profile)); |
| 191 if (turn_on_feature) | 142 if (turn_on_feature) |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 268 | 219 |
| 269 sync_preferences::TestingPrefServiceSyncable prefs_; | 220 sync_preferences::TestingPrefServiceSyncable prefs_; |
| 270 | 221 |
| 271 // TODO(groby): request TranslatePrefs from |mock_translate_client_| instead. | 222 // TODO(groby): request TranslatePrefs from |mock_translate_client_| instead. |
| 272 TranslatePrefs translate_prefs_; | 223 TranslatePrefs translate_prefs_; |
| 273 TranslateDownloadManager* manager_; | 224 TranslateDownloadManager* manager_; |
| 274 | 225 |
| 275 TestNetworkChangeNotifier network_notifier_; | 226 TestNetworkChangeNotifier network_notifier_; |
| 276 translate::testing::MockTranslateDriver driver_; | 227 translate::testing::MockTranslateDriver driver_; |
| 277 translate::testing::MockTranslateRanker mock_translate_ranker_; | 228 translate::testing::MockTranslateRanker mock_translate_ranker_; |
| 278 ::testing::NiceMock<MockTranslateClient> mock_translate_client_; | 229 ::testing::NiceMock<translate::testing::MockTranslateClient> |
| 230 mock_translate_client_; |
| 279 std::unique_ptr<TranslateManager> translate_manager_; | 231 std::unique_ptr<TranslateManager> translate_manager_; |
| 280 std::unique_ptr<base::FieldTrialList> field_trial_list_; | 232 std::unique_ptr<base::FieldTrialList> field_trial_list_; |
| 281 base::test::ScopedFeatureList scoped_feature_list_; | 233 base::test::ScopedFeatureList scoped_feature_list_; |
| 282 }; | 234 }; |
| 283 | 235 |
| 284 // Target language comes from application locale if the locale's language | 236 // Target language comes from application locale if the locale's language |
| 285 // is supported. | 237 // is supported. |
| 286 TEST_F(TranslateManagerTest, GetTargetLanguageDefaultsToAppLocale) { | 238 TEST_F(TranslateManagerTest, GetTargetLanguageDefaultsToAppLocale) { |
| 287 // Ensure the locale is set to a supported language. | 239 // Ensure the locale is set to a supported language. |
| 288 ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("en")); | 240 ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("en")); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 // First supported language is the fallback language. | 287 // First supported language is the fallback language. |
| 336 ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("en")); | 288 ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("en")); |
| 337 accept_language_list.push_back("en"); | 289 accept_language_list.push_back("en"); |
| 338 translate_prefs_.UpdateLanguageList(accept_language_list); | 290 translate_prefs_.UpdateLanguageList(accept_language_list); |
| 339 EXPECT_EQ("en", TranslateManager::GetTargetLanguage(&translate_prefs_)); | 291 EXPECT_EQ("en", TranslateManager::GetTargetLanguage(&translate_prefs_)); |
| 340 } | 292 } |
| 341 | 293 |
| 342 TEST_F(TranslateManagerTest, DontTranslateOffline) { | 294 TEST_F(TranslateManagerTest, DontTranslateOffline) { |
| 343 TranslateManager::SetIgnoreMissingKeyForTesting(true); | 295 TranslateManager::SetIgnoreMissingKeyForTesting(true); |
| 344 translate_manager_.reset(new translate::TranslateManager( | 296 translate_manager_.reset(new translate::TranslateManager( |
| 345 &mock_translate_client_, &mock_translate_ranker_, kAcceptLanguages)); | 297 &mock_translate_client_, &mock_translate_ranker_, |
| 298 accept_languages_prefs)); |
| 346 | 299 |
| 347 // The test measures that the "Translate was disabled" exit can only be | 300 // The test measures that the "Translate was disabled" exit can only be |
| 348 // reached after the early-out tests including IsOffline() passed. | 301 // reached after the early-out tests including IsOffline() passed. |
| 349 const char kMetricName[] = "Translate.InitiationStatus.v2"; | 302 const char kMetricName[] = "Translate.InitiationStatus.v2"; |
| 350 base::HistogramTester histogram_tester; | 303 base::HistogramTester histogram_tester; |
| 351 | 304 |
| 352 prefs_.SetBoolean(prefs::kEnableTranslate, false); | 305 prefs_.SetBoolean(prefs::kEnableTranslate, false); |
| 353 | 306 |
| 354 translate_manager_->GetLanguageState().LanguageDetermined("de", true); | 307 translate_manager_->GetLanguageState().LanguageDetermined("de", true); |
| 355 | 308 |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 609 _)) | 562 _)) |
| 610 .WillOnce(Return(true)); | 563 .WillOnce(Return(true)); |
| 611 SetHasLanguageChanged(false); | 564 SetHasLanguageChanged(false); |
| 612 SetLanguageTooOftenDenied("en"); | 565 SetLanguageTooOftenDenied("en"); |
| 613 EXPECT_FALSE(translate_manager_->ShouldSuppressBubbleUI(false, "en")); | 566 EXPECT_FALSE(translate_manager_->ShouldSuppressBubbleUI(false, "en")); |
| 614 } | 567 } |
| 615 | 568 |
| 616 } // namespace testing | 569 } // namespace testing |
| 617 | 570 |
| 618 } // namespace translate | 571 } // namespace translate |
| OLD | NEW |