/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠSquare , ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 Ġok io Ċ Ċ import Ġkotlinx . datetime . Clock Ċ import Ġok io . Path . Companion . to Path Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assert Fails With Ċ import Ġkotlin . test . assertTrue Ċ import Ġkotlin . time . Experimental Time Ċ Ċ @ Experimental Time Ċ @ Experimental Filesystem Ċ class ĠForward ing Filesystem Test Ġ: ĠAbstract Filesystem Test ( ĊĠ Ġclock Ġ= ĠClock . System , ĊĠ Ġfilesystem Ġ= Ġobject Ġ: ĠForward ing Filesystem ( Fake Filesystem ()) Ġ{}, ĊĠ Ġwindows Limit ations Ġ= Ġfalse , ĊĠ Ġtemporary Directory Ġ= Ġ"/ ". to Path () Ċ ) Ġ{ ĊĠ Ġ@ Test ĊĠ Ġfun Ġpath Blocking () Ġ{ ĊĠĠĠ Ġval Ġforwarding Filesystem Ġ= Ġobject Ġ: ĠForward ing Filesystem ( filesystem ) Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġdelete ( path : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" synt hetic Ġfailure !") ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġon Path Parameter ( path : ĠPath , Ġfunction Name : ĠString , Ġparameter Name : ĠString ): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( path . name . contains (" blocked ")) Ġthrow ĠIOException (" blocked Ġpath !") ĊĠĠĠĠĠĠĠ Ġreturn Ġpath ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġforwarding Filesystem . create Directory ( base Ġ/ Ġ" ok ay ") ĊĠĠĠ Ġassert Fails With < IOException > Ġ{ ĊĠĠĠĠĠ Ġforwarding Filesystem . create Directory ( base Ġ/ Ġ" blocked ") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġoperation Blocking () Ġ{ ĊĠĠĠ Ġval Ġforwarding Filesystem Ġ= Ġobject Ġ: ĠForward ing Filesystem ( filesystem ) Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġon Path Parameter ( path : ĠPath , Ġfunction Name : ĠString , Ġparameter Name : ĠString ): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( function Name Ġ== Ġ" delete ") Ġthrow ĠIOException (" blocked Ġoperation !") ĊĠĠĠĠĠĠĠ Ġreturn Ġpath ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġforwarding Filesystem . create Directory ( base Ġ/ Ġ" operation - blocking ") ĊĠĠĠ Ġassert Fails With < IOException > Ġ{ ĊĠĠĠĠĠ Ġforwarding Filesystem . delete ( base Ġ/ Ġ" operation - blocking ") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġpath Mapping () Ġ{ ĊĠĠĠ Ġval Ġprefix Ġ= Ġ"/ mapped " ĊĠĠĠ Ġval Ġsource Ġ= Ġbase Ġ/ Ġ" source " ĊĠĠĠ Ġval Ġmapped Source Ġ= Ġ( prefix Ġ+ Ġsource ). to Path () ĊĠĠĠ Ġval Ġtarget Ġ= Ġbase Ġ/ Ġ" target " ĊĠĠĠ Ġval Ġmapped Target Ġ= Ġ( prefix Ġ+ Ġtarget ). to Path () ĊĊĠĠĠ Ġsource . write Utf 8 (" hello , Ġworld !") ĊĊĠĠĠ Ġval Ġforwarding Filesystem Ġ= Ġobject Ġ: ĠForward ing Filesystem ( filesystem ) Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġon Path Parameter ( path : ĠPath , Ġfunction Name : ĠString , Ġparameter Name : ĠString ): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpath . toString (). remove Prefix ( prefix ). to Path () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġon Path Result ( path : ĠPath , Ġfunction Name : ĠString ): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( prefix Ġ+ Ġpath ). to Path () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġforwarding Filesystem . copy ( mapped Source , Ġmapped Target ) ĊĠĠĠ ĠassertTrue ( target Ġin Ġfilesystem . list ( base )) ĊĠĠĠ ĠassertTrue ( mapped Target Ġin Ġforwarding Filesystem . list ( base )) ĊĠĠĠ ĠassertEquals (" hello , Ġworld !", Ġsource . read Utf 8 ()) ĊĠĠĠ ĠassertEquals (" hello , Ġworld !", Ġtarget . read Utf 8 ()) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġcopy IsNot Forwarded () Ġ{ ĊĠĠĠ Ġval Ġlog Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠ Ġval Ġdelegate Ġ= Ġobject Ġ: ĠForward ing Filesystem ( filesystem ) Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġcopy ( source : ĠPath , Ġtarget : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" unexpected Ġcall Ġto Ġcopy () ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġforwarding Filesystem Ġ= Ġobject Ġ: ĠForward ing Filesystem ( delegate ) Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġon Path Parameter ( path : ĠPath , Ġfunction Name : ĠString , Ġparameter Name : ĠString ): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Ġ+= Ġ"$ function Name ($ parameter Name =$ path )" ĊĠĠĠĠĠĠĠ Ġreturn Ġpath ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsource Ġ= Ġbase Ġ/ Ġ" source " ĊĠĠĠ Ġsource . write Utf 8 (" hello , Ġworld !") ĊĠĠĠ Ġval Ġtarget Ġ= Ġbase Ġ/ Ġ" target " ĊĠĠĠ Ġforwarding Filesystem . copy ( source , Ġtarget ) ĊĠĠĠ ĠassertTrue ( target Ġin Ġfilesystem . list ( base )) ĊĠĠĠ ĠassertEquals (" hello , Ġworld !", Ġsource . read Utf 8 ()) ĊĠĠĠ ĠassertEquals (" hello , Ġworld !", Ġtarget . read Utf 8 ()) ĊĊĠĠĠ ĠassertEquals ( log , ĠlistOf (" source ( file =$ source )", Ġ" sink ( file =$ target ) ")) ĊĠ Ġ} Ċ } Ċ