12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/md5.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
10b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/cloud_print/cloud_print_constants.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/service/cloud_print/cloud_print_service_helpers.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/service/cloud_print/cloud_print_token_store.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/service/cloud_print/print_system.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/service/cloud_print/printer_job_handler.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_response_headers.h"
180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "net/http/http_status_code.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/url_request/url_request_status.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_test_util.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "printing/backend/print_backend.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::AtLeast;
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using ::testing::DoAll;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Exactly;
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using ::testing::Invoke;
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using ::testing::InvokeWithoutArgs;
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using ::testing::NiceMock;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Return;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::SaveArg;
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using ::testing::Sequence;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::SetArgPointee;
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using ::testing::StrictMock;
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using ::testing::_;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cloud_print {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::StringPrintf;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExampleCloudPrintServerURL[] = "https://www.google.com/cloudprint/";
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExamplePrintTicket[] = "{\"MediaType\":\"plain\","
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "\"Resolution\":\"300x300dpi\",\"PageRegion\":\"Letter\","
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "\"InputSlot\":\"auto\",\"PageSize\":\"Letter\",\"EconoMode\":\"off\"}";
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The fillowing constants will all be constructed with StringPrintf. The
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// following types of parameters are possible:
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// job number(int): ID # of job from given job list. All job IDs follow the
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// format __example_job_idN for some N.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// fetch reason(string): Fetch reason used by the code. The job list URL
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// requested by PrinterJobHandler has an extra parameter that signifies when
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the request was triggered.
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// status string(string): Status of print job, one of IN_PROGRESS, DONE or ERROR
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// job object list(string/JSON formatted): a comma-separated list of job objects
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// StringPrintf parameters: job number, job number, job number, job number
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExampleJobObject[] = "{"
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"tags\": ["
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"    \"^own\""
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   ],"
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"printerName\": \"Example Printer\","
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"status\": \"QUEUED\","
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"ownerId\": \"sampleuser@gmail.com\","
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"ticketUrl\": \"https://www.google.com/cloudprint/ticket?exampleURI%d\","
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"printerid\": \"__example_printer_id\","
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"printerType\": \"GOOGLE\","
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"contentType\": \"text/html\","
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"fileUrl\": \"https://www.google.com/cloudprint/download?exampleURI%d\","
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"id\": \"__example_job_id%d\","
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"message\": \"\","
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"title\": \"Example Job %d\","
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"errorCode\": \"\","
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"numberOfPages\": 3"
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  }";
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// StringPrintf parameters: job object list
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExampleJobListResponse[] = "{"
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)" \"success\": true,"
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)" \"jobs\": ["
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)" %s"
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)" ],"
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)" \"xsrf_token\": \"AIp06DjUd3AV6BO0aujB9NvM2a9ZbogxOQ:1360021066932\","
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)" \"request\": {"
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"time\": \"0\","
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"users\": ["
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"sampleuser@gmail.com\""
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  ],"
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"params\": {"
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"printerid\": ["
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"    \"__example_printer_id\""
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   ]"
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  },"
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"user\": \"sampleuser@gmail.com\""
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)" }"
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"}";
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// StringPrintf parameters: job number
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExampleJobID[] = "__example_job_id%d";
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// StringPrintf parameters: job number
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExamplePrintTicketURI[] =
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "https://www.google.com/cloudprint/ticket?exampleURI%d";
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// StringPrintf parameters: job number
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExamplePrintDownloadURI[] =
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "https://www.google.com/cloudprint/download?exampleURI%d";
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// StringPrintf parameters: job number
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExampleUpdateDoneURI[] =
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "https://www.google.com/cloudprint/control?jobid=__example_job_id%d"
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "&status=DONE&code=0&message=&numpages=0&pagesprinted=0";
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// StringPrintf parameters: job number
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExampleUpdateErrorURI[] =
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "https://www.google.com/cloudprint/control?jobid=__example_job_id%d"
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "&status=ERROR";
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// StringPrintf parameters: fetch reason
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExamplePrinterJobListURI[] =
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "https://www.google.com/cloudprint/fetch"
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "?printerid=__example_printer_id&deb=%s";
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// StringPrintf parameters: status string, job number, status string (repeat)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExampleControlResponse[] = "{"
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)" \"success\": true,"
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)" \"message\": \"Print job updated successfully.\","
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)" \"xsrf_token\": \"AIp06DjKgbfGalbqzj23V1bU6i-vtR2B4w:1360023068789\","
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)" \"request\": {"
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"time\": \"0\","
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"users\": ["
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"sampleuser@gmail.com\""
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  ],"
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"params\": {"
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"xsrf\": ["
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"    \"AIp06DgeGIETs42Cj28QWmxGPWVDiaXwVQ:1360023041852\""
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   ],"
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"status\": ["
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"    \"%s\""
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   ],"
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"jobid\": ["
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"    \"__example_job_id%d\""
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   ]"
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  },"
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"user\": \"sampleuser@gmail.com\""
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)" },"
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)" \"job\": {"
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"tags\": ["
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"   \"^own\""
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  ],"
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"printerName\": \"Example Printer\","
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"status\": \"%s\","
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"ownerId\": \"sampleuser@gmail.com\","
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"ticketUrl\": \"https://www.google.com/cloudprint/ticket?exampleURI1\","
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"printerid\": \"__example_printer_id\","
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"contentType\": \"text/html\","
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"fileUrl\": \"https://www.google.com/cloudprint/download?exampleURI1\","
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"id\": \"__example_job_id1\","
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"message\": \"\","
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"title\": \"Example Job\","
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"errorCode\": \"\","
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"  \"numberOfPages\": 3"
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)" }"
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"}";
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExamplePrinterID[] = "__example_printer_id";
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExamplePrinterCapabilities[] = "";
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExampleCapsMimeType[] = "";
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These can stay empty
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExampleDefaults[] = "";
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExampleDefaultMimeType[] = "";
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Since we're not connecting to the server, this can be any non-empty string.
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExampleCloudPrintOAuthToken[] = "__SAMPLE_TOKEN";
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Not actually printing, no need for real PDF.
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExamplePrintData[] = "__EXAMPLE_PRINT_DATA";
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExampleJobDownloadResponseHeaders[] =
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "Content-Type: Application/PDF\n";
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExamplePrinterName[] = "Example Printer";
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExamplePrinterDescription[] = "Example Description";
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These are functions used to construct the various sample strings.
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string JobListResponse(int num_jobs) {
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string job_objects;
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < num_jobs; i++) {
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    job_objects = job_objects + StringPrintf(kExampleJobObject, i+1, i+1, i+1,
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             i+1);
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (i != num_jobs-1) job_objects = job_objects + ",";
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return StringPrintf(kExampleJobListResponse, job_objects.c_str());
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)GURL JobListURI(const char* reason) {
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return GURL(StringPrintf(kExamplePrinterJobListURI, reason));
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)GURL DoneURI(int job_num) {
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return GURL(StringPrintf(kExampleUpdateDoneURI, job_num));
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)GURL ErrorURI(int job_num) {
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return GURL(StringPrintf(kExampleUpdateErrorURI, job_num));
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)GURL TicketURI(int job_num) {
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return GURL(StringPrintf(kExamplePrintTicketURI, job_num));
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)GURL DownloadURI(int job_num) {
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return GURL(StringPrintf(kExamplePrintDownloadURI, job_num));
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)GURL InProgressURI(int job_num) {
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetUrlForJobStatusUpdate(GURL(kExampleCloudPrintServerURL),
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  StringPrintf(kExampleJobID, job_num),
23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  PRINT_JOB_STATUS_IN_PROGRESS,
2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  0);
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string StatusResponse(int job_num, const char* status_string) {
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return StringPrintf(kExampleControlResponse,
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      status_string,
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      job_num,
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      status_string);
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CloudPrintURLFetcherNoServiceProcess
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public CloudPrintURLFetcher {
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CloudPrintURLFetcherNoServiceProcess() :
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      context_getter_(new net::TestURLRequestContextGetter(
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::MessageLoopProxy::current())) {}
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual net::URLRequestContextGetter* GetRequestContextGetter() OVERRIDE {
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return context_getter_.get();
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~CloudPrintURLFetcherNoServiceProcess() {}
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<net::URLRequestContextGetter> context_getter_;
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CloudPrintURLFetcherNoServiceProcessFactory
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public CloudPrintURLFetcherFactory {
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual CloudPrintURLFetcher* CreateCloudPrintURLFetcher() OVERRIDE {
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new CloudPrintURLFetcherNoServiceProcess;
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~CloudPrintURLFetcherNoServiceProcessFactory() {}
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class handles the callback from FakeURLFetcher
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// It is a separate class because callback methods must be
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// on RefCounted classes
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestURLFetcherCallback {
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<net::FakeURLFetcher> CreateURLFetcher(
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& url,
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      net::URLFetcherDelegate* d,
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& response_data,
282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      net::HttpStatusCode response_code,
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      net::URLRequestStatus::Status status) {
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<net::FakeURLFetcher> fetcher(
285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        new net::FakeURLFetcher(url, d, response_data, response_code, status));
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnRequestCreate(url, fetcher.get());
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return fetcher.Pass();
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD2(OnRequestCreate,
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               void(const GURL&, net::FakeURLFetcher*));
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockPrinterJobHandlerDelegate
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public PrinterJobHandler::Delegate {
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(OnAuthError, void());
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(OnPrinterDeleted, void(const std::string& str));
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockPrinterJobHandlerDelegate() {}
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockPrintServerWatcher
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public PrintSystem::PrintServerWatcher {
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(StartWatching,
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               bool(PrintSystem::PrintServerWatcher::Delegate* d));
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(StopWatching, bool());
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockPrintServerWatcher();
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintSystem::PrintServerWatcher::Delegate* delegate() const {
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return delegate_;
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class scoped_refptr<NiceMock<MockPrintServerWatcher> >;
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class scoped_refptr<StrictMock<MockPrintServerWatcher> >;
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class scoped_refptr<MockPrintServerWatcher>;
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockPrintServerWatcher() {}
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintSystem::PrintServerWatcher::Delegate* delegate_;
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockPrinterWatcher : public PrintSystem::PrinterWatcher {
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(StartWatching, bool(PrintSystem::PrinterWatcher::Delegate* d));
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(StopWatching, bool());
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(GetCurrentPrinterInfo,
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               bool(printing::PrinterBasicInfo* printer_info));
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockPrinterWatcher();
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintSystem::PrinterWatcher::Delegate* delegate() const { return delegate_; }
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class scoped_refptr<NiceMock<MockPrinterWatcher> >;
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class scoped_refptr<StrictMock<MockPrinterWatcher> >;
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class scoped_refptr<MockPrinterWatcher>;
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockPrinterWatcher() {}
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintSystem::PrinterWatcher::Delegate* delegate_;
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockJobSpooler : public PrintSystem::JobSpooler {
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD7(Spool, bool(
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& print_ticket,
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& print_data_file_path,
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& print_data_mime_type,
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& printer_name,
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& job_title,
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::vector<std::string>& tags,
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrintSystem::JobSpooler::Delegate* delegate));
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockJobSpooler();
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintSystem::JobSpooler::Delegate* delegate() const  { return delegate_; }
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class scoped_refptr<NiceMock<MockJobSpooler> >;
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class scoped_refptr<StrictMock<MockJobSpooler> >;
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class scoped_refptr<MockJobSpooler>;
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockJobSpooler() {}
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintSystem::JobSpooler::Delegate* delegate_;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockPrintSystem : public PrintSystem {
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockPrintSystem();
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintSystem::PrintSystemResult succeed() {
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PrintSystem::PrintSystemResult(true, "success");
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintSystem::PrintSystemResult fail() {
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PrintSystem::PrintSystemResult(false, "failure");
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MockJobSpooler& JobSpooler() { return *job_spooler_.get(); }
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MockPrinterWatcher& PrinterWatcher() { return *printer_watcher_.get(); }
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockPrintServerWatcher& PrintServerWatcher() {
392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return *print_server_watcher_.get();
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(Init, PrintSystem::PrintSystemResult());
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(EnumeratePrinters, PrintSystem::PrintSystemResult(
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::PrinterList* printer_list));
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD2(
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetPrinterCapsAndDefaults,
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      void(const std::string& printer_name,
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           const PrintSystem::PrinterCapsAndDefaultsCallback& callback));
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(IsValidPrinter, bool(const std::string& printer_name));
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD2(ValidatePrintTicket, bool(const std::string& printer_name,
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         const std::string& print_ticket_data));
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD3(GetJobDetails, bool(const std::string& printer_name,
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    PlatformJobId job_id,
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    PrintJobDetails* job_details));
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(CreatePrintServerWatcher, PrintSystem::PrintServerWatcher*());
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(CreatePrinterWatcher,
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               PrintSystem::PrinterWatcher*(const std::string& printer_name));
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(CreateJobSpooler, PrintSystem::JobSpooler*());
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(GetSupportedMimeTypes, std::string());
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class scoped_refptr<NiceMock<MockPrintSystem> >;
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class scoped_refptr<StrictMock<MockPrintSystem> >;
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class scoped_refptr<MockPrintSystem>;
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockPrintSystem() {}
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<MockJobSpooler> job_spooler_;
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<MockPrinterWatcher> printer_watcher_;
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<MockPrintServerWatcher> print_server_watcher_;
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrinterJobHandlerTest : public ::testing::Test {
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrinterJobHandlerTest();
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE;
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE;
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void IdleOut();
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GetPrinterInfo(printing::PrinterBasicInfo* info);
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SendCapsAndDefaults(
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& printer_name,
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const PrintSystem::PrinterCapsAndDefaultsCallback& callback);
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddMimeHeader(const GURL& url, net::FakeURLFetcher* fetcher);
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool PostSpoolSuccess();
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetUpJobSuccessTest(int job_num);
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void BeginTest(int timeout_seconds);
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MakeJobFetchReturnNoJobs();
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
450a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  static void MessageLoopQuitNowHelper(base::MessageLoop* message_loop);
451a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  static void MessageLoopQuitSoonHelper(base::MessageLoop* message_loop);
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
453a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  base::MessageLoopForIO loop_;
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestURLFetcherCallback url_callback_;
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockPrinterJobHandlerDelegate jobhandler_delegate_;
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CloudPrintTokenStore token_store_;
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CloudPrintURLFetcherNoServiceProcessFactory cloud_print_factory_;
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<PrinterJobHandler> job_handler_;
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<NiceMock<MockPrintSystem> > print_system_;
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::FakeURLFetcherFactory factory_;
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printing::PrinterBasicInfo basic_info_;
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printing::PrinterCapsAndDefaults caps_and_defaults_;
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrinterJobHandler::PrinterInfoFromCloud info_from_cloud_;
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrinterJobHandlerTest::SetUp() {
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  basic_info_.printer_name = kExamplePrinterName;
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  basic_info_.printer_description = kExamplePrinterDescription;
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  basic_info_.is_default = 0;
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info_from_cloud_.printer_id = kExamplePrinterID;
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info_from_cloud_.tags_hash = GetHashOfPrinterInfo(basic_info_);
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info_from_cloud_.caps_hash = base::MD5String(kExamplePrinterCapabilities);
47668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  info_from_cloud_.current_xmpp_timeout = 300;
47768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  info_from_cloud_.pending_xmpp_timeout = 0;
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  caps_and_defaults_.printer_capabilities = kExamplePrinterCapabilities;
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  caps_and_defaults_.caps_mime_type = kExampleCapsMimeType;
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  caps_and_defaults_.printer_defaults = kExampleDefaults;
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  caps_and_defaults_.defaults_mime_type = kExampleDefaultMimeType;
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  print_system_ = new NiceMock<MockPrintSystem>();
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  token_store_.SetToken(kExampleCloudPrintOAuthToken);
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ON_CALL(print_system_->PrinterWatcher(), GetCurrentPrinterInfo(_))
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillByDefault(Invoke(this, &PrinterJobHandlerTest::GetPrinterInfo));
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
491868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ON_CALL(*print_system_.get(), GetPrinterCapsAndDefaults(_, _))
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillByDefault(Invoke(this, &PrinterJobHandlerTest::SendCapsAndDefaults));
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CloudPrintURLFetcher::set_factory(&cloud_print_factory_);
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrinterJobHandlerTest::MakeJobFetchReturnNoJobs() {
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup),
499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           JobListResponse(0), net::HTTP_OK,
500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(JobListURI(kJobFetchReasonFailure),
502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           JobListResponse(0), net::HTTP_OK,
503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(JobListURI(kJobFetchReasonRetry),
505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           JobListResponse(0), net::HTTP_OK,
506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrinterJobHandlerTest::MessageLoopQuitNowHelper(
510a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    base::MessageLoop* message_loop) {
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop->QuitWhenIdle();
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrinterJobHandlerTest::MessageLoopQuitSoonHelper(
515a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    base::MessageLoop* message_loop) {
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop->message_loop_proxy()->PostTask(
517a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      FROM_HERE, base::Bind(&MessageLoopQuitNowHelper, message_loop));
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrinterJobHandlerTest::PrinterJobHandlerTest()
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : factory_(NULL, base::Bind(&TestURLFetcherCallback::CreateURLFetcher,
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                base::Unretained(&url_callback_))) {
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrinterJobHandlerTest::PostSpoolSuccess() {
526a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FROM_HERE,
528a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      base::Bind(&PrinterJobHandler::OnJobSpoolSucceeded, job_handler_, 0));
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Everything that would be posted on the printer thread queue
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // has been posted, we can tell the main message loop to quit when idle
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and not worry about it idling while the print thread does work
533a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
534a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      FROM_HERE, base::Bind(&MessageLoopQuitSoonHelper, &loop_));
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrinterJobHandlerTest::AddMimeHeader(const GURL& url,
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          net::FakeURLFetcher* fetcher) {
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> download_headers =
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new net::HttpResponseHeaders(kExampleJobDownloadResponseHeaders);
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fetcher->set_response_headers(download_headers);
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrinterJobHandlerTest::SetUpJobSuccessTest(int job_num) {
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(TicketURI(job_num),
548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           kExamplePrintTicket, net::HTTP_OK,
549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(DownloadURI(job_num),
551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           kExamplePrintData, net::HTTP_OK,
552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(DoneURI(job_num),
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           StatusResponse(job_num, "DONE"),
556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::HTTP_OK,
557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(InProgressURI(job_num),
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           StatusResponse(job_num, "IN_PROGRESS"),
560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::HTTP_OK,
561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The times requirement is relaxed for the ticket URI
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // in order to accommodate TicketDownloadFailureTest
5654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(url_callback_, OnRequestCreate(TicketURI(job_num), _))
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(AtLeast(1));
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(url_callback_, OnRequestCreate(DownloadURI(job_num), _))
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(Exactly(1))
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(Invoke(this, &PrinterJobHandlerTest::AddMimeHeader));
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(url_callback_, OnRequestCreate(InProgressURI(job_num), _))
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(Exactly(1));
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(url_callback_, OnRequestCreate(DoneURI(job_num), _))
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(Exactly(1));
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(print_system_->JobSpooler(),
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              Spool(kExamplePrintTicket, _, _, _, _, _, _))
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(Exactly(1))
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(InvokeWithoutArgs(this,
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  &PrinterJobHandlerTest::PostSpoolSuccess));
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrinterJobHandlerTest::BeginTest(int timeout_seconds) {
586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  job_handler_ = new PrinterJobHandler(basic_info_,
587868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       info_from_cloud_,
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       GURL(kExampleCloudPrintServerURL),
589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       print_system_.get(),
590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                       &jobhandler_delegate_);
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  job_handler_->Initialize();
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
594a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FROM_HERE,
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&PrinterJobHandlerTest::MessageLoopQuitSoonHelper,
597a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                 base::MessageLoop::current()),
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeDelta::FromSeconds(timeout_seconds));
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
600a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  base::MessageLoop::current()->Run();
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrinterJobHandlerTest::SendCapsAndDefaults(
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& printer_name,
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const PrintSystem::PrinterCapsAndDefaultsCallback& callback) {
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback.Run(true, printer_name, caps_and_defaults_);
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrinterJobHandlerTest::GetPrinterInfo(printing::PrinterBasicInfo* info) {
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *info = basic_info_;
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrinterJobHandlerTest::TearDown() {
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IdleOut();
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CloudPrintURLFetcher::set_factory(NULL);
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrinterJobHandlerTest::IdleOut() {
620a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockPrintServerWatcher::MockPrintServerWatcher() : delegate_(NULL) {
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ON_CALL(*this, StartWatching(_))
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillByDefault(DoAll(SaveArg<0>(&delegate_), Return(true)));
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ON_CALL(*this, StopWatching()).WillByDefault(Return(true));
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockPrinterWatcher::MockPrinterWatcher() : delegate_(NULL) {
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ON_CALL(*this, StartWatching(_))
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillByDefault(DoAll(SaveArg<0>(&delegate_), Return(true)));
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ON_CALL(*this, StopWatching()).WillByDefault(Return(true));
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockJobSpooler::MockJobSpooler() : delegate_(NULL) {
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ON_CALL(*this, Spool(_, _, _, _, _, _, _))
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillByDefault(DoAll(SaveArg<6>(&delegate_), Return(true)));
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockPrintSystem::MockPrintSystem()
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : job_spooler_(new NiceMock<MockJobSpooler>()),
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printer_watcher_(new NiceMock<MockPrinterWatcher>()),
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      print_server_watcher_(new NiceMock<MockPrintServerWatcher>()) {
645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ON_CALL(*this, CreateJobSpooler()).WillByDefault(Return(job_spooler_.get()));
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ON_CALL(*this, CreatePrinterWatcher(_))
648eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      .WillByDefault(Return(printer_watcher_.get()));
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ON_CALL(*this, CreatePrintServerWatcher())
651eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      .WillByDefault(Return(print_server_watcher_.get()));
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ON_CALL(*this, IsValidPrinter(_)).
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WillByDefault(Return(true));
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ON_CALL(*this, ValidatePrintTicket(_, _)).
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WillByDefault(Return(true));
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test simulates an end-to-end printing of a document
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// but tests only non-failure cases.
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled - http://crbug.com/184245
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrinterJobHandlerTest, DISABLED_HappyPathTest) {
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup),
665f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           JobListResponse(1), net::HTTP_OK,
666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(JobListURI(kJobFetchReasonQueryMore),
668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           JobListResponse(0), net::HTTP_OK,
669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(url_callback_,
6724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              OnRequestCreate(JobListURI(kJobFetchReasonStartup), _))
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(Exactly(1));
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(url_callback_,
6754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              OnRequestCreate(JobListURI(kJobFetchReasonQueryMore), _))
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(Exactly(1));
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpJobSuccessTest(1);
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BeginTest(20);
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrinterJobHandlerTest, TicketDownloadFailureTest) {
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup),
684f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           JobListResponse(2), net::HTTP_OK,
685f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(JobListURI(kJobFetchReasonFailure),
687f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           JobListResponse(2), net::HTTP_OK,
688f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(JobListURI(kJobFetchReasonQueryMore),
690f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           JobListResponse(0), net::HTTP_OK,
691f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
6920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  factory_.SetFakeResponse(TicketURI(1), std::string(),
693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::HTTP_INTERNAL_SERVER_ERROR,
694f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::FAILED);
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(url_callback_, OnRequestCreate(TicketURI(1), _))
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(AtLeast(1));
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(url_callback_,
7004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              OnRequestCreate(JobListURI(kJobFetchReasonStartup), _))
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(AtLeast(1));
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(url_callback_,
7044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              OnRequestCreate(JobListURI(kJobFetchReasonQueryMore), _))
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(AtLeast(1));
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(url_callback_,
7084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              OnRequestCreate(JobListURI(kJobFetchReasonFailure), _))
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(AtLeast(1));
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpJobSuccessTest(2);
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BeginTest(20);
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(noamsml): Figure out how to make this test not take 1 second and
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// re-enable it
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrinterJobHandlerTest, DISABLED_ManyFailureTest) {
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup),
719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           JobListResponse(1), net::HTTP_OK,
720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(JobListURI(kJobFetchReasonFailure),
722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           JobListResponse(1), net::HTTP_OK,
723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(JobListURI(kJobFetchReasonRetry),
725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           JobListResponse(1), net::HTTP_OK,
726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(JobListURI(kJobFetchReasonQueryMore),
728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           JobListResponse(0), net::HTTP_OK,
729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(url_callback_,
7324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              OnRequestCreate(JobListURI(kJobFetchReasonStartup), _))
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(AtLeast(1));
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(url_callback_,
7364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              OnRequestCreate(JobListURI(kJobFetchReasonQueryMore), _))
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(AtLeast(1));
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(url_callback_,
7404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              OnRequestCreate(JobListURI(kJobFetchReasonFailure), _))
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(AtLeast(1));
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(url_callback_,
7444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              OnRequestCreate(JobListURI(kJobFetchReasonRetry), _))
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(AtLeast(1));
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpJobSuccessTest(1);
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  factory_.SetFakeResponse(TicketURI(1),
7500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           std::string(),
751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::HTTP_INTERNAL_SERVER_ERROR,
752f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::FAILED);
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop_.PostDelayedTask(FROM_HERE,
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        base::Bind(&net::FakeURLFetcherFactory::SetFakeResponse,
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   base::Unretained(&factory_),
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   TicketURI(1),
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   kExamplePrintTicket,
759f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   net::HTTP_OK,
760f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   net::URLRequestStatus::SUCCESS),
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        base::TimeDelta::FromSeconds(1));
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BeginTest(5);
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(noamsml): Figure out how to make this test not take ~64-~2048 (depending
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// constant values) seconds and re-enable it
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrinterJobHandlerTest, DISABLED_CompleteFailureTest) {
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(JobListURI(kJobFetchReasonStartup),
772f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           JobListResponse(1), net::HTTP_OK,
773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(JobListURI(kJobFetchReasonFailure),
775f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           JobListResponse(1), net::HTTP_OK,
776f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  factory_.SetFakeResponse(JobListURI(kJobFetchReasonRetry),
778f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           JobListResponse(1), net::HTTP_OK,
779f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::SUCCESS);
7800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  factory_.SetFakeResponse(ErrorURI(1), StatusResponse(1, "ERROR"),
781f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::HTTP_OK, net::URLRequestStatus::SUCCESS);
7820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  factory_.SetFakeResponse(TicketURI(1), std::string(),
783f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::HTTP_INTERNAL_SERVER_ERROR,
784f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::FAILED);
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(url_callback_,
7874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              OnRequestCreate(JobListURI(kJobFetchReasonStartup), _))
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(AtLeast(1));
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(url_callback_,
7914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              OnRequestCreate(JobListURI(kJobFetchReasonFailure), _))
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(AtLeast(1));
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(url_callback_,
7954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              OnRequestCreate(JobListURI(kJobFetchReasonRetry), _))
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(AtLeast(1));
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(url_callback_, OnRequestCreate(ErrorURI(1), _))
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(Exactly(1))
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(InvokeWithoutArgs(
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this, &PrinterJobHandlerTest::MakeJobFetchReturnNoJobs));
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(url_callback_, OnRequestCreate(TicketURI(1), _))
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(AtLeast(kNumRetriesBeforeAbandonJob));
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BeginTest(70);
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cloud_print
810