print_dialog_cloud_unittest.cc revision 513209b27ff55e2841eac0e4120199c23acce758
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/printing/print_dialog_cloud.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/printing/print_dialog_cloud_internal.h"
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/path_service.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/weak_ptr.h"
15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/browser_thread.h"
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/printing/cloud_print/cloud_print_url.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/notification_details.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/notification_observer.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/notification_registrar.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/notification_source.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/notification_type.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/testing_profile.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gmock/include/gmock/gmock.h"
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::A;
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::AtLeast;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Eq;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::HasSubstr;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::IsNull;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::NotNull;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Return;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::StrEq;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::_;
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const char* const kPDFTestFile = "printing/cloud_print_unittest.pdf";
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const char* const kEmptyPDFTestFile =
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "printing/cloud_print_emptytest.pdf";
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const char* const kMockJobTitle = "Mock Job Title";
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFilePath GetTestDataFileName() {
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_data_directory;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory);
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_file = test_data_directory.AppendASCII(kPDFTestFile);
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return test_file;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFilePath GetEmptyDataFileName() {
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_data_directory;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_file = test_data_directory.AppendASCII(kEmptyPDFTestFile);
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return test_file;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchar* GetTestData() {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static std::string sTestFileData;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (sTestFileData.empty()) {
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath test_file = GetTestDataFileName();
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    file_util::ReadFileToString(test_file, &sTestFileData);
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return &sTestFileData[0];
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMATCHER_P(StringValueEq, expected, "StringValue") {
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (expected->Equals(&arg))
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string expected_string, arg_string;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  expected->GetAsString(&expected_string);
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  arg.GetAsString(&arg_string);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  *result_listener << "'" << arg_string
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   << "' (expected '" << expected_string << "')";
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return false;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace internal_cloud_print_helpers {
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockCloudPrintFlowHandler
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : public CloudPrintFlowHandler,
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      public base::SupportsWeakPtr<MockCloudPrintFlowHandler> {
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit MockCloudPrintFlowHandler(const FilePath& path,
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     const string16& title)
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : CloudPrintFlowHandler(path, title) {}
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0(DestructorCalled, void());
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0(RegisterMessages, void());
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD3(Observe,
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               void(NotificationType type,
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    const NotificationSource& source,
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    const NotificationDetails& details));
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(SetDialogDelegate,
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               void(CloudPrintHtmlDialogDelegate* delegate));
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0(CreateCloudPrintDataSender,
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               scoped_refptr<CloudPrintDataSender>());
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockCloudPrintHtmlDialogDelegate : public CloudPrintHtmlDialogDelegate {
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD0(IsDialogModal,
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      bool());
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD0(GetDialogTitle,
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      std::wstring());
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD0(GetDialogContentURL,
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GURL());
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD1(GetDOMMessageHandlers,
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      void(std::vector<DOMMessageHandler*>* handlers));
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD1(GetDialogSize,
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      void(gfx::Size* size));
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD0(GetDialogArgs,
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      std::string());
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(OnDialogClosed,
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      void(const std::string& json_retval));
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD2(OnCloseContents,
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      void(TabContents* source, bool *out_close_dialog));
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace internal_cloud_print_helpers
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing internal_cloud_print_helpers::CloudPrintDataSenderHelper;
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing internal_cloud_print_helpers::CloudPrintDataSender;
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockExternalHtmlDialogUI : public ExternalHtmlDialogUI {
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(RenderViewCreated,
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      void(RenderViewHost* render_view_host));
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockCloudPrintDataSenderHelper : public CloudPrintDataSenderHelper {
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(scottbyer): At some point this probably wants to use a
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // MockTabContents instead of NULL, and to pre-load it with a bunch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // of expects/results.
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockCloudPrintDataSenderHelper() : CloudPrintDataSenderHelper(NULL) {}
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(CallJavascriptFunction, void(const std::wstring&));
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD2(CallJavascriptFunction, void(const std::wstring&,
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            const Value& arg1));
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD3(CallJavascriptFunction, void(const std::wstring&,
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            const Value& arg1,
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            const Value& arg2));
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CloudPrintURLTest : public testing::Test {
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CloudPrintURLTest() {}
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUp() {
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    profile_.reset(new TestingProfile());
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<Profile> profile_;
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(CloudPrintURLTest, CheckDefaultURLs) {
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string service_url =
1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      CloudPrintURL(profile_.get()).
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GetCloudPrintServiceURL().spec();
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(service_url, HasSubstr("www.google.com"));
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(service_url, HasSubstr("cloudprint"));
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string dialog_url =
1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      CloudPrintURL(profile_.get()).
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GetCloudPrintServiceDialogURL().spec();
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, HasSubstr("www.google.com"));
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, HasSubstr("/cloudprint/"));
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, HasSubstr("/client/"));
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, Not(HasSubstr("cloudprint/cloudprint")));
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, HasSubstr("/dialog.html"));
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Repeat to make sure there isn't a transient glitch.
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dialog_url =
1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      CloudPrintURL(profile_.get()).
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GetCloudPrintServiceDialogURL().spec();
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, HasSubstr("www.google.com"));
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, HasSubstr("/cloudprint/"));
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, HasSubstr("/client/"));
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, Not(HasSubstr("cloudprint/cloudprint")));
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, HasSubstr("/dialog.html"));
180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string manage_url =
182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      CloudPrintURL(profile_.get()).
183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      GetCloudPrintServiceManageURL().spec();
184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_THAT(manage_url, HasSubstr("www.google.com"));
185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_THAT(manage_url, HasSubstr("/cloudprint/"));
186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_THAT(manage_url, Not(HasSubstr("/client/")));
187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_THAT(manage_url, Not(HasSubstr("cloudprint/cloudprint")));
188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_THAT(manage_url, HasSubstr("/manage"));
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Testing for CloudPrintDataSender needs a mock DOMUI.
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CloudPrintDataSenderTest : public testing::Test {
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CloudPrintDataSenderTest()
195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      : file_thread_(BrowserThread::FILE, &message_loop_),
196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        io_thread_(BrowserThread::IO, &message_loop_) {}
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUp() {
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    string16 mock_job_title(ASCIIToUTF16(kMockJobTitle));
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    mock_helper_.reset(new MockCloudPrintDataSenderHelper);
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    print_data_sender_ =
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        new CloudPrintDataSender(mock_helper_.get(), mock_job_title);
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<CloudPrintDataSender> print_data_sender_;
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<MockCloudPrintDataSenderHelper> mock_helper_;
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop message_loop_;
210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread file_thread_;
211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread io_thread_;
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(scottbyer): DISABLED until the binary test file can get
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// checked in separate from the patch.
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(CloudPrintDataSenderTest, CanSend) {
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StringValue mock_job_title(kMockJobTitle);
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(*mock_helper_,
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              CallJavascriptFunction(_, _, StringValueEq(&mock_job_title))).
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WillOnce(Return());
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_data_file_name = GetTestDataFileName();
223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                          NewRunnableMethod(
225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              print_data_sender_.get(),
226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              &CloudPrintDataSender::ReadPrintDataFile,
227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              test_data_file_name));
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(CloudPrintDataSenderTest, BadFile) {
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(*mock_helper_, CallJavascriptFunction(_, _, _)).Times(0);
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath bad_data_file_name(L"/some/file/that/isnot/there");
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath bad_data_file_name("/some/file/that/isnot/there");
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
240731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                          NewRunnableMethod(
241731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              print_data_sender_.get(),
242731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              &CloudPrintDataSender::ReadPrintDataFile,
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             bad_data_file_name));
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(CloudPrintDataSenderTest, EmptyFile) {
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(*mock_helper_, CallJavascriptFunction(_, _, _)).Times(0);
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath empty_data_file_name = GetEmptyDataFileName();
251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                          NewRunnableMethod(
253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              print_data_sender_.get(),
254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              &CloudPrintDataSender::ReadPrintDataFile,
255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              empty_data_file_name));
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Testing for CloudPrintFlowHandler needs a mock
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CloudPrintHtmlDialogDelegate, mock CloudPrintDataSender, and a mock
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// DOMUI.
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Testing for CloudPrintHtmlDialogDelegate needs a mock
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CloudPrintFlowHandler.
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing internal_cloud_print_helpers::MockCloudPrintFlowHandler;
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing internal_cloud_print_helpers::CloudPrintHtmlDialogDelegate;
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CloudPrintHtmlDialogDelegateTest : public testing::Test {
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CloudPrintHtmlDialogDelegateTest()
272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      : ui_thread_(BrowserThread::UI, &message_loop_) {}
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUp() {
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath mock_path;
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    string16 mock_title;
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MockCloudPrintFlowHandler* handler =
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        new MockCloudPrintFlowHandler(mock_path, mock_title);
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    mock_flow_handler_ = handler->AsWeakPtr();
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_CALL(*mock_flow_handler_.get(), SetDialogDelegate(_));
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_CALL(*mock_flow_handler_.get(), SetDialogDelegate(NULL));
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_.reset(new CloudPrintHtmlDialogDelegate(
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        mock_flow_handler_.get(), 100, 100, std::string()));
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void TearDown() {
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_.reset();
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (mock_flow_handler_)
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      delete mock_flow_handler_.get();
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoopForUI message_loop_;
294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread ui_thread_;
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::WeakPtr<MockCloudPrintFlowHandler> mock_flow_handler_;
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<CloudPrintHtmlDialogDelegate> delegate_;
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(CloudPrintHtmlDialogDelegateTest, BasicChecks) {
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(delegate_->IsDialogModal());
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(delegate_->GetDialogContentURL().spec(),
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              StrEq(chrome::kCloudPrintResourcesURL));
303513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(delegate_->GetDialogTitle().empty());
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool close_dialog = false;
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->OnCloseContents(NULL, &close_dialog);
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(close_dialog);
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(CloudPrintHtmlDialogDelegateTest, OwnedFlowDestroyed) {
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_.reset();
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(mock_flow_handler_.get(), IsNull());
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(CloudPrintHtmlDialogDelegateTest, UnownedFlowLetGo) {
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<DOMMessageHandler*> handlers;
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->GetDOMMessageHandlers(&handlers);
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_.reset();
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(mock_flow_handler_.get(), NotNull());
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Testing for ExternalHtmlDialogUI needs a mock TabContents, mock
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CloudPrintHtmlDialogDelegate (provided through the mock
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// tab_contents)
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Testing for PrintDialogCloud needs a mock Browser.
327