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" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.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/browser/printing/cloud_print/cloud_print_url.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebUIMessageHandler; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::A; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AtLeast; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Eq; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::HasSubstr; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::IsNull; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::NotNull; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::StrEq; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::ExternalWebDialogUI; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kPDFTestFile[] = "printing/cloud_print_unittest.pdf"; 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kMockJobTitle[] = "Mock Job Title"; 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kMockPrintTicket[] = "Resolution=300"; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetTestDataFileName() { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_directory; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_file = test_data_directory.AppendASCII(kPDFTestFile); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return test_file; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char* GetTestData() { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string sTestFileData; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sTestFileData.empty()) { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_file = GetTestDataFileName(); 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::ReadFileToString(test_file, &sTestFileData); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &sTestFileData[0]; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(StringValueEq, expected, "StringValue") { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected->Equals(&arg)) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string expected_string, arg_string; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected->GetAsString(&expected_string); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg.GetAsString(&arg_string); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result_listener << "'" << arg_string 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "' (expected '" << expected_string << "')"; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal_cloud_print_helpers { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockCloudPrintFlowHandler 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public CloudPrintFlowHandler, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::SupportsWeakPtr<MockCloudPrintFlowHandler> { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MockCloudPrintFlowHandler(const base::string16& title, 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& print_ticket, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& file_type, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool close_after_signin, 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : CloudPrintFlowHandler(NULL, title, print_ticket, file_type, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) close_after_signin, callback) {} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(DestructorCalled, void()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(RegisterMessages, void()); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD3(Observe, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(int type, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details)); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(SetDialogDelegate, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(CloudPrintWebDialogDelegate* delegate)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(CreateCloudPrintDataSender, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CloudPrintDataSender>()); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockCloudPrintWebDialogDelegate : public CloudPrintWebDialogDelegate { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(GetDialogModalType, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ModalType()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(GetDialogTitle, 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(GetDialogContentURL, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL()); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD1(GetWebUIMessageHandlers, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(std::vector<WebUIMessageHandler*>* handlers)); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD1(GetDialogSize, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(gfx::Size* size)); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(GetDialogArgs, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnDialogClosed, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(const std::string& json_retval)); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(OnCloseContents, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(WebContents* source, bool *out_close_dialog)); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal_cloud_print_helpers 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using internal_cloud_print_helpers::CloudPrintDataSenderHelper; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using internal_cloud_print_helpers::CloudPrintDataSender; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockExternalWebDialogUI : public ExternalWebDialogUI { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(RenderViewCreated, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(content::RenderViewHost* render_view_host)); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockCloudPrintDataSenderHelper : public CloudPrintDataSenderHelper { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(scottbyer): At some point this probably wants to use a 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MockTabContents instead of NULL, and to pre-load it with a bunch 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of expects/results. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCloudPrintDataSenderHelper() : CloudPrintDataSenderHelper(NULL) {} 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MOCK_METHOD3(CallJavascriptFunction, void(const std::string&, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value& arg1, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value& arg2)); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPrintURLTest : public testing::Test { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloudPrintURLTest() {} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_.reset(new TestingProfile()); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Profile> profile_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintURLTest, CheckDefaultURLs) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string service_url = 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloudPrintURL(profile_.get()). 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCloudPrintServiceURL().spec(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(service_url, HasSubstr("www.google.com")); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(service_url, HasSubstr("cloudprint")); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string dialog_url = 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloudPrintURL(profile_.get()). 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCloudPrintServiceDialogURL().spec(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(dialog_url, HasSubstr("www.google.com")); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(dialog_url, HasSubstr("/cloudprint/")); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(dialog_url, HasSubstr("/client/")); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(dialog_url, Not(HasSubstr("cloudprint/cloudprint"))); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(dialog_url, HasSubstr("/dialog.html")); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Repeat to make sure there isn't a transient glitch. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_url = 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloudPrintURL(profile_.get()). 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCloudPrintServiceDialogURL().spec(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(dialog_url, HasSubstr("www.google.com")); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(dialog_url, HasSubstr("/cloudprint/")); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(dialog_url, HasSubstr("/client/")); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(dialog_url, Not(HasSubstr("cloudprint/cloudprint"))); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(dialog_url, HasSubstr("/dialog.html")); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string manage_url = 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloudPrintURL(profile_.get()). 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCloudPrintServiceManageURL().spec(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(manage_url, HasSubstr("www.google.com")); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(manage_url, HasSubstr("/cloudprint/")); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(manage_url, Not(HasSubstr("/client/"))); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(manage_url, Not(HasSubstr("cloudprint/cloudprint"))); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(manage_url, HasSubstr("/manage")); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL learn_more_url = CloudPrintURL::GetCloudPrintLearnMoreURL(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string learn_more_path = learn_more_url.spec(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(learn_more_path, HasSubstr("www.google.com")); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(learn_more_path, HasSubstr("/support/")); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(learn_more_path, HasSubstr("/cloudprint")); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(learn_more_url.has_path()); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(learn_more_url.has_query()); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL test_page_url = CloudPrintURL::GetCloudPrintTestPageURL(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string test_page_path = test_page_url.spec(); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(test_page_path, HasSubstr("www.google.com")); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(test_page_path, HasSubstr("/landing/")); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(test_page_path, HasSubstr("/cloudprint/")); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_page_url.has_path()); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_page_url.has_query()); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Testing for CloudPrintDataSender needs a mock WebUI. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPrintDataSenderTest : public testing::Test { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloudPrintDataSenderTest() 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : file_thread_(BrowserThread::FILE, &message_loop_), 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_thread_(BrowserThread::IO, &message_loop_) {} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_helper_.reset(new MockCloudPrintDataSenderHelper); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<CloudPrintDataSender> CreateSender( 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::RefCountedString* data) { 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new CloudPrintDataSender(mock_helper_.get(), 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::ASCIIToUTF16(kMockJobTitle), 224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::ASCIIToUTF16(kMockPrintTicket), 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string("application/pdf"), 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CloudPrintDataSender> print_data_sender_; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockCloudPrintDataSenderHelper> mock_helper_; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop_; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread_; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread io_thread_; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintDataSenderTest, CanSend) { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringValue mock_job_title(kMockJobTitle); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_helper_, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallJavascriptFunction(_, _, StringValueEq(&mock_job_title))). 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(Return()); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string data("test_data"); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<CloudPrintDataSender> print_data_sender( 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateSender(base::RefCountedString::TakeString(&data))); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_file_name = GetTestDataFileName(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CloudPrintDataSender::SendPrintData, print_data_sender)); 25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(CloudPrintDataSenderTest, NoData) { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_helper_, CallJavascriptFunction(_, _, _)).Times(0); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<CloudPrintDataSender> print_data_sender(CreateSender(NULL)); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_file_name = GetTestDataFileName(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CloudPrintDataSender::SendPrintData, print_data_sender)); 26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(CloudPrintDataSenderTest, EmptyData) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_helper_, CallJavascriptFunction(_, _, _)).Times(0); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string data; 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<CloudPrintDataSender> print_data_sender( 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateSender(base::RefCountedString::TakeString(&data))); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_file_name = GetTestDataFileName(); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CloudPrintDataSender::SendPrintData, print_data_sender)); 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Testing for CloudPrintFlowHandler needs a mock 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CloudPrintWebDialogDelegate, mock CloudPrintDataSender, and a mock 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebUI. 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Testing for CloudPrintWebDialogDelegate needs a mock 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CloudPrintFlowHandler. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using internal_cloud_print_helpers::MockCloudPrintFlowHandler; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using internal_cloud_print_helpers::CloudPrintWebDialogDelegate; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPrintWebDialogDelegateTest : public testing::Test { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloudPrintWebDialogDelegateTest() 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ui_thread_(BrowserThread::UI, &message_loop_) {} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 mock_title; 295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 mock_print_ticket; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mock_file_type; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCloudPrintFlowHandler* handler = 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new MockCloudPrintFlowHandler(mock_print_ticket, mock_title, 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock_file_type, false, base::Closure()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_flow_handler_ = handler->AsWeakPtr(); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_flow_handler_.get(), SetDialogDelegate(_)); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_flow_handler_.get(), SetDialogDelegate(NULL)); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.reset(new CloudPrintWebDialogDelegate(mock_flow_handler_.get(), 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string())); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_.reset(); 309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (mock_flow_handler_.get()) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete mock_flow_handler_.get(); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI message_loop_; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread_; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtr<MockCloudPrintFlowHandler> mock_flow_handler_; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<CloudPrintWebDialogDelegate> delegate_; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintWebDialogDelegateTest, BasicChecks) { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(delegate_->GetDialogContentURL().spec(), 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrEq(chrome::kChromeUICloudPrintResourcesURL)); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(delegate_->GetDialogTitle().empty()); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool close_dialog = false; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnCloseContents(NULL, &close_dialog); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(close_dialog); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintWebDialogDelegateTest, OwnedFlowDestroyed) { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_.reset(); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(mock_flow_handler_.get(), IsNull()); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintWebDialogDelegateTest, UnownedFlowLetGo) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<WebUIMessageHandler*> handlers; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->GetWebUIMessageHandlers(&handlers); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_.reset(); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(mock_flow_handler_.get(), NotNull()); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Testing for ExternalWebDialogUI needs a mock WebContents and mock 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CloudPrintWebDialogDelegate (attached to the mock web_contents). 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Testing for PrintDialogCloud needs a mock Browser. 345