Chromium Code Reviews| 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 // Override NetworkChangeNotifier to simulate connection type changes for tests. |
|
hajimehoshi
2016/05/26 06:46:59
nit: Overrides?
groby-ooo-7-16
2016/05/28 00:59:37
Done. Slightly reworded to still stay at the 80 ch
| |
| 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 SetOffline(bool offline) { | |
|
hajimehoshi
2016/05/26 06:46:59
Hmm, a function taking a boolean value is a little
groby-ooo-7-16
2016/05/28 00:59:37
Since it's not actually enabling any networks (or
| |
| 54 connection_type_to_return_ = | |
| 55 offline ? net::NetworkChangeNotifier::CONNECTION_NONE | |
| 56 : net::NetworkChangeNotifier::CONNECTION_UNKNOWN; | |
| 57 } | |
| 58 | |
| 59 private: | |
| 60 ConnectionType GetCurrentConnectionType() const override { | |
| 61 return connection_type_to_return_; | |
| 62 } | |
| 63 | |
| 64 // The currently simulated network connection type. If this is set to | |
| 65 // CONNECTION_NONE, then NetworkChangeNotifier::IsOffline will return true. | |
| 66 net::NetworkChangeNotifier::ConnectionType connection_type_to_return_; | |
| 67 | |
| 68 DISALLOW_COPY_AND_ASSIGN(TestNetworkChangeNotifier); | |
| 69 }; | |
| 70 | |
| 71 // TODO(groby): Combine with MockTranslateClient in TranslateUiDelegateTest. | |
| 72 class MockTranslateClient : public TranslateClient { | |
| 73 public: | |
| 74 MockTranslateClient(TranslateDriver* driver, PrefService* prefs) | |
| 75 : driver_(driver), prefs_(prefs) {} | |
| 76 | |
| 77 // TODO(groby): Does TranslateClient need a virtual dtor? | |
|
hajimehoshi
2016/05/26 06:46:59
How will you check this?
groby-ooo-7-16
2016/05/28 00:59:37
Declared it - ChromeTranslateClient already declar
| |
| 78 virtual ~MockTranslateClient() {} | |
| 79 | |
| 80 TranslateDriver* GetTranslateDriver() { return driver_; } | |
| 81 PrefService* GetPrefs() { return prefs_; } | |
| 82 | |
| 83 std::unique_ptr<TranslatePrefs> GetTranslatePrefs() { | |
| 84 return base::WrapUnique(new TranslatePrefs(prefs_, kAcceptLanguages, | |
| 85 kLanguagePreferredLanguages)); | |
| 86 } | |
| 87 MOCK_METHOD0(GetTranslateAcceptLanguages, TranslateAcceptLanguages*()); | |
| 88 MOCK_CONST_METHOD0(GetInfobarIconID, int()); | |
| 89 | |
| 90 #if !defined(USE_AURA) | |
| 91 MOCK_CONST_METHOD1(CreateInfoBarMock, | |
| 92 infobars::InfoBar*(TranslateInfoBarDelegate*)); | |
| 93 std::unique_ptr<infobars::InfoBar> CreateInfoBar( | |
| 94 std::unique_ptr<TranslateInfoBarDelegate> delegate) const { | |
| 95 return base::WrapUnique(CreateInfoBarMock(std::move(delegate).get())); | |
| 96 } | |
| 97 #endif | |
| 98 | |
| 99 MOCK_METHOD5(ShowTranslateUI, | |
| 100 void(translate::TranslateStep, | |
| 101 const std::string&, | |
| 102 const std::string&, | |
| 103 TranslateErrors::Type, | |
| 104 bool)); | |
| 105 | |
| 106 MOCK_METHOD1(IsTranslatableURL, bool(const GURL&)); | |
| 107 MOCK_METHOD1(ShowReportLanguageDetectionErrorUI, | |
| 108 void(const GURL& report_url)); | |
| 109 | |
| 110 private: | |
| 111 TranslateDriver* driver_; | |
| 112 PrefService* prefs_; | |
| 113 }; | |
| 114 | |
| 115 class TranslateManagerTest : public ::testing::Test { | |
| 27 protected: | 116 protected: |
| 28 TranslateManagerTest() | 117 TranslateManagerTest() |
| 29 : translate_prefs_(&prefs_, | 118 : translate_prefs_(&prefs_, |
| 30 kAcceptLanguages, | 119 kAcceptLanguages, |
| 31 kLanguagePreferredLanguages), | 120 kLanguagePreferredLanguages), |
| 32 manager_(TranslateDownloadManager::GetInstance()) {} | 121 manager_(TranslateDownloadManager::GetInstance()), |
| 122 mock_translate_client_(&driver_, &prefs_) {} | |
| 33 | 123 |
| 34 void SetUp() override { | 124 void SetUp() override { |
| 35 // Ensure we're not requesting a server-side translate language list. | 125 // Ensure we're not requesting a server-side translate language list. |
| 36 TranslateLanguageList::DisableUpdate(); | 126 TranslateLanguageList::DisableUpdate(); |
| 37 prefs_.registry()->RegisterStringPref(kAcceptLanguages, std::string()); | 127 prefs_.registry()->RegisterStringPref(kAcceptLanguages, std::string()); |
| 38 #if defined(OS_CHROMEOS) | 128 #if defined(OS_CHROMEOS) |
| 39 prefs_.registry()->RegisterStringPref(kLanguagePreferredLanguages, | 129 prefs_.registry()->RegisterStringPref(kLanguagePreferredLanguages, |
| 40 std::string()); | 130 std::string()); |
| 41 #endif | 131 #endif |
| 42 TranslatePrefs::RegisterProfilePrefs(prefs_.registry()); | 132 TranslatePrefs::RegisterProfilePrefs(prefs_.registry()); |
| 133 // TODO(groby): Figure out RegisterProfilePrefs() should register this. | |
| 134 prefs_.registry()->RegisterBooleanPref( | |
| 135 prefs::kEnableTranslate, true, | |
| 136 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); | |
| 43 manager_->ResetForTesting(); | 137 manager_->ResetForTesting(); |
| 44 } | 138 } |
| 45 user_prefs::TestingPrefServiceSyncable prefs_; | 139 user_prefs::TestingPrefServiceSyncable prefs_; |
| 140 | |
| 141 // TODO(groby): request TranslatePrefs from |mock_translate_client_| instead. | |
| 46 TranslatePrefs translate_prefs_; | 142 TranslatePrefs translate_prefs_; |
| 47 TranslateDownloadManager* manager_; | 143 TranslateDownloadManager* manager_; |
| 48 | 144 |
| 145 TestNetworkChangeNotifier network_notifier_; | |
| 146 testing::MockTranslateDriver driver_; | |
| 147 ::testing::NiceMock<MockTranslateClient> mock_translate_client_; | |
|
hajimehoshi
2016/05/26 06:46:59
Unify ::testing or testing
groby-ooo-7-16
2016/05/28 00:59:37
Heh - one is actually ::testing, and the other is
| |
| 148 std::unique_ptr<TranslateManager> translate_manager_; | |
| 149 | |
| 49 void TearDown() override { manager_->ResetForTesting(); } | 150 void TearDown() override { manager_->ResetForTesting(); } |
| 50 }; | 151 }; |
| 51 | 152 |
| 52 } // namespace | 153 } // namespace |
| 53 | 154 |
| 54 // Target language comes from application locale if the locale's language | 155 // Target language comes from application locale if the locale's language |
| 55 // is supported. | 156 // is supported. |
| 56 TEST_F(TranslateManagerTest, GetTargetLanguageDefaultsToAppLocale) { | 157 TEST_F(TranslateManagerTest, GetTargetLanguageDefaultsToAppLocale) { |
| 57 // Ensure the locale is set to a supported language. | 158 // Ensure the locale is set to a supported language. |
| 58 ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("en")); | 159 ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("en")); |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 85 translate_prefs_.UpdateLanguageList(accept_language_list); | 186 translate_prefs_.UpdateLanguageList(accept_language_list); |
| 86 EXPECT_EQ("", TranslateManager::GetTargetLanguage(&translate_prefs_)); | 187 EXPECT_EQ("", TranslateManager::GetTargetLanguage(&translate_prefs_)); |
| 87 | 188 |
| 88 // First supported language is the fallback language. | 189 // First supported language is the fallback language. |
| 89 ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("en")); | 190 ASSERT_TRUE(TranslateDownloadManager::IsSupportedLanguage("en")); |
| 90 accept_language_list.push_back("en"); | 191 accept_language_list.push_back("en"); |
| 91 translate_prefs_.UpdateLanguageList(accept_language_list); | 192 translate_prefs_.UpdateLanguageList(accept_language_list); |
| 92 EXPECT_EQ("en", TranslateManager::GetTargetLanguage(&translate_prefs_)); | 193 EXPECT_EQ("en", TranslateManager::GetTargetLanguage(&translate_prefs_)); |
| 93 } | 194 } |
| 94 | 195 |
| 196 TEST_F(TranslateManagerTest, DontTranslateOffline) { | |
| 197 TranslateManager::SetIgnoreMissingKeyForTesting(true); | |
| 198 translate_manager_.reset(new translate::TranslateManager( | |
| 199 &mock_translate_client_, kAcceptLanguages)); | |
| 200 | |
| 201 // The test measures that the "Translate was disabled" exit can only be | |
| 202 // reached after the early-out tests including IsOffline() passed. | |
| 203 const char kMetricName[] = "Translate.InitiationStatus.v2"; | |
| 204 base::HistogramTester histogram_tester; | |
| 205 | |
| 206 prefs_.SetBoolean(prefs::kEnableTranslate, false); | |
| 207 | |
| 208 translate_manager_->GetLanguageState().LanguageDetermined("de", true); | |
| 209 | |
| 210 // In the offline case, Initiate will early-out before even hitting the API | |
| 211 // key test. | |
| 212 network_notifier_.SetOffline(true); | |
| 213 translate_manager_->InitiateTranslation("de"); | |
| 214 histogram_tester.ExpectTotalCount(kMetricName, 0); | |
| 215 | |
| 216 // In the online case, InitiateTranslation will proceed past early out tests. | |
| 217 network_notifier_.SetOffline(false); | |
| 218 translate_manager_->InitiateTranslation("de"); | |
| 219 histogram_tester.ExpectUniqueSample( | |
| 220 kMetricName, | |
| 221 translate::TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_PREFS, | |
| 222 1); | |
| 223 } | |
| 224 | |
| 95 } // namespace translate | 225 } // namespace translate |
| OLD | NEW |