blob: 022100642b2cd6b89551b08b7d1e41488b12ab22 [file] [log] [blame]
[email protected]85d252e2010-04-06 22:21:021// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]655f97c32010-07-22 21:24:175#include "chrome/common/chrome_constants.h"
[email protected]85d252e2010-04-06 22:21:026#include "chrome/renderer/translate_helper.h"
7#include "chrome/test/render_view_test.h"
8#include "testing/gmock/include/gmock/gmock.h"
9#include "testing/gtest/include/gtest/gtest.h"
10
11using testing::AtLeast;
12using testing::Return;
13
14class TestTranslateHelper : public TranslateHelper {
15 public:
16 explicit TestTranslateHelper(RenderView* render_view)
17 : TranslateHelper(render_view) {
18 }
19
20 virtual bool DontDelayTasks() { return true; }
21
22 MOCK_METHOD0(IsTranslateLibAvailable, bool());
23 MOCK_METHOD0(IsTranslateLibReady, bool());
24 MOCK_METHOD0(HasTranslationFinished, bool());
25 MOCK_METHOD0(HasTranslationFailed, bool());
[email protected]d64b07b2010-04-20 22:14:0626 MOCK_METHOD0(GetOriginalPageLanguage, std::string());
27 MOCK_METHOD0(StartTranslation, bool());
[email protected]85d252e2010-04-06 22:21:0228
29 private:
30 DISALLOW_COPY_AND_ASSIGN(TestTranslateHelper);
31};
32
33class TranslateHelperTest : public RenderViewTest {
34 public:
35 TranslateHelperTest() {}
36
37 protected:
38 virtual void SetUp() {
39 RenderViewTest::SetUp();
40 translate_helper_.reset(new TestTranslateHelper(view_));
41 }
42
43 bool GetPageTranslatedMessage(int* page_id,
44 std::string* original_lang,
45 std::string* target_lang,
46 TranslateErrors::Type* error) {
47 const IPC::Message* message = render_thread_.sink().
48 GetUniqueMessageMatching(ViewHostMsg_PageTranslated::ID);
49 if (!message)
50 return false;
51 Tuple4<int, std::string, std::string, TranslateErrors::Type>
52 translate_param;
53 ViewHostMsg_PageTranslated::Read(message, &translate_param);
54 if (page_id)
55 *page_id = translate_param.a;
56 if (original_lang)
57 *original_lang = translate_param.b;
58 if (target_lang)
59 *target_lang = translate_param.c;
60 if (error)
61 *error = translate_param.d;
62 return true;
63 }
64
65 scoped_ptr<TestTranslateHelper> translate_helper_;
66};
67
68// Tests that the browser gets notified of the translation failure if the
69// translate library fails/times-out during initialization.
70TEST_F(TranslateHelperTest, TranslateLibNeverReady) {
71 // We make IsTranslateLibAvailable true so we don't attempt to inject the
72 // library.
73 EXPECT_CALL(*translate_helper_, IsTranslateLibAvailable())
74 .Times(AtLeast(1))
75 .WillRepeatedly(Return(true));
76
77 EXPECT_CALL(*translate_helper_, IsTranslateLibReady())
78 .Times(AtLeast(5)) // See kMaxTranslateInitCheckAttempts in
79 // translate_helper.cc
80 .WillRepeatedly(Return(false));
81
82 translate_helper_->TranslatePage(view_->page_id(), "en", "fr", std::string());
83 MessageLoop::current()->RunAllPending();
84
85 int page_id;
86 TranslateErrors::Type error;
87 ASSERT_TRUE(GetPageTranslatedMessage(&page_id, NULL, NULL, &error));
88 EXPECT_EQ(view_->page_id(), page_id);
89 EXPECT_EQ(TranslateErrors::INITIALIZATION_ERROR, error);
90}
91
92// Tests that the browser gets notified of the translation success when the
93// translation succeeds.
94TEST_F(TranslateHelperTest, TranslateSuccess) {
95 // We make IsTranslateLibAvailable true so we don't attempt to inject the
96 // library.
97 EXPECT_CALL(*translate_helper_, IsTranslateLibAvailable())
98 .Times(AtLeast(1))
99 .WillRepeatedly(Return(true));
100
101 EXPECT_CALL(*translate_helper_, IsTranslateLibReady())
102 .WillOnce(Return(false))
103 .WillOnce(Return(true));
104
[email protected]d64b07b2010-04-20 22:14:06105 EXPECT_CALL(*translate_helper_, StartTranslation()).WillOnce(Return(true));
[email protected]85d252e2010-04-06 22:21:02106
107 // Succeed after few checks.
108 EXPECT_CALL(*translate_helper_, HasTranslationFailed())
109 .WillRepeatedly(Return(false));
110 EXPECT_CALL(*translate_helper_, HasTranslationFinished())
111 .WillOnce(Return(false))
112 .WillOnce(Return(false))
113 .WillOnce(Return(true));
114
115 std::string original_lang("en");
116 std::string target_lang("fr");
117 translate_helper_->TranslatePage(view_->page_id(), original_lang, target_lang,
118 std::string());
119 MessageLoop::current()->RunAllPending();
120
121 int page_id;
122 std::string received_original_lang;
123 std::string received_target_lang;
124 TranslateErrors::Type error;
125 ASSERT_TRUE(GetPageTranslatedMessage(&page_id,
126 &received_original_lang,
127 &received_target_lang,
128 &error));
129 EXPECT_EQ(view_->page_id(), page_id);
130 EXPECT_EQ(original_lang, received_original_lang);
131 EXPECT_EQ(target_lang, received_target_lang);
132 EXPECT_EQ(TranslateErrors::NONE, error);
133}
134
135// Tests that the browser gets notified of the translation failure when the
136// translation fails.
137TEST_F(TranslateHelperTest, TranslateFailure) {
138 // We make IsTranslateLibAvailable true so we don't attempt to inject the
139 // library.
140 EXPECT_CALL(*translate_helper_, IsTranslateLibAvailable())
141 .Times(AtLeast(1))
142 .WillRepeatedly(Return(true));
143
144 EXPECT_CALL(*translate_helper_, IsTranslateLibReady())
145 .WillOnce(Return(true));
146
[email protected]d64b07b2010-04-20 22:14:06147 EXPECT_CALL(*translate_helper_, StartTranslation()).WillOnce(Return(true));
[email protected]85d252e2010-04-06 22:21:02148
149 // Fail after few checks.
150 EXPECT_CALL(*translate_helper_, HasTranslationFailed())
151 .WillOnce(Return(false))
152 .WillOnce(Return(false))
153 .WillOnce(Return(false))
154 .WillOnce(Return(true));
155
156 EXPECT_CALL(*translate_helper_, HasTranslationFinished())
157 .Times(AtLeast(1))
158 .WillRepeatedly(Return(false));
159
160 translate_helper_->TranslatePage(view_->page_id(), "en", "fr", std::string());
161 MessageLoop::current()->RunAllPending();
162
163 int page_id;
164 TranslateErrors::Type error;
165 ASSERT_TRUE(GetPageTranslatedMessage(&page_id, NULL, NULL, &error));
166 EXPECT_EQ(view_->page_id(), page_id);
167 EXPECT_EQ(TranslateErrors::TRANSLATION_ERROR, error);
168}
[email protected]d64b07b2010-04-20 22:14:06169
170// Tests that when the browser translate a page for which the language is
171// undefined we query the translate element to get the language.
172TEST_F(TranslateHelperTest, UndefinedSourceLang) {
173 // We make IsTranslateLibAvailable true so we don't attempt to inject the
174 // library.
175 EXPECT_CALL(*translate_helper_, IsTranslateLibAvailable())
176 .Times(AtLeast(1))
177 .WillRepeatedly(Return(true));
178
179 EXPECT_CALL(*translate_helper_, IsTranslateLibReady())
180 .WillOnce(Return(true));
181
182 EXPECT_CALL(*translate_helper_, GetOriginalPageLanguage())
183 .WillOnce(Return("de"));
184
185 EXPECT_CALL(*translate_helper_, StartTranslation()).WillOnce(Return(true));
186 EXPECT_CALL(*translate_helper_, HasTranslationFailed())
187 .WillOnce(Return(false));
188 EXPECT_CALL(*translate_helper_, HasTranslationFinished())
189 .Times(AtLeast(1))
190 .WillRepeatedly(Return(true));
191
192 translate_helper_->TranslatePage(view_->page_id(),
[email protected]655f97c32010-07-22 21:24:17193 chrome::kUnknownLanguageCode, "fr",
[email protected]d64b07b2010-04-20 22:14:06194 std::string());
195 MessageLoop::current()->RunAllPending();
196
197 int page_id;
198 TranslateErrors::Type error;
199 std::string original_lang;
200 std::string target_lang;
201 ASSERT_TRUE(GetPageTranslatedMessage(&page_id, &original_lang, &target_lang,
202 &error));
203 EXPECT_EQ(view_->page_id(), page_id);
204 EXPECT_EQ("de", original_lang);
205 EXPECT_EQ("fr", target_lang);
206 EXPECT_EQ(TranslateErrors::NONE, error);
207}
208
209// Tests that starting a translation while a similar one is pending does not
210// break anything.
211TEST_F(TranslateHelperTest, MultipleSimilarTranslations) {
212 // We make IsTranslateLibAvailable true so we don't attempt to inject the
213 // library.
214 EXPECT_CALL(*translate_helper_, IsTranslateLibAvailable())
215 .Times(AtLeast(1))
216 .WillRepeatedly(Return(true));
217
218 EXPECT_CALL(*translate_helper_, IsTranslateLibReady())
219 .WillRepeatedly(Return(true));
220 EXPECT_CALL(*translate_helper_, StartTranslation())
221 .WillRepeatedly(Return(true));
222 EXPECT_CALL(*translate_helper_, HasTranslationFailed())
223 .WillRepeatedly(Return(false));
224 EXPECT_CALL(*translate_helper_, HasTranslationFinished())
225 .WillOnce(Return(true));
226
227 std::string original_lang("en");
228 std::string target_lang("fr");
229 translate_helper_->TranslatePage(view_->page_id(), original_lang, target_lang,
230 std::string());
231 // While this is running call again TranslatePage to make sure noting bad
232 // happens.
233 translate_helper_->TranslatePage(view_->page_id(), original_lang, target_lang,
234 std::string());
235 MessageLoop::current()->RunAllPending();
236
237 int page_id;
238 std::string received_original_lang;
239 std::string received_target_lang;
240 TranslateErrors::Type error;
241 ASSERT_TRUE(GetPageTranslatedMessage(&page_id,
242 &received_original_lang,
243 &received_target_lang,
244 &error));
245 EXPECT_EQ(view_->page_id(), page_id);
246 EXPECT_EQ(original_lang, received_original_lang);
247 EXPECT_EQ(target_lang, received_target_lang);
248 EXPECT_EQ(TranslateErrors::NONE, error);
249}
250
251// Tests that starting a translation while a different one is pending works.
252TEST_F(TranslateHelperTest, MultipleDifferentTranslations) {
253 EXPECT_CALL(*translate_helper_, IsTranslateLibAvailable())
254 .Times(AtLeast(1))
255 .WillRepeatedly(Return(true));
256 EXPECT_CALL(*translate_helper_, IsTranslateLibReady())
257 .WillRepeatedly(Return(true));
258 EXPECT_CALL(*translate_helper_, StartTranslation())
259 .WillRepeatedly(Return(true));
260 EXPECT_CALL(*translate_helper_, HasTranslationFailed())
261 .WillRepeatedly(Return(false));
262 EXPECT_CALL(*translate_helper_, HasTranslationFinished())
263 .WillOnce(Return(true));
264
265 std::string original_lang("en");
266 std::string target_lang("fr");
267 translate_helper_->TranslatePage(view_->page_id(), original_lang, target_lang,
268 std::string());
269 // While this is running call again TranslatePage with a new target lang.
270 std::string new_target_lang("de");
271 translate_helper_->TranslatePage(view_->page_id(), original_lang,
272 new_target_lang, std::string());
273 MessageLoop::current()->RunAllPending();
274
275 int page_id;
276 std::string received_original_lang;
277 std::string received_target_lang;
278 TranslateErrors::Type error;
279 ASSERT_TRUE(GetPageTranslatedMessage(&page_id,
280 &received_original_lang,
281 &received_target_lang,
282 &error));
283 EXPECT_EQ(view_->page_id(), page_id);
284 EXPECT_EQ(original_lang, received_original_lang);
285 EXPECT_EQ(new_target_lang, received_target_lang);
286 EXPECT_EQ(TranslateErrors::NONE, error);
287}