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)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/printing/print_job.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
79ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_job_worker.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/common/child_process_host.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_browser_thread_bundle.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/printed_pages_source.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSource : public printing::PrintedPagesSource {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 RenderSourceName() OVERRIDE {
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return base::string16();
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestPrintJobWorker : public printing::PrintJobWorker {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestPrintJobWorker(printing::PrintJobWorkerOwner* owner)
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : printing::PrintJobWorker(content::ChildProcessHost::kInvalidUniqueID,
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 content::ChildProcessHost::kInvalidUniqueID,
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 owner) {}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class TestOwner;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestOwner : public printing::PrintJobWorkerOwner {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void GetSettingsDone(
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const printing::PrintSettings& new_settings,
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::PrintingContext::Result result) OVERRIDE {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(true);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual printing::PrintJobWorker* DetachWorker(
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::PrintJobWorkerOwner* new_owner) OVERRIDE {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We're screwing up here since we're calling worker from the main thread.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // That's fine for testing. It is actually simulating PrinterQuery behavior.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestPrintJobWorker* worker(new TestPrintJobWorker(new_owner));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(worker->Start());
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    worker->printing_context()->UseDefaultSettings();
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings_ = worker->printing_context()->settings();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return worker;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const printing::PrintSettings& settings() const OVERRIDE {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return settings_;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int cookie() const OVERRIDE {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 42;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestOwner() {}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::PrintSettings settings_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestPrintJob : public printing::PrintJob {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestPrintJob(volatile bool* check) : check_(check) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestPrintJob() {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *check_ = true;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  volatile bool* check_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestPrintNotifObserv : public content::NotificationObserver {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::NotificationObserver
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ADD_FAILURE();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(PrintJobTest, SimplePrint) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test the multi-threaded nature of PrintJob to make sure we can use it with
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // known lifetime.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::TestBrowserThreadBundle thread_bundle_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPrintNotifObserv observ;
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  registrar_.Add(&observ,
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 content::NOTIFICATION_ALL,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::NotificationService::AllSources());
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  volatile bool check = false;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<printing::PrintJob> job(new TestPrintJob(&check));
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(job->RunsTasksOnCurrentThread());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TestOwner> owner(new TestOwner);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestSource source;
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  job->Initialize(owner.get(), &source, 1);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->Stop();
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  while (job->document()) {
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::MessageLoop::current()->RunUntilIdle();
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(job->document());
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job = NULL;
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  while (!check) {
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::MessageLoop::current()->RunUntilIdle();
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(check);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(PrintJobTest, SimplePrintLateInit) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  volatile bool check = false;
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop current;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<printing::PrintJob> job(new TestPrintJob(&check));
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job = NULL;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(check);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* TODO(maruel): Test these.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->Initialize()
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->Observe();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->GetSettingsDone();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->DetachWorker();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->message_loop();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->settings();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->cookie();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->GetSettings(printing::DEFAULTS, printing::ASK_USER, NULL);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->StartPrinting();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->Stop();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->Cancel();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->RequestMissingPages();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->FlushJob(timeout);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->DisconnectSource();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->is_job_pending();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->document();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Private
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->UpdatePrintedDocument(NULL);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<printing::JobEventDetails> event_details;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->OnNotifyPrintJobEvent(event_details);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->OnDocumentDone();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job->ControlledWorkerShutdown();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
148