OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/file_util.h" | 5 #include "base/file_util.h" |
6 #include "base/files/file_path.h" | 6 #include "base/files/file_path.h" |
7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "gin/public/isolate_holder.h" | 10 #include "gin/public/isolate_holder.h" |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
119 EXPECT_EQ(kExpectedDoubleVal, arg.double_val()); | 119 EXPECT_EQ(kExpectedDoubleVal, arg.double_val()); |
120 EXPECT_EQ(kExpectedDoubleInf, arg.double_inf()); | 120 EXPECT_EQ(kExpectedDoubleInf, arg.double_inf()); |
121 EXPECT_NAN(arg.double_nan()); | 121 EXPECT_NAN(arg.double_nan()); |
122 EXPECT_EQ(std::string("coming"), arg.name().To<std::string>()); | 122 EXPECT_EQ(std::string("coming"), arg.name().To<std::string>()); |
123 EXPECT_EQ(std::string("one"), arg.string_array()[0].To<std::string>()); | 123 EXPECT_EQ(std::string("one"), arg.string_array()[0].To<std::string>()); |
124 EXPECT_EQ(std::string("two"), arg.string_array()[1].To<std::string>()); | 124 EXPECT_EQ(std::string("two"), arg.string_array()[1].To<std::string>()); |
125 EXPECT_EQ(std::string("three"), arg.string_array()[2].To<std::string>()); | 125 EXPECT_EQ(std::string("three"), arg.string_array()[2].To<std::string>()); |
126 CheckDataPipe(arg.data_handle().get().value()); | 126 CheckDataPipe(arg.data_handle().get().value()); |
127 } | 127 } |
128 | 128 |
129 js_to_cpp::EchoArgsList BuildSampleEchoArgsList() { | |
130 js_to_cpp::EchoArgsList::Builder builder; | |
131 builder.set_item(BuildSampleEchoArgs()); | |
132 return builder.Finish(); | |
133 } | |
134 | |
135 void CheckSampleEchoArgsList(const js_to_cpp::EchoArgsList& list) { | 129 void CheckSampleEchoArgsList(const js_to_cpp::EchoArgsList& list) { |
136 if (list.is_null()) | 130 if (list.is_null()) |
137 return; | 131 return; |
138 CheckSampleEchoArgs(list.item()); | 132 CheckSampleEchoArgs(list.item()); |
139 CheckSampleEchoArgsList(list.next()); | 133 CheckSampleEchoArgsList(list.next()); |
140 } | 134 } |
141 | 135 |
142 void CheckCorruptedString(const mojo::String& arg) { | 136 void CheckCorruptedString(const mojo::String& arg) { |
143 // The values don't matter so long as all accesses are within bounds. | 137 // The values don't matter so long as all accesses are within bounds. |
144 if (arg.is_null()) | 138 if (arg.is_null()) |
145 return; | 139 return; |
146 for (size_t i = 0; i < arg.size(); ++i) | 140 for (size_t i = 0; i < arg.size(); ++i) |
147 g_waste_accumulator += arg[i]; | 141 g_waste_accumulator += arg[i]; |
148 } | 142 } |
149 | 143 |
150 void CheckCorruptedStringArray(const mojo::Array<mojo::String>& string_array) { | 144 void CheckCorruptedStringArray(const mojo::Array<mojo::String>& string_array) { |
151 if (string_array.is_null()) | 145 if (string_array.is_null()) |
152 return; | 146 return; |
153 for (size_t i = 0; i < string_array.size(); ++i) | 147 for (size_t i = 0; i < string_array.size(); ++i) |
154 CheckCorruptedString(string_array[i]); | 148 CheckCorruptedString(string_array[i]); |
155 } | 149 } |
156 | 150 |
151 void CheckCorruptedEchoArgs(const js_to_cpp::EchoArgs& arg) { | |
152 if (arg.is_null()) | |
153 return; | |
154 CheckCorruptedString(arg.name()); | |
155 CheckCorruptedStringArray(arg.string_array()); | |
156 if (arg.data_handle().is_valid()) | |
157 CheckDataPipe(arg.data_handle().get().value()); | |
158 } | |
159 | |
160 void CheckCorruptedEchoArgsList(const js_to_cpp::EchoArgsList& list) { | |
161 if (list.is_null()) | |
162 return; | |
163 CheckCorruptedEchoArgs(list.item()); | |
164 CheckCorruptedEchoArgsList(list.next()); | |
165 } | |
166 | |
157 // Base Provider implementation class. It's expected that tests subclass and | 167 // Base Provider implementation class. It's expected that tests subclass and |
158 // override the appropriate Provider functions. When test is done quit the | 168 // override the appropriate Provider functions. When test is done quit the |
159 // run_loop(). | 169 // run_loop(). |
160 class CppSideConnection : public js_to_cpp::CppSide { | 170 class CppSideConnection : public js_to_cpp::CppSide { |
161 public: | 171 public: |
162 CppSideConnection() : run_loop_(NULL), js_side_(NULL) { | 172 CppSideConnection() : run_loop_(NULL), js_side_(NULL) { |
163 } | 173 } |
164 virtual ~CppSideConnection() {} | 174 virtual ~CppSideConnection() {} |
165 | 175 |
166 void set_run_loop(base::RunLoop* run_loop) { run_loop_ = run_loop; } | 176 void set_run_loop(base::RunLoop* run_loop) { run_loop_ = run_loop; } |
(...skipping 12 matching lines...) Expand all Loading... | |
179 } | 189 } |
180 | 190 |
181 virtual void PingResponse() OVERRIDE { | 191 virtual void PingResponse() OVERRIDE { |
182 NOTREACHED(); | 192 NOTREACHED(); |
183 } | 193 } |
184 | 194 |
185 virtual void EchoResponse(const js_to_cpp::EchoArgsList& list) OVERRIDE { | 195 virtual void EchoResponse(const js_to_cpp::EchoArgsList& list) OVERRIDE { |
186 NOTREACHED(); | 196 NOTREACHED(); |
187 } | 197 } |
188 | 198 |
189 virtual void BitFlipResponse(const js_to_cpp::EchoArgs& arg1) OVERRIDE { | 199 virtual void BitFlipResponse(const js_to_cpp::EchoArgsList& list) OVERRIDE { |
190 NOTREACHED(); | 200 NOTREACHED(); |
191 } | 201 } |
192 | 202 |
203 virtual void BackPointerResponse( | |
204 const js_to_cpp::EchoArgsList& list) OVERRIDE { | |
205 NOTREACHED(); | |
206 } | |
193 protected: | 207 protected: |
194 base::RunLoop* run_loop_; | 208 base::RunLoop* run_loop_; |
195 js_to_cpp::JsSide* js_side_; | 209 js_to_cpp::JsSide* js_side_; |
196 | 210 |
197 private: | 211 private: |
198 DISALLOW_COPY_AND_ASSIGN(CppSideConnection); | 212 DISALLOW_COPY_AND_ASSIGN(CppSideConnection); |
199 }; | 213 }; |
200 | 214 |
201 // Trivial test to verify a message sent from JS is received. | 215 // Trivial test to verify a message sent from JS is received. |
202 class PingCppSideConnection : public CppSideConnection { | 216 class PingCppSideConnection : public CppSideConnection { |
(...skipping 25 matching lines...) Expand all Loading... | |
228 public: | 242 public: |
229 explicit EchoCppSideConnection() : | 243 explicit EchoCppSideConnection() : |
230 message_count_(0), | 244 message_count_(0), |
231 termination_seen_(false) { | 245 termination_seen_(false) { |
232 } | 246 } |
233 virtual ~EchoCppSideConnection() {} | 247 virtual ~EchoCppSideConnection() {} |
234 | 248 |
235 // js_to_cpp::CppSide: | 249 // js_to_cpp::CppSide: |
236 virtual void StartTest() OVERRIDE { | 250 virtual void StartTest() OVERRIDE { |
237 AllocationScope scope; | 251 AllocationScope scope; |
238 js_side_->Echo(kExpectedMessageCount, BuildSampleEchoArgsList()); | 252 js_side_->Echo(kExpectedMessageCount, BuildSampleEchoArgs()); |
239 } | 253 } |
240 | 254 |
241 virtual void EchoResponse(const js_to_cpp::EchoArgsList& list) OVERRIDE { | 255 virtual void EchoResponse(const js_to_cpp::EchoArgsList& list) OVERRIDE { |
242 const js_to_cpp::EchoArgs& special_arg = list.item(); | 256 const js_to_cpp::EchoArgs& special_arg = list.item(); |
243 message_count_ += 1; | 257 message_count_ += 1; |
244 EXPECT_EQ(-1, special_arg.si64()); | 258 EXPECT_EQ(-1, special_arg.si64()); |
245 EXPECT_EQ(-1, special_arg.si32()); | 259 EXPECT_EQ(-1, special_arg.si32()); |
246 EXPECT_EQ(-1, special_arg.si16()); | 260 EXPECT_EQ(-1, special_arg.si16()); |
247 EXPECT_EQ(-1, special_arg.si8()); | 261 EXPECT_EQ(-1, special_arg.si8()); |
248 EXPECT_EQ(std::string("going"), special_arg.name().To<std::string>()); | 262 EXPECT_EQ(std::string("going"), special_arg.name().To<std::string>()); |
249 CheckSampleEchoArgsList(list.next()); | 263 CheckSampleEchoArgsList(list.next()); |
250 } | 264 } |
251 | 265 |
252 virtual void TestFinished() OVERRIDE { | 266 virtual void TestFinished() OVERRIDE { |
253 termination_seen_ = true; | 267 termination_seen_ = true; |
254 run_loop()->Quit(); | 268 run_loop()->Quit(); |
255 } | 269 } |
256 | 270 |
257 bool DidSucceed() { | 271 bool DidSucceed() { |
258 return termination_seen_ && message_count_ == kExpectedMessageCount; | 272 return termination_seen_ && message_count_ == kExpectedMessageCount; |
259 } | 273 } |
260 | 274 |
261 private: | 275 private: |
262 static const int kExpectedMessageCount = 100; | 276 static const int kExpectedMessageCount = 10; |
263 int message_count_; | 277 int message_count_; |
264 bool termination_seen_; | 278 bool termination_seen_; |
265 DISALLOW_COPY_AND_ASSIGN(EchoCppSideConnection); | 279 DISALLOW_COPY_AND_ASSIGN(EchoCppSideConnection); |
266 }; | 280 }; |
267 | 281 |
268 // Test that corrupted messages don't wreak havoc. | 282 // Test that corrupted messages don't wreak havoc. |
269 class BitFlipCppSideConnection : public CppSideConnection { | 283 class BitFlipCppSideConnection : public CppSideConnection { |
270 public: | 284 public: |
271 explicit BitFlipCppSideConnection() : termination_seen_(false) {} | 285 explicit BitFlipCppSideConnection() : termination_seen_(false) {} |
272 virtual ~BitFlipCppSideConnection() {} | 286 virtual ~BitFlipCppSideConnection() {} |
273 | 287 |
274 // js_to_cpp::CppSide: | 288 // js_to_cpp::CppSide: |
275 virtual void StartTest() OVERRIDE { | 289 virtual void StartTest() OVERRIDE { |
276 AllocationScope scope; | 290 AllocationScope scope; |
277 js_side_->BitFlip(BuildSampleEchoArgs()); | 291 js_side_->BitFlip(BuildSampleEchoArgs()); |
278 } | 292 } |
279 | 293 |
280 virtual void BitFlipResponse(const js_to_cpp::EchoArgs& arg) OVERRIDE { | 294 virtual void BitFlipResponse(const js_to_cpp::EchoArgsList& list) OVERRIDE { |
281 if (arg.is_null()) | 295 CheckCorruptedEchoArgsList(list); |
282 return; | |
283 CheckCorruptedString(arg.name()); | |
284 CheckCorruptedStringArray(arg.string_array()); | |
285 if (arg.data_handle().is_valid()) | |
286 CheckDataPipe(arg.data_handle().get().value()); | |
287 } | 296 } |
288 | 297 |
289 virtual void TestFinished() OVERRIDE { | 298 virtual void TestFinished() OVERRIDE { |
290 termination_seen_ = true; | 299 termination_seen_ = true; |
291 run_loop()->Quit(); | 300 run_loop()->Quit(); |
292 } | 301 } |
293 | 302 |
294 bool DidSucceed() { | 303 bool DidSucceed() { |
295 return termination_seen_; | 304 return termination_seen_; |
296 } | 305 } |
297 | 306 |
298 private: | 307 private: |
299 bool termination_seen_; | 308 bool termination_seen_; |
300 DISALLOW_COPY_AND_ASSIGN(BitFlipCppSideConnection); | 309 DISALLOW_COPY_AND_ASSIGN(BitFlipCppSideConnection); |
301 }; | 310 }; |
302 | 311 |
312 // Test that severely random messages don't wreak havoc. | |
313 class BackPointerCppSideConnection : public CppSideConnection { | |
314 public: | |
315 explicit BackPointerCppSideConnection() : termination_seen_(false) {} | |
viettrungluu
2014/05/20 18:10:24
nit: no need for "explicit"
| |
316 virtual ~BackPointerCppSideConnection() {} | |
317 | |
318 // js_to_cpp::CppSide: | |
319 virtual void StartTest() OVERRIDE { | |
320 AllocationScope scope; | |
321 js_side_->BackPointer(BuildSampleEchoArgs()); | |
322 } | |
323 | |
324 virtual void BackPointerResponse( | |
325 const js_to_cpp::EchoArgsList& list) OVERRIDE { | |
326 CheckCorruptedEchoArgsList(list); | |
327 } | |
328 | |
329 virtual void TestFinished() OVERRIDE { | |
330 termination_seen_ = true; | |
331 run_loop()->Quit(); | |
332 } | |
333 | |
334 bool DidSucceed() { | |
335 return termination_seen_; | |
336 } | |
337 | |
338 private: | |
339 bool termination_seen_; | |
340 DISALLOW_COPY_AND_ASSIGN(BackPointerCppSideConnection); | |
341 }; | |
342 | |
303 } // namespace | 343 } // namespace |
304 | 344 |
305 class JsToCppTest : public testing::Test { | 345 class JsToCppTest : public testing::Test { |
306 public: | 346 public: |
307 JsToCppTest() {} | 347 JsToCppTest() {} |
308 | 348 |
309 void RunTest(const std::string& test, CppSideConnection* cpp_side) { | 349 void RunTest(const std::string& test, CppSideConnection* cpp_side) { |
310 cpp_side->set_run_loop(&run_loop_); | 350 cpp_side->set_run_loop(&run_loop_); |
311 | 351 |
312 MessagePipe pipe; | 352 MessagePipe pipe; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
356 // TODO(tsepez): Disabled due to http://crbug.com/366797. | 396 // TODO(tsepez): Disabled due to http://crbug.com/366797. |
357 TEST_F(JsToCppTest, DISABLED_BitFlip) { | 397 TEST_F(JsToCppTest, DISABLED_BitFlip) { |
358 if (IsRunningOnIsolatedBot()) | 398 if (IsRunningOnIsolatedBot()) |
359 return; | 399 return; |
360 | 400 |
361 BitFlipCppSideConnection cpp_side_connection; | 401 BitFlipCppSideConnection cpp_side_connection; |
362 RunTest("mojo/apps/js/test/js_to_cpp_unittest", &cpp_side_connection); | 402 RunTest("mojo/apps/js/test/js_to_cpp_unittest", &cpp_side_connection); |
363 EXPECT_TRUE(cpp_side_connection.DidSucceed()); | 403 EXPECT_TRUE(cpp_side_connection.DidSucceed()); |
364 } | 404 } |
365 | 405 |
406 // TODO(tsepez): Disabled due to http://crbug.com/366797. | |
407 TEST_F(JsToCppTest, DISABLED_BackPointer) { | |
408 if (IsRunningOnIsolatedBot()) | |
409 return; | |
410 | |
411 BackPointerCppSideConnection cpp_side_connection; | |
412 RunTest("mojo/apps/js/test/js_to_cpp_unittest", &cpp_side_connection); | |
413 EXPECT_TRUE(cpp_side_connection.DidSucceed()); | |
414 } | |
415 | |
366 } // namespace js | 416 } // namespace js |
367 } // namespace mojo | 417 } // namespace mojo |
OLD | NEW |