print_dialog_cloud_unittest.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
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/string_util.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/cloud_print/cloud_print_url.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebUIMessageHandler;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::A;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AtLeast;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Eq;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::HasSubstr;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::IsNull;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::NotNull;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::StrEq;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::ExternalWebDialogUI;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kPDFTestFile[] = "printing/cloud_print_unittest.pdf";
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kMockJobTitle[] = "Mock Job Title";
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kMockPrintTicket[] = "Resolution=300";
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetTestDataFileName() {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath test_data_directory;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath test_file = test_data_directory.AppendASCII(kPDFTestFile);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return test_file;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char* GetTestData() {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string sTestFileData;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sTestFileData.empty()) {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath test_file = GetTestDataFileName();
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::ReadFileToString(test_file, &sTestFileData);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &sTestFileData[0];
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(StringValueEq, expected, "StringValue") {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (expected->Equals(&arg))
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string expected_string, arg_string;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected->GetAsString(&expected_string);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg.GetAsString(&arg_string);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result_listener << "'" << arg_string
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   << "' (expected '" << expected_string << "')";
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal_cloud_print_helpers {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockCloudPrintFlowHandler
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public CloudPrintFlowHandler,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::SupportsWeakPtr<MockCloudPrintFlowHandler> {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCloudPrintFlowHandler(const string16& title,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const string16& print_ticket,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& file_type,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool close_after_signin,
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            const base::Closure& callback)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : CloudPrintFlowHandler(NULL, title, print_ticket, file_type,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              close_after_signin, callback) {}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(DestructorCalled, void());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(RegisterMessages, void());
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD3(Observe,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               void(int type,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const content::NotificationSource& source,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const content::NotificationDetails& details));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(SetDialogDelegate,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               void(CloudPrintWebDialogDelegate* delegate));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(CreateCloudPrintDataSender,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               scoped_refptr<CloudPrintDataSender>());
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockCloudPrintWebDialogDelegate : public CloudPrintWebDialogDelegate {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetDialogModalType,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::ModalType());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetDialogTitle,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      string16());
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetDialogContentURL,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL());
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD1(GetWebUIMessageHandlers,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void(std::vector<WebUIMessageHandler*>* handlers));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD1(GetDialogSize,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void(gfx::Size* size));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetDialogArgs,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string());
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(OnDialogClosed,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void(const std::string& json_retval));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(OnCloseContents,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void(WebContents* source, bool *out_close_dialog));
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal_cloud_print_helpers
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using internal_cloud_print_helpers::CloudPrintDataSenderHelper;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using internal_cloud_print_helpers::CloudPrintDataSender;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockExternalWebDialogUI : public ExternalWebDialogUI {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(RenderViewCreated,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               void(content::RenderViewHost* render_view_host));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockCloudPrintDataSenderHelper : public CloudPrintDataSenderHelper {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(scottbyer): At some point this probably wants to use a
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MockTabContents instead of NULL, and to pre-load it with a bunch
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of expects/results.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockCloudPrintDataSenderHelper() : CloudPrintDataSenderHelper(NULL) {}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(CallJavascriptFunction, void(const std::wstring&));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(CallJavascriptFunction, void(const std::wstring&,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const Value& arg1));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD3(CallJavascriptFunction, void(const std::wstring&,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const Value& arg1,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const Value& arg2));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPrintURLTest : public testing::Test {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloudPrintURLTest() {}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset(new TestingProfile());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Profile> profile_;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintURLTest, CheckDefaultURLs) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string service_url =
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CloudPrintURL(profile_.get()).
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetCloudPrintServiceURL().spec();
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(service_url, HasSubstr("www.google.com"));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(service_url, HasSubstr("cloudprint"));
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string dialog_url =
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CloudPrintURL(profile_.get()).
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetCloudPrintServiceDialogURL().spec();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(dialog_url, HasSubstr("www.google.com"));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(dialog_url, HasSubstr("/cloudprint/"));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(dialog_url, HasSubstr("/client/"));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(dialog_url, Not(HasSubstr("cloudprint/cloudprint")));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(dialog_url, HasSubstr("/dialog.html"));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Repeat to make sure there isn't a transient glitch.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dialog_url =
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CloudPrintURL(profile_.get()).
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetCloudPrintServiceDialogURL().spec();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(dialog_url, HasSubstr("www.google.com"));
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(dialog_url, HasSubstr("/cloudprint/"));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(dialog_url, HasSubstr("/client/"));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(dialog_url, Not(HasSubstr("cloudprint/cloudprint")));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(dialog_url, HasSubstr("/dialog.html"));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string manage_url =
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CloudPrintURL(profile_.get()).
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetCloudPrintServiceManageURL().spec();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(manage_url, HasSubstr("www.google.com"));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(manage_url, HasSubstr("/cloudprint/"));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(manage_url, Not(HasSubstr("/client/")));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(manage_url, Not(HasSubstr("cloudprint/cloudprint")));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(manage_url, HasSubstr("/manage"));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL learn_more_url = CloudPrintURL::GetCloudPrintLearnMoreURL();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string learn_more_path = learn_more_url.spec();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(learn_more_path, HasSubstr("www.google.com"));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(learn_more_path, HasSubstr("/support/"));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(learn_more_path, HasSubstr("/cloudprint"));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(learn_more_url.has_path());
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(learn_more_url.has_query());
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL test_page_url = CloudPrintURL::GetCloudPrintTestPageURL();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string test_page_path = test_page_url.spec();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(test_page_path, HasSubstr("www.google.com"));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(test_page_path, HasSubstr("/landing/"));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(test_page_path, HasSubstr("/cloudprint/"));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(test_page_url.has_path());
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(test_page_url.has_query());
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Testing for CloudPrintDataSender needs a mock WebUI.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPrintDataSenderTest : public testing::Test {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloudPrintDataSenderTest()
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : file_thread_(BrowserThread::FILE, &message_loop_),
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        io_thread_(BrowserThread::IO, &message_loop_) {}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_helper_.reset(new MockCloudPrintDataSenderHelper);
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<CloudPrintDataSender> CreateSender(
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::RefCountedString* data) {
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new CloudPrintDataSender(mock_helper_.get(),
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    ASCIIToUTF16(kMockJobTitle),
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    ASCIIToUTF16(kMockPrintTicket),
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    std::string("application/pdf"),
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    data);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CloudPrintDataSender> print_data_sender_;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockCloudPrintDataSenderHelper> mock_helper_;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop message_loop_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread file_thread_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread io_thread_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintDataSenderTest, CanSend) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringValue mock_job_title(kMockJobTitle);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_helper_,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              CallJavascriptFunction(_, _, StringValueEq(&mock_job_title))).
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return());
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string data("test_data");
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<CloudPrintDataSender> print_data_sender(
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateSender(base::RefCountedString::TakeString(&data)));
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath test_data_file_name = GetTestDataFileName();
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::IO, FROM_HERE,
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&CloudPrintDataSender::SendPrintData, print_data_sender));
25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(CloudPrintDataSenderTest, NoData) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_helper_, CallJavascriptFunction(_, _, _)).Times(0);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<CloudPrintDataSender> print_data_sender(CreateSender(NULL));
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath test_data_file_name = GetTestDataFileName();
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::IO, FROM_HERE,
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&CloudPrintDataSender::SendPrintData, print_data_sender));
26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(CloudPrintDataSenderTest, EmptyData) {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_helper_, CallJavascriptFunction(_, _, _)).Times(0);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string data;
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<CloudPrintDataSender> print_data_sender(
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateSender(base::RefCountedString::TakeString(&data)));
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath test_data_file_name = GetTestDataFileName();
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::IO, FROM_HERE,
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&CloudPrintDataSender::SendPrintData, print_data_sender));
27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Testing for CloudPrintFlowHandler needs a mock
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CloudPrintWebDialogDelegate, mock CloudPrintDataSender, and a mock
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebUI.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Testing for CloudPrintWebDialogDelegate needs a mock
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CloudPrintFlowHandler.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using internal_cloud_print_helpers::MockCloudPrintFlowHandler;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using internal_cloud_print_helpers::CloudPrintWebDialogDelegate;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPrintWebDialogDelegateTest : public testing::Test {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloudPrintWebDialogDelegateTest()
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ui_thread_(BrowserThread::UI, &message_loop_) {}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 mock_title;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 mock_print_ticket;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string mock_file_type;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockCloudPrintFlowHandler* handler =
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new MockCloudPrintFlowHandler(mock_print_ticket, mock_title,
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      mock_file_type, false, base::Closure());
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_flow_handler_ = handler->AsWeakPtr();
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*mock_flow_handler_.get(), SetDialogDelegate(_));
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*mock_flow_handler_.get(), SetDialogDelegate(NULL));
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_.reset(new CloudPrintWebDialogDelegate(mock_flow_handler_.get(),
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    std::string()));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_.reset();
313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (mock_flow_handler_.get())
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete mock_flow_handler_.get();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoopForUI message_loop_;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<MockCloudPrintFlowHandler> mock_flow_handler_;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CloudPrintWebDialogDelegate> delegate_;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintWebDialogDelegateTest, BasicChecks) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(delegate_->GetDialogContentURL().spec(),
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              StrEq(chrome::kChromeUICloudPrintResourcesURL));
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(delegate_->GetDialogTitle().empty());
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool close_dialog = false;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->OnCloseContents(NULL, &close_dialog);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(close_dialog);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintWebDialogDelegateTest, OwnedFlowDestroyed) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_.reset();
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(mock_flow_handler_.get(), IsNull());
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintWebDialogDelegateTest, UnownedFlowLetGo) {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<WebUIMessageHandler*> handlers;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->GetWebUIMessageHandlers(&handlers);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_.reset();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(mock_flow_handler_.get(), NotNull());
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Testing for ExternalWebDialogUI needs a mock WebContents and mock
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CloudPrintWebDialogDelegate (attached to the mock web_contents).
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Testing for PrintDialogCloud needs a mock Browser.
349