172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 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
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <string>
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <vector>
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/weak_ptr.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/path_service.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h"
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/printing/cloud_print/cloud_print_url.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/testing_profile.h"
22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_details.h"
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h"
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gmock/include/gmock/gmock.h"
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "testing/gtest/include/gtest/gtest.h"
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::A;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::AtLeast;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Eq;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::HasSubstr;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::IsNull;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::NotNull;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Return;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::StrEq;
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::_;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const char* const kPDFTestFile = "printing/cloud_print_unittest.pdf";
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const char* const kEmptyPDFTestFile =
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "printing/cloud_print_emptytest.pdf";
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const char* const kMockJobTitle = "Mock Job Title";
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFilePath GetTestDataFileName() {
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_data_directory;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory);
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_file = test_data_directory.AppendASCII(kPDFTestFile);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return test_file;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFilePath GetEmptyDataFileName() {
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_data_directory;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory);
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_file = test_data_directory.AppendASCII(kEmptyPDFTestFile);
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return test_file;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchar* GetTestData() {
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static std::string sTestFileData;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (sTestFileData.empty()) {
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath test_file = GetTestDataFileName();
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    file_util::ReadFileToString(test_file, &sTestFileData);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return &sTestFileData[0];
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMATCHER_P(StringValueEq, expected, "StringValue") {
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (expected->Equals(&arg))
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string expected_string, arg_string;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  expected->GetAsString(&expected_string);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  arg.GetAsString(&arg_string);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  *result_listener << "'" << arg_string
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   << "' (expected '" << expected_string << "')";
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return false;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace internal_cloud_print_helpers {
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockCloudPrintFlowHandler
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : public CloudPrintFlowHandler,
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      public base::SupportsWeakPtr<MockCloudPrintFlowHandler> {
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit MockCloudPrintFlowHandler(const FilePath& path,
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     const string16& title,
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     const std::string& file_type)
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      : CloudPrintFlowHandler(path, title, file_type) {}
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0(DestructorCalled, void());
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0(RegisterMessages, void());
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD3(Observe,
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               void(NotificationType type,
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    const NotificationSource& source,
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    const NotificationDetails& details));
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(SetDialogDelegate,
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               void(CloudPrintHtmlDialogDelegate* delegate));
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0(CreateCloudPrintDataSender,
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               scoped_refptr<CloudPrintDataSender>());
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockCloudPrintHtmlDialogDelegate : public CloudPrintHtmlDialogDelegate {
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD0(IsDialogModal,
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      bool());
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD0(GetDialogTitle,
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      std::wstring());
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD0(GetDialogContentURL,
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GURL());
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MOCK_CONST_METHOD1(GetWebUIMessageHandlers,
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      void(std::vector<WebUIMessageHandler*>* handlers));
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD1(GetDialogSize,
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      void(gfx::Size* size));
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD0(GetDialogArgs,
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      std::string());
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(OnDialogClosed,
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      void(const std::string& json_retval));
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD2(OnCloseContents,
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      void(TabContents* source, bool *out_close_dialog));
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace internal_cloud_print_helpers
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing internal_cloud_print_helpers::CloudPrintDataSenderHelper;
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing internal_cloud_print_helpers::CloudPrintDataSender;
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockExternalHtmlDialogUI : public ExternalHtmlDialogUI {
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(RenderViewCreated,
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      void(RenderViewHost* render_view_host));
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockCloudPrintDataSenderHelper : public CloudPrintDataSenderHelper {
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(scottbyer): At some point this probably wants to use a
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // MockTabContents instead of NULL, and to pre-load it with a bunch
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // of expects/results.
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockCloudPrintDataSenderHelper() : CloudPrintDataSenderHelper(NULL) {}
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(CallJavascriptFunction, void(const std::wstring&));
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD2(CallJavascriptFunction, void(const std::wstring&,
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            const Value& arg1));
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD3(CallJavascriptFunction, void(const std::wstring&,
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            const Value& arg1,
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            const Value& arg2));
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CloudPrintURLTest : public testing::Test {
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CloudPrintURLTest() {}
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUp() {
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    profile_.reset(new TestingProfile());
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<Profile> profile_;
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(CloudPrintURLTest, CheckDefaultURLs) {
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string service_url =
1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      CloudPrintURL(profile_.get()).
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GetCloudPrintServiceURL().spec();
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(service_url, HasSubstr("www.google.com"));
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(service_url, HasSubstr("cloudprint"));
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string dialog_url =
1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      CloudPrintURL(profile_.get()).
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GetCloudPrintServiceDialogURL().spec();
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, HasSubstr("www.google.com"));
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, HasSubstr("/cloudprint/"));
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, HasSubstr("/client/"));
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, Not(HasSubstr("cloudprint/cloudprint")));
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, HasSubstr("/dialog.html"));
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Repeat to make sure there isn't a transient glitch.
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dialog_url =
1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      CloudPrintURL(profile_.get()).
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GetCloudPrintServiceDialogURL().spec();
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, HasSubstr("www.google.com"));
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, HasSubstr("/cloudprint/"));
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, HasSubstr("/client/"));
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, Not(HasSubstr("cloudprint/cloudprint")));
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(dialog_url, HasSubstr("/dialog.html"));
182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string manage_url =
184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      CloudPrintURL(profile_.get()).
185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      GetCloudPrintServiceManageURL().spec();
186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_THAT(manage_url, HasSubstr("www.google.com"));
187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_THAT(manage_url, HasSubstr("/cloudprint/"));
188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_THAT(manage_url, Not(HasSubstr("/client/")));
189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_THAT(manage_url, Not(HasSubstr("cloudprint/cloudprint")));
190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_THAT(manage_url, HasSubstr("/manage"));
191201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
192201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  GURL learn_more_url = CloudPrintURL::GetCloudPrintLearnMoreURL();
193201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string learn_more_path = learn_more_url.spec();
194201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_THAT(learn_more_path, HasSubstr("www.google.com"));
195201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_THAT(learn_more_path, HasSubstr("/support/"));
196201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_THAT(learn_more_path, HasSubstr("/cloudprint"));
197201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(learn_more_url.has_path());
198201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_FALSE(learn_more_url.has_query());
199201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
200201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  GURL test_page_url = CloudPrintURL::GetCloudPrintTestPageURL();
201201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string test_page_path = test_page_url.spec();
202201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_THAT(test_page_path, HasSubstr("www.google.com"));
203201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_THAT(test_page_path, HasSubstr("/landing/"));
204201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_THAT(test_page_path, HasSubstr("/cloudprint/"));
205201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(test_page_url.has_path());
206201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(test_page_url.has_query());
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Testing for CloudPrintDataSender needs a mock WebUI.
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CloudPrintDataSenderTest : public testing::Test {
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CloudPrintDataSenderTest()
213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      : file_thread_(BrowserThread::FILE, &message_loop_),
214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        io_thread_(BrowserThread::IO, &message_loop_) {}
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUp() {
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    string16 mock_job_title(ASCIIToUTF16(kMockJobTitle));
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    mock_helper_.reset(new MockCloudPrintDataSenderHelper);
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    print_data_sender_ =
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        new CloudPrintDataSender(mock_helper_.get(),
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 mock_job_title,
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 std::string("application/pdf"));
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<CloudPrintDataSender> print_data_sender_;
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<MockCloudPrintDataSenderHelper> mock_helper_;
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop message_loop_;
230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread file_thread_;
231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread io_thread_;
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(scottbyer): DISABLED until the binary test file can get
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// checked in separate from the patch.
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(CloudPrintDataSenderTest, CanSend) {
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StringValue mock_job_title(kMockJobTitle);
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(*mock_helper_,
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              CallJavascriptFunction(_, _, StringValueEq(&mock_job_title))).
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WillOnce(Return());
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_data_file_name = GetTestDataFileName();
243731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                          NewRunnableMethod(
245731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              print_data_sender_.get(),
246731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              &CloudPrintDataSender::ReadPrintDataFile,
247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              test_data_file_name));
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(CloudPrintDataSenderTest, BadFile) {
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(*mock_helper_, CallJavascriptFunction(_, _, _)).Times(0);
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath bad_data_file_name(L"/some/file/that/isnot/there");
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath bad_data_file_name("/some/file/that/isnot/there");
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                          NewRunnableMethod(
261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              print_data_sender_.get(),
262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              &CloudPrintDataSender::ReadPrintDataFile,
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             bad_data_file_name));
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(CloudPrintDataSenderTest, EmptyFile) {
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(*mock_helper_, CallJavascriptFunction(_, _, _)).Times(0);
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath empty_data_file_name = GetEmptyDataFileName();
271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                          NewRunnableMethod(
273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              print_data_sender_.get(),
274731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              &CloudPrintDataSender::ReadPrintDataFile,
275731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              empty_data_file_name));
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Testing for CloudPrintFlowHandler needs a mock
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CloudPrintHtmlDialogDelegate, mock CloudPrintDataSender, and a mock
28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// WebUI.
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Testing for CloudPrintHtmlDialogDelegate needs a mock
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CloudPrintFlowHandler.
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing internal_cloud_print_helpers::MockCloudPrintFlowHandler;
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing internal_cloud_print_helpers::CloudPrintHtmlDialogDelegate;
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CloudPrintHtmlDialogDelegateTest : public testing::Test {
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CloudPrintHtmlDialogDelegateTest()
292731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      : ui_thread_(BrowserThread::UI, &message_loop_) {}
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUp() {
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath mock_path;
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    string16 mock_title;
298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string mock_file_type;
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MockCloudPrintFlowHandler* handler =
300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        new MockCloudPrintFlowHandler(mock_path, mock_title, mock_file_type);
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    mock_flow_handler_ = handler->AsWeakPtr();
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_CALL(*mock_flow_handler_.get(), SetDialogDelegate(_));
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_CALL(*mock_flow_handler_.get(), SetDialogDelegate(NULL));
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_.reset(new CloudPrintHtmlDialogDelegate(
30572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        mock_flow_handler_.get(), 100, 100, std::string(), true));
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void TearDown() {
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_.reset();
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (mock_flow_handler_)
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      delete mock_flow_handler_.get();
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoopForUI message_loop_;
315731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread ui_thread_;
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::WeakPtr<MockCloudPrintFlowHandler> mock_flow_handler_;
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<CloudPrintHtmlDialogDelegate> delegate_;
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(CloudPrintHtmlDialogDelegateTest, BasicChecks) {
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(delegate_->IsDialogModal());
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(delegate_->GetDialogContentURL().spec(),
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              StrEq(chrome::kCloudPrintResourcesURL));
324513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(delegate_->GetDialogTitle().empty());
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool close_dialog = false;
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->OnCloseContents(NULL, &close_dialog);
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(close_dialog);
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(CloudPrintHtmlDialogDelegateTest, OwnedFlowDestroyed) {
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_.reset();
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(mock_flow_handler_.get(), IsNull());
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(CloudPrintHtmlDialogDelegateTest, UnownedFlowLetGo) {
33772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<WebUIMessageHandler*> handlers;
33872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delegate_->GetWebUIMessageHandlers(&handlers);
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_.reset();
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(mock_flow_handler_.get(), NotNull());
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Testing for ExternalHtmlDialogUI needs a mock TabContents, mock
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CloudPrintHtmlDialogDelegate (provided through the mock
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// tab_contents)
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Testing for PrintDialogCloud needs a mock Browser.
348