OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 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 | 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 <string> | 5 #include <string> |
6 #include "base/file_path.h" | 6 #include "base/file_path.h" |
7 #include "base/waitable_event.h" | 7 #include "base/waitable_event.h" |
8 #include "chrome/common/automation_messages.h" | 8 #include "chrome/common/automation_messages.h" |
9 #include "chrome_frame/cfproxy_private.h" | 9 #include "chrome_frame/cfproxy_private.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 using testing::CreateFunctor; | 21 using testing::CreateFunctor; |
22 using testing::StrEq; | 22 using testing::StrEq; |
23 using testing::Eq; | 23 using testing::Eq; |
24 | 24 |
25 // There is not much to test here since CFProxy is pretty dumb. | 25 // There is not much to test here since CFProxy is pretty dumb. |
26 struct MockFactory : public ChromeProxyFactory { | 26 struct MockFactory : public ChromeProxyFactory { |
27 MOCK_METHOD0(CreateProxy, ChromeProxy*()); | 27 MOCK_METHOD0(CreateProxy, ChromeProxy*()); |
28 }; | 28 }; |
29 | 29 |
30 struct MockChromeProxyDelegate : public ChromeProxyDelegate { | 30 struct MockChromeProxyDelegate : public ChromeProxyDelegate { |
| 31 MOCK_METHOD1(OnMessageReceived, void(const IPC::Message& message)); |
31 MOCK_METHOD1(Connected, void(ChromeProxy* proxy)); | 32 MOCK_METHOD1(Connected, void(ChromeProxy* proxy)); |
32 MOCK_METHOD2(PeerLost, void(ChromeProxy*, enum DisconnectReason reason)); | 33 MOCK_METHOD2(PeerLost, void(ChromeProxy*, enum DisconnectReason reason)); |
33 MOCK_METHOD0(Disconnected, void()); | 34 MOCK_METHOD0(Disconnected, void()); |
34 MOCK_METHOD0(tab_handle, int()); | 35 MOCK_METHOD0(tab_handle, int()); |
35 | 36 |
36 MOCK_METHOD5(Completed_CreateTab, void(bool success, HWND chrome_wnd, | 37 MOCK_METHOD5(Completed_CreateTab, void(bool success, HWND chrome_wnd, |
37 HWND tab_window, int tab_handle, int session_id)); | 38 HWND tab_window, int tab_handle, int session_id)); |
38 MOCK_METHOD5(Completed_ConnectToTab, void(bool success, HWND chrome_window, | 39 MOCK_METHOD5(Completed_ConnectToTab, void(bool success, HWND chrome_window, |
39 HWND tab_window, int tab_handle, int session_id)); | 40 HWND tab_window, int tab_handle, int session_id)); |
40 MOCK_METHOD2(Completed_Navigate, void(bool success, | 41 MOCK_METHOD2(Completed_Navigate, void(bool success, |
41 enum AutomationMsg_NavigationResponseValues res)); | 42 enum AutomationMsg_NavigationResponseValues res)); |
42 MOCK_METHOD3(Completed_InstallExtension, void(bool success, | 43 MOCK_METHOD3(Completed_InstallExtension, void(bool success, |
43 enum AutomationMsg_ExtensionResponseValues res, SyncMessageContext* ctx)); | 44 enum AutomationMsg_ExtensionResponseValues res, SyncMessageContext* ctx)); |
44 MOCK_METHOD3(Completed_LoadExpandedExtension, void(bool success, | 45 MOCK_METHOD3(Completed_LoadExpandedExtension, void(bool success, |
45 enum AutomationMsg_ExtensionResponseValues res, SyncMessageContext* ctx)); | 46 enum AutomationMsg_ExtensionResponseValues res, SyncMessageContext* ctx)); |
46 MOCK_METHOD2(Completed_GetEnabledExtensions, void(bool success, | 47 MOCK_METHOD2(Completed_GetEnabledExtensions, void(bool success, |
47 const std::vector<FilePath>* v)); | 48 const std::vector<FilePath>* v)); |
48 | 49 |
49 // Network requests from Chrome. | 50 // Network requests from Chrome. |
50 MOCK_METHOD2(Network_Start, void(int request_id, | 51 MOCK_METHOD2(Network_Start, void(int request_id, |
51 const IPC::AutomationURLRequest& request_info)); | 52 const AutomationURLRequest& request_info)); |
52 MOCK_METHOD2(Network_Read, void(int request_id, int bytes_to_read)); | 53 MOCK_METHOD2(Network_Read, void(int request_id, int bytes_to_read)); |
53 MOCK_METHOD2(Network_End, void(int request_id, const URLRequestStatus& s)); | 54 MOCK_METHOD2(Network_End, void(int request_id, const URLRequestStatus& s)); |
54 MOCK_METHOD1(Network_DownloadInHost, void(int request_id)); | 55 MOCK_METHOD1(Network_DownloadInHost, void(int request_id)); |
55 MOCK_METHOD2(GetCookies, void(const GURL& url, int cookie_id)); | 56 MOCK_METHOD2(GetCookies, void(const GURL& url, int cookie_id)); |
56 MOCK_METHOD2(SetCookie, void(const GURL& url, const std::string& cookie)); | 57 MOCK_METHOD2(SetCookie, void(const GURL& url, const std::string& cookie)); |
57 | 58 |
58 // Navigation progress notifications. | 59 // Navigation progress notifications. |
59 MOCK_METHOD2(NavigationStateChanged, void(int flags, | 60 MOCK_METHOD2(NavigationStateChanged, void(int flags, |
60 const IPC::NavigationInfo& nav_info)); | 61 const NavigationInfo& nav_info)); |
61 MOCK_METHOD1(UpdateTargetUrl, void(const std::wstring& url)); | 62 MOCK_METHOD1(UpdateTargetUrl, void(const std::wstring& url)); |
62 MOCK_METHOD2(NavigationFailed, void(int error_code, const GURL& gurl)); | 63 MOCK_METHOD2(NavigationFailed, void(int error_code, const GURL& gurl)); |
63 MOCK_METHOD1(DidNavigate, void(const IPC::NavigationInfo& navigation_info)); | 64 MOCK_METHOD1(DidNavigate, void(const NavigationInfo& navigation_info)); |
64 MOCK_METHOD1(TabLoaded, void(const GURL& url)); | 65 MOCK_METHOD1(TabLoaded, void(const GURL& url)); |
65 | 66 |
66 // | 67 // |
67 MOCK_METHOD3(OpenURL, void(const GURL& url_to_open, const GURL& referrer, | 68 MOCK_METHOD3(OpenURL, void(const GURL& url_to_open, const GURL& referrer, |
68 int open_disposition)); | 69 int open_disposition)); |
69 MOCK_METHOD1(GoToHistoryOffset, void(int offset)); | 70 MOCK_METHOD1(GoToHistoryOffset, void(int offset)); |
70 MOCK_METHOD3(MessageToHost, void(const std::string& message, | 71 MOCK_METHOD3(MessageToHost, void(const std::string& message, |
71 const std::string& origin, const std::string& target)); | 72 const std::string& origin, const std::string& target)); |
72 | 73 |
73 // Misc. UI. | 74 // Misc. UI. |
74 MOCK_METHOD1(HandleAccelerator, void(const MSG& accel_message)); | 75 MOCK_METHOD1(HandleAccelerator, void(const MSG& accel_message)); |
75 MOCK_METHOD3(HandleContextMenu, void(HANDLE menu_handle, int align_flags, | 76 MOCK_METHOD3(HandleContextMenu, void(HANDLE menu_handle, int align_flags, |
76 const IPC::MiniContextMenuParams& params)); | 77 const MiniContextMenuParams& params)); |
77 MOCK_METHOD1(TabbedOut, void(bool reverse)); | 78 MOCK_METHOD1(TabbedOut, void(bool reverse)); |
78 | 79 |
79 // | 80 // |
80 MOCK_METHOD0(TabClosed, void()); | 81 MOCK_METHOD0(TabClosed, void()); |
81 MOCK_METHOD1(AttachTab, | 82 MOCK_METHOD1(AttachTab, void(const AttachExternalTabParams& attach_params)); |
82 void(const IPC::AttachExternalTabParams& attach_params)); | |
83 }; | 83 }; |
84 | 84 |
85 struct MockSender : public IPC::Message::Sender { | 85 struct MockSender : public IPC::Message::Sender { |
86 MOCK_METHOD1(Send, bool(IPC::Message* m)); | 86 MOCK_METHOD1(Send, bool(IPC::Message* m)); |
87 }; | 87 }; |
88 | 88 |
89 struct MockCFProxyTraits : public CFProxyTraits { | 89 struct MockCFProxyTraits : public CFProxyTraits { |
90 MOCK_METHOD2(DoCreateChannel, IPC::Message::Sender*(const std::string& id, | 90 MOCK_METHOD2(DoCreateChannel, IPC::Message::Sender*(const std::string& id, |
91 IPC::Channel::Listener* l)); | 91 IPC::Channel::Listener* l)); |
92 MOCK_METHOD1(CloseChannel, void(IPC::Message::Sender* s)); | 92 MOCK_METHOD1(CloseChannel, void(IPC::Message::Sender* s)); |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 ipc.StartWithOptions(base::Thread::Options(MessageLoop::TYPE_IO, 0)); | 335 ipc.StartWithOptions(base::Thread::Options(MessageLoop::TYPE_IO, 0)); |
336 | 336 |
337 StrictMock<MockChromeProxyDelegate> d1; | 337 StrictMock<MockChromeProxyDelegate> d1; |
338 TabsMap tab2delegate; | 338 TabsMap tab2delegate; |
339 SyncMsgSender queue(&tab2delegate); | 339 SyncMsgSender queue(&tab2delegate); |
340 | 340 |
341 const int kTabHandle = 6; | 341 const int kTabHandle = 6; |
342 const int kSessionId = 8; | 342 const int kSessionId = 8; |
343 | 343 |
344 // Create some sync messages and their replies. | 344 // Create some sync messages and their replies. |
345 AutomationMsg_InstallExtension m1(0, FilePath(L"c:\\awesome.x"), 0); | 345 AutomationMsg_InstallExtension m1(FilePath(L"c:\\awesome.x"), 0); |
346 AutomationMsg_CreateExternalTab m2(0, IPC::ExternalTabSettings(), 0, 0, 0, 0); | 346 AutomationMsg_CreateExternalTab m2(ExternalTabSettings(), 0, 0, 0, 0); |
347 scoped_ptr<IPC::Message> r1(CreateReply(&m1, | 347 scoped_ptr<IPC::Message> r1(CreateReply(&m1, |
348 AUTOMATION_MSG_EXTENSION_INSTALL_SUCCEEDED)); | 348 AUTOMATION_MSG_EXTENSION_INSTALL_SUCCEEDED)); |
349 scoped_ptr<IPC::Message> r2(CreateReply(&m2, (HWND)1, (HWND)2, kTabHandle, | 349 scoped_ptr<IPC::Message> r2(CreateReply(&m2, (HWND)1, (HWND)2, kTabHandle, |
350 kSessionId)); | 350 kSessionId)); |
351 | 351 |
352 queue.QueueSyncMessage(&m1, &d1, NULL); | 352 queue.QueueSyncMessage(&m1, &d1, NULL); |
353 queue.QueueSyncMessage(&m2, &d1, NULL); | 353 queue.QueueSyncMessage(&m2, &d1, NULL); |
354 | 354 |
355 testing::InSequence s; | 355 testing::InSequence s; |
356 EXPECT_CALL(d1, Completed_InstallExtension(true, | 356 EXPECT_CALL(d1, Completed_InstallExtension(true, |
357 AUTOMATION_MSG_EXTENSION_INSTALL_SUCCEEDED, NULL)); | 357 AUTOMATION_MSG_EXTENSION_INSTALL_SUCCEEDED, NULL)); |
358 EXPECT_CALL(d1, Completed_CreateTab(true, (HWND)1, (HWND)2, kTabHandle, | 358 EXPECT_CALL(d1, Completed_CreateTab(true, (HWND)1, (HWND)2, kTabHandle, |
359 kSessionId)); | 359 kSessionId)); |
360 | 360 |
361 // Execute replies in a worker thread. | 361 // Execute replies in a worker thread. |
362 ipc.message_loop()->PostTask(FROM_HERE, NewRunnableMethod(&queue, | 362 ipc.message_loop()->PostTask(FROM_HERE, NewRunnableMethod(&queue, |
363 &SyncMsgSender::OnReplyReceived, r1.get())); | 363 &SyncMsgSender::OnReplyReceived, r1.get())); |
364 ipc.message_loop()->PostTask(FROM_HERE, NewRunnableMethod(&queue, | 364 ipc.message_loop()->PostTask(FROM_HERE, NewRunnableMethod(&queue, |
365 &SyncMsgSender::OnReplyReceived, r2.get())); | 365 &SyncMsgSender::OnReplyReceived, r2.get())); |
366 ipc.Stop(); | 366 ipc.Stop(); |
367 | 367 |
368 // Expect that tab 6 has been associated with the delegate. | 368 // Expect that tab 6 has been associated with the delegate. |
369 EXPECT_EQ(&d1, tab2delegate[6]); | 369 EXPECT_EQ(&d1, tab2delegate[6]); |
370 } | 370 } |
371 | 371 |
372 TEST(SyncMsgSender, OnChannelClosed) { | 372 TEST(SyncMsgSender, OnChannelClosed) { |
373 // TODO(stoyan): implement. | 373 // TODO(stoyan): implement. |
374 } | 374 } |
375 | |
376 MATCHER_P(EqNavigationInfo, ni, "") { | |
377 return arg.navigation_type == ni.navigation_type && | |
378 arg.relative_offset == ni.relative_offset && | |
379 arg.navigation_index == ni.navigation_index && | |
380 arg.title == ni.title && | |
381 arg.url == ni.url && | |
382 arg.referrer == ni.referrer && | |
383 arg.security_style == ni.security_style && | |
384 arg.displayed_insecure_content == ni.displayed_insecure_content && | |
385 arg.ran_insecure_content == ni.ran_insecure_content; | |
386 } | |
387 | |
388 MATCHER_P(EqMSG, msg, "") { | |
389 return arg.hwnd == msg.hwnd && | |
390 arg.message == msg.message && | |
391 arg.wParam == msg.wParam && | |
392 arg.lParam == msg.lParam && | |
393 arg.time == msg.time && | |
394 arg.pt.x == msg.pt.x && | |
395 arg.pt.y == msg.pt.y; | |
396 } | |
397 | |
398 MATCHER_P(EqContextMenuParam, p, "") { | |
399 return arg.screen_x == p.screen_x && | |
400 arg.screen_y == p.screen_y && | |
401 arg.link_url == p.link_url && | |
402 arg.unfiltered_link_url == p.unfiltered_link_url && | |
403 arg.src_url == p.src_url && | |
404 arg.page_url == p.page_url && | |
405 arg.frame_url == p.frame_url; | |
406 } | |
407 | |
408 MATCHER_P(EqURLRequest, p, "") { | |
409 return arg.url == p.url && | |
410 arg.method == p.method && | |
411 arg.referrer == p.referrer && | |
412 arg.extra_request_headers == p.extra_request_headers && | |
413 // TODO(stoyan): scoped_refptr<net::UploadData> upload_data; | |
414 arg.resource_type == p.resource_type; | |
415 } | |
416 | |
417 | |
418 MATCHER_P(EqAttachExternalTab, p, "") { | |
419 return arg.cookie == p.cookie && | |
420 arg.url == p.url && | |
421 arg.dimensions == p.dimensions && | |
422 arg.disposition == p.disposition && | |
423 arg.user_gesture == p.user_gesture && | |
424 arg.profile_name == p.profile_name; | |
425 } | |
426 | |
427 TEST(Deserialize, DispatchTabMessage) { | |
428 testing::InSequence s; | |
429 StrictMock<MockChromeProxyDelegate> delegate; | |
430 GURL url("http://destination"); | |
431 GURL ref("http://referer"); | |
432 | |
433 // Tuple3<int, int, IPC::NavigationInfo> | |
434 int flags = 2; | |
435 IPC::NavigationInfo ni(2, 3, 4, L"title", url, | |
436 ref, SECURITY_STYLE_AUTHENTICATION_BROKEN, true, true); | |
437 AutomationMsg_NavigationStateChanged m1(0, 1, flags, ni); | |
438 EXPECT_CALL(delegate, NavigationStateChanged(flags, EqNavigationInfo(ni))); | |
439 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m1)); | |
440 | |
441 // Tuple2<int, std::wstring> | |
442 AutomationMsg_UpdateTargetUrl m2(0, 1, L"hello"); | |
443 EXPECT_CALL(delegate, UpdateTargetUrl(StrEq(L"hello"))); | |
444 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m2)); | |
445 | |
446 // Tuple2<int, MSG> | |
447 MSG wnd_msg = {0, WM_DESTROY, 1, 9, 0x5671, { 11, 12 }}; | |
448 AutomationMsg_HandleAccelerator m3(0, 1, wnd_msg); | |
449 EXPECT_CALL(delegate, HandleAccelerator(EqMSG(wnd_msg))); | |
450 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m3)); | |
451 | |
452 // Tuple2<int, bool> | |
453 AutomationMsg_TabbedOut m4(0, 1, true); | |
454 EXPECT_CALL(delegate, TabbedOut(true)); | |
455 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m4)); | |
456 | |
457 | |
458 // Tuple4<int, GURL, GURL, int> | |
459 AutomationMsg_OpenURL m5(0, 1, url, ref, 4); | |
460 EXPECT_CALL(delegate, OpenURL(url, ref, 4)); | |
461 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m5)); | |
462 | |
463 // Tuple3<int, int, GURL> | |
464 AutomationMsg_NavigationFailed m6(0, 1, 2, url); | |
465 EXPECT_CALL(delegate, NavigationFailed(2, url)); | |
466 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m6)); | |
467 | |
468 | |
469 // Tuple2<int, IPC::NavigationInfo> | |
470 AutomationMsg_DidNavigate m7(0, 1, ni); | |
471 EXPECT_CALL(delegate, DidNavigate(EqNavigationInfo(ni))); | |
472 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m7)); | |
473 | |
474 | |
475 // Tuple2<int, GURL> | |
476 AutomationMsg_TabLoaded m8(0, 1, url); | |
477 EXPECT_CALL(delegate, TabLoaded(url)); | |
478 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m8)); | |
479 | |
480 // Tuple4<int, string, string, string> | |
481 std::string msg("Load oranges barrels"); | |
482 std::string origin("Brothers Karamazov"); | |
483 std::string target("Alexander Ivanovich"); | |
484 AutomationMsg_ForwardMessageToExternalHost m9(0, 1, msg, origin, target); | |
485 EXPECT_CALL(delegate, MessageToHost(msg, origin, target)); | |
486 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m9)); | |
487 | |
488 // Tuple4<int, HANDLE, int, IPC::ContextMenuParams> | |
489 IPC::MiniContextMenuParams ctxmenu(711, 512, GURL("http://link_src"), | |
490 GURL("http://unfiltered_link_url"), GURL("http://src_url"), | |
491 GURL("http://page_url"), GURL("http://frame_url")); | |
492 AutomationMsg_ForwardContextMenuToExternalHost m10(0, 1, HANDLE(7), 4, | |
493 ctxmenu); | |
494 EXPECT_CALL(delegate, HandleContextMenu(HANDLE(7), 4, | |
495 EqContextMenuParam(ctxmenu))); | |
496 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m10)); | |
497 | |
498 // Tuple3<int, int, IPC::AutomationURLRequest> | |
499 IPC::AutomationURLRequest url_request("url", "post", "referer", | |
500 "extra_headers", 0, 3, 0); | |
501 AutomationMsg_RequestStart m11(0, 1, 7, url_request); | |
502 EXPECT_CALL(delegate, Network_Start(7, EqURLRequest(url_request))); | |
503 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m11)); | |
504 | |
505 // Tuple3<int, int, int> | |
506 AutomationMsg_RequestRead m12(0, 1, 7, 16384); | |
507 EXPECT_CALL(delegate, Network_Read(7, 16384)); | |
508 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m12)); | |
509 | |
510 // Tuple3<int, int, URLRequestStatus> | |
511 AutomationMsg_RequestEnd m13(0, 1, 7, URLRequestStatus()); | |
512 EXPECT_CALL(delegate, Network_End(7, _)); | |
513 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m13)); | |
514 | |
515 // Tuple2<int, int> | |
516 AutomationMsg_DownloadRequestInHost m14(0, 1, 7); | |
517 EXPECT_CALL(delegate, Network_DownloadInHost(7)); | |
518 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m14)); | |
519 | |
520 // Tuple3<int, GURL, string> | |
521 AutomationMsg_SetCookieAsync m15(0, 1, url, "cake=big"); | |
522 EXPECT_CALL(delegate, SetCookie(url, "cake=big")); | |
523 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m15)); | |
524 | |
525 // Tuple2<int, IPC::AttachExternalTabParams> | |
526 IPC::AttachExternalTabParams ext_tab(0xFEDCBA0987654321i64, url, | |
527 gfx::Rect(6, 9, 123, 999), 1, | |
528 false, "theprofile"); | |
529 AutomationMsg_AttachExternalTab m16(0, 1, ext_tab); | |
530 EXPECT_CALL(delegate, AttachTab(EqAttachExternalTab(ext_tab))); | |
531 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m16)); | |
532 | |
533 // Tuple2<int, int> | |
534 AutomationMsg_RequestGoToHistoryEntryOffset m17(0, 1, -4); | |
535 EXPECT_CALL(delegate, GoToHistoryOffset(-4)); | |
536 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m17)); | |
537 | |
538 // Tuple3<int, GURL, int> | |
539 AutomationMsg_GetCookiesFromHost m18(0, 1, url, 903); | |
540 EXPECT_CALL(delegate, GetCookies(url, 903)); | |
541 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m18)); | |
542 | |
543 AutomationMsg_CloseExternalTab m19(0, 1); | |
544 EXPECT_CALL(delegate, TabClosed()); | |
545 EXPECT_TRUE(DispatchTabMessageToDelegate(&delegate, m19)); | |
546 } | |
OLD | NEW |