Chromium Code Reviews| Index: ceee/ie/plugin/bho/infobar_manager_unittest.cc |
| =================================================================== |
| --- ceee/ie/plugin/bho/infobar_manager_unittest.cc (revision 0) |
| +++ ceee/ie/plugin/bho/infobar_manager_unittest.cc (revision 0) |
| @@ -0,0 +1,203 @@ |
| +// Copyright (c) 2010 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. |
| +// |
| +// Infobar manager implementation unit tests. |
| + |
| +// MockWin32 must not be included after atlwin, which is included by some |
| +// headers in here, so we need to put it at the top: |
| +#include "ceee/testing/utils/mock_win32.h" // NOLINT |
| + |
| +#include "ceee/ie/plugin/bho/infobar_manager.h" |
| +#include "ceee/ie/plugin/bho/infobar_window.h" |
| +#include "ceee/testing/utils/instance_count_mixin.h" |
| +#include "ceee/testing/utils/test_utils.h" |
| +#include "testing/gmock/include/gmock/gmock.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
|
MAD
2010/11/16 12:58:12
Just a note that if you don't submit before Jói do
vadimb
2010/11/16 22:46:01
I will sync before submitting. Or maybe you will h
|
| + |
| +#include "broker_lib.h" // NOLINT |
| + |
| +namespace { |
| + |
| +using testing::_; |
| +using testing::Invoke; |
| +using testing::InvokeWithoutArgs; |
| +using testing::NotNull; |
| +using testing::Return; |
| +using testing::SetArgumentPointee; |
| +using testing::StrictMock; |
| + |
| +const HWND kGoodWindow = reinterpret_cast<HWND>(42); |
| +const HWND kParentWindow = reinterpret_cast<HWND>(77); |
| +const HWND kInfobarWindow = reinterpret_cast<HWND>(91); |
| +const wchar_t* kUrl1 = L"/infobar/test.html"; |
| +const int kMaxHeight = 55; |
| + |
| +class MockInfobarDelegate : public infobar_api::InfobarWindow::Delegate { |
| + public: |
| + MOCK_METHOD0(GetContainerWindow, HWND()); |
| + MOCK_METHOD1(OnWindowClose, void(infobar_api::InfobarType)); |
| +}; |
| + |
| +class MockInfobarWindow : public infobar_api::InfobarWindow { |
| + public: |
| + MockInfobarWindow(infobar_api::InfobarType type, Delegate* delegate) |
| + : infobar_api::InfobarWindow(type, delegate) {} |
| + MOCK_METHOD2(InternalCreate, HWND(HWND, DWORD)); |
| + MOCK_METHOD2(Show, HRESULT(int, bool)); |
| + MOCK_METHOD0(Hide, HRESULT()); |
| + MOCK_METHOD1(Navigate, HRESULT(const std::wstring& url)); |
| + MOCK_METHOD0(Reset, void()); |
| + |
| + HWND SetInfobarHwnd() { |
| + m_hWnd = kInfobarWindow; |
| + return m_hWnd; |
| + } |
| +}; |
| + |
| +class TestingInfobarManager : public infobar_api::InfobarManager { |
| + public: |
| + class MockContainerWindow : public ContainerWindowInterface { |
| + public: |
| + virtual bool IsDestroyed() const { return false; } |
|
MAD
2010/11/16 12:58:12
Would be nice to mock those two and test the diffe
vadimb
2010/11/16 22:46:01
Done.
|
| + virtual HWND GetWindowHandle() const { return kParentWindow; } |
| + MOCK_METHOD3(PostWindowsMessage, bool(UINT, WPARAM, LPARAM)); |
| + /* |
|
MAD
2010/11/16 12:58:12
Why this commented out code?
vadimb
2010/11/16 22:46:01
Removed. Sorry, leftover from the previous version
|
| + virtual bool PostWindowsMessage(UINT msg, WPARAM wparam, LPARAM lparam) { |
| + return true; |
| + } |
| + */ |
| + }; |
| + |
| + explicit TestingInfobarManager(HWND tab_window) |
| + : infobar_api::InfobarManager(tab_window) { |
| + } |
| + |
| + MockInfobarWindow* GetInfobarWindow(infobar_api::InfobarType type) { |
| + if (type < infobar_api::FIRST_INFOBAR_TYPE || |
| + type >= infobar_api::END_OF_INFOBAR_TYPE) { |
| + return NULL; |
| + } |
| + return reinterpret_cast<MockInfobarWindow*>(infobars_[type].get()); |
| + } |
| + |
| + void InitInfobarWindow(infobar_api::InfobarType type, Delegate* delegate) { |
| + ASSERT_TRUE(type >= infobar_api::FIRST_INFOBAR_TYPE && |
| + type < infobar_api::END_OF_INFOBAR_TYPE); |
| + ASSERT_TRUE(infobars_[type] == NULL); |
| + infobars_[type].reset(new MockInfobarWindow(type, delegate)); |
| + } |
| + |
| + virtual ContainerWindowInterface* CreateContainerWindow( |
| + HWND container, InfobarManager* manager) { |
| + return new MockContainerWindow; |
| + } |
| + |
| + void SetContainerWindow(ContainerWindowInterface* window) { |
| + container_window_.reset(window); |
| + } |
| + |
| + void EmulateOnClose(infobar_api::InfobarType type) { |
| + OnWindowClose(type); |
| + OnContainerWindowDelayedCloseInfobar(type); |
| + } |
| +}; |
| + |
| +class InfobarManagerTests : public testing::Test { |
| + public: |
| + virtual void SetUp() { |
| + infobar_delegate_.reset(new MockInfobarDelegate); |
| + infobar_manager_.reset(new TestingInfobarManager(kGoodWindow)); |
| + |
| + EXPECT_CALL(user32_, IsWindow(kParentWindow)).WillRepeatedly(Return(TRUE)); |
| + EXPECT_CALL(user32_, IsWindow(kGoodWindow)).WillRepeatedly(Return(TRUE)); |
| + EXPECT_CALL(user32_, IsWindow(kInfobarWindow)).WillRepeatedly(Return(TRUE)); |
| + EXPECT_CALL(user32_, IsWindow(NULL)).WillRepeatedly(Return(FALSE)); |
| + EXPECT_CALL(user32_, GetParent(_)).WillRepeatedly(Return(kGoodWindow)); |
| + |
| + RECT window_rect = {131, 213, 831, 1013}; |
|
MAD
2010/11/16 12:58:12
Where do these numbers come from?
Comments please.
vadimb
2010/11/16 22:46:01
Done.
|
| + EXPECT_CALL(user32_, GetWindowRect(_, NotNull())). |
| + WillRepeatedly(DoAll(SetArgumentPointee<1>(window_rect), Return(TRUE))); |
| + } |
| + virtual void TearDown() { |
| + testing::LogDisabler no_dchecks; |
| + infobar_manager_.reset(NULL); |
| + infobar_delegate_.reset(NULL); |
| + |
| + // Everything should have been relinquished. |
| + ASSERT_EQ(0, testing::InstanceCountMixinBase::all_instance_count()); |
| +} |
| + |
| + protected: |
| + static BOOL MockEnumChildWindows(HWND, WNDENUMPROC, LPARAM lparam) { |
| + HWND* window_handle = reinterpret_cast<HWND*>(lparam); |
| + if (window_handle) |
| + *window_handle = kParentWindow; |
| + return TRUE; |
| + } |
| + |
| + StrictMock<testing::MockUser32> user32_; |
| + scoped_ptr<MockInfobarDelegate> infobar_delegate_; |
| + scoped_ptr<TestingInfobarManager> infobar_manager_; |
| +}; |
| + |
| +TEST_F(InfobarManagerTests, GetContainerWindow) { |
| + EXPECT_CALL(user32_, EnumChildWindows(kGoodWindow, _, _)). |
| + WillOnce(Invoke(MockEnumChildWindows)); |
| + |
| + ASSERT_EQ(kParentWindow, infobar_manager_->GetContainerWindow()); |
| + // Next time it should not call EnumChildWindows. |
| + ASSERT_EQ(kParentWindow, infobar_manager_->GetContainerWindow()); |
| +} |
| + |
| +TEST_F(InfobarManagerTests, ShowHide) { |
| + infobar_manager_->InitInfobarWindow(infobar_api::TOP_INFOBAR, |
| + infobar_delegate_.get()); |
| + |
| + // Test Show first. |
| + MockInfobarWindow* infobar_window = |
| + infobar_manager_->GetInfobarWindow(infobar_api::TOP_INFOBAR); |
| + const std::wstring url(kUrl1); |
| + EXPECT_CALL(*infobar_window, Navigate(url)).WillOnce(Return(S_OK)); |
| + EXPECT_CALL(*infobar_window, InternalCreate(kGoodWindow, _)). |
| + WillOnce(WithoutArgs(Invoke(infobar_window, |
| + &MockInfobarWindow::SetInfobarHwnd))); |
| + EXPECT_CALL(*infobar_window, Show(kMaxHeight, false)); |
| + EXPECT_CALL(*infobar_delegate_, GetContainerWindow()). |
| + WillRepeatedly(Return(kParentWindow)); |
| + EXPECT_CALL(user32_, SetWindowPos(_, _, _, _, _, _, _)). |
| + WillRepeatedly(Return(TRUE)); |
| + |
| + EXPECT_HRESULT_SUCCEEDED(infobar_manager_->Show(infobar_api::TOP_INFOBAR, |
| + kMaxHeight, kUrl1, false)); |
| + |
| + // Test Hide for this infobar two times. The second Hide should still be OK |
| + // even though the infobar is already hidden. |
| + EXPECT_CALL(*infobar_window, Reset()).Times(2); |
| + EXPECT_HRESULT_SUCCEEDED(infobar_manager_->Hide(infobar_api::TOP_INFOBAR)); |
| + EXPECT_HRESULT_SUCCEEDED(infobar_manager_->Hide(infobar_api::TOP_INFOBAR)); |
| + |
| + // However Hide to non-existent infobar should result in an error. |
| + EXPECT_HRESULT_FAILED(infobar_manager_->Hide(infobar_api::BOTTOM_INFOBAR)); |
| + EXPECT_HRESULT_FAILED(infobar_manager_->Hide( |
| + static_cast<infobar_api::InfobarType>(55))); |
| + |
| + // HideAll hides only the existing infobar. |
| + EXPECT_CALL(*infobar_window, Reset()); |
| + infobar_manager_->HideAll(); |
| +} |
| + |
| +TEST_F(InfobarManagerTests, OnClose) { |
| + infobar_manager_->InitInfobarWindow(infobar_api::TOP_INFOBAR, |
| + infobar_delegate_.get()); |
| + TestingInfobarManager::MockContainerWindow* container_window = |
| + new TestingInfobarManager::MockContainerWindow; |
| + infobar_manager_->SetContainerWindow(container_window); |
| + EXPECT_CALL(*container_window, PostWindowsMessage(_, _, _)); |
| + MockInfobarWindow* infobar_window = |
| + infobar_manager_->GetInfobarWindow(infobar_api::TOP_INFOBAR); |
| + EXPECT_CALL(*infobar_window, Reset()); |
| + infobar_manager_->EmulateOnClose(infobar_api::TOP_INFOBAR); |
| +} |
| + |
| +} // namespace |