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