| 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 |