| OLD | NEW |
| (Empty) |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/local_discovery/privet_http.h" | |
| 6 | |
| 7 #include <utility> | |
| 8 | |
| 9 #include "base/json/json_reader.h" | |
| 10 #include "base/json/json_writer.h" | |
| 11 #include "base/run_loop.h" | |
| 12 #include "chrome/browser/local_discovery/privet_http_impl.h" | |
| 13 #include "content/public/browser/browser_thread.h" | |
| 14 #include "content/public/test/test_browser_thread_bundle.h" | |
| 15 #include "net/test/embedded_test_server/embedded_test_server.h" | |
| 16 #include "net/url_request/test_url_fetcher_factory.h" | |
| 17 #include "net/url_request/url_request_test_util.h" | |
| 18 #include "testing/gmock/include/gmock/gmock.h" | |
| 19 #include "testing/gtest/include/gtest/gtest.h" | |
| 20 | |
| 21 #if defined(ENABLE_PRINT_PREVIEW) | |
| 22 #include "chrome/browser/local_discovery/pwg_raster_converter.h" | |
| 23 #include "printing/pwg_raster_settings.h" | |
| 24 #endif // ENABLE_PRINT_PREVIEW | |
| 25 | |
| 26 namespace local_discovery { | |
| 27 | |
| 28 namespace { | |
| 29 | |
| 30 using testing::NiceMock; | |
| 31 using testing::StrictMock; | |
| 32 using testing::TestWithParam; | |
| 33 using testing::ValuesIn; | |
| 34 | |
| 35 using content::BrowserThread; | |
| 36 using net::EmbeddedTestServer; | |
| 37 | |
| 38 const char kSampleInfoResponse[] = "{" | |
| 39 " \"version\": \"1.0\"," | |
| 40 " \"name\": \"Common printer\"," | |
| 41 " \"description\": \"Printer connected through Chrome connector\"," | |
| 42 " \"url\": \"https://www.google.com/cloudprint\"," | |
| 43 " \"type\": [" | |
| 44 " \"printer\"" | |
| 45 " ]," | |
| 46 " \"id\": \"\"," | |
| 47 " \"device_state\": \"idle\"," | |
| 48 " \"connection_state\": \"online\"," | |
| 49 " \"manufacturer\": \"Google\"," | |
| 50 " \"model\": \"Google Chrome\"," | |
| 51 " \"serial_number\": \"1111-22222-33333-4444\"," | |
| 52 " \"firmware\": \"24.0.1312.52\"," | |
| 53 " \"uptime\": 600," | |
| 54 " \"setup_url\": \"http://support.google.com/\"," | |
| 55 " \"support_url\": \"http://support.google.com/cloudprint/?hl=en\"," | |
| 56 " \"update_url\": \"http://support.google.com/cloudprint/?hl=en\"," | |
| 57 " \"x-privet-token\": \"SampleTokenForTesting\"," | |
| 58 " \"api\": [" | |
| 59 " \"/privet/accesstoken\"," | |
| 60 " \"/privet/capabilities\"," | |
| 61 " \"/privet/printer/submitdoc\"," | |
| 62 " ]" | |
| 63 "}"; | |
| 64 | |
| 65 const char kSampleInfoResponseRegistered[] = "{" | |
| 66 " \"version\": \"1.0\"," | |
| 67 " \"name\": \"Common printer\"," | |
| 68 " \"description\": \"Printer connected through Chrome connector\"," | |
| 69 " \"url\": \"https://www.google.com/cloudprint\"," | |
| 70 " \"type\": [" | |
| 71 " \"printer\"" | |
| 72 " ]," | |
| 73 " \"id\": \"MyDeviceID\"," | |
| 74 " \"device_state\": \"idle\"," | |
| 75 " \"connection_state\": \"online\"," | |
| 76 " \"manufacturer\": \"Google\"," | |
| 77 " \"model\": \"Google Chrome\"," | |
| 78 " \"serial_number\": \"1111-22222-33333-4444\"," | |
| 79 " \"firmware\": \"24.0.1312.52\"," | |
| 80 " \"uptime\": 600," | |
| 81 " \"setup_url\": \"http://support.google.com/\"," | |
| 82 " \"support_url\": \"http://support.google.com/cloudprint/?hl=en\"," | |
| 83 " \"update_url\": \"http://support.google.com/cloudprint/?hl=en\"," | |
| 84 " \"x-privet-token\": \"SampleTokenForTesting\"," | |
| 85 " \"api\": [" | |
| 86 " \"/privet/accesstoken\"," | |
| 87 " \"/privet/capabilities\"," | |
| 88 " \"/privet/printer/submitdoc\"," | |
| 89 " ]" | |
| 90 "}"; | |
| 91 | |
| 92 const char kSampleRegisterStartResponse[] = "{" | |
| 93 "\"user\": \"example@google.com\"," | |
| 94 "\"action\": \"start\"" | |
| 95 "}"; | |
| 96 | |
| 97 const char kSampleRegisterGetClaimTokenResponse[] = "{" | |
| 98 " \"action\": \"getClaimToken\"," | |
| 99 " \"user\": \"example@google.com\"," | |
| 100 " \"token\": \"MySampleToken\"," | |
| 101 " \"claim_url\": \"https://domain.com/SoMeUrL\"" | |
| 102 "}"; | |
| 103 | |
| 104 const char kSampleRegisterCompleteResponse[] = "{" | |
| 105 "\"user\": \"example@google.com\"," | |
| 106 "\"action\": \"complete\"," | |
| 107 "\"device_id\": \"MyDeviceID\"" | |
| 108 "}"; | |
| 109 | |
| 110 const char kSampleXPrivetErrorResponse[] = | |
| 111 "{ \"error\": \"invalid_x_privet_token\" }"; | |
| 112 | |
| 113 const char kSampleRegisterErrorTransient[] = | |
| 114 "{ \"error\": \"device_busy\", \"timeout\": 1}"; | |
| 115 | |
| 116 const char kSampleRegisterErrorPermanent[] = | |
| 117 "{ \"error\": \"user_cancel\" }"; | |
| 118 | |
| 119 const char kSampleInfoResponseBadJson[] = "{"; | |
| 120 | |
| 121 const char kSampleRegisterCancelResponse[] = "{" | |
| 122 "\"user\": \"example@google.com\"," | |
| 123 "\"action\": \"cancel\"" | |
| 124 "}"; | |
| 125 | |
| 126 const char kSampleCapabilitiesResponse[] = "{" | |
| 127 "\"version\" : \"1.0\"," | |
| 128 "\"printer\" : {" | |
| 129 " \"supported_content_type\" : [" | |
| 130 " { \"content_type\" : \"application/pdf\" }," | |
| 131 " { \"content_type\" : \"image/pwg-raster\" }" | |
| 132 " ]" | |
| 133 "}" | |
| 134 "}"; | |
| 135 | |
| 136 #if defined(ENABLE_PRINT_PREVIEW) | |
| 137 const char kSampleInfoResponseWithCreatejob[] = "{" | |
| 138 " \"version\": \"1.0\"," | |
| 139 " \"name\": \"Common printer\"," | |
| 140 " \"description\": \"Printer connected through Chrome connector\"," | |
| 141 " \"url\": \"https://www.google.com/cloudprint\"," | |
| 142 " \"type\": [" | |
| 143 " \"printer\"" | |
| 144 " ]," | |
| 145 " \"id\": \"\"," | |
| 146 " \"device_state\": \"idle\"," | |
| 147 " \"connection_state\": \"online\"," | |
| 148 " \"manufacturer\": \"Google\"," | |
| 149 " \"model\": \"Google Chrome\"," | |
| 150 " \"serial_number\": \"1111-22222-33333-4444\"," | |
| 151 " \"firmware\": \"24.0.1312.52\"," | |
| 152 " \"uptime\": 600," | |
| 153 " \"setup_url\": \"http://support.google.com/\"," | |
| 154 " \"support_url\": \"http://support.google.com/cloudprint/?hl=en\"," | |
| 155 " \"update_url\": \"http://support.google.com/cloudprint/?hl=en\"," | |
| 156 " \"x-privet-token\": \"SampleTokenForTesting\"," | |
| 157 " \"api\": [" | |
| 158 " \"/privet/accesstoken\"," | |
| 159 " \"/privet/capabilities\"," | |
| 160 " \"/privet/printer/createjob\"," | |
| 161 " \"/privet/printer/submitdoc\"," | |
| 162 " ]" | |
| 163 "}"; | |
| 164 | |
| 165 const char kSampleLocalPrintResponse[] = "{" | |
| 166 "\"job_id\": \"123\"," | |
| 167 "\"expires_in\": 500," | |
| 168 "\"job_type\": \"application/pdf\"," | |
| 169 "\"job_size\": 16," | |
| 170 "\"job_name\": \"Sample job name\"," | |
| 171 "}"; | |
| 172 | |
| 173 const char kSampleCapabilitiesResponsePWGOnly[] = "{" | |
| 174 "\"version\" : \"1.0\"," | |
| 175 "\"printer\" : {" | |
| 176 " \"supported_content_type\" : [" | |
| 177 " { \"content_type\" : \"image/pwg-raster\" }" | |
| 178 " ]" | |
| 179 "}" | |
| 180 "}"; | |
| 181 | |
| 182 const char kSampleErrorResponsePrinterBusy[] = "{" | |
| 183 "\"error\": \"invalid_print_job\"," | |
| 184 "\"timeout\": 1 " | |
| 185 "}"; | |
| 186 | |
| 187 const char kSampleInvalidDocumentTypeResponse[] = "{" | |
| 188 "\"error\" : \"invalid_document_type\"" | |
| 189 "}"; | |
| 190 | |
| 191 const char kSampleCreatejobResponse[] = "{ \"job_id\": \"1234\" }"; | |
| 192 | |
| 193 const char kSampleCapabilitiesResponseWithAnyMimetype[] = "{" | |
| 194 "\"version\" : \"1.0\"," | |
| 195 "\"printer\" : {" | |
| 196 " \"supported_content_type\" : [" | |
| 197 " { \"content_type\" : \"*/*\" }," | |
| 198 " { \"content_type\" : \"image/pwg-raster\" }" | |
| 199 " ]" | |
| 200 "}" | |
| 201 "}"; | |
| 202 | |
| 203 const char kSampleCJT[] = "{ \"version\" : \"1.0\" }"; | |
| 204 | |
| 205 const char kSampleCapabilitiesResponsePWGSettings[] = | |
| 206 "{" | |
| 207 "\"version\" : \"1.0\"," | |
| 208 "\"printer\" : {" | |
| 209 " \"pwg_raster_config\" : {" | |
| 210 " \"document_sheet_back\" : \"MANUAL_TUMBLE\"," | |
| 211 " \"reverse_order_streaming\": true" | |
| 212 " }," | |
| 213 " \"supported_content_type\" : [" | |
| 214 " { \"content_type\" : \"image/pwg-raster\" }" | |
| 215 " ]" | |
| 216 "}" | |
| 217 "}"; | |
| 218 | |
| 219 const char kSampleCJTDuplex[] = | |
| 220 "{" | |
| 221 "\"version\" : \"1.0\"," | |
| 222 "\"print\": { \"duplex\": {\"type\": \"SHORT_EDGE\"} }" | |
| 223 "}"; | |
| 224 #endif // ENABLE_PRINT_PREVIEW | |
| 225 | |
| 226 const char* const kTestParams[] = {"8.8.4.4", "2001:4860:4860::8888"}; | |
| 227 | |
| 228 // Return the representation of the given JSON that would be outputted by | |
| 229 // JSONWriter. This ensures the same JSON values are represented by the same | |
| 230 // string. | |
| 231 std::string NormalizeJson(const std::string& json) { | |
| 232 std::string result = json; | |
| 233 scoped_ptr<base::Value> value = base::JSONReader::Read(result); | |
| 234 DCHECK(value) << result; | |
| 235 base::JSONWriter::Write(*value, &result); | |
| 236 return result; | |
| 237 } | |
| 238 | |
| 239 class MockTestURLFetcherFactoryDelegate | |
| 240 : public net::TestURLFetcher::DelegateForTests { | |
| 241 public: | |
| 242 // Callback issued correspondingly to the call to the |Start()| method. | |
| 243 MOCK_METHOD1(OnRequestStart, void(int fetcher_id)); | |
| 244 | |
| 245 // Callback issued correspondingly to the call to |AppendChunkToUpload|. | |
| 246 // Uploaded chunks can be retrieved with the |upload_chunks()| getter. | |
| 247 MOCK_METHOD1(OnChunkUpload, void(int fetcher_id)); | |
| 248 | |
| 249 // Callback issued correspondingly to the destructor. | |
| 250 MOCK_METHOD1(OnRequestEnd, void(int fetcher_id)); | |
| 251 }; | |
| 252 | |
| 253 class PrivetHTTPTest : public TestWithParam<const char*> { | |
| 254 public: | |
| 255 PrivetHTTPTest() { | |
| 256 PrivetURLFetcher::ResetTokenMapForTests(); | |
| 257 | |
| 258 request_context_ = new net::TestURLRequestContextGetter( | |
| 259 base::ThreadTaskRunnerHandle::Get()); | |
| 260 privet_client_ = PrivetV1HTTPClient::CreateDefault( | |
| 261 make_scoped_ptr<PrivetHTTPClient>(new PrivetHTTPClientImpl( | |
| 262 "sampleDevice._privet._tcp.local", | |
| 263 net::HostPortPair(GetParam(), 6006), request_context_.get()))); | |
| 264 fetcher_factory_.SetDelegateForTests(&fetcher_delegate_); | |
| 265 } | |
| 266 | |
| 267 GURL GetUrl(const std::string& path) const { | |
| 268 std::string host = GetParam(); | |
| 269 if (host.find(":") != std::string::npos) | |
| 270 host = "[" + host + "]"; | |
| 271 return GURL("http://" + host + ":6006" + path); | |
| 272 } | |
| 273 | |
| 274 bool SuccessfulResponseToURL(const GURL& url, | |
| 275 const std::string& response) { | |
| 276 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
| 277 EXPECT_TRUE(fetcher); | |
| 278 EXPECT_EQ(url, fetcher->GetOriginalURL()); | |
| 279 | |
| 280 if (!fetcher || url != fetcher->GetOriginalURL()) | |
| 281 return false; | |
| 282 | |
| 283 fetcher->SetResponseString(response); | |
| 284 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS, | |
| 285 net::OK)); | |
| 286 fetcher->set_response_code(200); | |
| 287 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 288 return true; | |
| 289 } | |
| 290 | |
| 291 bool SuccessfulResponseToURLAndData(const GURL& url, | |
| 292 const std::string& data, | |
| 293 const std::string& response) { | |
| 294 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
| 295 EXPECT_TRUE(fetcher); | |
| 296 EXPECT_EQ(url, fetcher->GetOriginalURL()); | |
| 297 | |
| 298 if (!fetcher) return false; | |
| 299 | |
| 300 EXPECT_EQ(data, fetcher->upload_data()); | |
| 301 if (data != fetcher->upload_data()) return false; | |
| 302 | |
| 303 return SuccessfulResponseToURL(url, response); | |
| 304 } | |
| 305 | |
| 306 bool SuccessfulResponseToURLAndJSONData(const GURL& url, | |
| 307 const std::string& data, | |
| 308 const std::string& response) { | |
| 309 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
| 310 EXPECT_TRUE(fetcher); | |
| 311 EXPECT_EQ(url, fetcher->GetOriginalURL()); | |
| 312 | |
| 313 if (!fetcher) | |
| 314 return false; | |
| 315 | |
| 316 std::string normalized_data = NormalizeJson(data); | |
| 317 std::string normalized_upload_data = NormalizeJson(fetcher->upload_data()); | |
| 318 EXPECT_EQ(normalized_data, normalized_upload_data); | |
| 319 if (normalized_data != normalized_upload_data) | |
| 320 return false; | |
| 321 | |
| 322 return SuccessfulResponseToURL(url, response); | |
| 323 } | |
| 324 | |
| 325 bool SuccessfulResponseToURLAndFilePath(const GURL& url, | |
| 326 const base::FilePath& file_path, | |
| 327 const std::string& response) { | |
| 328 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
| 329 EXPECT_TRUE(fetcher); | |
| 330 EXPECT_EQ(url, fetcher->GetOriginalURL()); | |
| 331 | |
| 332 if (!fetcher) return false; | |
| 333 | |
| 334 EXPECT_EQ(file_path, fetcher->upload_file_path()); | |
| 335 if (file_path != fetcher->upload_file_path()) return false; | |
| 336 | |
| 337 return SuccessfulResponseToURL(url, response); | |
| 338 } | |
| 339 | |
| 340 | |
| 341 void RunFor(base::TimeDelta time_period) { | |
| 342 base::CancelableCallback<void()> callback(base::Bind( | |
| 343 &PrivetHTTPTest::Stop, base::Unretained(this))); | |
| 344 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | |
| 345 FROM_HERE, callback.callback(), time_period); | |
| 346 | |
| 347 base::MessageLoop::current()->Run(); | |
| 348 callback.Cancel(); | |
| 349 } | |
| 350 | |
| 351 void Stop() { base::MessageLoop::current()->QuitWhenIdle(); } | |
| 352 | |
| 353 protected: | |
| 354 base::MessageLoop loop_; | |
| 355 scoped_refptr<net::TestURLRequestContextGetter> request_context_; | |
| 356 net::TestURLFetcherFactory fetcher_factory_; | |
| 357 scoped_ptr<PrivetV1HTTPClient> privet_client_; | |
| 358 NiceMock<MockTestURLFetcherFactoryDelegate> fetcher_delegate_; | |
| 359 }; | |
| 360 | |
| 361 class MockJSONCallback{ | |
| 362 public: | |
| 363 void OnPrivetJSONDone(const base::DictionaryValue* value) { | |
| 364 if (!value) { | |
| 365 value_.reset(); | |
| 366 } else { | |
| 367 value_.reset(value->DeepCopy()); | |
| 368 } | |
| 369 | |
| 370 OnPrivetJSONDoneInternal(); | |
| 371 } | |
| 372 | |
| 373 MOCK_METHOD0(OnPrivetJSONDoneInternal, void()); | |
| 374 | |
| 375 const base::DictionaryValue* value() { return value_.get(); } | |
| 376 PrivetJSONOperation::ResultCallback callback() { | |
| 377 return base::Bind(&MockJSONCallback::OnPrivetJSONDone, | |
| 378 base::Unretained(this)); | |
| 379 } | |
| 380 protected: | |
| 381 scoped_ptr<base::DictionaryValue> value_; | |
| 382 }; | |
| 383 | |
| 384 class MockRegisterDelegate : public PrivetRegisterOperation::Delegate { | |
| 385 public: | |
| 386 void OnPrivetRegisterClaimToken( | |
| 387 PrivetRegisterOperation* operation, | |
| 388 const std::string& token, | |
| 389 const GURL& url) override { | |
| 390 OnPrivetRegisterClaimTokenInternal(token, url); | |
| 391 } | |
| 392 | |
| 393 MOCK_METHOD2(OnPrivetRegisterClaimTokenInternal, void( | |
| 394 const std::string& token, | |
| 395 const GURL& url)); | |
| 396 | |
| 397 void OnPrivetRegisterError( | |
| 398 PrivetRegisterOperation* operation, | |
| 399 const std::string& action, | |
| 400 PrivetRegisterOperation::FailureReason reason, | |
| 401 int printer_http_code, | |
| 402 const base::DictionaryValue* json) override { | |
| 403 // TODO(noamsml): Save and test for JSON? | |
| 404 OnPrivetRegisterErrorInternal(action, reason, printer_http_code); | |
| 405 } | |
| 406 | |
| 407 MOCK_METHOD3(OnPrivetRegisterErrorInternal, | |
| 408 void(const std::string& action, | |
| 409 PrivetRegisterOperation::FailureReason reason, | |
| 410 int printer_http_code)); | |
| 411 | |
| 412 void OnPrivetRegisterDone( | |
| 413 PrivetRegisterOperation* operation, | |
| 414 const std::string& device_id) override { | |
| 415 OnPrivetRegisterDoneInternal(device_id); | |
| 416 } | |
| 417 | |
| 418 MOCK_METHOD1(OnPrivetRegisterDoneInternal, | |
| 419 void(const std::string& device_id)); | |
| 420 }; | |
| 421 | |
| 422 class MockLocalPrintDelegate : public PrivetLocalPrintOperation::Delegate { | |
| 423 public: | |
| 424 virtual void OnPrivetPrintingDone( | |
| 425 const PrivetLocalPrintOperation* print_operation) { | |
| 426 OnPrivetPrintingDoneInternal(); | |
| 427 } | |
| 428 | |
| 429 MOCK_METHOD0(OnPrivetPrintingDoneInternal, void()); | |
| 430 | |
| 431 virtual void OnPrivetPrintingError( | |
| 432 const PrivetLocalPrintOperation* print_operation, int http_code) { | |
| 433 OnPrivetPrintingErrorInternal(http_code); | |
| 434 } | |
| 435 | |
| 436 MOCK_METHOD1(OnPrivetPrintingErrorInternal, void(int http_code)); | |
| 437 }; | |
| 438 | |
| 439 class PrivetInfoTest : public PrivetHTTPTest { | |
| 440 public: | |
| 441 void SetUp() override { | |
| 442 info_operation_ = privet_client_->CreateInfoOperation( | |
| 443 info_callback_.callback()); | |
| 444 } | |
| 445 | |
| 446 protected: | |
| 447 scoped_ptr<PrivetJSONOperation> info_operation_; | |
| 448 StrictMock<MockJSONCallback> info_callback_; | |
| 449 }; | |
| 450 | |
| 451 INSTANTIATE_TEST_CASE_P(PrivetTests, PrivetInfoTest, ValuesIn(kTestParams)); | |
| 452 | |
| 453 TEST_P(PrivetInfoTest, SuccessfulInfo) { | |
| 454 info_operation_->Start(); | |
| 455 | |
| 456 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
| 457 ASSERT_TRUE(fetcher != NULL); | |
| 458 EXPECT_EQ(GetUrl("/privet/info"), fetcher->GetOriginalURL()); | |
| 459 | |
| 460 fetcher->SetResponseString(kSampleInfoResponse); | |
| 461 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS, | |
| 462 net::OK)); | |
| 463 fetcher->set_response_code(200); | |
| 464 | |
| 465 EXPECT_CALL(info_callback_, OnPrivetJSONDoneInternal()); | |
| 466 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 467 } | |
| 468 | |
| 469 TEST_P(PrivetInfoTest, InfoFailureHTTP) { | |
| 470 info_operation_->Start(); | |
| 471 | |
| 472 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
| 473 ASSERT_TRUE(fetcher != NULL); | |
| 474 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS, | |
| 475 net::OK)); | |
| 476 fetcher->set_response_code(404); | |
| 477 | |
| 478 EXPECT_CALL(info_callback_, OnPrivetJSONDoneInternal()); | |
| 479 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 480 } | |
| 481 | |
| 482 class PrivetRegisterTest : public PrivetHTTPTest { | |
| 483 public: | |
| 484 void SetUp() override { | |
| 485 info_operation_ = privet_client_->CreateInfoOperation( | |
| 486 info_callback_.callback()); | |
| 487 register_operation_ = | |
| 488 privet_client_->CreateRegisterOperation("example@google.com", | |
| 489 ®ister_delegate_); | |
| 490 } | |
| 491 | |
| 492 protected: | |
| 493 bool SuccessfulResponseToURL(const GURL& url, | |
| 494 const std::string& response) { | |
| 495 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); | |
| 496 EXPECT_TRUE(fetcher); | |
| 497 EXPECT_EQ(url, fetcher->GetOriginalURL()); | |
| 498 if (!fetcher || url != fetcher->GetOriginalURL()) | |
| 499 return false; | |
| 500 | |
| 501 fetcher->SetResponseString(response); | |
| 502 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS, | |
| 503 net::OK)); | |
| 504 fetcher->set_response_code(200); | |
| 505 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 506 return true; | |
| 507 } | |
| 508 | |
| 509 scoped_ptr<PrivetJSONOperation> info_operation_; | |
| 510 NiceMock<MockJSONCallback> info_callback_; | |
| 511 scoped_ptr<PrivetRegisterOperation> register_operation_; | |
| 512 StrictMock<MockRegisterDelegate> register_delegate_; | |
| 513 }; | |
| 514 | |
| 515 TEST_P(PrivetRegisterTest, RegisterSuccessSimple) { | |
| 516 register_operation_->Start(); | |
| 517 | |
| 518 EXPECT_TRUE( | |
| 519 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 520 | |
| 521 EXPECT_TRUE( | |
| 522 SuccessfulResponseToURL(GetUrl("/privet/register?" | |
| 523 "action=start&user=example%40google.com"), | |
| 524 kSampleRegisterStartResponse)); | |
| 525 | |
| 526 EXPECT_CALL(register_delegate_, OnPrivetRegisterClaimTokenInternal( | |
| 527 "MySampleToken", | |
| 528 GURL("https://domain.com/SoMeUrL"))); | |
| 529 | |
| 530 EXPECT_TRUE(SuccessfulResponseToURL( | |
| 531 GetUrl("/privet/register?" | |
| 532 "action=getClaimToken&user=example%40google.com"), | |
| 533 kSampleRegisterGetClaimTokenResponse)); | |
| 534 | |
| 535 register_operation_->CompleteRegistration(); | |
| 536 | |
| 537 EXPECT_TRUE(SuccessfulResponseToURL( | |
| 538 GetUrl("/privet/register?" | |
| 539 "action=complete&user=example%40google.com"), | |
| 540 kSampleRegisterCompleteResponse)); | |
| 541 | |
| 542 EXPECT_CALL(register_delegate_, OnPrivetRegisterDoneInternal( | |
| 543 "MyDeviceID")); | |
| 544 | |
| 545 EXPECT_TRUE(SuccessfulResponseToURL(GetUrl("/privet/info"), | |
| 546 kSampleInfoResponseRegistered)); | |
| 547 } | |
| 548 | |
| 549 TEST_P(PrivetRegisterTest, RegisterXSRFFailure) { | |
| 550 register_operation_->Start(); | |
| 551 | |
| 552 EXPECT_TRUE( | |
| 553 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 554 | |
| 555 EXPECT_TRUE( | |
| 556 SuccessfulResponseToURL(GetUrl("/privet/register?" | |
| 557 "action=start&user=example%40google.com"), | |
| 558 kSampleRegisterStartResponse)); | |
| 559 | |
| 560 EXPECT_TRUE(SuccessfulResponseToURL( | |
| 561 GetUrl("/privet/register?" | |
| 562 "action=getClaimToken&user=example%40google.com"), | |
| 563 kSampleXPrivetErrorResponse)); | |
| 564 | |
| 565 EXPECT_TRUE( | |
| 566 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 567 | |
| 568 EXPECT_CALL(register_delegate_, OnPrivetRegisterClaimTokenInternal( | |
| 569 "MySampleToken", GURL("https://domain.com/SoMeUrL"))); | |
| 570 | |
| 571 EXPECT_TRUE(SuccessfulResponseToURL( | |
| 572 GetUrl("/privet/register?" | |
| 573 "action=getClaimToken&user=example%40google.com"), | |
| 574 kSampleRegisterGetClaimTokenResponse)); | |
| 575 } | |
| 576 | |
| 577 TEST_P(PrivetRegisterTest, TransientFailure) { | |
| 578 register_operation_->Start(); | |
| 579 | |
| 580 EXPECT_TRUE( | |
| 581 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 582 | |
| 583 EXPECT_TRUE( | |
| 584 SuccessfulResponseToURL(GetUrl("/privet/register?" | |
| 585 "action=start&user=example%40google.com"), | |
| 586 kSampleRegisterErrorTransient)); | |
| 587 | |
| 588 EXPECT_CALL(fetcher_delegate_, OnRequestStart(0)); | |
| 589 | |
| 590 RunFor(base::TimeDelta::FromSeconds(2)); | |
| 591 | |
| 592 testing::Mock::VerifyAndClearExpectations(&fetcher_delegate_); | |
| 593 | |
| 594 EXPECT_TRUE( | |
| 595 SuccessfulResponseToURL(GetUrl("/privet/register?" | |
| 596 "action=start&user=example%40google.com"), | |
| 597 kSampleRegisterStartResponse)); | |
| 598 } | |
| 599 | |
| 600 TEST_P(PrivetRegisterTest, PermanentFailure) { | |
| 601 register_operation_->Start(); | |
| 602 | |
| 603 EXPECT_TRUE( | |
| 604 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 605 | |
| 606 EXPECT_TRUE( | |
| 607 SuccessfulResponseToURL(GetUrl("/privet/register?" | |
| 608 "action=start&user=example%40google.com"), | |
| 609 kSampleRegisterStartResponse)); | |
| 610 | |
| 611 EXPECT_CALL(register_delegate_, | |
| 612 OnPrivetRegisterErrorInternal( | |
| 613 "getClaimToken", | |
| 614 PrivetRegisterOperation::FAILURE_JSON_ERROR, | |
| 615 200)); | |
| 616 | |
| 617 EXPECT_TRUE(SuccessfulResponseToURL( | |
| 618 GetUrl("/privet/register?" | |
| 619 "action=getClaimToken&user=example%40google.com"), | |
| 620 kSampleRegisterErrorPermanent)); | |
| 621 } | |
| 622 | |
| 623 TEST_P(PrivetRegisterTest, InfoFailure) { | |
| 624 register_operation_->Start(); | |
| 625 | |
| 626 EXPECT_CALL(register_delegate_, | |
| 627 OnPrivetRegisterErrorInternal( | |
| 628 "start", | |
| 629 PrivetRegisterOperation::FAILURE_TOKEN, | |
| 630 -1)); | |
| 631 | |
| 632 EXPECT_TRUE(SuccessfulResponseToURL(GetUrl("/privet/info"), | |
| 633 kSampleInfoResponseBadJson)); | |
| 634 } | |
| 635 | |
| 636 TEST_P(PrivetRegisterTest, RegisterCancel) { | |
| 637 register_operation_->Start(); | |
| 638 | |
| 639 EXPECT_TRUE( | |
| 640 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 641 | |
| 642 EXPECT_TRUE( | |
| 643 SuccessfulResponseToURL(GetUrl("/privet/register?" | |
| 644 "action=start&user=example%40google.com"), | |
| 645 kSampleRegisterStartResponse)); | |
| 646 | |
| 647 register_operation_->Cancel(); | |
| 648 | |
| 649 EXPECT_TRUE( | |
| 650 SuccessfulResponseToURL(GetUrl("/privet/register?" | |
| 651 "action=cancel&user=example%40google.com"), | |
| 652 kSampleRegisterCancelResponse)); | |
| 653 | |
| 654 // Must keep mocks alive for 3 seconds so the cancelation object can be | |
| 655 // deleted. | |
| 656 RunFor(base::TimeDelta::FromSeconds(3)); | |
| 657 } | |
| 658 | |
| 659 class PrivetCapabilitiesTest : public PrivetHTTPTest { | |
| 660 public: | |
| 661 void SetUp() override { | |
| 662 capabilities_operation_ = privet_client_->CreateCapabilitiesOperation( | |
| 663 capabilities_callback_.callback()); | |
| 664 } | |
| 665 | |
| 666 protected: | |
| 667 scoped_ptr<PrivetJSONOperation> capabilities_operation_; | |
| 668 StrictMock<MockJSONCallback> capabilities_callback_; | |
| 669 }; | |
| 670 | |
| 671 INSTANTIATE_TEST_CASE_P(PrivetTests, | |
| 672 PrivetCapabilitiesTest, | |
| 673 ValuesIn(kTestParams)); | |
| 674 | |
| 675 TEST_P(PrivetCapabilitiesTest, SuccessfulCapabilities) { | |
| 676 capabilities_operation_->Start(); | |
| 677 | |
| 678 EXPECT_TRUE( | |
| 679 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 680 | |
| 681 EXPECT_CALL(capabilities_callback_, OnPrivetJSONDoneInternal()); | |
| 682 | |
| 683 EXPECT_TRUE(SuccessfulResponseToURL(GetUrl("/privet/capabilities"), | |
| 684 kSampleCapabilitiesResponse)); | |
| 685 | |
| 686 std::string version; | |
| 687 EXPECT_TRUE(capabilities_callback_.value()->GetString("version", &version)); | |
| 688 EXPECT_EQ("1.0", version); | |
| 689 } | |
| 690 | |
| 691 TEST_P(PrivetCapabilitiesTest, CacheToken) { | |
| 692 capabilities_operation_->Start(); | |
| 693 | |
| 694 EXPECT_TRUE( | |
| 695 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 696 | |
| 697 EXPECT_CALL(capabilities_callback_, OnPrivetJSONDoneInternal()); | |
| 698 | |
| 699 EXPECT_TRUE(SuccessfulResponseToURL(GetUrl("/privet/capabilities"), | |
| 700 kSampleCapabilitiesResponse)); | |
| 701 | |
| 702 capabilities_operation_ = privet_client_->CreateCapabilitiesOperation( | |
| 703 capabilities_callback_.callback()); | |
| 704 | |
| 705 capabilities_operation_->Start(); | |
| 706 | |
| 707 EXPECT_CALL(capabilities_callback_, OnPrivetJSONDoneInternal()); | |
| 708 | |
| 709 EXPECT_TRUE(SuccessfulResponseToURL(GetUrl("/privet/capabilities"), | |
| 710 kSampleCapabilitiesResponse)); | |
| 711 } | |
| 712 | |
| 713 TEST_P(PrivetCapabilitiesTest, BadToken) { | |
| 714 capabilities_operation_->Start(); | |
| 715 | |
| 716 EXPECT_TRUE( | |
| 717 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 718 | |
| 719 EXPECT_TRUE(SuccessfulResponseToURL(GetUrl("/privet/capabilities"), | |
| 720 kSampleXPrivetErrorResponse)); | |
| 721 | |
| 722 EXPECT_TRUE( | |
| 723 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 724 | |
| 725 EXPECT_CALL(capabilities_callback_, OnPrivetJSONDoneInternal()); | |
| 726 | |
| 727 EXPECT_TRUE(SuccessfulResponseToURL(GetUrl("/privet/capabilities"), | |
| 728 kSampleCapabilitiesResponse)); | |
| 729 } | |
| 730 | |
| 731 #if defined(ENABLE_PRINT_PREVIEW) | |
| 732 // A note on PWG raster conversion: The PWG raster converter used simply | |
| 733 // converts strings to file paths based on them by appending "test.pdf", since | |
| 734 // it's easier to test that way. Instead of using a mock, we simply check if the | |
| 735 // request is uploading a file that is based on this pattern. | |
| 736 class FakePWGRasterConverter : public PWGRasterConverter { | |
| 737 public: | |
| 738 void Start(base::RefCountedMemory* data, | |
| 739 const printing::PdfRenderSettings& conversion_settings, | |
| 740 const printing::PwgRasterSettings& bitmap_settings, | |
| 741 const ResultCallback& callback) override { | |
| 742 bitmap_settings_ = bitmap_settings; | |
| 743 std::string data_str(data->front_as<char>(), data->size()); | |
| 744 callback.Run(true, base::FilePath().AppendASCII(data_str + "test.pdf")); | |
| 745 } | |
| 746 | |
| 747 const printing::PwgRasterSettings& bitmap_settings() { | |
| 748 return bitmap_settings_; | |
| 749 } | |
| 750 | |
| 751 private: | |
| 752 printing::PwgRasterSettings bitmap_settings_; | |
| 753 }; | |
| 754 | |
| 755 class PrivetLocalPrintTest : public PrivetHTTPTest { | |
| 756 public: | |
| 757 void SetUp() override { | |
| 758 PrivetURLFetcher::ResetTokenMapForTests(); | |
| 759 | |
| 760 local_print_operation_ = privet_client_->CreateLocalPrintOperation( | |
| 761 &local_print_delegate_); | |
| 762 | |
| 763 scoped_ptr<FakePWGRasterConverter> pwg_converter( | |
| 764 new FakePWGRasterConverter); | |
| 765 pwg_converter_ = pwg_converter.get(); | |
| 766 local_print_operation_->SetPWGRasterConverterForTesting( | |
| 767 std::move(pwg_converter)); | |
| 768 } | |
| 769 | |
| 770 scoped_refptr<base::RefCountedBytes> RefCountedBytesFromString( | |
| 771 std::string str) { | |
| 772 std::vector<unsigned char> str_vec; | |
| 773 str_vec.insert(str_vec.begin(), str.begin(), str.end()); | |
| 774 return scoped_refptr<base::RefCountedBytes>( | |
| 775 base::RefCountedBytes::TakeVector(&str_vec)); | |
| 776 } | |
| 777 | |
| 778 protected: | |
| 779 scoped_ptr<PrivetLocalPrintOperation> local_print_operation_; | |
| 780 StrictMock<MockLocalPrintDelegate> local_print_delegate_; | |
| 781 FakePWGRasterConverter* pwg_converter_; | |
| 782 }; | |
| 783 | |
| 784 INSTANTIATE_TEST_CASE_P(PrivetTests, | |
| 785 PrivetLocalPrintTest, | |
| 786 ValuesIn(kTestParams)); | |
| 787 | |
| 788 TEST_P(PrivetLocalPrintTest, SuccessfulLocalPrint) { | |
| 789 local_print_operation_->SetUsername("sample@gmail.com"); | |
| 790 local_print_operation_->SetJobname("Sample job name"); | |
| 791 local_print_operation_->SetData(RefCountedBytesFromString( | |
| 792 "Sample print data")); | |
| 793 local_print_operation_->SetCapabilities(kSampleCapabilitiesResponse); | |
| 794 local_print_operation_->Start(); | |
| 795 | |
| 796 EXPECT_TRUE( | |
| 797 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 798 | |
| 799 EXPECT_TRUE( | |
| 800 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 801 | |
| 802 EXPECT_CALL(local_print_delegate_, OnPrivetPrintingDoneInternal()); | |
| 803 | |
| 804 // TODO(noamsml): Is encoding spaces as pluses standard? | |
| 805 EXPECT_TRUE(SuccessfulResponseToURLAndData( | |
| 806 GetUrl("/privet/printer/submitdoc?" | |
| 807 "client_name=Chrome&user_name=sample%40gmail.com&" | |
| 808 "job_name=Sample+job+name"), | |
| 809 "Sample print data", kSampleLocalPrintResponse)); | |
| 810 } | |
| 811 | |
| 812 TEST_P(PrivetLocalPrintTest, SuccessfulLocalPrintWithAnyMimetype) { | |
| 813 local_print_operation_->SetUsername("sample@gmail.com"); | |
| 814 local_print_operation_->SetJobname("Sample job name"); | |
| 815 local_print_operation_->SetData( | |
| 816 RefCountedBytesFromString("Sample print data")); | |
| 817 local_print_operation_->SetCapabilities( | |
| 818 kSampleCapabilitiesResponseWithAnyMimetype); | |
| 819 local_print_operation_->Start(); | |
| 820 | |
| 821 EXPECT_TRUE( | |
| 822 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 823 | |
| 824 EXPECT_TRUE( | |
| 825 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 826 | |
| 827 EXPECT_CALL(local_print_delegate_, OnPrivetPrintingDoneInternal()); | |
| 828 | |
| 829 // TODO(noamsml): Is encoding spaces as pluses standard? | |
| 830 EXPECT_TRUE(SuccessfulResponseToURLAndData( | |
| 831 GetUrl("/privet/printer/submitdoc?" | |
| 832 "client_name=Chrome&user_name=sample%40gmail.com&" | |
| 833 "job_name=Sample+job+name"), | |
| 834 "Sample print data", kSampleLocalPrintResponse)); | |
| 835 } | |
| 836 | |
| 837 TEST_P(PrivetLocalPrintTest, SuccessfulPWGLocalPrint) { | |
| 838 local_print_operation_->SetUsername("sample@gmail.com"); | |
| 839 local_print_operation_->SetJobname("Sample job name"); | |
| 840 local_print_operation_->SetData( | |
| 841 RefCountedBytesFromString("path/to/")); | |
| 842 local_print_operation_->SetCapabilities(kSampleCapabilitiesResponsePWGOnly); | |
| 843 local_print_operation_->Start(); | |
| 844 | |
| 845 EXPECT_TRUE( | |
| 846 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 847 | |
| 848 EXPECT_TRUE( | |
| 849 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 850 | |
| 851 EXPECT_CALL(local_print_delegate_, OnPrivetPrintingDoneInternal()); | |
| 852 | |
| 853 // TODO(noamsml): Is encoding spaces as pluses standard? | |
| 854 EXPECT_TRUE(SuccessfulResponseToURLAndFilePath( | |
| 855 GetUrl("/privet/printer/submitdoc?" | |
| 856 "client_name=Chrome&user_name=sample%40gmail.com" | |
| 857 "&job_name=Sample+job+name"), | |
| 858 base::FilePath(FILE_PATH_LITERAL("path/to/test.pdf")), | |
| 859 kSampleLocalPrintResponse)); | |
| 860 | |
| 861 EXPECT_EQ(printing::TRANSFORM_NORMAL, | |
| 862 pwg_converter_->bitmap_settings().odd_page_transform); | |
| 863 EXPECT_FALSE(pwg_converter_->bitmap_settings().rotate_all_pages); | |
| 864 EXPECT_FALSE(pwg_converter_->bitmap_settings().reverse_page_order); | |
| 865 } | |
| 866 | |
| 867 TEST_P(PrivetLocalPrintTest, SuccessfulPWGLocalPrintDuplex) { | |
| 868 local_print_operation_->SetUsername("sample@gmail.com"); | |
| 869 local_print_operation_->SetJobname("Sample job name"); | |
| 870 local_print_operation_->SetData(RefCountedBytesFromString("path/to/")); | |
| 871 local_print_operation_->SetTicket(kSampleCJTDuplex); | |
| 872 local_print_operation_->SetCapabilities( | |
| 873 kSampleCapabilitiesResponsePWGSettings); | |
| 874 local_print_operation_->Start(); | |
| 875 | |
| 876 EXPECT_TRUE(SuccessfulResponseToURL(GetUrl("/privet/info"), | |
| 877 kSampleInfoResponseWithCreatejob)); | |
| 878 | |
| 879 EXPECT_TRUE( | |
| 880 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 881 | |
| 882 EXPECT_TRUE(SuccessfulResponseToURLAndJSONData( | |
| 883 GetUrl("/privet/printer/createjob"), kSampleCJTDuplex, | |
| 884 kSampleCreatejobResponse)); | |
| 885 | |
| 886 EXPECT_CALL(local_print_delegate_, OnPrivetPrintingDoneInternal()); | |
| 887 | |
| 888 // TODO(noamsml): Is encoding spaces as pluses standard? | |
| 889 EXPECT_TRUE(SuccessfulResponseToURLAndFilePath( | |
| 890 GetUrl("/privet/printer/submitdoc?" | |
| 891 "client_name=Chrome&user_name=sample%40gmail.com" | |
| 892 "&job_name=Sample+job+name&job_id=1234"), | |
| 893 base::FilePath(FILE_PATH_LITERAL("path/to/test.pdf")), | |
| 894 kSampleLocalPrintResponse)); | |
| 895 | |
| 896 EXPECT_EQ(printing::TRANSFORM_ROTATE_180, | |
| 897 pwg_converter_->bitmap_settings().odd_page_transform); | |
| 898 EXPECT_FALSE(pwg_converter_->bitmap_settings().rotate_all_pages); | |
| 899 EXPECT_TRUE(pwg_converter_->bitmap_settings().reverse_page_order); | |
| 900 } | |
| 901 | |
| 902 TEST_P(PrivetLocalPrintTest, SuccessfulLocalPrintWithCreatejob) { | |
| 903 local_print_operation_->SetUsername("sample@gmail.com"); | |
| 904 local_print_operation_->SetJobname("Sample job name"); | |
| 905 local_print_operation_->SetTicket(kSampleCJT); | |
| 906 local_print_operation_->SetData( | |
| 907 RefCountedBytesFromString("Sample print data")); | |
| 908 local_print_operation_->SetCapabilities(kSampleCapabilitiesResponse); | |
| 909 local_print_operation_->Start(); | |
| 910 | |
| 911 EXPECT_TRUE(SuccessfulResponseToURL(GetUrl("/privet/info"), | |
| 912 kSampleInfoResponseWithCreatejob)); | |
| 913 | |
| 914 EXPECT_TRUE( | |
| 915 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 916 | |
| 917 EXPECT_TRUE( | |
| 918 SuccessfulResponseToURLAndJSONData(GetUrl("/privet/printer/createjob"), | |
| 919 kSampleCJT, kSampleCreatejobResponse)); | |
| 920 | |
| 921 EXPECT_CALL(local_print_delegate_, OnPrivetPrintingDoneInternal()); | |
| 922 | |
| 923 // TODO(noamsml): Is encoding spaces as pluses standard? | |
| 924 EXPECT_TRUE(SuccessfulResponseToURLAndData( | |
| 925 GetUrl("/privet/printer/submitdoc?" | |
| 926 "client_name=Chrome&user_name=sample%40gmail.com&" | |
| 927 "job_name=Sample+job+name&job_id=1234"), | |
| 928 "Sample print data", kSampleLocalPrintResponse)); | |
| 929 } | |
| 930 | |
| 931 TEST_P(PrivetLocalPrintTest, SuccessfulLocalPrintWithOverlongName) { | |
| 932 local_print_operation_->SetUsername("sample@gmail.com"); | |
| 933 local_print_operation_->SetJobname( | |
| 934 "123456789:123456789:123456789:123456789:123456789:123456789:123456789:"); | |
| 935 local_print_operation_->SetTicket(kSampleCJT); | |
| 936 local_print_operation_->SetCapabilities(kSampleCapabilitiesResponse); | |
| 937 local_print_operation_->SetData( | |
| 938 RefCountedBytesFromString("Sample print data")); | |
| 939 local_print_operation_->Start(); | |
| 940 | |
| 941 EXPECT_TRUE(SuccessfulResponseToURL(GetUrl("/privet/info"), | |
| 942 kSampleInfoResponseWithCreatejob)); | |
| 943 | |
| 944 EXPECT_TRUE( | |
| 945 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 946 | |
| 947 EXPECT_TRUE( | |
| 948 SuccessfulResponseToURLAndJSONData(GetUrl("/privet/printer/createjob"), | |
| 949 kSampleCJT, kSampleCreatejobResponse)); | |
| 950 | |
| 951 EXPECT_CALL(local_print_delegate_, OnPrivetPrintingDoneInternal()); | |
| 952 | |
| 953 // TODO(noamsml): Is encoding spaces as pluses standard? | |
| 954 EXPECT_TRUE(SuccessfulResponseToURLAndData( | |
| 955 GetUrl("/privet/printer/submitdoc?" | |
| 956 "client_name=Chrome&user_name=sample%40gmail.com&" | |
| 957 "job_name=123456789%3A123456789%3A123456789%3A1...123456789" | |
| 958 "%3A123456789%3A123456789%3A&job_id=1234"), | |
| 959 "Sample print data", kSampleLocalPrintResponse)); | |
| 960 } | |
| 961 | |
| 962 TEST_P(PrivetLocalPrintTest, PDFPrintInvalidDocumentTypeRetry) { | |
| 963 local_print_operation_->SetUsername("sample@gmail.com"); | |
| 964 local_print_operation_->SetJobname("Sample job name"); | |
| 965 local_print_operation_->SetTicket(kSampleCJT); | |
| 966 local_print_operation_->SetCapabilities(kSampleCapabilitiesResponse); | |
| 967 local_print_operation_->SetData( | |
| 968 RefCountedBytesFromString("sample/path/")); | |
| 969 local_print_operation_->Start(); | |
| 970 | |
| 971 EXPECT_TRUE(SuccessfulResponseToURL(GetUrl("/privet/info"), | |
| 972 kSampleInfoResponseWithCreatejob)); | |
| 973 | |
| 974 EXPECT_TRUE( | |
| 975 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 976 | |
| 977 EXPECT_TRUE( | |
| 978 SuccessfulResponseToURLAndJSONData(GetUrl("/privet/printer/createjob"), | |
| 979 kSampleCJT, kSampleCreatejobResponse)); | |
| 980 | |
| 981 // TODO(noamsml): Is encoding spaces as pluses standard? | |
| 982 EXPECT_TRUE(SuccessfulResponseToURLAndData( | |
| 983 GetUrl("/privet/printer/submitdoc?" | |
| 984 "client_name=Chrome&user_name=sample%40gmail.com&" | |
| 985 "job_name=Sample+job+name&job_id=1234"), | |
| 986 "sample/path/", kSampleInvalidDocumentTypeResponse)); | |
| 987 | |
| 988 EXPECT_CALL(local_print_delegate_, OnPrivetPrintingDoneInternal()); | |
| 989 | |
| 990 EXPECT_TRUE(SuccessfulResponseToURLAndFilePath( | |
| 991 GetUrl("/privet/printer/submitdoc?" | |
| 992 "client_name=Chrome&user_name=sample%40gmail.com&" | |
| 993 "job_name=Sample+job+name&job_id=1234"), | |
| 994 base::FilePath(FILE_PATH_LITERAL("sample/path/test.pdf")), | |
| 995 kSampleLocalPrintResponse)); | |
| 996 } | |
| 997 | |
| 998 TEST_P(PrivetLocalPrintTest, LocalPrintRetryOnInvalidJobID) { | |
| 999 local_print_operation_->SetUsername("sample@gmail.com"); | |
| 1000 local_print_operation_->SetJobname("Sample job name"); | |
| 1001 local_print_operation_->SetTicket(kSampleCJT); | |
| 1002 local_print_operation_->SetCapabilities(kSampleCapabilitiesResponse); | |
| 1003 local_print_operation_->SetData( | |
| 1004 RefCountedBytesFromString("Sample print data")); | |
| 1005 local_print_operation_->Start(); | |
| 1006 | |
| 1007 EXPECT_TRUE(SuccessfulResponseToURL(GetUrl("/privet/info"), | |
| 1008 kSampleInfoResponseWithCreatejob)); | |
| 1009 | |
| 1010 EXPECT_TRUE( | |
| 1011 SuccessfulResponseToURL(GetUrl("/privet/info"), kSampleInfoResponse)); | |
| 1012 | |
| 1013 EXPECT_TRUE( | |
| 1014 SuccessfulResponseToURLAndJSONData(GetUrl("/privet/printer/createjob"), | |
| 1015 kSampleCJT, kSampleCreatejobResponse)); | |
| 1016 | |
| 1017 EXPECT_TRUE(SuccessfulResponseToURLAndData( | |
| 1018 GetUrl("/privet/printer/submitdoc?" | |
| 1019 "client_name=Chrome&user_name=sample%40gmail.com&" | |
| 1020 "job_name=Sample+job+name&job_id=1234"), | |
| 1021 "Sample print data", kSampleErrorResponsePrinterBusy)); | |
| 1022 | |
| 1023 RunFor(base::TimeDelta::FromSeconds(3)); | |
| 1024 | |
| 1025 EXPECT_TRUE(SuccessfulResponseToURL(GetUrl("/privet/printer/createjob"), | |
| 1026 kSampleCreatejobResponse)); | |
| 1027 } | |
| 1028 #endif // ENABLE_PRINT_PREVIEW | |
| 1029 | |
| 1030 class PrivetHttpWithServerTest : public ::testing::Test, | |
| 1031 public PrivetURLFetcher::Delegate { | |
| 1032 protected: | |
| 1033 PrivetHttpWithServerTest() | |
| 1034 : thread_bundle_(content::TestBrowserThreadBundle::REAL_IO_THREAD) {} | |
| 1035 | |
| 1036 void SetUp() override { | |
| 1037 context_getter_ = new net::TestURLRequestContextGetter( | |
| 1038 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)); | |
| 1039 | |
| 1040 server_.reset(new EmbeddedTestServer(EmbeddedTestServer::TYPE_HTTP)); | |
| 1041 ASSERT_TRUE(server_->Start()); | |
| 1042 | |
| 1043 base::FilePath test_data_dir; | |
| 1044 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir)); | |
| 1045 server_->ServeFilesFromDirectory( | |
| 1046 test_data_dir.Append(FILE_PATH_LITERAL("chrome/test/data"))); | |
| 1047 | |
| 1048 client_.reset(new PrivetHTTPClientImpl("test", server_->host_port_pair(), | |
| 1049 context_getter_)); | |
| 1050 } | |
| 1051 | |
| 1052 void OnNeedPrivetToken( | |
| 1053 PrivetURLFetcher* fetcher, | |
| 1054 const PrivetURLFetcher::TokenCallback& callback) override { | |
| 1055 callback.Run("abc"); | |
| 1056 } | |
| 1057 | |
| 1058 void OnError(PrivetURLFetcher* fetcher, | |
| 1059 PrivetURLFetcher::ErrorType error) override { | |
| 1060 done_ = true; | |
| 1061 success_ = false; | |
| 1062 error_ = error; | |
| 1063 | |
| 1064 base::MessageLoop::current()->PostTask(FROM_HERE, quit_); | |
| 1065 } | |
| 1066 | |
| 1067 void OnParsedJson(PrivetURLFetcher* fetcher, | |
| 1068 const base::DictionaryValue& value, | |
| 1069 bool has_error) override { | |
| 1070 NOTREACHED(); | |
| 1071 base::MessageLoop::current()->PostTask(FROM_HERE, quit_); | |
| 1072 } | |
| 1073 | |
| 1074 bool OnRawData(PrivetURLFetcher* fetcher, | |
| 1075 bool response_is_file, | |
| 1076 const std::string& data_string, | |
| 1077 const base::FilePath& data_file) override { | |
| 1078 done_ = true; | |
| 1079 success_ = true; | |
| 1080 | |
| 1081 base::MessageLoop::current()->PostTask(FROM_HERE, quit_); | |
| 1082 return true; | |
| 1083 } | |
| 1084 | |
| 1085 bool Run() { | |
| 1086 success_ = false; | |
| 1087 done_ = false; | |
| 1088 | |
| 1089 base::RunLoop run_loop; | |
| 1090 quit_ = run_loop.QuitClosure(); | |
| 1091 | |
| 1092 scoped_ptr<PrivetURLFetcher> fetcher = client_->CreateURLFetcher( | |
| 1093 server_->GetURL("/simple.html"), net::URLFetcher::GET, this); | |
| 1094 | |
| 1095 fetcher->SetMaxRetries(1); | |
| 1096 fetcher->Start(); | |
| 1097 | |
| 1098 run_loop.Run(); | |
| 1099 | |
| 1100 EXPECT_TRUE(done_); | |
| 1101 return success_; | |
| 1102 } | |
| 1103 | |
| 1104 bool success_ = false; | |
| 1105 bool done_ = false; | |
| 1106 PrivetURLFetcher::ErrorType error_ = PrivetURLFetcher::ErrorType(); | |
| 1107 content::TestBrowserThreadBundle thread_bundle_; | |
| 1108 scoped_refptr<net::TestURLRequestContextGetter> context_getter_; | |
| 1109 scoped_ptr<EmbeddedTestServer> server_; | |
| 1110 scoped_ptr<PrivetHTTPClientImpl> client_; | |
| 1111 | |
| 1112 base::Closure quit_; | |
| 1113 }; | |
| 1114 | |
| 1115 TEST_F(PrivetHttpWithServerTest, HttpServer) { | |
| 1116 EXPECT_TRUE(Run()); | |
| 1117 } | |
| 1118 | |
| 1119 } // namespace | |
| 1120 | |
| 1121 } // namespace local_discovery | |
| OLD | NEW |