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 "base/message_loop/message_loop.h" 6#include "base/strings/string16.h" 7#include "chrome/browser/chrome_notification_types.h" 8#include "chrome/browser/printing/print_job.h" 9#include "chrome/browser/printing/print_job_worker.h" 10#include "content/public/browser/notification_registrar.h" 11#include "content/public/browser/notification_service.h" 12#include "printing/printed_pages_source.h" 13#include "testing/gtest/include/gtest/gtest.h" 14 15namespace { 16 17class TestSource : public printing::PrintedPagesSource { 18 public: 19 virtual string16 RenderSourceName() OVERRIDE { 20 return string16(); 21 } 22}; 23 24class TestPrintJobWorker : public printing::PrintJobWorker { 25 public: 26 explicit TestPrintJobWorker(printing::PrintJobWorkerOwner* owner) 27 : printing::PrintJobWorker(owner) { 28 } 29 friend class TestOwner; 30}; 31 32class TestOwner : public printing::PrintJobWorkerOwner { 33 public: 34 virtual void GetSettingsDone( 35 const printing::PrintSettings& new_settings, 36 printing::PrintingContext::Result result) OVERRIDE { 37 EXPECT_FALSE(true); 38 } 39 virtual printing::PrintJobWorker* DetachWorker( 40 printing::PrintJobWorkerOwner* new_owner) OVERRIDE { 41 // We're screwing up here since we're calling worker from the main thread. 42 // That's fine for testing. It is actually simulating PrinterQuery behavior. 43 TestPrintJobWorker* worker(new TestPrintJobWorker(new_owner)); 44 EXPECT_TRUE(worker->Start()); 45 worker->printing_context()->UseDefaultSettings(); 46 settings_ = worker->printing_context()->settings(); 47 return worker; 48 } 49 virtual base::MessageLoop* message_loop() OVERRIDE { 50 EXPECT_FALSE(true); 51 return NULL; 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 89typedef testing::Test PrintJobTest; 90 91TEST_F(PrintJobTest, SimplePrint) { 92 // Test the multi-threaded nature of PrintJob to make sure we can use it with 93 // known lifetime. 94 95 // This message loop is actually never run. 96 base::MessageLoop current; 97 98 content::NotificationRegistrar registrar_; 99 TestPrintNotifObserv observ; 100 registrar_.Add(&observ, content::NOTIFICATION_ALL, 101 content::NotificationService::AllSources()); 102 volatile bool check = false; 103 scoped_refptr<printing::PrintJob> job(new TestPrintJob(&check)); 104 EXPECT_EQ(base::MessageLoop::current(), job->message_loop()); 105 scoped_refptr<TestOwner> owner(new TestOwner); 106 TestSource source; 107 job->Initialize(owner.get(), &source, 1); 108 job->Stop(); 109 EXPECT_FALSE(job->is_stopped()); 110 EXPECT_TRUE(job->is_stopping()); 111 while (!job->is_stopped()) 112 { 113 current.RunUntilIdle(); 114 } 115 EXPECT_TRUE(job->is_stopped()); 116 EXPECT_FALSE(job->is_stopping()); 117 job = NULL; 118 EXPECT_TRUE(check); 119} 120 121TEST_F(PrintJobTest, SimplePrintLateInit) { 122 volatile bool check = false; 123 base::MessageLoop current; 124 scoped_refptr<printing::PrintJob> job(new TestPrintJob(&check)); 125 job = NULL; 126 EXPECT_TRUE(check); 127 /* TODO(maruel): Test these. 128 job->Initialize() 129 job->Observe(); 130 job->GetSettingsDone(); 131 job->DetachWorker(); 132 job->message_loop(); 133 job->settings(); 134 job->cookie(); 135 job->GetSettings(printing::DEFAULTS, printing::ASK_USER, NULL); 136 job->StartPrinting(); 137 job->Stop(); 138 job->Cancel(); 139 job->RequestMissingPages(); 140 job->FlushJob(timeout); 141 job->DisconnectSource(); 142 job->is_job_pending(); 143 job->document(); 144 // Private 145 job->UpdatePrintedDocument(NULL); 146 scoped_refptr<printing::JobEventDetails> event_details; 147 job->OnNotifyPrintJobEvent(event_details); 148 job->OnDocumentDone(); 149 job->ControlledWorkerShutdown(); 150 */ 151} 152