15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_dialog_cloud.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_dialog_cloud_internal.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 169ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/cloud_devices/common/cloud_devices_urls.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebUIMessageHandler; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::A; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AtLeast; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Eq; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::HasSubstr; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::IsNull; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::NotNull; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::StrEq; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::ExternalWebDialogUI; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kPDFTestFile[] = "printing/cloud_print_unittest.pdf"; 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kMockJobTitle[] = "Mock Job Title"; 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kMockPrintTicket[] = "Resolution=300"; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetTestDataFileName() { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_directory; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_file = test_data_directory.AppendASCII(kPDFTestFile); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return test_file; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char* GetTestData() { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string sTestFileData; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sTestFileData.empty()) { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_file = GetTestDataFileName(); 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::ReadFileToString(test_file, &sTestFileData); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &sTestFileData[0]; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(StringValueEq, expected, "StringValue") { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected->Equals(&arg)) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string expected_string, arg_string; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected->GetAsString(&expected_string); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg.GetAsString(&arg_string); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result_listener << "'" << arg_string 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "' (expected '" << expected_string << "')"; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal_cloud_print_helpers { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockCloudPrintFlowHandler 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public CloudPrintFlowHandler, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::SupportsWeakPtr<MockCloudPrintFlowHandler> { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MockCloudPrintFlowHandler(const base::string16& title, 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& print_ticket, 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& file_type) 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : CloudPrintFlowHandler(NULL, title, print_ticket, file_type) {} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(DestructorCalled, void()); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(RegisterMessages, void()); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD3(Observe, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(int type, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details)); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(SetDialogDelegate, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(CloudPrintWebDialogDelegate* delegate)); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(CreateCloudPrintDataSender, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CloudPrintDataSender>()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockCloudPrintWebDialogDelegate : public CloudPrintWebDialogDelegate { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(GetDialogModalType, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ModalType()); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(GetDialogTitle, 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(GetDialogContentURL, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD1(GetWebUIMessageHandlers, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(std::vector<WebUIMessageHandler*>* handlers)); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD1(GetDialogSize, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(gfx::Size* size)); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(GetDialogArgs, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnDialogClosed, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(const std::string& json_retval)); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(OnCloseContents, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(WebContents* source, bool *out_close_dialog)); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal_cloud_print_helpers 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using internal_cloud_print_helpers::CloudPrintDataSenderHelper; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using internal_cloud_print_helpers::CloudPrintDataSender; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockExternalWebDialogUI : public ExternalWebDialogUI { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(RenderViewCreated, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(content::RenderViewHost* render_view_host)); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockCloudPrintDataSenderHelper : public CloudPrintDataSenderHelper { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(scottbyer): At some point this probably wants to use a 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MockTabContents instead of NULL, and to pre-load it with a bunch 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of expects/results. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCloudPrintDataSenderHelper() : CloudPrintDataSenderHelper(NULL) {} 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MOCK_METHOD3(CallJavascriptFunction, void(const std::string&, 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Value& arg1, 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Value& arg2)); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Testing for CloudPrintDataSender needs a mock WebUI. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPrintDataSenderTest : public testing::Test { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloudPrintDataSenderTest() 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : file_thread_(BrowserThread::FILE, &message_loop_), 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_thread_(BrowserThread::IO, &message_loop_) {} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_helper_.reset(new MockCloudPrintDataSenderHelper); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<CloudPrintDataSender> CreateSender( 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::RefCountedString* data) { 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new CloudPrintDataSender(mock_helper_.get(), 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::ASCIIToUTF16(kMockJobTitle), 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::ASCIIToUTF16(kMockPrintTicket), 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string("application/pdf"), 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CloudPrintDataSender> print_data_sender_; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockCloudPrintDataSenderHelper> mock_helper_; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop_; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread_; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread io_thread_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintDataSenderTest, CanSend) { 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::StringValue mock_job_title(kMockJobTitle); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_helper_, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallJavascriptFunction(_, _, StringValueEq(&mock_job_title))). 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(Return()); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string data("test_data"); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<CloudPrintDataSender> print_data_sender( 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateSender(base::RefCountedString::TakeString(&data))); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_file_name = GetTestDataFileName(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CloudPrintDataSender::SendPrintData, print_data_sender)); 18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(CloudPrintDataSenderTest, NoData) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_helper_, CallJavascriptFunction(_, _, _)).Times(0); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<CloudPrintDataSender> print_data_sender(CreateSender(NULL)); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_file_name = GetTestDataFileName(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CloudPrintDataSender::SendPrintData, print_data_sender)); 19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(CloudPrintDataSenderTest, EmptyData) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_helper_, CallJavascriptFunction(_, _, _)).Times(0); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string data; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<CloudPrintDataSender> print_data_sender( 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateSender(base::RefCountedString::TakeString(&data))); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_file_name = GetTestDataFileName(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CloudPrintDataSender::SendPrintData, print_data_sender)); 20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Testing for CloudPrintFlowHandler needs a mock 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CloudPrintWebDialogDelegate, mock CloudPrintDataSender, and a mock 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebUI. 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Testing for CloudPrintWebDialogDelegate needs a mock 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CloudPrintFlowHandler. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using internal_cloud_print_helpers::MockCloudPrintFlowHandler; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using internal_cloud_print_helpers::CloudPrintWebDialogDelegate; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPrintWebDialogDelegateTest : public testing::Test { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloudPrintWebDialogDelegateTest() 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ui_thread_(BrowserThread::UI, &message_loop_) {} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 mock_title; 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 mock_print_ticket; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mock_file_type; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCloudPrintFlowHandler* handler = 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new MockCloudPrintFlowHandler(mock_print_ticket, mock_title, 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mock_file_type); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_flow_handler_ = handler->AsWeakPtr(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_flow_handler_.get(), SetDialogDelegate(_)); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_flow_handler_.get(), SetDialogDelegate(NULL)); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.reset(new CloudPrintWebDialogDelegate(mock_flow_handler_.get(), 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string())); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_.reset(); 241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (mock_flow_handler_.get()) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete mock_flow_handler_.get(); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI message_loop_; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread_; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtr<MockCloudPrintFlowHandler> mock_flow_handler_; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<CloudPrintWebDialogDelegate> delegate_; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintWebDialogDelegateTest, BasicChecks) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(delegate_->GetDialogContentURL().spec(), 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrEq(chrome::kChromeUICloudPrintResourcesURL)); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(delegate_->GetDialogTitle().empty()); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool close_dialog = false; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnCloseContents(NULL, &close_dialog); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(close_dialog); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintWebDialogDelegateTest, OwnedFlowDestroyed) { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_.reset(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(mock_flow_handler_.get(), IsNull()); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintWebDialogDelegateTest, UnownedFlowLetGo) { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<WebUIMessageHandler*> handlers; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->GetWebUIMessageHandlers(&handlers); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_.reset(); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(mock_flow_handler_.get(), NotNull()); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Testing for ExternalWebDialogUI needs a mock WebContents and mock 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CloudPrintWebDialogDelegate (attached to the mock web_contents). 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Testing for PrintDialogCloud needs a mock Browser. 277