/* Ċ Ġ* ĠUnless Ġexplicitly Ġstated Ġotherwise Ġall Ġfiles Ġin Ġthis Ġrepository Ġare Ġlicensed Ġunder Ġthe ĠApache ĠLicense ĠVersion Ġ 2 . 0 . Ċ Ġ* ĠThis Ġproduct Ġincludes Ġsoftware Ġdeveloped Ġat ĠDat adog Ġ( https :// www . datadog hq . com /). Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - Present ĠDat adog , ĠInc . Ċ Ġ*/ Ċ Ċ package Ġcom . datadog . android . core . internal . data . file Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . datadog . android . log . internal . logger . Log Handler Ċ import Ġcom . datadog . android . utils . mock Sdk Log Handler Ċ import Ġcom . datadog . android . utils . restore Sdk Log Handler Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . any Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . any OrNull Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . do Throw Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . eq Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . is A Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . mock Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . verify Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġfr . xg ou chet . el my r . Forge Ċ import Ġfr . xg ou chet . el my r . annotation . String F org ery Ċ import Ġfr . xg ou chet . el my r . junit 5 . Forge Extension Ċ import Ġjava . io . File Ċ import Ġjava . lang . NullPointerException Ċ import Ġjava . lang . RuntimeException Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . extension . Extend With Ċ import Ġorg . junit . jupiter . api . extension . Extensions Ċ import Ġorg . junit . jupiter . api . io . TempDir Ċ import Ġorg . mockito . junit . jupiter . Mockito Extension Ċ import Ġorg . mockito . junit . jupiter . Mockito Settings Ċ import Ġorg . mockito . quality . Strict ness Ċ Ċ @ Extensions ( ĊĠĠĠ ĠExtend With ( Mockito Extension :: class ), ĊĠĠĠ ĠExtend With ( Forge Extension :: class ) Ċ ) Ċ @ Mockito Settings ( strict ness Ġ= ĠStrict ness . LEN IENT ) Ċ internal Ġclass ĠFile Handler Test Ġ{ ĊĊĠĠĠ Ġ@ TempDir ĊĠĠĠ Ġlateinit Ġvar Ġfake Root Directory : ĠFile ĊĊĠĠĠ Ġlateinit Ġvar Ġfake Source Directory : ĠFile ĊĠĠĠ Ġlateinit Ġvar Ġfake Destination Directory : ĠFile ĊĊĠĠĠ Ġlateinit Ġvar Ġtested File Handler : ĠFile Handler ĊĊĠĠĠ Ġ@ String F org ery ( regex Ġ= Ġ" ([ a - z ]+ )- ([ a - z ]+ )") ĊĠĠĠ Ġlateinit Ġvar Ġfake Source Dir Name : ĠString ĊĊĠĠĠ Ġ@ String F org ery ( regex Ġ= Ġ" ([ a - z ]+ )- ([ a - z ]+ )") ĊĠĠĠ Ġlateinit Ġvar Ġfake Destination Dir Name : ĠString ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun Ġ` set Ġup `() Ġ{ ĊĠĠĠĠĠĠĠ Ġtested File Handler Ġ= ĠFile Handler () ĊĠĠĠĠĠĠĠ Ġfake Source Directory Ġ= ĠFile ( fake Root Directory , Ġfake Source Dir Name ) ĊĠĠĠĠĠĠĠ Ġfake Destination Directory Ġ= ĠFile ( fake Root Directory , Ġfake Destination Dir Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġregion ĠMove Files ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġreturn Ġtrue ĠW Ġmove Files Ġ{ Ġsource Ġdirectory Ġdoes Ġnot Ġexist }` ( ĊĠĠĠĠĠĠĠ Ġfor ge : ĠFor ge ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtested File Handler . move Files ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake Source Directory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake Destination Directory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ ĠassertThat ( success ). isTrue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġsend Ġa Ġwarning Ġlog ĠW Ġmove Files Ġ{ Ġsource Ġdirectory Ġdoes Ġnot Ġexist }` ( ĊĠĠĠĠĠĠĠ Ġfor ge : ĠFor ge ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠ Ġval Ġmock Log Handler : ĠLog Handler Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Log Handler : ĠLog Handler Ġ= Ġmock Sdk Log Handler ( mock Log Handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġtested File Handler . move Files ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfake Source Directory , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfake Destination Directory ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ Ġverify ( mock Log Handler ). handle Log ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . WARN , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġwere Ġno Ġfiles Ġto Ġmove . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġis Ġno Ġdirectory Ġat Ġthis Ġpath : Ġ[ ${ fake Source Directory . absolute Path }] " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrestore Sdk Log Handler ( original Log Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġreturn Ġtrue ĠW Ġmove Files Ġ{ Ġsource Ġdirectory Ġis Ġnot Ġa Ġdirectory }` ( ĊĠĠĠĠĠĠĠ Ġfor ge : ĠFor ge ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠ Ġfake Source Directory . createNew File () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtested File Handler . move Files ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake Source Directory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake Destination Directory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ ĠassertThat ( success ). isTrue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġsend Ġa Ġwarning Ġlog ĠW Ġmove Files Ġ{ Ġsource Ġdirectory Ġis Ġnot Ġa Ġdirectory }` ( ĊĠĠĠĠĠĠĠ Ġfor ge : ĠFor ge ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠ Ġval Ġmock Log Handler : ĠLog Handler Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Log Handler : ĠLog Handler Ġ= Ġmock Sdk Log Handler ( mock Log Handler ) ĊĠĠĠĠĠĠĠ Ġfake Source Directory . createNew File () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġtested File Handler . move Files ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfake Source Directory , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfake Destination Directory ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ Ġverify ( mock Log Handler ). handle Log ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . WARN , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġwere Ġno Ġfiles Ġto Ġmove ." Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ ${ fake Source Directory . absolute Path }] Ġis Ġnot Ġa Ġdirectory ." ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrestore Sdk Log Handler ( original Log Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġmove Ġall Ġthe Ġfiles ĠW Ġmove Files `( forge : ĠFor ge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠ Ġfake Source Directory . mkdir s () ĊĠĠĠĠĠĠĠ Ġfake Destination Directory . mkdir s () ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġfor ge . a List Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( fake Source Directory , Ġfor ge . an Alphabet ical String ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfiles . forEach Ġ{ Ġit . createNew File () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġtested File Handler . move Files ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfake Source Directory , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfake Destination Directory ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ ĠassertThat ( success ). isTrue () ĊĠĠĠĠĠĠĠ ĠassertThat ( fake Source Directory . list Files ()). isEmpty () ĊĠĠĠĠĠĠĠ Ġval Ġdestination Directory Files Ġ= Ġfake Destination Directory . list Files () ĊĠĠĠĠĠĠĠ ĠassertThat ( destination Directory Files ?. map Ġ{ Ġit . name Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Only (*( files . map Ġ{ Ġit . name Ġ}. to Typed Array ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġreturn Ġtrue ĠW Ġmove Files Ġ{ Ġsource Directory Ġis Ġempty Ġ} `( forge : ĠFor ge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠ Ġfake Source Directory . mkdir s () ĊĠĠĠĠĠĠĠ Ġfake Destination Directory . mkdir s () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġtested File Handler . move Files ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfake Source Directory , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfake Destination Directory ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ ĠassertThat ( success ). isTrue () ĊĠĠĠĠĠĠĠ Ġval Ġdestination Directory Files Ġ= Ġfake Destination Directory . list Files () ĊĠĠĠĠĠĠĠ ĠassertThat ( destination Directory Files ). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġcreate Ġthe Ġdestination Ġdirectory Ġif Ġdoes Ġnot Ġexists ĠW Ġmove Files `( forge : ĠFor ge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠ Ġfake Source Directory . mkdir s () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġtested File Handler . move Files ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfake Source Directory , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfake Destination Directory ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ ĠassertThat ( success ). isTrue () ĊĠĠĠĠĠĠĠ Ġval Ġdestination Directory Files Ġ= Ġfake Destination Directory . list Files () ĊĠĠĠĠĠĠĠ ĠassertThat ( destination Directory Files ). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġreturn Ġfalse ĠW Ġmove Files Ġ{ Ġrename File Ġfails Ġwith ĠN PE Ġ} `( forge : ĠFor ge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠ Ġval Ġfake N pe Ġ= ĠNullPointerException ( forge . an Alphabet ical String ()) ĊĠĠĠĠĠĠĠ Ġval Ġmocked Files Pair Ġ= Ġmocked Files With Special Mock ( forge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( it . rename To ( any ())). do Throw ( fake N pe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmock Log Handler : ĠLog Handler Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Log Handler : ĠLog Handler Ġ= Ġmock Sdk Log Handler ( mock Log Handler ) ĊĠĠĠĠĠĠĠ Ġval Ġbroken File Ġ= Ġmocked Files Pair . second ĊĠĠĠĠĠĠĠ Ġval Ġmocked Source Directory : ĠFile Ġ= Ġmock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( it . isDirectory ). thenReturn ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( it . exists ()). thenReturn ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( it . list Files ()). thenReturn ( mocked Files Pair . first ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġtested File Handler . move Files ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmocked Source Directory , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfake Destination Directory ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ ĠassertThat ( success ). isFalse () ĊĠĠĠĠĠĠĠ Ġverify ( mock Log Handler ). handle Log ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġmove Ġfile : Ġ[ ${ broken File . absolute Path }] " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġto Ġnew Ġfile : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ ${ fake Destination Directory . absolute Path }/${ broken File . name } ]", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfake N pe ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrestore Sdk Log Handler ( original Log Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġreturn Ġfalse ĠW Ġmove Files Ġ{ Ġrename File Ġfails Ġwith ĠSecurity Exception Ġ} `( forge : ĠFor ge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠ Ġval Ġfake Sec Exception Ġ= ĠSecurity Exception ( forge . an Alphabet ical String ()) ĊĠĠĠĠĠĠĠ Ġval Ġmocked Files Pair Ġ= Ġmocked Files With Special Mock ( forge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( it . rename To ( any ())). do Throw ( fake Sec Exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmock Log Handler : ĠLog Handler Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Log Handler : ĠLog Handler Ġ= Ġmock Sdk Log Handler ( mock Log Handler ) ĊĠĠĠĠĠĠĠ Ġval Ġbroken File Ġ= Ġmocked Files Pair . second ĊĠĠĠĠĠĠĠ Ġval Ġmocked Source Directory : ĠFile Ġ= Ġmock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( it . isDirectory ). thenReturn ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( it . exists ()). thenReturn ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( it . list Files ()). thenReturn ( mocked Files Pair . first ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġtested File Handler . move Files ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmocked Source Directory , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfake Destination Directory ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ ĠassertThat ( success ). isFalse () ĊĠĠĠĠĠĠĠ Ġverify ( mock Log Handler ). handle Log ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġmove Ġfile : Ġ[ ${ broken File . absolute Path }] " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġto Ġnew Ġfile : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ ${ fake Destination Directory . absolute Path }/${ broken File . name } ]", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfake Sec Exception ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrestore Sdk Log Handler ( original Log Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠClean Directory ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġclear Ġthe Ġfile ĠW Ġrequired `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠ Ġval Ġmock Directory : ĠFile Ġ= Ġmock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( it . delete Re cursively ()). thenReturn ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġtested File Handler . delete File Or Directory ( mock Directory ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ ĠassertThat ( success ). isTrue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġreturn Ġfalse ĠW Ġclear File Ġ{ Ġthrows ĠException Ġ} `( forge : ĠFor ge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠ Ġval Ġfake Exception Ġ= ĠRuntimeException ( forge . an Alphabet ical String ()) ĊĠĠĠĠĠĠĠ Ġval Ġmock File : ĠFile Ġ= Ġmock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( it . delete Re cursively ()). then Throw ( fake Exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġtested File Handler . delete File Or Directory ( mock File ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ ĠassertThat ( success ). isFalse () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġsend Ġan Ġerror Ġlog ĠW Ġclear File Ġ{ Ġthrows ĠException Ġ} `( forge : ĠFor ge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠ Ġval Ġmock Log Handler : ĠLog Handler Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Log Handler : ĠLog Handler Ġ= Ġmock Sdk Log Handler ( mock Log Handler ) ĊĠĠĠĠĠĠĠ Ġval Ġfake Exception Ġ= ĠRuntimeException ( forge . an Alphabet ical String ()) ĊĠĠĠĠĠĠĠ Ġval Ġmock File : ĠFile Ġ= Ġmock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( it . delete Re cursively ()). then Throw ( fake Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( it . absolute Path ). thenReturn ( forge . an Alphabet ical String ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġtested File Handler . delete File Or Directory ( mock File ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ Ġverify ( mock Log Handler ). handle Log ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġclear Ġthe Ġfile Ġat Ġ[ ${ mock File . absolute Path } ]", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfake Exception ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrestore Sdk Log Handler ( original Log Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠWrite Ġdata Ġto Ġfile ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġwrite Ġdata ĠW Ġwrite Data { Ġappend Ġis Ġfalse , Ġseparator Ġis Ġnull Ġ} `( forge : ĠFor ge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠ Ġval Ġfake File Ġ= ĠFile ( fake Root Directory , Ġfor ge . an Alphabet ical String ()) ĊĠĠĠĠĠĠĠ Ġfake File . createNew File () ĊĠĠĠĠĠĠĠ Ġval Ġfake DataRow 1 Ġ= Ġfor ge . a String () ĊĠĠĠĠĠĠĠ Ġval Ġfake DataRow 2 Ġ= Ġfor ge . a String () ĊĠĠĠĠĠĠĠ Ġval Ġfake DataRow 3 Ġ= Ġfor ge . a String () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġval Ġis Success Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtested File Handler . write Data ( fake File , Ġfake DataRow 1 . toByteArray ()) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtested File Handler . write Data ( fake File , Ġfake DataRow 2 . toByteArray ()) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtested File Handler . write Data ( fake File , Ġfake DataRow 3 . toByteArray ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ ĠassertThat ( is Success ). isTrue () ĊĠĠĠĠĠĠĠ Ġval Ġread Text Ġ= Ġfake File . read Text () ĊĠĠĠĠĠĠĠ ĠassertThat ( read Text ). isEqualTo ( fake DataRow 3 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġwrite Ġdata ĠW Ġwrite Data { Ġappend Ġis Ġtrue , Ġseparator Ġis Ġnot Ġnull Ġ} `( forge : ĠFor ge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠ Ġval Ġfake File Ġ= ĠFile ( fake Root Directory , Ġfor ge . an Alphabet ical String ()) ĊĠĠĠĠĠĠĠ Ġfake File . createNew File () ĊĠĠĠĠĠĠĠ Ġval Ġfake DataRow 1 Ġ= Ġfor ge . a String () ĊĠĠĠĠĠĠĠ Ġval Ġfake DataRow 2 Ġ= Ġfor ge . a String () ĊĠĠĠĠĠĠĠ Ġval Ġfake DataRow 3 Ġ= Ġfor ge . a String () ĊĠĠĠĠĠĠĠ Ġval Ġfake Separator Ġ= Ġfor ge . an Alphabet ical String () ĊĠĠĠĠĠĠĠ Ġval Ġexpected Data Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( fake DataRow 1 , Ġfake DataRow 2 , Ġfake DataRow 3 ). join ToString ( fake Separator ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġval Ġis Success Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtested File Handler . write Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake DataRow 1 . toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake Separator . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtested File Handler . write Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake DataRow 2 . toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake Separator . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtested File Handler . write Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake DataRow 3 . toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake Separator . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ ĠassertThat ( is Success ). isTrue () ĊĠĠĠĠĠĠĠ Ġval Ġread Text Ġ= Ġfake File . read Text () ĊĠĠĠĠĠĠĠ ĠassertThat ( read Text ). isEqualTo ( expected Data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġwrite Ġdata ĠW Ġwrite Data { Ġappend Ġis Ġtrue , Ġseparator Ġis Ġnull Ġ} `( forge : ĠFor ge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠ Ġval Ġfake File Ġ= ĠFile ( fake Root Directory , Ġfor ge . an Alphabet ical String ()) ĊĠĠĠĠĠĠĠ Ġfake File . createNew File () ĊĠĠĠĠĠĠĠ Ġval Ġfake DataRow 1 Ġ= Ġfor ge . a String () ĊĠĠĠĠĠĠĠ Ġval Ġfake DataRow 2 Ġ= Ġfor ge . a String () ĊĠĠĠĠĠĠĠ Ġval Ġfake DataRow 3 Ġ= Ġfor ge . a String () ĊĠĠĠĠĠĠĠ Ġval Ġexpected Data Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( fake DataRow 1 , Ġfake DataRow 2 , Ġfake DataRow 3 ). join ToString ("") ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġval Ġis Success Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtested File Handler . write Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake DataRow 1 . toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtested File Handler . write Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake DataRow 2 . toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtested File Handler . write Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake DataRow 3 . toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ ĠassertThat ( is Success ). isTrue () ĊĠĠĠĠĠĠĠ Ġval Ġread Text Ġ= Ġfake File . read Text () ĊĠĠĠĠĠĠĠ ĠassertThat ( read Text ). isEqualTo ( expected Data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġwrite Ġdata ĠW Ġwrite Data { Ġappend Ġis Ġfalse , Ġseparator Ġis Ġnot Ġnull Ġ} `( forge : ĠFor ge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠ Ġval Ġfake File Ġ= ĠFile ( fake Root Directory , Ġfor ge . an Alphabet ical String ()) ĊĠĠĠĠĠĠĠ Ġfake File . createNew File () ĊĠĠĠĠĠĠĠ Ġval Ġfake DataRow 1 Ġ= Ġfor ge . a String () ĊĠĠĠĠĠĠĠ Ġval Ġfake DataRow 2 Ġ= Ġfor ge . a String () ĊĠĠĠĠĠĠĠ Ġval Ġfake DataRow 3 Ġ= Ġfor ge . a String () ĊĠĠĠĠĠĠĠ Ġval Ġfake Separator Ġ= Ġfor ge . an Alphabet ical String () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġval Ġis Success Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtested File Handler . write Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake DataRow 1 . toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake Separator . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtested File Handler . write Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake DataRow 2 . toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake Separator . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtested File Handler . write Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake DataRow 3 . toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfake Separator . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ ĠassertThat ( is Success ). isTrue () ĊĠĠĠĠĠĠĠ Ġval Ġread Text Ġ= Ġfake File . read Text () ĊĠĠĠĠĠĠĠ ĠassertThat ( read Text ). isEqualTo ( fake DataRow 3 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` M Ġdo Ġnothing Ġand Ġlog Ġerror ĠW Ġwrite Data Ġ{ Ġfile Ġdoes Ġnot Ġexist Ġ} `( forge : ĠFor ge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠ Ġval Ġmock Log Handler : ĠLog Handler Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Log Handler : ĠLog Handler Ġ= Ġmock Sdk Log Handler ( mock Log Handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠ Ġtested File Handler . write Data ( fake Root Directory , Ġfor ge . a String (). toByteArray ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠ Ġrestore Sdk Log Handler ( original Log Handler ) ĊĠĠĠĠĠĠĠ Ġverify ( mock Log Handler ). handle Log ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( Log . ERROR ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeq (" Couldn 't Ġcreate Ġan Ġoutput Ġstream Ġto Ġfile Ġ${ fake Root Directory . path } "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis A (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( empty Set ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany OrNull () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠInternal ĊĊĠĠĠ Ġprivate Ġfun Ġmocked Files With Special Mock ( ĊĠĠĠĠĠĠĠ Ġfor ge : ĠFor ge , ĊĠĠĠĠĠĠĠ Ġspecial Mock Block : Ġ( File ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠPair < Array < File >, ĠFile > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfiles Length Ġ= Ġfor ge . an Int ( 1 , Ġ 1 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġspecial Mock Index Ġ= Ġfor ge . an Int ( 0 , Ġfiles Length ) ĊĠĠĠĠĠĠĠ Ġval Ġmocked Files Ġ= ĠArray < File >( files Length ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġspecial Mock Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspecial Mock Block ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( it . rename To ( any ())). thenReturn ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfake FileName Ġ= Ġfor ge . an Alphabet ical String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( it . name ). thenReturn ( fake FileName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( it . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. thenReturn ( forge . a String Matching (" ([ a - z ]+)/ ([ a - z ]+)/ ") Ġ+ Ġfake FileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmocked Files Ġto Ġmocked Files [ special Mock Index ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region Ċ } Ċ