package Ġpt . ise l . le ic . pc . demos . syn ch Ċ Ċ import Ġorg . junit . jupiter . api . assert Throws Ċ import Ġpt . ise l . le ic . pc . demos . syn ch . AF uture Ċ import Ġpt . ise l . le ic . pc . demos . syn ch . AF uture Impl Ċ import Ġjava . io . IOException Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertNull Ċ Ċ class ĠA Future Impl Tests Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsuccess Text Ġ= Ġ" Y eah " ĊĠĠĠ Ġprivate Ġval Ġerror Ġ= ĠIOException () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAn Ġexample Ġof Ġan Ġasynchronous Ġoperation . ĠThis Ġone ĠÂ ´ alle ged ly Â ´ Ġf etches Ġsome Ġtext Ġfrom Ġa Ġremote Ġserver Ġ( I / O Ġbound ). ĊĠĠĠĠ Ġ* ĠThe Ġfunction Ġcan Ġeither Ġfail Ġor Ġsucceed , Ġaccording Ġto Ġ[ simulate Failure ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfetch Some Text ( simulate Failure : ĠBoolean ): ĠA Future < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠA Future Impl < String >() ĊĠĠĠĠĠĠĠ ĠThread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( simulate Failure ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . set Failure ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . set Success ( success Text ) ĊĠĠĠĠĠĠĠ Ġ}. start () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` get Ġblocks Ġuntil Ġsuccess Ġresult Ġis Ġavailable `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfuture Text Ġ= Ġfetch Some Text ( simulate Failure Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġsomething Ġelse Ġin Ġthe Ġmeantime ĊĠĠĠĠĠĠĠ ĠassertEquals ( success Text , Ġfuture Text . get ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` get Ġblocks Ġuntil Ġerror Ġresult Ġis Ġavailable `() Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThrows < IOException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfuture Text Ġ= Ġfetch Some Text ( simulate Failure Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfuture Text . get () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` get Ġblocks Ġuntil Ġtimeout Ġexpires `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfuture Text Ġ= Ġfetch Some Text ( simulate Failure Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ ĠassertNull ( future Text . get ( 1 , ĠTimeUnit . SECONDS )) ĊĠĠĠ Ġ} Ċ } ĊĊ