/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġandroidx . work . impl . foreground Ċ Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . util . Log Ċ import Ġandroidx . test . core . app . Application Provider Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġandroidx . test . filters . Large Test Ċ import Ġandroidx . work . Configuration Ċ import Ġandroidx . work . One Time Work Request Ċ import Ġandroidx . work . impl . Processor Ċ import Ġandroidx . work . impl . Scheduler Ċ import Ġandroidx . work . impl . Work Database Ċ import Ġandroidx . work . impl . Work ManagerImpl Ċ import Ġandroidx . work . impl . Worker Wrapper Ċ import Ġandroidx . work . impl . utils . Serial Executor Ċ import Ġandroidx . work . impl . utils . futures . Set table Future Ċ import Ġandroidx . work . impl . utils . task executor . Task Executor Ċ import Ġandroidx . work . worker . Stop Aware Foreground Worker Ċ import Ġandroidx . work . worker . Test Foreground Worker Ċ import Ġorg . hamcrest . Core Matchers .` is ` Ċ import Ġorg . hamcrest . Matcher Assert . assertThat Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . mockito . Argument Matchers . any Ċ import Ġorg . mockito . Mockito . do Return Ċ import Ġorg . mockito . Mockito . mock Ċ import Ġorg . mockito . Mockito . spy Ċ import Ġjava . util . Collections Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġjava . util . concurrent . Executor Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ @ Large Test Ċ class ĠWorker Wrapper Foreground Test Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcontext : ĠContext ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhandler : ĠHandler ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġconfig : ĠConfiguration ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġexecutor : ĠExecutor Service ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtask Executor : ĠTask Executor ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġwork Database : ĠWork Database ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġs chedulers : ĠList < Scheduler > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġprocessor : ĠProcessor ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġwork Manager : ĠWork ManagerImpl ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġforeground Processor : ĠFore ground Processor ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext Ġ= Ġspy ( Application Provider . getApplicationContext < Context >()) ĊĠĠĠĠĠĠĠ Ġ// ĠPrevent Ġstart Service Ġhere Ġto Ġavoid Ġnotifications Ġduring Ġtests ĊĠĠĠĠĠĠĠ Ġval Ġcomponent Name Ġ= ĠComponent Name ( context , ĠSystem Foreground Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġdo Return ( component Name ). ` when `( context ). start Service ( any < Intent >()) ĊĠĠĠĠĠĠĠ Ġdo Return ( context ). ` when `( context ). application Context ĊĊĠĠĠĠĠĠĠ Ġexecutor Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠĠĠĠĠ Ġhandler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĠĠĠĠĠĠĠ Ġconfig Ġ= ĠConfiguration . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Executor ( executor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMinimum Logging Level ( Log . DEBUG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġtask Executor Ġ= Ġobject Ġ: ĠTask Executor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Ġ= ĠExecutor Ġ{ Ġrunnable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post ( run nable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserial Executor Ġ= ĠSerial Executor ( executor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpost To MainThread ( run nable : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post ( run nable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget MainThread Executor (): ĠExecutor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmain ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute On Background Thread ( run nable : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserial Executor . execute ( run nable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Background Executor () Ġ= Ġserial Executor ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwork Database Ġ= ĠWork Database . create ( context , Ġtask Executor . background Executor , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= Ġmock ( Scheduler :: class . java ) ĊĠĠĠĠĠĠĠ Ġs chedulers Ġ= ĠCollections . singletonList ( scheduler ) ĊĠĠĠĠĠĠĠ Ġprocessor Ġ= ĠProcessor ( context , Ġconfig , Ġtask Executor , Ġwork Database , Ġs chedulers ) ĊĠĠĠĠĠĠĠ Ġwork Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspy ( Work ManagerImpl ( context , Ġconfig , Ġtask Executor , Ġwork Database , Ġs chedulers , Ġprocessor )) ĊĠĠĠĠĠĠĠ Ġwork Database Ġ= Ġwork Manager . work Database ĊĠĠĠĠĠĠĠ ĠWork ManagerImpl . set Delegate ( work Manager ) ĊĠĠĠĠĠĠĠ Ġ// ĠFore ground Ġprocessor ĊĠĠĠĠĠĠĠ Ġforeground Processor Ġ= Ġmock ( Foreground Processor :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Worker Wrapper _ does Not Resolve Backing Job Immediate ly () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠOne Time Work Request . Builder ( Stop Aware Foreground Worker :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġwork Database . work Spec Dao (). insert Work Spec ( request . work Spec ) ĊĊĠĠĠĠĠĠĠ Ġval Ġwrapper Ġ= ĠWorker Wrapper . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask Executor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforeground Processor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwork Database , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . string Id ĊĠĠĠĠĠĠĠ Ġ). build () ĊĊĠĠĠĠĠĠĠ Ġwrapper . run () ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġwrapper . future Ġas ĠSet table Future < Boolean > ĊĠĠĠĠĠĠĠ ĠassertThat ( future . is Done , Ġ` is `( false )) ĊĠĠĠĠĠĠĠ Ġwrapper . interrupt () ĊĠĠĠĠĠĠĠ ĠassertThat ( future . is Done , Ġ` is `( true )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Worker Wrapper _ resolves Backing Job _ when Worker Comp letes () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠOne Time Work Request . Builder ( Test Foreground Worker :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġwork Database . work Spec Dao (). insert Work Spec ( request . work Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġwrapper Ġ= ĠWorker Wrapper . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask Executor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforeground Processor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwork Database , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . string Id ĊĠĠĠĠĠĠĠ Ġ). build () ĊĊĠĠĠĠĠĠĠ Ġwrapper . run () ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġwrapper . future Ġas ĠSet table Future < Boolean > ĊĠĠĠĠĠĠĠ Ġwhile Ġ( task Executor . background Executor . has Pending Tasks ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWait Ġuntil Ġall Ġpending Ġoperations Ġin Ġthe Ġinternal Ġtask Ġexecutor Ġare Ġcomplete ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġfuture . addListener ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( future . is Done , Ġ` is `( true )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠ Ġ}, Ġexecutor ) ĊĊĠĠĠĠĠĠĠ Ġl atch . await ( 5 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ ĠassertThat ( latch . count , Ġ` is `( 0 L )) ĊĠĠĠ Ġ} Ċ } Ċ