Index: components/translate/core/browser/translate_manager_unittest.cc |
diff --git a/components/translate/core/browser/translate_manager_unittest.cc b/components/translate/core/browser/translate_manager_unittest.cc |
index c6a9d408c41ac5c3570b86460db2d74883855084..043e036075e89367fc17ce6bfdb3ce542bd8e6f8 100644 |
--- a/components/translate/core/browser/translate_manager_unittest.cc |
+++ b/components/translate/core/browser/translate_manager_unittest.cc |
@@ -13,6 +13,7 @@ |
#include "base/test/scoped_feature_list.h" |
#include "build/build_config.h" |
#include "components/infobars/core/infobar.h" |
+#include "components/metrics/proto/translate_event.pb.h" |
#include "components/pref_registry/pref_registry_syncable.h" |
#include "components/sync_preferences/testing_pref_service_syncable.h" |
#include "components/translate/core/browser/mock_translate_driver.h" |
@@ -30,6 +31,7 @@ |
using testing::_; |
using testing::Return; |
using testing::SetArgPointee; |
+using testing::Pointee; |
namespace translate { |
@@ -45,7 +47,8 @@ const char* kLanguagePreferredLanguages = nullptr; |
#endif |
const char kAcceptLanguages[] = "intl.accept_languages"; |
-// Overrides NetworkChangeNotifier, simulatng connection type changes for tests. |
+// Overrides NetworkChangeNotifier, simulating connection type changes |
+// for tests. |
// TODO(groby): Combine with similar code in ResourceRequestAllowedNotifierTest. |
class TestNetworkChangeNotifier : public net::NetworkChangeNotifier { |
public: |
@@ -65,7 +68,7 @@ class TestNetworkChangeNotifier : public net::NetworkChangeNotifier { |
} |
void SimulateOffline() { |
- connection_type_to_return_ =net::NetworkChangeNotifier::CONNECTION_NONE; |
+ connection_type_to_return_ = net::NetworkChangeNotifier::CONNECTION_NONE; |
} |
void SimulateOnline() { |
@@ -128,6 +131,14 @@ class MockTranslateClient : public TranslateClient { |
PrefService* prefs_; |
}; |
+// Compares TranslateEventProto on a restricted set of fields. |
+MATCHER_P(EqualsTranslateEventProto, translate_event, "") { |
+ const metrics::TranslateEventProto& tep(translate_event); |
+ return (arg.source_language() == tep.source_language() && |
+ arg.target_language() == tep.target_language() && |
+ arg.event_type() == tep.event_type()); |
+} |
+ |
} // namespace |
namespace testing { |
@@ -190,9 +201,9 @@ class TranslateManagerTest : public ::testing::Test { |
std::unique_ptr<base::Value> profile(base::JSONReader::ReadAndReturnError( |
json, 0, &error_code, &error_msg, &error_line, &error_column)); |
- EXPECT_EQ(0, error_code) << error_msg << " at " << error_line << ":" |
- << error_column << std::endl |
- << json; |
+ EXPECT_EQ(0, error_code) |
+ << error_msg << " at " << error_line << ":" << error_column << std::endl |
+ << json; |
return profile; |
} |
@@ -217,14 +228,43 @@ class TranslateManagerTest : public ::testing::Test { |
base::FieldTrial::SESSION_RANDOMIZED, default_group_number); |
} |
+ void SetHasLanguageChanged(bool has_language_changed) { |
+ translate_manager_->GetLanguageState().LanguageDetermined("de", true); |
+ translate_manager_->GetLanguageState().DidNavigate(false, true, false); |
+ translate_manager_->GetLanguageState().LanguageDetermined( |
+ has_language_changed ? "en" : "de", true); |
+ EXPECT_EQ(has_language_changed, |
+ translate_manager_->GetLanguageState().HasLanguageChanged()); |
+ } |
+ |
+ void SetLanguageTooOftenDenied(const std::string& language) { |
+ if (base::FeatureList::IsEnabled(kTranslateUI2016Q2)) { |
+ translate_prefs_.ResetDenialState(); |
+ for (int i = 0; i < 4; i++) { |
+ translate_prefs_.IncrementTranslationDeniedCount(language); |
+ } |
+ } else { |
+ translate_prefs_.UpdateLastDeniedTime(language); |
+ translate_prefs_.UpdateLastDeniedTime(language); |
+ } |
+ |
+ EXPECT_TRUE(translate_prefs_.IsTooOftenDenied(language)); |
+ EXPECT_FALSE(translate_prefs_.IsTooOftenDenied("other_language")); |
+ } |
+ |
// Functions to help TEST_F in subclass to access private functions in |
- // TranslteManager so we can unit test them. |
+ // TranslateManager so we can unit test them. |
std::string CallGetTargetLanguageFromULP() { |
return TranslateManager::GetTargetLanguageFromULP(&translate_prefs_); |
} |
bool CallLanguageInULP(const std::string& language) { |
return translate_manager_->LanguageInULP(language); |
} |
+ void InitTranslateEvent(const std::string& src_lang, |
+ const std::string& dst_lang) { |
+ translate_manager_->InitTranslateEvent(src_lang, dst_lang, |
+ translate_prefs_); |
+ } |
sync_preferences::TestingPrefServiceSyncable prefs_; |
@@ -241,7 +281,6 @@ class TranslateManagerTest : public ::testing::Test { |
base::test::ScopedFeatureList scoped_feature_list_; |
}; |
- |
// Target language comes from application locale if the locale's language |
// is supported. |
TEST_F(TranslateManagerTest, GetTargetLanguageDefaultsToAppLocale) { |
@@ -336,14 +375,15 @@ void ChangeThresholdInParams( |
const char* target_language_confidence_threshold, |
const char* target_language_probability_threshold) { |
ASSERT_TRUE(variations::AssociateVariationParams( |
- kTrialName, "Enabled", {{"initiate_translation_ulp_confidence_threshold", |
- initiate_translation_confidence_threshold}, |
- {"initiate_translation_ulp_probability_threshold", |
- initiate_translation_probability_threshold}, |
- {"target_language_ulp_confidence_threshold", |
- target_language_confidence_threshold}, |
- {"target_language_ulp_probability_threshold", |
- target_language_probability_threshold}})); |
+ kTrialName, "Enabled", |
+ {{"initiate_translation_ulp_confidence_threshold", |
+ initiate_translation_confidence_threshold}, |
+ {"initiate_translation_ulp_probability_threshold", |
+ initiate_translation_probability_threshold}, |
+ {"target_language_ulp_confidence_threshold", |
+ target_language_confidence_threshold}, |
+ {"target_language_ulp_probability_threshold", |
+ target_language_probability_threshold}})); |
} |
// Normal ULP in Json |
@@ -463,7 +503,7 @@ TEST_F(TranslateManagerTest, |
TestLanguageInULPLowConfidenceThresholdFromConfig) { |
PrepareULPTest(ulp_1, true); |
ChangeThresholdInParams("0.79", "0.39", "", ""); |
- // Both "fr" and "pt" should reutrn true because the confidence threshold is |
+ // Both "fr" and "pt" should return true because the confidence threshold is |
// 0.79 and lower than 0.8 and the probability threshold is lower than both |
// the one with "fr" (0.6) and "pt-PT" (0.4). |
EXPECT_TRUE(CallLanguageInULP("fr")); |
@@ -471,6 +511,108 @@ TEST_F(TranslateManagerTest, |
EXPECT_FALSE(CallLanguageInULP("zh-TW")); |
} |
+TEST_F(TranslateManagerTest, TestRecordTranslateEvent) { |
+ PrepareTranslateManager(); |
+ const std::string locale = "zh-TW"; |
+ const std::string page_lang = "zh-CN"; |
+ metrics::TranslateEventProto expected_tep; |
+ expected_tep.set_target_language(locale); |
+ expected_tep.set_source_language(page_lang); |
+ EXPECT_CALL( |
+ mock_translate_ranker_, |
+ RecordTranslateEvent(metrics::TranslateEventProto::USER_ACCEPT, _, |
+ Pointee(EqualsTranslateEventProto(expected_tep)))) |
+ .Times(1); |
+ |
+ InitTranslateEvent(page_lang, locale); |
+ translate_manager_->RecordTranslateEvent( |
+ metrics::TranslateEventProto::USER_ACCEPT); |
+} |
+ |
+TEST_F(TranslateManagerTest, TestShouldOverrideDecision) { |
+ PrepareTranslateManager(); |
+ const int kEventType = 1; |
+ EXPECT_CALL( |
+ mock_translate_ranker_, |
+ ShouldOverrideDecision( |
+ kEventType, _, |
+ Pointee(EqualsTranslateEventProto(metrics::TranslateEventProto())))) |
+ .WillOnce(Return(false)); |
+ EXPECT_FALSE(translate_manager_->ShouldOverrideDecision(kEventType)); |
+ |
+ EXPECT_CALL( |
+ mock_translate_ranker_, |
+ ShouldOverrideDecision( |
+ kEventType, _, |
+ Pointee(EqualsTranslateEventProto(metrics::TranslateEventProto())))) |
+ .WillOnce(Return(true)); |
+ EXPECT_TRUE(translate_manager_->ShouldOverrideDecision(kEventType)); |
+} |
+ |
+TEST_F(TranslateManagerTest, ShouldSuppressBubbleUI_Default) { |
+ PrepareTranslateManager(); |
+ SetHasLanguageChanged(true); |
+ EXPECT_FALSE(translate_manager_->ShouldSuppressBubbleUI(false, "en")); |
+ EXPECT_FALSE(translate_manager_->ShouldSuppressBubbleUI(true, "en")); |
+} |
+ |
+TEST_F(TranslateManagerTest, ShouldSuppressBubbleUI_HasLanguageChangedFalse) { |
+ PrepareTranslateManager(); |
+ SetHasLanguageChanged(false); |
+ EXPECT_CALL( |
+ mock_translate_ranker_, |
+ ShouldOverrideDecision( |
+ metrics::TranslateEventProto::MATCHES_PREVIOUS_LANGUAGE, _, _)) |
+ .WillOnce(Return(false)); |
+ EXPECT_TRUE(translate_manager_->ShouldSuppressBubbleUI(false, "en")); |
+ |
+ EXPECT_CALL(mock_translate_ranker_, ShouldOverrideDecision(_, _, _)) |
+ .WillOnce(Return(false)); |
+ |
+ EXPECT_TRUE(translate_manager_->ShouldSuppressBubbleUI(true, "en")); |
+} |
+ |
+TEST_F(TranslateManagerTest, ShouldSuppressBubbleUI_NewUI) { |
+ PrepareTranslateManager(); |
+ base::test::ScopedFeatureList scoped_feature_list; |
+ scoped_feature_list.InitAndEnableFeature(translate::kTranslateUI2016Q2); |
+ SetHasLanguageChanged(false); |
+ EXPECT_FALSE(translate_manager_->ShouldSuppressBubbleUI(false, "en")); |
+} |
+ |
+TEST_F(TranslateManagerTest, ShouldSuppressBubbleUI_IsTooOftenDenied) { |
+ PrepareTranslateManager(); |
+ SetHasLanguageChanged(true); |
+ SetLanguageTooOftenDenied("en"); |
+ EXPECT_CALL( |
+ mock_translate_ranker_, |
+ ShouldOverrideDecision( |
+ metrics::TranslateEventProto::LANGUAGE_DISABLED_BY_AUTO_BLACKLIST, _, |
+ _)) |
+ .WillOnce(Return(false)); |
+ EXPECT_TRUE(translate_manager_->ShouldSuppressBubbleUI(false, "en")); |
+ EXPECT_FALSE(translate_manager_->ShouldSuppressBubbleUI(false, "de")); |
+ EXPECT_FALSE(translate_manager_->ShouldSuppressBubbleUI(true, "en")); |
+} |
+ |
+TEST_F(TranslateManagerTest, ShouldSuppressBubbleUI_Override) { |
+ PrepareTranslateManager(); |
+ EXPECT_CALL( |
+ mock_translate_ranker_, |
+ ShouldOverrideDecision( |
+ metrics::TranslateEventProto::MATCHES_PREVIOUS_LANGUAGE, _, _)) |
+ .WillOnce(Return(true)); |
+ EXPECT_CALL( |
+ mock_translate_ranker_, |
+ ShouldOverrideDecision( |
+ metrics::TranslateEventProto::LANGUAGE_DISABLED_BY_AUTO_BLACKLIST, _, |
+ _)) |
+ .WillOnce(Return(true)); |
+ SetHasLanguageChanged(false); |
+ SetLanguageTooOftenDenied("en"); |
+ EXPECT_FALSE(translate_manager_->ShouldSuppressBubbleUI(false, "en")); |
+} |
+ |
} // namespace testing |
} // namespace translate |