diff options
Diffstat (limited to 'chrome/browser/printing/print_dialog_cloud_unittest.cc')
-rw-r--r-- | chrome/browser/printing/print_dialog_cloud_unittest.cc | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/chrome/browser/printing/print_dialog_cloud_unittest.cc b/chrome/browser/printing/print_dialog_cloud_unittest.cc new file mode 100644 index 0000000..85a3ce3 --- /dev/null +++ b/chrome/browser/printing/print_dialog_cloud_unittest.cc @@ -0,0 +1,189 @@ +// 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. + +#include "chrome/browser/printing/print_dialog_cloud.h" +#include "chrome/browser/printing/print_dialog_cloud_internal.h" + +#include "base/file_path.h" +#include "base/file_util.h" +#include "base/path_service.h" +#include "base/values.h" +#include "chrome/browser/chrome_thread.h" +#include "chrome/common/chrome_paths.h" +#include "chrome/common/notification_details.h" +#include "chrome/common/notification_observer.h" +#include "chrome/common/notification_registrar.h" +#include "chrome/common/notification_source.h" +#include "chrome/common/notification_type.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/gmock/include/gmock/gmock.h" + +using testing::AtLeast; +using testing::Return; +using testing::_; +using testing::A; + +static const char* const kPDFTestFile = "printing/cloud_print_unittest.pdf"; +static const char* const kEmptyPDFTestFile = + "printing/cloud_print_emptytest.pdf"; + +FilePath GetTestDataFileName() { + FilePath test_data_directory; + PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory); + FilePath test_file = test_data_directory.AppendASCII(kPDFTestFile); + return test_file; +} + +FilePath GetEmptyDataFileName() { + FilePath test_data_directory; + PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory); + FilePath test_file = test_data_directory.AppendASCII(kEmptyPDFTestFile); + return test_file; +} + +char* GetTestData() { + static std::string sTestFileData; + if (sTestFileData.empty()) { + FilePath test_file = GetTestDataFileName(); + file_util::ReadFileToString(test_file, &sTestFileData); + } + return &sTestFileData[0]; +} + +namespace internal_cloud_print_helpers { + +class MockCloudPrintFlowHandler : public CloudPrintFlowHandler { + public: + MOCK_METHOD0(RegisterMessages, + void()); + MOCK_METHOD3(Observe, + void(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details)); + MOCK_METHOD0(CreateCloudPrintDataSender, + scoped_refptr<CloudPrintDataSender>()); +}; + +class MockCloudPrintHtmlDialogDelegate : public CloudPrintHtmlDialogDelegate { + public: + MOCK_CONST_METHOD0(IsDialogModal, + bool()); + MOCK_CONST_METHOD0(GetDialogTitle, + std::wstring()); + MOCK_CONST_METHOD0(GetDialogContentURL, + GURL()); + MOCK_CONST_METHOD1(GetDOMMessageHandlers, + void(std::vector<DOMMessageHandler*>* handlers)); + MOCK_CONST_METHOD1(GetDialogSize, + void(gfx::Size* size)); + MOCK_CONST_METHOD0(GetDialogArgs, + std::string()); + MOCK_METHOD1(OnDialogClosed, + void(const std::string& json_retval)); + MOCK_METHOD2(OnCloseContents, + void(TabContents* source, bool *out_close_dialog)); +}; + +} // namespace internal_cloud_print_helpers + +using internal_cloud_print_helpers::CloudPrintDataSenderHelper; +using internal_cloud_print_helpers::CloudPrintDataSender; + +class MockExternalHtmlDialogUI : public ExternalHtmlDialogUI { + public: + MOCK_METHOD1(RenderViewCreated, + void(RenderViewHost* render_view_host)); +}; + +class MockCloudPrintDataSenderHelper : public CloudPrintDataSenderHelper { + public: + // TODO(scottbyer): At some point this probably wants to use a + // MockTabContents instead of NULL, and to pre-load it with a bunch + // of expects/results. + MockCloudPrintDataSenderHelper() : CloudPrintDataSenderHelper(NULL) {} + MOCK_METHOD1(CallJavascriptFunction, void(const std::wstring&)); + MOCK_METHOD2(CallJavascriptFunction, void(const std::wstring&, + const Value& arg1)); + MOCK_METHOD3(CallJavascriptFunction, void(const std::wstring&, + const Value& arg1, + const Value& arg2)); +}; + +// Testing for CloudPrintDataSender needs a mock DOMUI. +class CloudPrintDataSenderTest : public testing::Test { + public: + CloudPrintDataSenderTest() + : file_thread_(ChromeThread::FILE, &message_loop_), + io_thread_(ChromeThread::IO, &message_loop_) {} + + protected: + virtual void SetUp() { + mock_helper_.reset(new MockCloudPrintDataSenderHelper); + print_data_sender_ = + new CloudPrintDataSender(mock_helper_.get()); + } + + scoped_refptr<CloudPrintDataSender> print_data_sender_; + scoped_ptr<MockCloudPrintDataSenderHelper> mock_helper_; + + MessageLoop message_loop_; + ChromeThread file_thread_; + ChromeThread io_thread_; +}; + +// TODO(scottbyer): DISABLED until the binary test file can get +// checked in separate from the patch. +TEST_F(CloudPrintDataSenderTest, DISABLED_CanSend) { + EXPECT_CALL(*mock_helper_, CallJavascriptFunction(_, _, _)). + WillOnce(Return()); + + FilePath test_data_file_name = GetTestDataFileName(); + ChromeThread::PostTask(ChromeThread::FILE, FROM_HERE, + NewRunnableMethod( + print_data_sender_.get(), + &CloudPrintDataSender::ReadPrintDataFile, + test_data_file_name)); + MessageLoop::current()->RunAllPending(); +} + +TEST_F(CloudPrintDataSenderTest, BadFile) { + EXPECT_CALL(*mock_helper_, CallJavascriptFunction(_, _, _)).Times(0); + +#if defined(OS_WIN) + FilePath bad_data_file_name(L"/some/file/that/isnot/there"); +#else + FilePath bad_data_file_name("/some/file/that/isnot/there"); +#endif + ChromeThread::PostTask(ChromeThread::FILE, FROM_HERE, + NewRunnableMethod( + print_data_sender_.get(), + &CloudPrintDataSender::ReadPrintDataFile, + bad_data_file_name)); + MessageLoop::current()->RunAllPending(); +} + +TEST_F(CloudPrintDataSenderTest, EmptyFile) { + EXPECT_CALL(*mock_helper_, CallJavascriptFunction(_, _, _)).Times(0); + + FilePath empty_data_file_name = GetEmptyDataFileName(); + ChromeThread::PostTask(ChromeThread::FILE, FROM_HERE, + NewRunnableMethod( + print_data_sender_.get(), + &CloudPrintDataSender::ReadPrintDataFile, + empty_data_file_name)); + MessageLoop::current()->RunAllPending(); +} + +// Testing for CloudPrintFlowHandler needs a mock +// CloudPrintHtmlDialogDelegate, mock CloudPrintDataSender, and a mock +// DOMUI. + +// Testing for CloudPrintHtmlDialogDelegate needs a mock +// CloudPrintFlowHandler. + +// Testing for ExternalHtmlDialogUI needs a mock TabContents, mock +// CloudPrintHtmlDialogDelegate (provided through the mock +// tab_contents) + +// Testing for PrintDialogCloud needs a mock Browser. |