| 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 "base/test/histogram_tester.h" |
| 7 #include "build/build_config.h" | 8 #include "build/build_config.h" |
| 9 #include "components/infobars/core/infobar.h" |
| 8 #include "components/pref_registry/pref_registry_syncable.h" | 10 #include "components/pref_registry/pref_registry_syncable.h" |
| 9 #include "components/pref_registry/testing_pref_service_syncable.h" | 11 #include "components/pref_registry/testing_pref_service_syncable.h" |
| 12 #include "components/translate/core/browser/mock_translate_driver.h" |
| 13 #include "components/translate/core/browser/translate_browser_metrics.h" |
| 14 #include "components/translate/core/browser/translate_client.h" |
| 10 #include "components/translate/core/browser/translate_download_manager.h" | 15 #include "components/translate/core/browser/translate_download_manager.h" |
| 11 #include "components/translate/core/browser/translate_prefs.h" | 16 #include "components/translate/core/browser/translate_prefs.h" |
| 17 #include "components/translate/core/common/translate_pref_names.h" |
| 18 #include "net/base/network_change_notifier.h" |
| 19 #include "testing/gmock/include/gmock/gmock.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 21 |
| 14 namespace translate { | 22 namespace translate { |
| 15 | 23 |
| 16 namespace { | 24 namespace { |
| 17 | 25 |
| 18 #if defined(OS_CHROMEOS) | 26 #if defined(OS_CHROMEOS) |
| 19 const char kLanguagePreferredLanguages[] = | 27 const char kLanguagePreferredLanguages[] = |
| 20 "settings.language.preferred_languages"; | 28 "settings.language.preferred_languages"; |
| 21 #else | 29 #else |
| 22 const char* kLanguagePreferredLanguages = nullptr; | 30 const char* kLanguagePreferredLanguages = nullptr; |
| 23 #endif | 31 #endif |
| 24 const char kAcceptLanguages[] = "intl.accept_languages"; | 32 const char kAcceptLanguages[] = "intl.accept_languages"; |
| 25 | 33 |
| 26 class TranslateManagerTest : public testing::Test { | 34 // Overrides NetworkChangeNotifier, simulatng connection type changes for tests. |
| 35 // TODO(groby): Combine with similar code in ResourceRequestAllowedNotifierTest. |
| 36 class TestNetworkChangeNotifier : public net::NetworkChangeNotifier { |
| 37 public: |
| 38 TestNetworkChangeNotifier() |
| 39 : net::NetworkChangeNotifier(), |
| 40 connection_type_to_return_( |
| 41 net::NetworkChangeNotifier::CONNECTION_UNKNOWN) {} |
| 42 |
| 43 // Simulates a change of the connection type to |type|. This will notify any |
| 44 // objects that are NetworkChangeNotifiers. |
| 45 void SimulateNetworkConnectionChange( |
| 46 net::NetworkChangeNotifier::ConnectionType type) { |
| 47 connection_type_to_return_ = type; |
| 48 net::NetworkChangeNotifier::NotifyObserversOfConnectionTypeChangeForTests( |
| 49 connection_type_to_return_); |
| 50 base::MessageLoop::current()->RunUntilIdle(); |
| 51 } |
| 52 |
| 53 void SimulateOffline() { |
| 54 connection_type_to_return_ =net::NetworkChangeNotifier::CONNECTION_NONE; |
| 55 } |
| 56 |
| 57 void SimulateOnline() { |
| 58 connection_type_to_return_ = net::NetworkChangeNotifier::CONNECTION_UNKNOWN; |
| 59 } |
| 60 |
| 61 private: |
| 62 ConnectionType GetCurrentConnectionType() const override { |
| 63 return connection_type_to_return_; |
| 64 } |
| 65 |
| 66 // The currently simulated network connection type. If this is set to |
| 67 // CONNECTION_NONE, then NetworkChangeNotifier::IsOffline will return true. |
| 68 net::NetworkChangeNotifier::ConnectionType connection_type_to_return_; |
| 69 |
| 70 DISALLOW_COPY_AND_ASSIGN(TestNetworkChangeNotifier); |
| 71 }; |
| 72 |
| 73 // TODO(groby): Combine with MockTranslateClient in TranslateUiDelegateTest. |
| 74 class MockTranslateClient : public TranslateClient { |
| 75 public: |
| 76 MockTranslateClient(TranslateDriver* driver, PrefService* prefs) |
| 77 : driver_(driver), prefs_(prefs) {} |
| 78 |
| 79 // TODO(groby): Does TranslateClient need a virtual dtor? |
| 80 virtual ~MockTranslateClient() {} |
| 81 |
| 82 TranslateDriver* GetTranslateDriver() { return driver_; } |
| 83 PrefService* GetPrefs() { return prefs_; } |
| 84 |
| 85 std::unique_ptr<TranslatePrefs> GetTranslatePrefs() { |
| 86 return base::WrapUnique(new TranslatePrefs(prefs_, kAcceptLanguages, |
| 87 kLanguagePreferredLanguages)); |
| 88 } |
| 89 MOCK_METHOD0(GetTranslateAcceptLanguages, TranslateAcceptLanguages*()); |
| 90 MOCK_CONST_METHOD0(GetInfobarIconID, int()); |
| 91 |
| 92 #if !defined(USE_AURA) |
| 93 MOCK_CONST_METHOD1(CreateInfoBarMock, |
| 94 infobars::InfoBar*(TranslateInfoBarDelegate*)); |
| 95 std::unique_ptr<infobars::InfoBar> CreateInfoBar( |
| 96 std::unique_ptr<TranslateInfoBarDelegate> delegate) const { |
| 97 return base::WrapUnique(CreateInfoBarMock(std::move(delegate).get())); |
| 98 } |
| 99 #endif |
| 100 |
| 101 MOCK_METHOD5(ShowTranslateUI, |
| 102 void(translate::TranslateStep, |
| 103 const std::string&, |
| 104 const std::string&, |
| 105 TranslateErrors::Type, |
| 106 bool)); |
| 107 |
| 108 MOCK_METHOD1(IsTranslatableURL, bool(const GURL&)); |
| 109 MOCK_METHOD1(ShowReportLanguageDetectionErrorUI, |
| 110 void(const GURL& report_url)); |
| 111 |
| 112 private: |
| 113 TranslateDriver* driver_; |
| 114 PrefService* prefs_; |
| 115 }; |
| 116 |
| 117 class TranslateManagerTest : public ::testing::Test { |
| 27 protected: | 118 protected: |
| 28 TranslateManagerTest() | 119 TranslateManagerTest() |
| 29 : translate_prefs_(&prefs_, | 120 : translate_prefs_(&prefs_, |
| 30 kAcceptLanguages, | 121 kAcceptLanguages, |
| 31 kLanguagePreferredLanguages), | 122 kLanguagePreferredLanguages), |
| 32 manager_(TranslateDownloadManager::GetInstance()) {} | 123 manager_(TranslateDownloadManager::GetInstance()), |
| 124 mock_translate_client_(&driver_, &prefs_) {} |
| 33 | 125 |
| 34 void SetUp() override { | 126 void SetUp() override { |
| 35 // Ensure we're not requesting a server-side translate language list. | 127 // Ensure we're not requesting a server-side translate language list. |
| 36 TranslateLanguageList::DisableUpdate(); | 128 TranslateLanguageList::DisableUpdate(); |
| 37 prefs_.registry()->RegisterStringPref(kAcceptLanguages, std::string()); | 129 prefs_.registry()->RegisterStringPref(kAcceptLanguages, std::string()); |
| 38 #if defined(OS_CHROMEOS) | 130 #if defined(OS_CHROMEOS) |
| 39 prefs_.registry()->RegisterStringPref(kLanguagePreferredLanguages, | 131 prefs_.registry()->RegisterStringPref(kLanguagePreferredLanguages, |
| 40 std::string()); | 132 std::string()); |
| 41 #endif | 133 #endif |
| 42 TranslatePrefs::RegisterProfilePrefs(prefs_.registry()); | 134 TranslatePrefs::RegisterProfilePrefs(prefs_.registry()); |
| 135 // TODO(groby): Figure out RegisterProfilePrefs() should register this. |
| 136 prefs_.registry()->RegisterBooleanPref( |
| 137 prefs::kEnableTranslate, true, |
| 138 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
| 43 manager_->ResetForTesting(); | 139 manager_->ResetForTesting(); |
| 44 } | 140 } |
| 45 user_prefs::TestingPrefServiceSyncable prefs_; | 141 user_prefs::TestingPrefServiceSyncable prefs_; |
| 142 |
| 143 // TODO(groby): request TranslatePrefs from |mock_translate_client_| instead. |
| 46 TranslatePrefs translate_prefs_; | 144 TranslatePrefs translate_prefs_; |
| 47 TranslateDownloadManager* manager_; | 145 TranslateDownloadManager* manager_; |
| 48 | 146 |
| 147 TestNetworkChangeNotifier network_notifier_; |
| 148 translate::testing::MockTranslateDriver driver_; |
| 149 ::testing::NiceMock<MockTranslateClient> mock_translate_client_; |
| 150 std::unique_ptr<TranslateManager> translate_manager_; |
| 151 |
| 49 void TearDown() override { manager_->ResetForTesting(); } | 152 void TearDown() override { manager_->ResetForTesting(); } |
| 50 }; | 153 }; |
| 51 | 154 |
| 52 } // namespace | 155 } // namespace |
| 53 | 156 |
| 54 // Target language comes from application locale if the locale's language | 157 // Target language comes from application locale if the locale's language |
| 55 // is supported. | 158 // is supported. |
| 56 TEST_F(TranslateManagerTest, GetTargetLanguageDefaultsToAppLocale) { | 159 TEST_F(TranslateManagerTest, GetTargetLanguageDefaultsToAppLocale) { |
| 57 // Ensure the locale is set to a supported language. | 160 // Ensure the locale is set to a supported language. |
| 58 ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("en")); | 161 ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("en")); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 85 translate_prefs_.UpdateLanguageList(accept_language_list); | 188 translate_prefs_.UpdateLanguageList(accept_language_list); |
| 86 EXPECT_EQ("", TranslateManager::GetTargetLanguage(&translate_prefs_)); | 189 EXPECT_EQ("", TranslateManager::GetTargetLanguage(&translate_prefs_)); |
| 87 | 190 |
| 88 // First supported language is the fallback language. | 191 // First supported language is the fallback language. |
| 89 ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("en")); | 192 ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("en")); |
| 90 accept_language_list.push_back("en"); | 193 accept_language_list.push_back("en"); |
| 91 translate_prefs_.UpdateLanguageList(accept_language_list); | 194 translate_prefs_.UpdateLanguageList(accept_language_list); |
| 92 EXPECT_EQ("en", TranslateManager::GetTargetLanguage(&translate_prefs_)); | 195 EXPECT_EQ("en", TranslateManager::GetTargetLanguage(&translate_prefs_)); |
| 93 } | 196 } |
| 94 | 197 |
| 198 TEST_F(TranslateManagerTest, DontTranslateOffline) { |
| 199 TranslateManager::SetIgnoreMissingKeyForTesting(true); |
| 200 translate_manager_.reset(new translate::TranslateManager( |
| 201 &mock_translate_client_, kAcceptLanguages)); |
| 202 |
| 203 // The test measures that the "Translate was disabled" exit can only be |
| 204 // reached after the early-out tests including IsOffline() passed. |
| 205 const char kMetricName[] = "Translate.InitiationStatus.v2"; |
| 206 base::HistogramTester histogram_tester; |
| 207 |
| 208 prefs_.SetBoolean(prefs::kEnableTranslate, false); |
| 209 |
| 210 translate_manager_->GetLanguageState().LanguageDetermined("de", true); |
| 211 |
| 212 // In the offline case, Initiate will early-out before even hitting the API |
| 213 // key test. |
| 214 network_notifier_.SimulateOffline(); |
| 215 translate_manager_->InitiateTranslation("de"); |
| 216 histogram_tester.ExpectTotalCount(kMetricName, 0); |
| 217 |
| 218 // In the online case, InitiateTranslation will proceed past early out tests. |
| 219 network_notifier_.SimulateOnline(); |
| 220 translate_manager_->InitiateTranslation("de"); |
| 221 histogram_tester.ExpectUniqueSample( |
| 222 kMetricName, |
| 223 translate::TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_PREFS, |
| 224 1); |
| 225 } |
| 226 |
| 95 } // namespace translate | 227 } // namespace translate |
| OLD | NEW |