OLD | NEW |
| (Empty) |
1 // 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 | |
5 #include "chrome/common/chrome_constants.h" | |
6 #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 | |
11 using testing::AtLeast; | |
12 using testing::Return; | |
13 | |
14 class 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()); | |
26 MOCK_METHOD0(GetOriginalPageLanguage, std::string()); | |
27 MOCK_METHOD0(StartTranslation, bool()); | |
28 | |
29 private: | |
30 DISALLOW_COPY_AND_ASSIGN(TestTranslateHelper); | |
31 }; | |
32 | |
33 class 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. | |
70 TEST_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. | |
94 TEST_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 | |
105 EXPECT_CALL(*translate_helper_, StartTranslation()).WillOnce(Return(true)); | |
106 | |
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. | |
137 TEST_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 | |
147 EXPECT_CALL(*translate_helper_, StartTranslation()).WillOnce(Return(true)); | |
148 | |
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 } | |
169 | |
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. | |
172 TEST_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(), | |
193 chrome::kUnknownLanguageCode, "fr", | |
194 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. | |
211 TEST_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. | |
252 TEST_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 } | |
OLD | NEW |