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