| 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).spec(); | 233 PRINT_JOB_STATUS_IN_PROGRESS); |
| 235 } | 234 } |
| 236 | 235 |
| 237 std::string StatusResponse(int job_num, const char* status_string) { | 236 std::string StatusResponse(int job_num, const char* status_string) { |
| 238 return StringPrintf(kExampleControlResponse, | 237 return StringPrintf(kExampleControlResponse, |
| 239 status_string, | 238 status_string, |
| 240 job_num, | 239 job_num, |
| 241 status_string); | 240 status_string); |
| 242 } | 241 } |
| 243 | 242 |
| 244 } // namespace | 243 } // namespace |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 | 546 |
| 548 factory_.SetFakeResponse(DoneURI(job_num), | 547 factory_.SetFakeResponse(DoneURI(job_num), |
| 549 StatusResponse(job_num, "DONE"), | 548 StatusResponse(job_num, "DONE"), |
| 550 true); | 549 true); |
| 551 factory_.SetFakeResponse(InProgressURI(job_num), | 550 factory_.SetFakeResponse(InProgressURI(job_num), |
| 552 StatusResponse(job_num, "IN_PROGRESS"), | 551 StatusResponse(job_num, "IN_PROGRESS"), |
| 553 true); | 552 true); |
| 554 | 553 |
| 555 // The times requirement is relaxed for the ticket URI | 554 // The times requirement is relaxed for the ticket URI |
| 556 // in order to accommodate TicketDownloadFailureTest | 555 // in order to accommodate TicketDownloadFailureTest |
| 557 EXPECT_CALL(url_callback_, OnRequestCreate( | 556 EXPECT_CALL(url_callback_, OnRequestCreate(TicketURI(job_num), _)) |
| 558 GURL(TicketURI(job_num)), _)) | |
| 559 .Times(AtLeast(1)); | 557 .Times(AtLeast(1)); |
| 560 | 558 |
| 561 EXPECT_CALL(url_callback_, OnRequestCreate(GURL(DownloadURI(job_num)), _)) | 559 EXPECT_CALL(url_callback_, OnRequestCreate(DownloadURI(job_num), _)) |
| 562 .Times(Exactly(1)) | 560 .Times(Exactly(1)) |
| 563 .WillOnce(Invoke(this, &PrinterJobHandlerTest::AddMimeHeader)); | 561 .WillOnce(Invoke(this, &PrinterJobHandlerTest::AddMimeHeader)); |
| 564 | 562 |
| 565 EXPECT_CALL(url_callback_, OnRequestCreate(GURL(InProgressURI(job_num)), _)) | 563 EXPECT_CALL(url_callback_, OnRequestCreate(InProgressURI(job_num), _)) |
| 566 .Times(Exactly(1)); | 564 .Times(Exactly(1)); |
| 567 | 565 |
| 568 EXPECT_CALL(url_callback_, OnRequestCreate(GURL(DoneURI(job_num)), _)) | 566 EXPECT_CALL(url_callback_, OnRequestCreate(DoneURI(job_num), _)) |
| 569 .Times(Exactly(1)); | 567 .Times(Exactly(1)); |
| 570 | 568 |
| 571 EXPECT_CALL(print_system_->JobSpooler(), | 569 EXPECT_CALL(print_system_->JobSpooler(), |
| 572 Spool(kExamplePrintTicket, _, _, _, _, _, _)) | 570 Spool(kExamplePrintTicket, _, _, _, _, _, _)) |
| 573 .Times(Exactly(1)) | 571 .Times(Exactly(1)) |
| 574 .WillOnce(InvokeWithoutArgs(this, | 572 .WillOnce(InvokeWithoutArgs(this, |
| 575 &PrinterJobHandlerTest::PostSpoolSuccess)); | 573 &PrinterJobHandlerTest::PostSpoolSuccess)); |
| 576 } | 574 } |
| 577 | 575 |
| 578 void PrinterJobHandlerTest::BeginTest(int timeout_seconds) { | 576 void PrinterJobHandlerTest::BeginTest(int timeout_seconds) { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 653 // This test simulates an end-to-end printing of a document | 651 // This test simulates an end-to-end printing of a document |
| 654 // but tests only non-failure cases. | 652 // but tests only non-failure cases. |
| 655 // Disabled - http://crbug.com/184245 | 653 // Disabled - http://crbug.com/184245 |
| 656 TEST_F(PrinterJobHandlerTest, DISABLED_HappyPathTest) { | 654 TEST_F(PrinterJobHandlerTest, DISABLED_HappyPathTest) { |
| 657 factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup), | 655 factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup), |
| 658 JobListResponse(1), true); | 656 JobListResponse(1), true); |
| 659 factory_.SetFakeResponse(JobListURI(kJobFetchReasonQueryMore), | 657 factory_.SetFakeResponse(JobListURI(kJobFetchReasonQueryMore), |
| 660 JobListResponse(0), true); | 658 JobListResponse(0), true); |
| 661 | 659 |
| 662 EXPECT_CALL(url_callback_, | 660 EXPECT_CALL(url_callback_, |
| 663 OnRequestCreate(GURL(JobListURI(kJobFetchReasonStartup)), _)) | 661 OnRequestCreate(JobListURI(kJobFetchReasonStartup), _)) |
| 664 .Times(Exactly(1)); | 662 .Times(Exactly(1)); |
| 665 EXPECT_CALL(url_callback_, | 663 EXPECT_CALL(url_callback_, |
| 666 OnRequestCreate(GURL(JobListURI(kJobFetchReasonQueryMore)), _)) | 664 OnRequestCreate(JobListURI(kJobFetchReasonQueryMore), _)) |
| 667 .Times(Exactly(1)); | 665 .Times(Exactly(1)); |
| 668 | 666 |
| 669 SetUpJobSuccessTest(1); | 667 SetUpJobSuccessTest(1); |
| 670 BeginTest(20); | 668 BeginTest(20); |
| 671 } | 669 } |
| 672 | 670 |
| 673 TEST_F(PrinterJobHandlerTest, TicketDownloadFailureTest) { | 671 TEST_F(PrinterJobHandlerTest, TicketDownloadFailureTest) { |
| 674 factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup), | 672 factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup), |
| 675 JobListResponse(2), true); | 673 JobListResponse(2), true); |
| 676 factory_.SetFakeResponse(JobListURI(kJobFetchReasonFailure), | 674 factory_.SetFakeResponse(JobListURI(kJobFetchReasonFailure), |
| 677 JobListResponse(2), true); | 675 JobListResponse(2), true); |
| 678 factory_.SetFakeResponse(JobListURI(kJobFetchReasonQueryMore), | 676 factory_.SetFakeResponse(JobListURI(kJobFetchReasonQueryMore), |
| 679 JobListResponse(0), true); | 677 JobListResponse(0), true); |
| 680 factory_.SetFakeResponse(TicketURI(1), std::string(), false); | 678 factory_.SetFakeResponse(TicketURI(1), std::string(), false); |
| 681 | 679 |
| 682 EXPECT_CALL(url_callback_, OnRequestCreate(GURL(TicketURI(1)), _)) | 680 EXPECT_CALL(url_callback_, OnRequestCreate(TicketURI(1), _)) |
| 683 .Times(AtLeast(1)); | 681 .Times(AtLeast(1)); |
| 684 | 682 |
| 685 EXPECT_CALL(url_callback_, | 683 EXPECT_CALL(url_callback_, |
| 686 OnRequestCreate(GURL(JobListURI(kJobFetchReasonStartup)), _)) | 684 OnRequestCreate(JobListURI(kJobFetchReasonStartup), _)) |
| 687 .Times(AtLeast(1)); | 685 .Times(AtLeast(1)); |
| 688 | 686 |
| 689 EXPECT_CALL(url_callback_, | 687 EXPECT_CALL(url_callback_, |
| 690 OnRequestCreate(GURL(JobListURI(kJobFetchReasonQueryMore)), _)) | 688 OnRequestCreate(JobListURI(kJobFetchReasonQueryMore), _)) |
| 691 .Times(AtLeast(1)); | 689 .Times(AtLeast(1)); |
| 692 | 690 |
| 693 EXPECT_CALL(url_callback_, | 691 EXPECT_CALL(url_callback_, |
| 694 OnRequestCreate(GURL(JobListURI(kJobFetchReasonFailure)), _)) | 692 OnRequestCreate(JobListURI(kJobFetchReasonFailure), _)) |
| 695 .Times(AtLeast(1)); | 693 .Times(AtLeast(1)); |
| 696 | 694 |
| 697 SetUpJobSuccessTest(2); | 695 SetUpJobSuccessTest(2); |
| 698 BeginTest(20); | 696 BeginTest(20); |
| 699 } | 697 } |
| 700 | 698 |
| 701 // TODO(noamsml): Figure out how to make this test not take 1 second and | 699 // TODO(noamsml): Figure out how to make this test not take 1 second and |
| 702 // re-enable it | 700 // re-enable it |
| 703 TEST_F(PrinterJobHandlerTest, DISABLED_ManyFailureTest) { | 701 TEST_F(PrinterJobHandlerTest, DISABLED_ManyFailureTest) { |
| 704 factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup), | 702 factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup), |
| 705 JobListResponse(1), true); | 703 JobListResponse(1), true); |
| 706 factory_.SetFakeResponse(JobListURI(kJobFetchReasonFailure), | 704 factory_.SetFakeResponse(JobListURI(kJobFetchReasonFailure), |
| 707 JobListResponse(1), true); | 705 JobListResponse(1), true); |
| 708 factory_.SetFakeResponse(JobListURI(kJobFetchReasonRetry), | 706 factory_.SetFakeResponse(JobListURI(kJobFetchReasonRetry), |
| 709 JobListResponse(1), true); | 707 JobListResponse(1), true); |
| 710 factory_.SetFakeResponse(JobListURI(kJobFetchReasonQueryMore), | 708 factory_.SetFakeResponse(JobListURI(kJobFetchReasonQueryMore), |
| 711 JobListResponse(0), true); | 709 JobListResponse(0), true); |
| 712 | 710 |
| 713 EXPECT_CALL(url_callback_, | 711 EXPECT_CALL(url_callback_, |
| 714 OnRequestCreate(GURL(JobListURI(kJobFetchReasonStartup)), _)) | 712 OnRequestCreate(JobListURI(kJobFetchReasonStartup), _)) |
| 715 .Times(AtLeast(1)); | 713 .Times(AtLeast(1)); |
| 716 | 714 |
| 717 EXPECT_CALL(url_callback_, | 715 EXPECT_CALL(url_callback_, |
| 718 OnRequestCreate(GURL(JobListURI(kJobFetchReasonQueryMore)), _)) | 716 OnRequestCreate(JobListURI(kJobFetchReasonQueryMore), _)) |
| 719 .Times(AtLeast(1)); | 717 .Times(AtLeast(1)); |
| 720 | 718 |
| 721 EXPECT_CALL(url_callback_, | 719 EXPECT_CALL(url_callback_, |
| 722 OnRequestCreate(GURL(JobListURI(kJobFetchReasonFailure)), _)) | 720 OnRequestCreate(JobListURI(kJobFetchReasonFailure), _)) |
| 723 .Times(AtLeast(1)); | 721 .Times(AtLeast(1)); |
| 724 | 722 |
| 725 EXPECT_CALL(url_callback_, | 723 EXPECT_CALL(url_callback_, |
| 726 OnRequestCreate(GURL(JobListURI(kJobFetchReasonRetry)), _)) | 724 OnRequestCreate(JobListURI(kJobFetchReasonRetry), _)) |
| 727 .Times(AtLeast(1)); | 725 .Times(AtLeast(1)); |
| 728 | 726 |
| 729 SetUpJobSuccessTest(1); | 727 SetUpJobSuccessTest(1); |
| 730 | 728 |
| 731 factory_.SetFakeResponse(TicketURI(1), std::string(), false); | 729 factory_.SetFakeResponse(TicketURI(1), std::string(), false); |
| 732 | 730 |
| 733 loop_.PostDelayedTask(FROM_HERE, | 731 loop_.PostDelayedTask(FROM_HERE, |
| 734 base::Bind(&net::FakeURLFetcherFactory::SetFakeResponse, | 732 base::Bind(&net::FakeURLFetcherFactory::SetFakeResponse, |
| 735 base::Unretained(&factory_), | 733 base::Unretained(&factory_), |
| 736 TicketURI(1), | 734 TicketURI(1), |
| (...skipping 12 matching lines...) Expand all Loading... |
| 749 factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup), | 747 factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup), |
| 750 JobListResponse(1), true); | 748 JobListResponse(1), true); |
| 751 factory_.SetFakeResponse(JobListURI(kJobFetchReasonFailure), | 749 factory_.SetFakeResponse(JobListURI(kJobFetchReasonFailure), |
| 752 JobListResponse(1), true); | 750 JobListResponse(1), true); |
| 753 factory_.SetFakeResponse(JobListURI(kJobFetchReasonRetry), | 751 factory_.SetFakeResponse(JobListURI(kJobFetchReasonRetry), |
| 754 JobListResponse(1), true); | 752 JobListResponse(1), true); |
| 755 factory_.SetFakeResponse(ErrorURI(1), StatusResponse(1, "ERROR"), true); | 753 factory_.SetFakeResponse(ErrorURI(1), StatusResponse(1, "ERROR"), true); |
| 756 factory_.SetFakeResponse(TicketURI(1), std::string(), false); | 754 factory_.SetFakeResponse(TicketURI(1), std::string(), false); |
| 757 | 755 |
| 758 EXPECT_CALL(url_callback_, | 756 EXPECT_CALL(url_callback_, |
| 759 OnRequestCreate(GURL(JobListURI(kJobFetchReasonStartup)), _)) | 757 OnRequestCreate(JobListURI(kJobFetchReasonStartup), _)) |
| 760 .Times(AtLeast(1)); | 758 .Times(AtLeast(1)); |
| 761 | 759 |
| 762 EXPECT_CALL(url_callback_, | 760 EXPECT_CALL(url_callback_, |
| 763 OnRequestCreate(GURL(JobListURI(kJobFetchReasonFailure)), _)) | 761 OnRequestCreate(JobListURI(kJobFetchReasonFailure), _)) |
| 764 .Times(AtLeast(1)); | 762 .Times(AtLeast(1)); |
| 765 | 763 |
| 766 EXPECT_CALL(url_callback_, | 764 EXPECT_CALL(url_callback_, |
| 767 OnRequestCreate(GURL(JobListURI(kJobFetchReasonRetry)), _)) | 765 OnRequestCreate(JobListURI(kJobFetchReasonRetry), _)) |
| 768 .Times(AtLeast(1)); | 766 .Times(AtLeast(1)); |
| 769 | 767 |
| 770 EXPECT_CALL(url_callback_, OnRequestCreate(GURL(ErrorURI(1)), _)) | 768 EXPECT_CALL(url_callback_, OnRequestCreate(ErrorURI(1), _)) |
| 771 .Times(Exactly(1)) | 769 .Times(Exactly(1)) |
| 772 .WillOnce(InvokeWithoutArgs( | 770 .WillOnce(InvokeWithoutArgs( |
| 773 this, &PrinterJobHandlerTest::MakeJobFetchReturnNoJobs)); | 771 this, &PrinterJobHandlerTest::MakeJobFetchReturnNoJobs)); |
| 774 | 772 |
| 775 EXPECT_CALL(url_callback_, OnRequestCreate(GURL(TicketURI(1)), _)) | 773 EXPECT_CALL(url_callback_, OnRequestCreate(TicketURI(1), _)) |
| 776 .Times(AtLeast(kNumRetriesBeforeAbandonJob)); | 774 .Times(AtLeast(kNumRetriesBeforeAbandonJob)); |
| 777 | 775 |
| 778 BeginTest(70); | 776 BeginTest(70); |
| 779 } | 777 } |
| 780 | 778 |
| 781 } // namespace cloud_print | 779 } // namespace cloud_print |
| OLD | NEW |