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