diff options
author | toyoshim@chromium.org <toyoshim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-09 15:38:39 +0000 |
---|---|---|
committer | toyoshim@chromium.org <toyoshim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-09 15:38:39 +0000 |
commit | 9434870c70486356838dac18466c5327789cef62 (patch) | |
tree | 888faa80d3c10c2cf9186e49289860fdaa010fa0 /chrome/renderer/translate | |
parent | 809aa3ca3ed4993ae26c651bdce75630b6c5b16d (diff) | |
download | chromium_src-9434870c70486356838dac18466c5327789cef62.zip chromium_src-9434870c70486356838dac18466c5327789cef62.tar.gz chromium_src-9434870c70486356838dac18466c5327789cef62.tar.bz2 |
Translate: add RenderViewTest to check if translate.js handles errors
BUG=211308
TEST=browser_tests --gtest_filter='TranslateScriptBrowserTest.*'
Review URL: https://chromiumcodereview.appspot.com/23548019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@222039 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/translate')
-rw-r--r-- | chrome/renderer/translate/translate_script_browsertest.cc | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/chrome/renderer/translate/translate_script_browsertest.cc b/chrome/renderer/translate/translate_script_browsertest.cc new file mode 100644 index 0000000..e284e70 --- /dev/null +++ b/chrome/renderer/translate/translate_script_browsertest.cc @@ -0,0 +1,239 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" +#include "chrome/common/translate/translate_errors.h" +#include "chrome/test/base/chrome_render_view_test.h" +#include "grit/browser_resources.h" +#include "third_party/WebKit/public/web/WebFrame.h" +#include "third_party/WebKit/public/web/WebScriptSource.h" +#include "ui/base/resource/resource_bundle.h" + +using WebKit::WebFrame; +using WebKit::WebScriptSource; + +namespace { + +// JavaScript code to set runtime test flags. +const char kThrowInitializationError[] = "throwInitializationError = true"; +const char kThrowUnexpectedScriptError[] = "throwUnexpectedScriptError = true"; +const char kCallbackReturnBooleanError[] = "callbackReturnBooleanError = true"; +const char kCallbackReturnNumberError[] = "callbackReturnNumberError = true"; +const char kSetCallbackErrorCode[] = "callbackErrorCode = "; + +// JavaScript code to check if any error happens. +const char kError[] = "cr.googleTranslate.error"; + +// JavaScript code to get error code. +const char kErrorCode[] = "cr.googleTranslate.errorCode"; + +// JavaScript code to check if the library is ready. +const char kLibReady[] = "cr.googleTranslate.libReady"; + +// JavaScript code to perform translation. +const char kTranslate[] = "cr.googleTranslate.translate('auto', 'en')"; + +// JavaScript code to mimic element.js provided by a translate server. +const char kElementJs[] = + "translateApiKey = '';" + "google = {};" + "google.translate = {};" + "google.translate.TranslateService = function() {" + " if (window['throwInitializationError']) {" + " throw 'API initialization error';" + " }" + " return {" + " isAvailable: function() { return true; }," + " restore: function() {}," + " translatePage: function(originalLang, targetLang, cb) {" + " if (window['throwUnexpectedScriptError']) {" + " throw 'all your base are belong to us';" + " }" + " if (window['callbackReturnBooleanError']) {" + " cb(0, false, true);" + " }" + " if (window['callbackReturnNumberError']) {" + " cb(0, false, callbackErrorCode);" + " }" + " }" + " };" + "};" + "cr.googleTranslate.onTranslateElementLoad();"; + +std::string GenerateSetCallbackErrorCodeScript(int code) { + return base::StringPrintf("%s%d", kSetCallbackErrorCode, code); +} + +}; // namespace + +// This class is for testing resource/translate.js works and reports errors +// correctly. +class TranslateScriptBrowserTest : public ChromeRenderViewTest { + public: + TranslateScriptBrowserTest() {} + + protected: + void InjectElementLibrary() { + std::string script; + base::StringPiece translate_js = ResourceBundle::GetSharedInstance(). + GetRawDataResource(IDR_TRANSLATE_JS); + translate_js.CopyToString(&script); + script += kElementJs; + ExecuteScript(script); + } + + void ExecuteScript(const std::string& script) { + WebScriptSource source = WebScriptSource(ASCIIToUTF16(script)); + GetMainFrame()->executeScript(source); + } + + bool GetError() { + return ExecuteScriptAndGetBoolResult(kError); + } + + double GetErrorCode() { + return ExecuteScriptAndGetNumberResult(kErrorCode); + } + + bool IsLibReady() { + return ExecuteScriptAndGetBoolResult(kLibReady); + } + + private: + virtual void SetUp() OVERRIDE { + ChromeRenderViewTest::SetUp(); + } + + virtual void TearDown() OVERRIDE { + ChromeRenderViewTest::TearDown(); + } + + double ExecuteScriptAndGetNumberResult(const std::string& script) { + WebScriptSource source = WebScriptSource(ASCIIToUTF16(script)); + v8::HandleScope handle_scope; + v8::Handle<v8::Value> result = + GetMainFrame()->executeScriptAndReturnValue(source); + if (result.IsEmpty() || !result->IsNumber()) { + NOTREACHED(); + // TODO(toyoshim): Return NaN here and the real implementation in + // TranslateHelper::ExecuteScriptAndGetDoubleResult(). + return 0.0; + } + return result->NumberValue(); + } + + bool ExecuteScriptAndGetBoolResult(const std::string& script) { + WebScriptSource source = WebScriptSource(ASCIIToUTF16(script)); + v8::HandleScope handle_scope; + v8::Handle<v8::Value> result = + GetMainFrame()->executeScriptAndReturnValue(source); + if (result.IsEmpty() || !result->IsBoolean()) { + NOTREACHED(); + return false; + } + return result->BooleanValue(); + } + + DISALLOW_COPY_AND_ASSIGN(TranslateScriptBrowserTest); +}; + +// Test if onTranslateElementLoad() succeeds to initialize the element library. +TEST_F(TranslateScriptBrowserTest, ElementLoadSuccess) { + InjectElementLibrary(); + EXPECT_TRUE(IsLibReady()); + EXPECT_FALSE(GetError()); + EXPECT_EQ(TranslateErrors::NONE, GetErrorCode()); +} + +// Test if onTranslateElementLoad() fails to initialize the element library and +// report the right error code. +TEST_F(TranslateScriptBrowserTest, ElementLoadFailure) { + ExecuteScript(kThrowInitializationError); + + InjectElementLibrary(); + EXPECT_FALSE(IsLibReady()); + EXPECT_TRUE(GetError()); + EXPECT_EQ(TranslateErrors::INITIALIZATION_ERROR, GetErrorCode()); +} + +// Test if cr.googleTranslate.translate() works. +TEST_F(TranslateScriptBrowserTest, TranslateSuccess) { + InjectElementLibrary(); + EXPECT_TRUE(IsLibReady()); + EXPECT_FALSE(GetError()); + EXPECT_EQ(TranslateErrors::NONE, GetErrorCode()); + + ExecuteScript(kTranslate); + + EXPECT_FALSE(GetError()); + EXPECT_EQ(TranslateErrors::NONE, GetErrorCode()); +} + +// Test if cr.googleTranslate.translate() handles library exception correctly. +TEST_F(TranslateScriptBrowserTest, TranslateFail) { + ExecuteScript(kThrowUnexpectedScriptError); + + InjectElementLibrary(); + EXPECT_TRUE(IsLibReady()); + EXPECT_FALSE(GetError()); + EXPECT_EQ(TranslateErrors::NONE, GetErrorCode()); + + ExecuteScript(kTranslate); + + EXPECT_TRUE(GetError()); + EXPECT_EQ(TranslateErrors::UNEXPECTED_SCRIPT_ERROR, GetErrorCode()); +} + +// Test if onTranslateProgress callback handles boolean type error correctly. +// Remove this test once server side changes the API to return a number. +TEST_F(TranslateScriptBrowserTest, CallbackGetBooleanError) { + ExecuteScript(kCallbackReturnBooleanError); + + InjectElementLibrary(); + EXPECT_TRUE(IsLibReady()); + EXPECT_FALSE(GetError()); + EXPECT_EQ(TranslateErrors::NONE, GetErrorCode()); + + ExecuteScript(kTranslate); + + EXPECT_TRUE(GetError()); + EXPECT_EQ(TranslateErrors::TRANSLATION_ERROR, GetErrorCode()); +} + +// Test if onTranslateProgress callback handles number type error correctly and +// converts it to the proper error code. +TEST_F(TranslateScriptBrowserTest, CallbackGetNumberError1) { + ExecuteScript(kCallbackReturnNumberError); + ExecuteScript(GenerateSetCallbackErrorCodeScript(1)); + + InjectElementLibrary(); + EXPECT_TRUE(IsLibReady()); + EXPECT_FALSE(GetError()); + EXPECT_EQ(TranslateErrors::NONE, GetErrorCode()); + + ExecuteScript(kTranslate); + + EXPECT_TRUE(GetError()); + EXPECT_EQ(TranslateErrors::TRANSLATION_ERROR, GetErrorCode()); +} + +// Test if onTranslateProgress callback handles number type error correctly and +// converts it to the proper error code. +TEST_F(TranslateScriptBrowserTest, CallbackGetNumberError2) { + ExecuteScript(kCallbackReturnNumberError); + ExecuteScript(GenerateSetCallbackErrorCodeScript(2)); + + InjectElementLibrary(); + EXPECT_TRUE(IsLibReady()); + EXPECT_FALSE(GetError()); + EXPECT_EQ(TranslateErrors::NONE, GetErrorCode()); + + ExecuteScript(kTranslate); + + EXPECT_TRUE(GetError()); + EXPECT_EQ(TranslateErrors::UNSUPPORTED_LANGUAGE, GetErrorCode()); +} + +// TODO(toyoshim): Add test for onLoadJavaScript. |