print_job_unittest.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_job.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_job_worker.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/printed_pages_source.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSource : public printing::PrintedPagesSource {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 RenderSourceName() OVERRIDE {
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return base::string16();
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestPrintJobWorker : public printing::PrintJobWorker {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestPrintJobWorker(printing::PrintJobWorkerOwner* owner)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : printing::PrintJobWorker(owner) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class TestOwner;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestOwner : public printing::PrintJobWorkerOwner {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void GetSettingsDone(
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const printing::PrintSettings& new_settings,
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::PrintingContext::Result result) OVERRIDE {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(true);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual printing::PrintJobWorker* DetachWorker(
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::PrintJobWorkerOwner* new_owner) OVERRIDE {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We're screwing up here since we're calling worker from the main thread.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // That's fine for testing. It is actually simulating PrinterQuery behavior.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestPrintJobWorker* worker(new TestPrintJobWorker(new_owner));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(worker->Start());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    worker->printing_context()->UseDefaultSettings();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings_ = worker->printing_context()->settings();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return worker;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const printing::PrintSettings& settings() const OVERRIDE {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return settings_;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int cookie() const OVERRIDE {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 42;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestOwner() {}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::PrintSettings settings_;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestPrintJob : public printing::PrintJob {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestPrintJob(volatile bool* check) : check_(check) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestPrintJob() {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *check_ = true;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  volatile bool* check_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestPrintNotifObserv : public content::NotificationObserver {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::NotificationObserver
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ADD_FAILURE();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef testing::Test PrintJobTest;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintJobTest, SimplePrint) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test the multi-threaded nature of PrintJob to make sure we can use it with
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // known lifetime.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This message loop is actually never run.
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop current;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPrintNotifObserv observ;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(&observ, content::NOTIFICATION_ALL,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::NotificationService::AllSources());
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  volatile bool check = false;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<printing::PrintJob> job(new TestPrintJob(&check));
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(job->RunsTasksOnCurrentThread());
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TestOwner> owner(new TestOwner);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestSource source;
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  job->Initialize(owner.get(), &source, 1);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->Stop();
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  while (job->document()) {
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    current.RunUntilIdle();
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(job->document());
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job = NULL;
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  while (!check) {
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    current.RunUntilIdle();
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(check);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintJobTest, SimplePrintLateInit) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  volatile bool check = false;
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop current;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<printing::PrintJob> job(new TestPrintJob(&check));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job = NULL;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(check);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* TODO(maruel): Test these.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->Initialize()
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->Observe();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->GetSettingsDone();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->DetachWorker();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->message_loop();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->settings();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->cookie();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->GetSettings(printing::DEFAULTS, printing::ASK_USER, NULL);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->StartPrinting();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->Stop();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->Cancel();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->RequestMissingPages();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->FlushJob(timeout);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->DisconnectSource();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->is_job_pending();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->document();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Private
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->UpdatePrintedDocument(NULL);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<printing::JobEventDetails> event_details;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->OnNotifyPrintJobEvent(event_details);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->OnDocumentDone();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->ControlledWorkerShutdown();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
147