| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/files/file_path.h" | 5 #include "base/files/file_path.h" |
| 6 #include "base/md5.h" | 6 #include "base/md5.h" |
| 7 #include "base/memory/ref_counted.h" | 7 #include "base/memory/ref_counted.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/message_loop/message_loop_proxy.h" | 10 #include "base/message_loop/message_loop_proxy.h" |
| 11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
| 12 #include "chrome/common/cloud_print/cloud_print_constants.h" | 12 #include "chrome/common/cloud_print/cloud_print_constants.h" |
| 13 #include "chrome/service/cloud_print/cloud_print_helpers.h" | 13 #include "chrome/service/cloud_print/cloud_print_helpers.h" |
| 14 #include "chrome/service/cloud_print/cloud_print_token_store.h" | 14 #include "chrome/service/cloud_print/cloud_print_token_store.h" |
| 15 #include "chrome/service/cloud_print/print_system.h" | 15 #include "chrome/service/cloud_print/print_system.h" |
| 16 #include "chrome/service/cloud_print/printer_job_handler.h" | 16 #include "chrome/service/cloud_print/printer_job_handler.h" |
| 17 #include "net/http/http_response_headers.h" | 17 #include "net/http/http_response_headers.h" |
| 18 #include "net/url_request/test_url_fetcher_factory.h" | 18 #include "net/url_request/test_url_fetcher_factory.h" |
| 19 #include "net/url_request/url_request_test_util.h" | 19 #include "net/url_request/url_request_test_util.h" |
| 20 #include "printing/backend/print_backend.h" | 20 #include "printing/backend/print_backend.h" |
| 21 #include "testing/gmock/include/gmock/gmock.h" | 21 #include "testing/gmock/include/gmock/gmock.h" |
| 22 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
| 23 | 23 |
| 24 using ::testing::AtLeast; | 24 using ::testing::AtLeast; |
| 25 using ::testing::DoAll; |
| 25 using ::testing::Exactly; | 26 using ::testing::Exactly; |
| 26 using ::testing::Sequence; | 27 using ::testing::Invoke; |
| 28 using ::testing::InvokeWithoutArgs; |
| 29 using ::testing::NiceMock; |
| 27 using ::testing::Return; | 30 using ::testing::Return; |
| 28 using ::testing::SaveArg; | 31 using ::testing::SaveArg; |
| 29 using ::testing::DoAll; | 32 using ::testing::Sequence; |
| 33 using ::testing::SetArgPointee; |
| 34 using ::testing::StrictMock; |
| 30 using ::testing::_; | 35 using ::testing::_; |
| 31 using ::testing::NiceMock; | |
| 32 using ::testing::StrictMock; | |
| 33 using ::testing::Invoke; | |
| 34 using ::testing::SetArgPointee; | |
| 35 using ::testing::InvokeWithoutArgs; | |
| 36 | 36 |
| 37 namespace cloud_print { | 37 namespace cloud_print { |
| 38 | 38 |
| 39 namespace { | 39 namespace { |
| 40 | 40 |
| 41 using base::StringPrintf; | 41 using base::StringPrintf; |
| 42 | 42 |
| 43 const char kExampleCloudPrintServerURL[] = "https://www.google.com/cloudprint/"; | 43 const char kExampleCloudPrintServerURL[] = "https://www.google.com/cloudprint/"; |
| 44 | 44 |
| 45 const char kExamplePrintTicket[] = "{\"MediaType\":\"plain\"," | 45 const char kExamplePrintTicket[] = "{\"MediaType\":\"plain\"," |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 std::string JobListResponse(int num_jobs) { | 196 std::string JobListResponse(int num_jobs) { |
| 197 std::string job_objects; | 197 std::string job_objects; |
| 198 for (int i = 0; i < num_jobs; i++) { | 198 for (int i = 0; i < num_jobs; i++) { |
| 199 job_objects = job_objects + StringPrintf(kExampleJobObject, i+1, i+1, i+1, | 199 job_objects = job_objects + StringPrintf(kExampleJobObject, i+1, i+1, i+1, |
| 200 i+1); | 200 i+1); |
| 201 if (i != num_jobs-1) job_objects = job_objects + ","; | 201 if (i != num_jobs-1) job_objects = job_objects + ","; |
| 202 } | 202 } |
| 203 return StringPrintf(kExampleJobListResponse, job_objects.c_str()); | 203 return StringPrintf(kExampleJobListResponse, job_objects.c_str()); |
| 204 } | 204 } |
| 205 | 205 |
| 206 std::string JobListURI(const char* reason) { | 206 GURL JobListURI(const char* reason) { |
| 207 return StringPrintf(kExamplePrinterJobListURI, reason); | 207 return GURL(StringPrintf(kExamplePrinterJobListURI, reason)); |
| 208 } | 208 } |
| 209 | 209 |
| 210 std::string JobID(int job_num) { | 210 std::string JobID(int job_num) { |
| 211 return StringPrintf(kExampleJobID, job_num); | 211 return StringPrintf(kExampleJobID, job_num); |
| 212 } | 212 } |
| 213 | 213 |
| 214 std::string DoneURI(int job_num) { | 214 GURL DoneURI(int job_num) { |
| 215 return StringPrintf(kExampleUpdateDoneURI, job_num); | 215 return GURL(StringPrintf(kExampleUpdateDoneURI, job_num)); |
| 216 } | 216 } |
| 217 | 217 |
| 218 std::string ErrorURI(int job_num) { | 218 GURL ErrorURI(int job_num) { |
| 219 return StringPrintf(kExampleUpdateErrorURI, job_num); | 219 return GURL(StringPrintf(kExampleUpdateErrorURI, job_num)); |
| 220 } | 220 } |
| 221 | 221 |
| 222 std::string TicketURI(int job_num) { | 222 GURL TicketURI(int job_num) { |
| 223 return StringPrintf(kExamplePrintTicketURI, job_num); | 223 return GURL(StringPrintf(kExamplePrintTicketURI, job_num)); |
| 224 } | 224 } |
| 225 | 225 |
| 226 std::string DownloadURI(int job_num) { | 226 GURL DownloadURI(int job_num) { |
| 227 return StringPrintf(kExamplePrintDownloadURI, job_num); | 227 return GURL(StringPrintf(kExamplePrintDownloadURI, job_num)); |
| 228 } | 228 } |
| 229 | 229 |
| 230 // converts to string for consistency | 230 GURL InProgressURI(int job_num) { |
| 231 std::string InProgressURI(int job_num) { | |
| 232 return GetUrlForJobStatusUpdate(GURL(kExampleCloudPrintServerURL), | 231 return GetUrlForJobStatusUpdate(GURL(kExampleCloudPrintServerURL), |
| 233 StringPrintf(kExampleJobID, job_num), | 232 StringPrintf(kExampleJobID, job_num), |
| 234 PRINT_JOB_STATUS_IN_PROGRESS, | 233 PRINT_JOB_STATUS_IN_PROGRESS, |
| 235 0).spec(); | 234 0); |
| 236 } | 235 } |
| 237 | 236 |
| 238 std::string StatusResponse(int job_num, const char* status_string) { | 237 std::string StatusResponse(int job_num, const char* status_string) { |
| 239 return StringPrintf(kExampleControlResponse, | 238 return StringPrintf(kExampleControlResponse, |
| 240 status_string, | 239 status_string, |
| 241 job_num, | 240 job_num, |
| 242 status_string); | 241 status_string); |
| 243 } | 242 } |
| 244 | 243 |
| 245 } // namespace | 244 } // namespace |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 | 549 |
| 551 factory_.SetFakeResponse(DoneURI(job_num), | 550 factory_.SetFakeResponse(DoneURI(job_num), |
| 552 StatusResponse(job_num, "DONE"), | 551 StatusResponse(job_num, "DONE"), |
| 553 true); | 552 true); |
| 554 factory_.SetFakeResponse(InProgressURI(job_num), | 553 factory_.SetFakeResponse(InProgressURI(job_num), |
| 555 StatusResponse(job_num, "IN_PROGRESS"), | 554 StatusResponse(job_num, "IN_PROGRESS"), |
| 556 true); | 555 true); |
| 557 | 556 |
| 558 // The times requirement is relaxed for the ticket URI | 557 // The times requirement is relaxed for the ticket URI |
| 559 // in order to accommodate TicketDownloadFailureTest | 558 // in order to accommodate TicketDownloadFailureTest |
| 560 EXPECT_CALL(url_callback_, OnRequestCreate( | 559 EXPECT_CALL(url_callback_, OnRequestCreate(TicketURI(job_num), _)) |
| 561 GURL(TicketURI(job_num)), _)) | |
| 562 .Times(AtLeast(1)); | 560 .Times(AtLeast(1)); |
| 563 | 561 |
| 564 EXPECT_CALL(url_callback_, OnRequestCreate(GURL(DownloadURI(job_num)), _)) | 562 EXPECT_CALL(url_callback_, OnRequestCreate(DownloadURI(job_num), _)) |
| 565 .Times(Exactly(1)) | 563 .Times(Exactly(1)) |
| 566 .WillOnce(Invoke(this, &PrinterJobHandlerTest::AddMimeHeader)); | 564 .WillOnce(Invoke(this, &PrinterJobHandlerTest::AddMimeHeader)); |
| 567 | 565 |
| 568 EXPECT_CALL(url_callback_, OnRequestCreate(GURL(InProgressURI(job_num)), _)) | 566 EXPECT_CALL(url_callback_, OnRequestCreate(InProgressURI(job_num), _)) |
| 569 .Times(Exactly(1)); | 567 .Times(Exactly(1)); |
| 570 | 568 |
| 571 EXPECT_CALL(url_callback_, OnRequestCreate(GURL(DoneURI(job_num)), _)) | 569 EXPECT_CALL(url_callback_, OnRequestCreate(DoneURI(job_num), _)) |
| 572 .Times(Exactly(1)); | 570 .Times(Exactly(1)); |
| 573 | 571 |
| 574 EXPECT_CALL(print_system_->JobSpooler(), | 572 EXPECT_CALL(print_system_->JobSpooler(), |
| 575 Spool(kExamplePrintTicket, _, _, _, _, _, _)) | 573 Spool(kExamplePrintTicket, _, _, _, _, _, _)) |
| 576 .Times(Exactly(1)) | 574 .Times(Exactly(1)) |
| 577 .WillOnce(InvokeWithoutArgs(this, | 575 .WillOnce(InvokeWithoutArgs(this, |
| 578 &PrinterJobHandlerTest::PostSpoolSuccess)); | 576 &PrinterJobHandlerTest::PostSpoolSuccess)); |
| 579 } | 577 } |
| 580 | 578 |
| 581 void PrinterJobHandlerTest::BeginTest(int timeout_seconds) { | 579 void PrinterJobHandlerTest::BeginTest(int timeout_seconds) { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 656 // This test simulates an end-to-end printing of a document | 654 // This test simulates an end-to-end printing of a document |
| 657 // but tests only non-failure cases. | 655 // but tests only non-failure cases. |
| 658 // Disabled - http://crbug.com/184245 | 656 // Disabled - http://crbug.com/184245 |
| 659 TEST_F(PrinterJobHandlerTest, DISABLED_HappyPathTest) { | 657 TEST_F(PrinterJobHandlerTest, DISABLED_HappyPathTest) { |
| 660 factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup), | 658 factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup), |
| 661 JobListResponse(1), true); | 659 JobListResponse(1), true); |
| 662 factory_.SetFakeResponse(JobListURI(kJobFetchReasonQueryMore), | 660 factory_.SetFakeResponse(JobListURI(kJobFetchReasonQueryMore), |
| 663 JobListResponse(0), true); | 661 JobListResponse(0), true); |
| 664 | 662 |
| 665 EXPECT_CALL(url_callback_, | 663 EXPECT_CALL(url_callback_, |
| 666 OnRequestCreate(GURL(JobListURI(kJobFetchReasonStartup)), _)) | 664 OnRequestCreate(JobListURI(kJobFetchReasonStartup), _)) |
| 667 .Times(Exactly(1)); | 665 .Times(Exactly(1)); |
| 668 EXPECT_CALL(url_callback_, | 666 EXPECT_CALL(url_callback_, |
| 669 OnRequestCreate(GURL(JobListURI(kJobFetchReasonQueryMore)), _)) | 667 OnRequestCreate(JobListURI(kJobFetchReasonQueryMore), _)) |
| 670 .Times(Exactly(1)); | 668 .Times(Exactly(1)); |
| 671 | 669 |
| 672 SetUpJobSuccessTest(1); | 670 SetUpJobSuccessTest(1); |
| 673 BeginTest(20); | 671 BeginTest(20); |
| 674 } | 672 } |
| 675 | 673 |
| 676 TEST_F(PrinterJobHandlerTest, TicketDownloadFailureTest) { | 674 TEST_F(PrinterJobHandlerTest, TicketDownloadFailureTest) { |
| 677 factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup), | 675 factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup), |
| 678 JobListResponse(2), true); | 676 JobListResponse(2), true); |
| 679 factory_.SetFakeResponse(JobListURI(kJobFetchReasonFailure), | 677 factory_.SetFakeResponse(JobListURI(kJobFetchReasonFailure), |
| 680 JobListResponse(2), true); | 678 JobListResponse(2), true); |
| 681 factory_.SetFakeResponse(JobListURI(kJobFetchReasonQueryMore), | 679 factory_.SetFakeResponse(JobListURI(kJobFetchReasonQueryMore), |
| 682 JobListResponse(0), true); | 680 JobListResponse(0), true); |
| 683 factory_.SetFakeResponse(TicketURI(1), std::string(), false); | 681 factory_.SetFakeResponse(TicketURI(1), std::string(), false); |
| 684 | 682 |
| 685 EXPECT_CALL(url_callback_, OnRequestCreate(GURL(TicketURI(1)), _)) | 683 EXPECT_CALL(url_callback_, OnRequestCreate(TicketURI(1), _)) |
| 686 .Times(AtLeast(1)); | 684 .Times(AtLeast(1)); |
| 687 | 685 |
| 688 EXPECT_CALL(url_callback_, | 686 EXPECT_CALL(url_callback_, |
| 689 OnRequestCreate(GURL(JobListURI(kJobFetchReasonStartup)), _)) | 687 OnRequestCreate(JobListURI(kJobFetchReasonStartup), _)) |
| 690 .Times(AtLeast(1)); | 688 .Times(AtLeast(1)); |
| 691 | 689 |
| 692 EXPECT_CALL(url_callback_, | 690 EXPECT_CALL(url_callback_, |
| 693 OnRequestCreate(GURL(JobListURI(kJobFetchReasonQueryMore)), _)) | 691 OnRequestCreate(JobListURI(kJobFetchReasonQueryMore), _)) |
| 694 .Times(AtLeast(1)); | 692 .Times(AtLeast(1)); |
| 695 | 693 |
| 696 EXPECT_CALL(url_callback_, | 694 EXPECT_CALL(url_callback_, |
| 697 OnRequestCreate(GURL(JobListURI(kJobFetchReasonFailure)), _)) | 695 OnRequestCreate(JobListURI(kJobFetchReasonFailure), _)) |
| 698 .Times(AtLeast(1)); | 696 .Times(AtLeast(1)); |
| 699 | 697 |
| 700 SetUpJobSuccessTest(2); | 698 SetUpJobSuccessTest(2); |
| 701 BeginTest(20); | 699 BeginTest(20); |
| 702 } | 700 } |
| 703 | 701 |
| 704 // TODO(noamsml): Figure out how to make this test not take 1 second and | 702 // TODO(noamsml): Figure out how to make this test not take 1 second and |
| 705 // re-enable it | 703 // re-enable it |
| 706 TEST_F(PrinterJobHandlerTest, DISABLED_ManyFailureTest) { | 704 TEST_F(PrinterJobHandlerTest, DISABLED_ManyFailureTest) { |
| 707 factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup), | 705 factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup), |
| 708 JobListResponse(1), true); | 706 JobListResponse(1), true); |
| 709 factory_.SetFakeResponse(JobListURI(kJobFetchReasonFailure), | 707 factory_.SetFakeResponse(JobListURI(kJobFetchReasonFailure), |
| 710 JobListResponse(1), true); | 708 JobListResponse(1), true); |
| 711 factory_.SetFakeResponse(JobListURI(kJobFetchReasonRetry), | 709 factory_.SetFakeResponse(JobListURI(kJobFetchReasonRetry), |
| 712 JobListResponse(1), true); | 710 JobListResponse(1), true); |
| 713 factory_.SetFakeResponse(JobListURI(kJobFetchReasonQueryMore), | 711 factory_.SetFakeResponse(JobListURI(kJobFetchReasonQueryMore), |
| 714 JobListResponse(0), true); | 712 JobListResponse(0), true); |
| 715 | 713 |
| 716 EXPECT_CALL(url_callback_, | 714 EXPECT_CALL(url_callback_, |
| 717 OnRequestCreate(GURL(JobListURI(kJobFetchReasonStartup)), _)) | 715 OnRequestCreate(JobListURI(kJobFetchReasonStartup), _)) |
| 718 .Times(AtLeast(1)); | 716 .Times(AtLeast(1)); |
| 719 | 717 |
| 720 EXPECT_CALL(url_callback_, | 718 EXPECT_CALL(url_callback_, |
| 721 OnRequestCreate(GURL(JobListURI(kJobFetchReasonQueryMore)), _)) | 719 OnRequestCreate(JobListURI(kJobFetchReasonQueryMore), _)) |
| 722 .Times(AtLeast(1)); | 720 .Times(AtLeast(1)); |
| 723 | 721 |
| 724 EXPECT_CALL(url_callback_, | 722 EXPECT_CALL(url_callback_, |
| 725 OnRequestCreate(GURL(JobListURI(kJobFetchReasonFailure)), _)) | 723 OnRequestCreate(JobListURI(kJobFetchReasonFailure), _)) |
| 726 .Times(AtLeast(1)); | 724 .Times(AtLeast(1)); |
| 727 | 725 |
| 728 EXPECT_CALL(url_callback_, | 726 EXPECT_CALL(url_callback_, |
| 729 OnRequestCreate(GURL(JobListURI(kJobFetchReasonRetry)), _)) | 727 OnRequestCreate(JobListURI(kJobFetchReasonRetry), _)) |
| 730 .Times(AtLeast(1)); | 728 .Times(AtLeast(1)); |
| 731 | 729 |
| 732 SetUpJobSuccessTest(1); | 730 SetUpJobSuccessTest(1); |
| 733 | 731 |
| 734 factory_.SetFakeResponse(TicketURI(1), std::string(), false); | 732 factory_.SetFakeResponse(TicketURI(1), std::string(), false); |
| 735 | 733 |
| 736 loop_.PostDelayedTask(FROM_HERE, | 734 loop_.PostDelayedTask(FROM_HERE, |
| 737 base::Bind(&net::FakeURLFetcherFactory::SetFakeResponse, | 735 base::Bind(&net::FakeURLFetcherFactory::SetFakeResponse, |
| 738 base::Unretained(&factory_), | 736 base::Unretained(&factory_), |
| 739 TicketURI(1), | 737 TicketURI(1), |
| (...skipping 12 matching lines...) Expand all Loading... |
| 752 factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup), | 750 factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup), |
| 753 JobListResponse(1), true); | 751 JobListResponse(1), true); |
| 754 factory_.SetFakeResponse(JobListURI(kJobFetchReasonFailure), | 752 factory_.SetFakeResponse(JobListURI(kJobFetchReasonFailure), |
| 755 JobListResponse(1), true); | 753 JobListResponse(1), true); |
| 756 factory_.SetFakeResponse(JobListURI(kJobFetchReasonRetry), | 754 factory_.SetFakeResponse(JobListURI(kJobFetchReasonRetry), |
| 757 JobListResponse(1), true); | 755 JobListResponse(1), true); |
| 758 factory_.SetFakeResponse(ErrorURI(1), StatusResponse(1, "ERROR"), true); | 756 factory_.SetFakeResponse(ErrorURI(1), StatusResponse(1, "ERROR"), true); |
| 759 factory_.SetFakeResponse(TicketURI(1), std::string(), false); | 757 factory_.SetFakeResponse(TicketURI(1), std::string(), false); |
| 760 | 758 |
| 761 EXPECT_CALL(url_callback_, | 759 EXPECT_CALL(url_callback_, |
| 762 OnRequestCreate(GURL(JobListURI(kJobFetchReasonStartup)), _)) | 760 OnRequestCreate(JobListURI(kJobFetchReasonStartup), _)) |
| 763 .Times(AtLeast(1)); | 761 .Times(AtLeast(1)); |
| 764 | 762 |
| 765 EXPECT_CALL(url_callback_, | 763 EXPECT_CALL(url_callback_, |
| 766 OnRequestCreate(GURL(JobListURI(kJobFetchReasonFailure)), _)) | 764 OnRequestCreate(JobListURI(kJobFetchReasonFailure), _)) |
| 767 .Times(AtLeast(1)); | 765 .Times(AtLeast(1)); |
| 768 | 766 |
| 769 EXPECT_CALL(url_callback_, | 767 EXPECT_CALL(url_callback_, |
| 770 OnRequestCreate(GURL(JobListURI(kJobFetchReasonRetry)), _)) | 768 OnRequestCreate(JobListURI(kJobFetchReasonRetry), _)) |
| 771 .Times(AtLeast(1)); | 769 .Times(AtLeast(1)); |
| 772 | 770 |
| 773 EXPECT_CALL(url_callback_, OnRequestCreate(GURL(ErrorURI(1)), _)) | 771 EXPECT_CALL(url_callback_, OnRequestCreate(ErrorURI(1), _)) |
| 774 .Times(Exactly(1)) | 772 .Times(Exactly(1)) |
| 775 .WillOnce(InvokeWithoutArgs( | 773 .WillOnce(InvokeWithoutArgs( |
| 776 this, &PrinterJobHandlerTest::MakeJobFetchReturnNoJobs)); | 774 this, &PrinterJobHandlerTest::MakeJobFetchReturnNoJobs)); |
| 777 | 775 |
| 778 EXPECT_CALL(url_callback_, OnRequestCreate(GURL(TicketURI(1)), _)) | 776 EXPECT_CALL(url_callback_, OnRequestCreate(TicketURI(1), _)) |
| 779 .Times(AtLeast(kNumRetriesBeforeAbandonJob)); | 777 .Times(AtLeast(kNumRetriesBeforeAbandonJob)); |
| 780 | 778 |
| 781 BeginTest(70); | 779 BeginTest(70); |
| 782 } | 780 } |
| 783 | 781 |
| 784 } // namespace cloud_print | 782 } // namespace cloud_print |
| OLD | NEW |