Chromium Code Reviews| Index: chrome/browser/translate/translate_manager_browsertest.cc |
| =================================================================== |
| --- chrome/browser/translate/translate_manager_browsertest.cc (revision 89207) |
| +++ chrome/browser/translate/translate_manager_browsertest.cc (working copy) |
| @@ -3,9 +3,12 @@ |
| // found in the LICENSE file. |
| +#include <algorithm> |
| #include <set> |
| +#include <vector> |
| #include "base/utf_string_conversions.h" |
| +#include "base/stringprintf.h" |
| #include "chrome/app/chrome_command_ids.h" |
| #include "chrome/browser/prefs/pref_change_registrar.h" |
| #include "chrome/browser/prefs/pref_service.h" |
| @@ -177,7 +180,7 @@ |
| URLFetcher::set_factory(NULL); |
| } |
| - void SimulateURLFetch(bool success) { |
| + void SimulateTranslateScriptURLFetch(bool success) { |
| TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| ASSERT_TRUE(fetcher); |
| net::URLRequestStatus status; |
| @@ -189,6 +192,34 @@ |
| std::string()); |
| } |
| + void SimulateSupportedLanguagesURLFetch(bool success, |
| + std::vector<std::string> languages) { |
|
Jay Civelli
2011/06/21 17:22:07
const std::vector<std::string>&
|
| + TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(1); |
| + ASSERT_TRUE(fetcher); |
| + net::URLRequestStatus status; |
| + status.set_status(success ? net::URLRequestStatus::SUCCESS : |
| + net::URLRequestStatus::FAILED); |
| + |
| + std::string data; |
| + if (success) { |
| + data = base::StringPrintf("%s{'sl': {'bla': 'bla'}, '%s': {", |
| + TranslateManager::kLanguageListCallbackName, |
| + TranslateManager::kTargetLanguagesKey); |
| + const char* comma = ""; |
| + for (size_t i = 0; i < languages.size(); ++i) { |
| + data += base::StringPrintf( |
| + "%s'%s': 'UnusedFullName'", comma, languages[i].c_str()); |
| + if (i == 0) |
| + comma = ","; |
| + } |
| + data += "}})"; |
| + } |
| + fetcher->delegate()->OnURLFetchComplete(fetcher, fetcher->original_url(), |
| + status, success ? 200 : 500, |
| + net::ResponseCookies(), |
| + data); |
| + } |
| + |
| void SetPrefObserverExpectation(const char* path) { |
| EXPECT_CALL( |
| pref_observer_, |
| @@ -300,7 +331,7 @@ |
| // Simulate the translate script being retrieved (it only needs to be done |
| // once in the test as it is cached). |
| - SimulateURLFetch(true); |
| + SimulateTranslateScriptURLFetch(true); |
| // Test that we sent the right message to the renderer. |
| int page_id = 0; |
| @@ -361,7 +392,7 @@ |
| process()->sink().ClearMessages(); |
| infobar->Translate(); |
| // Simulate a failure retrieving the translate script. |
| - SimulateURLFetch(false); |
| + SimulateTranslateScriptURLFetch(false); |
| // We should not have sent any message to translate to the renderer. |
| EXPECT_FALSE(GetTranslateMessage(NULL, NULL, NULL)); |
| @@ -389,13 +420,14 @@ |
| menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE); |
| // To test that bug #49018 if fixed, make sure we deal correctly with errors. |
| - SimulateURLFetch(false); // Simulate a failure to fetch the translate script. |
| + // Simulate a failure to fetch the translate script. |
| + SimulateTranslateScriptURLFetch(false); |
| TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); |
| ASSERT_TRUE(infobar != NULL); |
| EXPECT_EQ(TranslateInfoBarDelegate::TRANSLATION_ERROR, infobar->type()); |
| EXPECT_TRUE(infobar->IsError()); |
| infobar->MessageInfoBarButtonPressed(); |
| - SimulateURLFetch(true); // This time succeed. |
| + SimulateTranslateScriptURLFetch(true); // This time succeed. |
| // Simulate the render notifying the translation has been done, the server |
| // having detected the page was in a known and supported language. |
| @@ -506,6 +538,59 @@ |
| } |
| } |
| +// Test the fetching of languages from the translate server |
| +TEST_F(TranslateManagerTest, FetchLanguagesFromTranslateServer) { |
| + std::vector<std::string> server_languages; |
| + // A list of languages to fake being returned by the translate server. |
| + server_languages.push_back("aa"); |
| + server_languages.push_back("bb"); |
| + server_languages.push_back("ab"); |
| + server_languages.push_back("en-CA"); |
| + server_languages.push_back("zz"); |
| + server_languages.push_back("yy"); |
| + server_languages.push_back("fr-FR"); |
| + |
| + // First, get the default languages list: |
| + std::vector<std::string> default_supported_languages; |
| + TranslateManager::GetSupportedLanguages(&default_supported_languages); |
| + // To make sure we got the defaults and don't confuse them with the mocks. |
| + ASSERT_NE(default_supported_languages.size(), server_languages.size()); |
| + |
| + TranslateManager::GetInstance()->FetchLanguageListFromTranslateServer( |
| + contents()->profile()->GetPrefs()); |
| + |
| + // Check that we still get the defaults until the URLFetch has completed. |
| + std::vector<std::string> current_supported_languages; |
| + TranslateManager::GetSupportedLanguages(¤t_supported_languages); |
| + EXPECT_EQ(default_supported_languages, current_supported_languages); |
| + |
| + // Also check that it didn't change if we failed the URL fetch. |
| + SimulateSupportedLanguagesURLFetch(false, std::vector<std::string>()); |
| + current_supported_languages.clear(); |
| + TranslateManager::GetSupportedLanguages(¤t_supported_languages); |
| + EXPECT_EQ(default_supported_languages, current_supported_languages); |
| + |
| + // Now check that we got the appropriate set of languages from the server. |
| + TranslateManager::GetInstance()->FetchLanguageListFromTranslateServer( |
| + contents()->profile()->GetPrefs()); |
| + SimulateSupportedLanguagesURLFetch(true, server_languages); |
| + current_supported_languages.clear(); |
| + TranslateManager::GetSupportedLanguages(¤t_supported_languages); |
| + // Not sure we need to guarantee the order of languages, so we find them. |
| + EXPECT_EQ(server_languages.size(), current_supported_languages.size()); |
| + for (size_t i = 0; i < server_languages.size(); ++i) { |
| + EXPECT_NE(current_supported_languages.end(), |
| + std::find(current_supported_languages.begin(), |
| + current_supported_languages.end(), |
| + server_languages[i])); |
| + } |
| + |
| + // Reset to original state. |
| + TranslateManager::GetInstance()->FetchLanguageListFromTranslateServer( |
| + contents()->profile()->GetPrefs()); |
| + SimulateSupportedLanguagesURLFetch(true, default_supported_languages); |
| +} |
| + |
| // Tests auto-translate on page. |
| TEST_F(TranslateManagerTest, AutoTranslateOnNavigate) { |
| // Simulate navigating to a page and getting its language. |
| @@ -515,7 +600,8 @@ |
| TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); |
| ASSERT_TRUE(infobar != NULL); |
| infobar->Translate(); |
| - SimulateURLFetch(true); // Simulate the translate script being retrieved. |
| + // Simulate the translate script being retrieved. |
| + SimulateTranslateScriptURLFetch(true); |
| rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "fr", "en", |
| TranslateErrors::NONE)); |
| @@ -687,7 +773,8 @@ |
| TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); |
| ASSERT_TRUE(infobar != NULL); |
| infobar->Translate(); |
| - SimulateURLFetch(true); // Simulate the translate script being retrieved. |
| + // Simulate the translate script being retrieved. |
| + SimulateTranslateScriptURLFetch(true); |
| rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "fr", "en", |
| TranslateErrors::NONE)); |
| @@ -716,7 +803,8 @@ |
| TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); |
| ASSERT_TRUE(infobar != NULL); |
| infobar->Translate(); |
| - SimulateURLFetch(true); // Simulate the translate script being retrieved. |
| + // Simulate the translate script being retrieved. |
| + SimulateTranslateScriptURLFetch(true); |
| rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "fr", "en", |
| TranslateErrors::NONE)); |
| // The after translate infobar is showing. |
| @@ -753,7 +841,7 @@ |
| ASSERT_TRUE(infobar != NULL); |
| process()->sink().ClearMessages(); |
| infobar->Translate(); |
| - SimulateURLFetch(true); |
| + SimulateTranslateScriptURLFetch(true); |
| // Simulate the render notifying the translation has been done, but it |
| // reports a language we don't support. |
| rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "qbz", "en", |
| @@ -936,8 +1024,8 @@ |
| TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); |
| ASSERT_TRUE(infobar != NULL); |
| EXPECT_EQ(TranslateInfoBarDelegate::TRANSLATING, infobar->type()); |
| - |
| - SimulateURLFetch(true); // Simulate the translate script being retrieved. |
| + // Simulate the translate script being retrieved. |
| + SimulateTranslateScriptURLFetch(true); |
| int page_id = 0; |
| std::string original_lang, target_lang; |
| EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); |
| @@ -1007,7 +1095,8 @@ |
| TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); |
| ASSERT_TRUE(infobar != NULL); |
| EXPECT_EQ(TranslateInfoBarDelegate::TRANSLATING, infobar->type()); |
| - SimulateURLFetch(true); // Simulate the translate script being retrieved. |
| + // Simulate the translate script being retrieved. |
| + SimulateTranslateScriptURLFetch(true); |
| int page_id = 0; |
| std::string original_lang, target_lang; |
| EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); |
| @@ -1117,7 +1206,7 @@ |
| EXPECT_TRUE(translate_prefs.IsLanguagePairWhitelisted("fr", "en")); |
| // Simulate the translate script being retrieved (it only needs to be done |
| // once in the test as it is cached). |
| - SimulateURLFetch(true); |
| + SimulateTranslateScriptURLFetch(true); |
| // That should have triggered a page translate. |
| int page_id = 0; |
| std::string original_lang, target_lang; |
| @@ -1179,7 +1268,7 @@ |
| ASSERT_TRUE(infobar != NULL); |
| process()->sink().ClearMessages(); |
| infobar->Translate(); |
| - SimulateURLFetch(true); |
| + SimulateTranslateScriptURLFetch(true); |
| rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "fr", "en", |
| TranslateErrors::NONE)); |
| @@ -1198,7 +1287,7 @@ |
| process()->sink().GetFirstMessageMatching(ViewMsg_TranslatePage::ID) == |
| NULL); |
| // Now simulate the URL fetch. |
| - SimulateURLFetch(true); |
| + SimulateTranslateScriptURLFetch(true); |
| // Now the message should have been sent. |
| int page_id = 0; |
| std::string original_lang, target_lang; |