Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Unified Diff: ceee/ie/plugin/bho/infobar_manager_unittest.cc

Issue 4991002: New unittests for infobar. (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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"
+
+#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:
+ // TODO(vadimb@google.com): Mock these two methods and test different
+ // behaviors when they return different values.
+ virtual bool IsDestroyed() const { return false; }
+ virtual HWND GetWindowHandle() const { return kParentWindow; }
+ MOCK_METHOD3(PostWindowsMessage, bool(UINT, WPARAM, LPARAM));
+ };
+
+ 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));
+
+ // Arbitrary number to return from GetWindowRect. Unique to make it easier
+ // to trace in the debugger or to add in future tests dependent on return
+ // values.
+ RECT window_rect = {131, 213, 831, 1013};
+ 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

Powered by Google App Engine
This is Rietveld 408576698