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