/* Ċ Ġ* ĠCopyright Ġ 2 0 2 2 Ġ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 . camera . core Ċ Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Size Ċ import Ġandroidx . camera . core . impl . Capture Processor Ċ import Ġandroidx . camera . core . impl . utils . executor . Camera X Executors Ċ import Ġandroidx . concurrent . futures . Callback To Future Adapter Ċ import Ġcom . google . common . truth . Truth Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . mockito . Mockito Ċ import Ġorg . ro bo lectric . Ro bo lectric TestRunner Ċ import Ġorg . ro bo lectric . annotation . Config Ċ import Ġorg . ro bo lectric . annotation . internal . DoNot Instrument Ċ Ċ @ RunWith ( Ro bo lectric TestRunner :: class ) Ċ @ DoNot Instrument Ċ @ Config ( ĊĠĠĠ Ġmin Sdk Ġ= ĠBuild . VERSION _ CODES . LO L LI POP Ċ ) Ċ class ĠCapture Processor Pipeline Test Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ SIZE Ġ= ĠSize ( 6 4 0 , Ġ 4 8 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcan Close Under lying Capture Processors () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSets Ġup Ġpre - processor ĊĠĠĠĠĠĠĠ Ġval Ġpre Processor Ġ= ĠMockito . mock ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Processor :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġvar Ġpre Processor Comp leter : ĠCallback To Future Adapter . Comp leter < Void >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġpre Processor Close Future Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCallback To Future Adapter . get Future < Void > Ġ{ Ġcomp leter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Processor Comp leter Ġ= Ġcomp leter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" pre Processor Close Future " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( pre Processor . close Future ). thenReturn ( pre Processor Close Future ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSets Ġup Ġpost - processor ĊĠĠĠĠĠĠĠ Ġval Ġpost Processor Ġ= ĠMockito . mock ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Processor :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġvar Ġpost Processor Comp leter : ĠCallback To Future Adapter . Comp leter < Void >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġpost Processor Close Future Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCallback To Future Adapter . get Future < Void > Ġ{ Ġcomp leter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Processor Comp leter Ġ= Ġcomp leter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" post Processor Close Future " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( post Processor . close Future ). thenReturn ( post Processor Close Future ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcapture Processor Pipeline Ġ= ĠCapture Processor Pipeline ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Processor , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Processor , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExec utors . new Single Thread Executor () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSets Ġup Ġthe Ġresolution Ġto Ġcreate Ġthe Ġintermediate Ġimage Ġreader ĊĠĠĠĠĠĠĠ Ġcapture Processor Pipeline . on Resolution Update ( DEFAULT _ SIZE ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCalls Ġthe Ġclose () Ġfunction Ġof Ġthe ĠCapture Processor Pipeline ĊĠĠĠĠĠĠĠ Ġcapture Processor Pipeline . close () ĊĊĠĠĠĠĠĠĠ Ġ// ĠVerifies Ġwhether Ġclose () Ġfunction Ġof Ġthe Ġunderlying Ġcapture Ġprocessors Ġare Ġcalled ĊĠĠĠĠĠĠĠ ĠMockito . verify ( pre Processor , ĠMockito . times ( 1 )). close () ĊĠĠĠĠĠĠĠ ĠMockito . verify ( post Processor , ĠMockito . times ( 1 )). close () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSets Ġup Ġthe Ġlistener Ġto Ġmonitor Ġwhether Ġthe Ġclose Ġfuture Ġis Ġclosed Ġor Ġnot . ĊĠĠĠĠĠĠĠ Ġval Ġclosed Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġcapture Processor Pipeline . close Future . addListener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġclosed Latch . count Down () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCamera X Executors . direct Executor () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠChecks Ġthat Ġthe Ġclose Ġfuture Ġis Ġnot Ġcompleted Ġbefore Ġthe Ġunderlying Ġcapture Ġprocessor ĊĠĠĠĠĠĠĠ Ġ// Ġcomplete Ġtheir Ġclose Ġfutures ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( closed Latch . await ( 1 0 0 0 , ĠTimeUnit . MILLISECONDS )). isFalse () ĊĊĠĠĠĠĠĠĠ Ġ// ĠComp letes Ġthe Ġcomp leter Ġof Ġthe Ġunderlying Ġcapture Ġprocessors Ġto Ġcomplete Ġtheir Ġclose ĊĠĠĠĠĠĠĠ Ġ// Ġfutures ĊĠĠĠĠĠĠĠ Ġpre Processor Comp leter !!. set ( null ) ĊĠĠĠĠĠĠĠ Ġpost Processor Comp leter !!. set ( null ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠChecks Ġwhether Ġthe Ġclose Ġfuture Ġof ĠCapture Processor Pipeline Ġis Ġcompleted Ġafter Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġunderlying Ġcapture Ġprocessors Ġcomplete Ġtheir Ġclose Ġfutures ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( closed Latch . await ( 1 0 0 0 , ĠTimeUnit . MILLISECONDS )). isTrue () ĊĠĠĠ Ġ} Ċ }