// ĠCopyright Ġ 2 0 2 1 ĠDyn at race ĠLLC Ċ // Ċ // Ġ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 Ġcom . dyn at race . k ached properties Ċ Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . verify Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . assert Throws Ċ import Ġjava . lang . Thread . sleep Ċ import Ġjava . time . Duration Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġkotlin . concurrent . thread Ċ Ċ class ĠTime Bound Cache Deleg ated Property Test Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġthe Ġsame Ġvalue Ġwhen Ġcache Ġdidn 't Ġexpire `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Time Source Ġ= ĠSim ulated Time Source () ĊĠĠĠĠĠĠĠ Ġval Ġfetch Value From Dependency Ġ= Ġmock k < () Ġ-> ĠString >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfetch Value From Dependency () Ġ} Ġreturns Many ĠlistOf (" Call Ġ 1 ", Ġ" Call Ġ 2 ") ĊĠĠĠĠĠĠĠ Ġval Ġcached Value Ġby Ġcached Lazy For ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDuration . of Seconds ( 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġfetch Value From Dependency () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Source Ġ= Ġmock Time Source , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals (" Call Ġ 1 ", Ġcached Value ) ĊĠĠĠĠĠĠĠ Ġmock Time Source . advance By ( Duration . of Seconds ( 2 )) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Call Ġ 1 ", Ġcached Value ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġfetch Value From Dependency () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġupdate Ġthe Ġvalue Ġafter Ġthe Ġcache Ġexpires `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Time Source Ġ= ĠSim ulated Time Source () ĊĠĠĠĠĠĠĠ Ġval Ġfetch Value From Dependency Ġ= Ġmock k < () Ġ-> ĠString >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfetch Value From Dependency () Ġ} Ġreturns Many ĠlistOf (" Call Ġ 1 ", Ġ" Call Ġ 2 ") ĊĠĠĠĠĠĠĠ Ġval Ġcached Value Ġby Ġcached Blocking For ( Duration . of Seconds ( 5 ), Ġ{ Ġfetch Value From Dependency () Ġ}, Ġmock Time Source ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals (" Call Ġ 1 ", Ġcached Value ) ĊĠĠĠĠĠĠĠ Ġmock Time Source . advance By ( Duration . of Seconds ( 1 0 )) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Call Ġ 2 ", Ġcached Value ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 2 ) Ġ{ Ġfetch Value From Dependency () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġsame Ġvalue Ġwhen Ġdifferent Ġthreads Ġcall Ġit Ġfor Ġupdating Ġwith Ġlazy Ġrefresh Ġ` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Time Source Ġ= ĠSim ulated Time Source () ĊĠĠĠĠĠĠĠ Ġval Ġfetch Value From Dependency Ġ= Ġmock k < () Ġ-> ĠString >() ĊĠĠĠĠĠĠĠ Ġval Ġdependency Call Counter Ġ= ĠAtomicInteger ( 1 ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfetch Value From Dependency () Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsleep ( 1 0 0 0 ) Ġ// ĠSim ulating Ġlong Ġnetwork Ġcall . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Call Ġ${ dependency Call Counter . get And Increment () }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcached Value Ġby Ġcached Lazy For ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDuration . of Seconds ( 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġfetch Value From Dependency () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Source Ġ= Ġmock Time Source , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġcached Value Read From Thread 1 : ĠString ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġcached Value Read From Thread 2 : ĠString ĊĠĠĠĠĠĠĠ Ġval Ġthread 1 Ġ= Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Value Read From Thread 1 Ġ= Ġcached Value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġthread 2 Ġ= Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Value Read From Thread 2 Ġ= Ġcached Value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthread 1 . join () ĊĠĠĠĠĠĠĠ Ġthread 2 . join () ĊĊĠĠĠĠĠĠĠ Ġval Ġretrieved Values Ġ= Ġset Of ( cached Value Read From Thread 1 , Ġcached Value Read From Thread 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( set Of (" Call Ġ 1 "), Ġretrieved Values ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġfetch Value From Dependency () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġsame Ġvalue Ġwhen Ġdifferent Ġthreads Ġcall Ġit Ġfor Ġupdating Ġwithout Ġlazy Ġrefresh `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Time Source Ġ= ĠSim ulated Time Source () ĊĠĠĠĠĠĠĠ Ġval Ġfetch Value From Dependency Ġ= Ġmock k < () Ġ-> ĠString >() ĊĠĠĠĠĠĠĠ Ġval Ġdependency Call Counter Ġ= ĠAtomicInteger ( 1 ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfetch Value From Dependency () Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsleep ( 1 0 0 0 ) Ġ// ĠSim ulating Ġlong Ġnetwork Ġcall . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Call Ġ${ dependency Call Counter . get And Increment () }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcached Value Ġby Ġcached Blocking For ( Duration . of Seconds ( 5 ), Ġ{ Ġfetch Value From Dependency () Ġ}, Ġmock Time Source ) ĊĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġcached Value Read From Thread 1 : ĠString ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġcached Value Read From Thread 2 : ĠString ĊĠĠĠĠĠĠĠ Ġval Ġthread 1 Ġ= Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Value Read From Thread 1 Ġ= Ġcached Value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġthread 2 Ġ= Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Value Read From Thread 2 Ġ= Ġcached Value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthread 1 . join () ĊĠĠĠĠĠĠĠ Ġthread 2 . join () ĊĊĠĠĠĠĠĠĠ Ġval Ġretrieved Values Ġ= Ġset Of ( cached Value Read From Thread 1 , Ġcached Value Read From Thread 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( set Of (" Call Ġ 1 "), Ġretrieved Values ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġfetch Value From Dependency () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġsame Ġvalue Ġwith Ġlazy Ġrefresh `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Time Source Ġ= ĠSim ulated Time Source () ĊĠĠĠĠĠĠĠ Ġval Ġexecutor Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠĠĠĠĠ Ġval Ġfetch Value From Dependency Ġ= Ġmock k < () Ġ-> ĠString >() ĊĠĠĠĠĠĠĠ Ġval Ġdependency Call Counter Ġ= ĠAtomicInteger ( 1 ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfetch Value From Dependency () Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsleep ( 1 0 0 0 ) Ġ// ĠSim ulating Ġlong Ġnetwork Ġcall . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Call Ġ${ dependency Call Counter . get And Increment () }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcached Value Ġby Ġcached Lazy For ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDuration . of Seconds ( 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġfetch Value From Dependency () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Time Source , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcached Value Read From Thread 1 : ĠString Ġ= Ġcached Value ĊĠĠĠĠĠĠĠ Ġmock Time Source . advance By ( Duration . of Seconds ( 1 0 )) ĊĠĠĠĠĠĠĠ Ġval Ġcached Value Read From Thread 2 : ĠString Ġ= Ġcached Value ĊĊĠĠĠĠĠĠĠ Ġval Ġretrieved Values Ġ= Ġset Of ( cached Value Read From Thread 1 , Ġcached Value Read From Thread 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( set Of (" Call Ġ 1 "), Ġretrieved Values ) ĊĊĠĠĠĠĠĠĠ Ġexecutor . await Termination ( 1 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 2 ) Ġ{ Ġfetch Value From Dependency () Ġ} Ġ// ĠShould Ġbe Ġupdating Ġin Ġthe Ġbackground ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġupdated Ġvalue Ġimmediately Ġwithout Ġlazy Ġrefresh `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Time Source Ġ= ĠSim ulated Time Source () ĊĠĠĠĠĠĠĠ Ġval Ġfetch Value From Dependency Ġ= Ġmock k < () Ġ-> ĠString >() ĊĠĠĠĠĠĠĠ Ġval Ġdependency Call Counter Ġ= ĠAtomicInteger ( 1 ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfetch Value From Dependency () Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsleep ( 1 0 0 0 ) Ġ// ĠSim ulating Ġlong Ġnetwork Ġcall . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Call Ġ${ dependency Call Counter . get And Increment () }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcached Value Ġby Ġcached Blocking For ( Duration . of Seconds ( 5 ), Ġ{ Ġfetch Value From Dependency () Ġ}, Ġmock Time Source ) ĊĊĠĠĠĠĠĠĠ Ġval Ġread 1 : ĠString Ġ= Ġcached Value ĊĠĠĠĠĠĠĠ Ġmock Time Source . advance By ( Duration . of Seconds ( 1 0 )) ĊĠĠĠĠĠĠĠ Ġval Ġread 2 : ĠString Ġ= Ġcached Value ĊĊĠĠĠĠĠĠĠ Ġval Ġretrieved Values Ġ= Ġset Of ( read 1 , Ġread 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( set Of (" Call Ġ 1 ", Ġ" Call Ġ 2 "), Ġretrieved Values ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 2 ) Ġ{ Ġfetch Value From Dependency () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Suppress (" Too Generic Exception Thrown ") ĊĠĠĠ Ġfun Ġ` retries Ġfetching Ġvalue Ġon Ġnext Ġrequest Ġwhen Ġfetching Ġvalue Ġthrew Ġan Ġexception Ġ- Ġlazy Ġversion `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Time Source Ġ= ĠSim ulated Time Source () ĊĠĠĠĠĠĠĠ Ġval Ġfetch Value From Dependency Ġ= Ġmock k < () Ġ-> ĠString >() ĊĠĠĠĠĠĠĠ Ġval Ġdependency Call Counter Ġ= ĠAtomicInteger ( 1 ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfetch Value From Dependency () Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dependency Call Counter . get () Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" A Ġ${ dependency Call Counter . get And Increment ()} Ġcall Ġto Ġthe Ġdependency Ġfailed ! Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Next Ġwill Ġbe Ġ${ dependency Call Counter . get () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Call Ġ${ dependency Call Counter . get And Increment () }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcached Value Ġby Ġcached Lazy For ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDuration . of Seconds ( 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġfetch Value From Dependency () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Source Ġ= Ġmock Time Source , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals (" Call Ġ 1 ", Ġcached Value ) ĊĠĠĠĠĠĠĠ Ġmock Time Source . advance By ( Duration . of Seconds ( 1 0 )) ĊĠĠĠĠĠĠĠ Ġsleep ( 1 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Call Ġ 1 ", Ġcached Value ) ĊĠĠĠĠĠĠĠ Ġmock Time Source . advance By ( Duration . of Seconds ( 1 0 )) ĊĠĠĠĠĠĠĠ Ġsleep ( 1 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Call Ġ 1 ", Ġcached Value ) ĊĠĠĠĠĠĠĠ Ġmock Time Source . advance By ( Duration . of Seconds ( 1 0 )) ĊĠĠĠĠĠĠĠ Ġsleep ( 1 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Call Ġ 3 ", Ġcached Value ) ĊĠĠĠĠĠĠĠ Ġmock Time Source . advance By ( Duration . of Seconds ( 1 0 )) ĊĠĠĠĠĠĠĠ Ġsleep ( 1 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Call Ġ 3 ", Ġcached Value ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 4 ) Ġ{ Ġfetch Value From Dependency () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Suppress (" Too Generic Exception Thrown ") ĊĠĠĠ Ġfun Ġ` retries Ġfetching Ġvalue Ġon Ġnext Ġrequest Ġwhen Ġfetching Ġvalue Ġthrew Ġan Ġexception Ġ- Ġblocking Ġversion `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Time Source Ġ= ĠSim ulated Time Source () ĊĠĠĠĠĠĠĠ Ġval Ġfetch Value From Dependency Ġ= Ġmock k < () Ġ-> ĠString >() ĊĠĠĠĠĠĠĠ Ġval Ġdependency Call Counter Ġ= ĠAtomicInteger ( 1 ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġfetch Value From Dependency () Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dependency Call Counter . get () Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" A Ġ${ dependency Call Counter . get And Increment ()} Ġcall Ġto Ġthe Ġdependency Ġfailed ! Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Next Ġwill Ġbe Ġ${ dependency Call Counter . get () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Call Ġ${ dependency Call Counter . get And Increment () }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcached Value Ġby Ġcached Blocking For ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDuration . of Seconds ( 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġfetch Value From Dependency () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Source Ġ= Ġmock Time Source , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals (" Call Ġ 1 ", Ġcached Value ) ĊĠĠĠĠĠĠĠ Ġmock Time Source . advance By ( Duration . of Seconds ( 1 0 )) ĊĠĠĠĠĠĠĠ Ġsleep ( 1 0 ) ĊĠĠĠĠĠĠĠ ĠassertThrows < RuntimeException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmock Time Source . advance By ( Duration . of Seconds ( 1 0 )) ĊĠĠĠĠĠĠĠ Ġsleep ( 1 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Call Ġ 3 ", Ġcached Value ) ĊĠĠĠĠĠĠĠ Ġmock Time Source . advance By ( Duration . of Seconds ( 1 0 )) ĊĠĠĠĠĠĠĠ Ġsleep ( 1 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Call Ġ 4 ", Ġcached Value ) ĊĠĠĠĠĠĠĠ Ġmock Time Source . advance By ( Duration . of Seconds ( 1 0 )) ĊĠĠĠĠĠĠĠ Ġsleep ( 1 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Call Ġ 5 ", Ġcached Value ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 5 ) Ġ{ Ġfetch Value From Dependency () Ġ} ĊĠĠĠ Ġ} Ċ } Ċ