1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/printing/print_job.h" 6 7#include "base/message_loop/message_loop.h" 8#include "base/strings/string16.h" 9#include "chrome/browser/chrome_notification_types.h" 10#include "chrome/browser/printing/print_job_worker.h" 11#include "content/public/browser/notification_registrar.h" 12#include "content/public/browser/notification_service.h" 13#include "content/public/common/child_process_host.h" 14#include "content/public/test/test_browser_thread_bundle.h" 15#include "printing/printed_pages_source.h" 16#include "testing/gtest/include/gtest/gtest.h" 17 18namespace { 19 20class TestSource : public printing::PrintedPagesSource { 21 public: 22 virtual base::string16 RenderSourceName() OVERRIDE { 23 return base::string16(); 24 } 25}; 26 27class TestPrintJobWorker : public printing::PrintJobWorker { 28 public: 29 explicit TestPrintJobWorker(printing::PrintJobWorkerOwner* owner) 30 : printing::PrintJobWorker(content::ChildProcessHost::kInvalidUniqueID, 31 content::ChildProcessHost::kInvalidUniqueID, 32 owner) {} 33 friend class TestOwner; 34}; 35 36class TestOwner : public printing::PrintJobWorkerOwner { 37 public: 38 virtual void GetSettingsDone( 39 const printing::PrintSettings& new_settings, 40 printing::PrintingContext::Result result) OVERRIDE { 41 EXPECT_FALSE(true); 42 } 43 virtual printing::PrintJobWorker* DetachWorker( 44 printing::PrintJobWorkerOwner* new_owner) OVERRIDE { 45 // We're screwing up here since we're calling worker from the main thread. 46 // That's fine for testing. It is actually simulating PrinterQuery behavior. 47 TestPrintJobWorker* worker(new TestPrintJobWorker(new_owner)); 48 EXPECT_TRUE(worker->Start()); 49 worker->printing_context()->UseDefaultSettings(); 50 settings_ = worker->printing_context()->settings(); 51 return worker; 52 } 53 virtual const printing::PrintSettings& settings() const OVERRIDE { 54 return settings_; 55 } 56 virtual int cookie() const OVERRIDE { 57 return 42; 58 } 59 60 private: 61 virtual ~TestOwner() {} 62 63 printing::PrintSettings settings_; 64}; 65 66class TestPrintJob : public printing::PrintJob { 67 public: 68 explicit TestPrintJob(volatile bool* check) : check_(check) { 69 } 70 private: 71 virtual ~TestPrintJob() { 72 *check_ = true; 73 } 74 volatile bool* check_; 75}; 76 77class TestPrintNotifObserv : public content::NotificationObserver { 78 public: 79 // content::NotificationObserver 80 virtual void Observe(int type, 81 const content::NotificationSource& source, 82 const content::NotificationDetails& details) OVERRIDE { 83 ADD_FAILURE(); 84 } 85}; 86 87} // namespace 88 89TEST(PrintJobTest, SimplePrint) { 90 // Test the multi-threaded nature of PrintJob to make sure we can use it with 91 // known lifetime. 92 93 content::TestBrowserThreadBundle thread_bundle_; 94 content::NotificationRegistrar registrar_; 95 TestPrintNotifObserv observ; 96 registrar_.Add(&observ, 97 content::NOTIFICATION_ALL, 98 content::NotificationService::AllSources()); 99 volatile bool check = false; 100 scoped_refptr<printing::PrintJob> job(new TestPrintJob(&check)); 101 EXPECT_TRUE(job->RunsTasksOnCurrentThread()); 102 scoped_refptr<TestOwner> owner(new TestOwner); 103 TestSource source; 104 job->Initialize(owner.get(), &source, 1); 105 job->Stop(); 106 while (job->document()) { 107 base::MessageLoop::current()->RunUntilIdle(); 108 } 109 EXPECT_FALSE(job->document()); 110 job = NULL; 111 while (!check) { 112 base::MessageLoop::current()->RunUntilIdle(); 113 } 114 EXPECT_TRUE(check); 115} 116 117TEST(PrintJobTest, SimplePrintLateInit) { 118 volatile bool check = false; 119 base::MessageLoop current; 120 scoped_refptr<printing::PrintJob> job(new TestPrintJob(&check)); 121 job = NULL; 122 EXPECT_TRUE(check); 123 /* TODO(maruel): Test these. 124 job->Initialize() 125 job->Observe(); 126 job->GetSettingsDone(); 127 job->DetachWorker(); 128 job->message_loop(); 129 job->settings(); 130 job->cookie(); 131 job->GetSettings(printing::DEFAULTS, printing::ASK_USER, NULL); 132 job->StartPrinting(); 133 job->Stop(); 134 job->Cancel(); 135 job->RequestMissingPages(); 136 job->FlushJob(timeout); 137 job->DisconnectSource(); 138 job->is_job_pending(); 139 job->document(); 140 // Private 141 job->UpdatePrintedDocument(NULL); 142 scoped_refptr<printing::JobEventDetails> event_details; 143 job->OnNotifyPrintJobEvent(event_details); 144 job->OnDocumentDone(); 145 job->ControlledWorkerShutdown(); 146 */ 147} 148