/* Ċ Ġ* Ġ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 . persistence . file . batch Ċ Ċ import Ġcom . datadog . android . core . internal . persistence . Data Writer Ċ import Ġcom . datadog . android . core . internal . persistence . Payload Decoration Ċ import Ġcom . datadog . android . core . internal . persistence . Serializer Ċ import Ġcom . datadog . android . core . internal . persistence . file . File Handler Ċ import Ġcom . datadog . android . core . internal . persistence . file . File Orche strator Ċ import Ġcom . datadog . android . utils . forge . Configurator Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . any Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . argument Captor Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . do Answer Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . do Return Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . eq Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . same Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . times Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . verify Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . verify Zero Interactions Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġfr . xg ou chet . el my r . annotation . F org ery Ċ import Ġfr . xg ou chet . el my r . annotation . String F org ery Ċ import Ġfr . xg ou chet . el my r . junit 5 . Forge Configuration Ċ import Ġfr . xg ou chet . el my r . junit 5 . Forge Extension Ċ import Ġjava . io . File Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . jupiter . api . After Each Ċ 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 . mockito . Mock Ċ import Ġorg . mockito . junit . jupiter . Mockito Extension Ċ import Ġorg . mockito . junit . jupiter . Mockito Settings Ċ import Ġorg . mockito . quality . Strict ness Ċ import Ġorg . mockito . stub bing . Answer Ċ Ċ @ Extensions ( ĊĠĠĠ ĠExtend With ( Mockito Extension :: class ), ĊĠĠĠ ĠExtend With ( Forge Extension :: class ) Ċ ) Ċ @ Forge Configuration ( Configurator :: class ) Ċ @ Mockito Settings ( strict ness Ġ= ĠStrict ness . LEN IENT ) Ċ internal Ġclass ĠBatch File Data Writer Test Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġtested Writer : ĠData Writer < String > ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġmock Serializer : ĠSerializer < String > ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġmock Orche strator : ĠFile Orche strator ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġmock File Handler : ĠFile Handler ĊĊĠĠĠ Ġ@ F org ery ĊĠĠĠ Ġlateinit Ġvar Ġfake Decoration : ĠPayload Decoration ĊĊĠĠĠ Ġprivate Ġval Ġsuccessful Data : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprivate Ġval Ġfailed Data : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġprivate Ġval Ġstub Reverse Serializer Answer Ġ= ĠAnswer < String ?> Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠ Ġ( invocation . arguments [ 0 ] Ġas ĠString ). reversed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġstub Fail ing Serializer Answer Ġ= ĠAnswer < String ?> Ġ{ Ġnull Ġ} ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun Ġ` set Ġup `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( mock Serializer . serialize ( any ())). do Answer ( stub Reverse Serializer Answer ) ĊĊĠĠĠĠĠĠĠ Ġtested Writer Ġ= Ġobject Ġ: ĠBatch File Data Writer < String >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Orche strator , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Serializer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfake Decoration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock File Handler ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Written ( data : ĠString , Ġraw Data : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccessful Data . add ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Write Failed ( data : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailed Data . add ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After Each ĊĠĠĠ Ġfun Ġ` te ar Ġdown `() Ġ{ ĊĠĠĠĠĠĠĠ Ġsuccessful Data . clear () ĊĠĠĠĠĠĠĠ Ġfailed Data . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ðĿ ķ Ħ Ġwrite Ġelement Ġto Ġfile Ġ ðĿ ķ İ Ġwrite ( element )` ( ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġdata : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ F org ery Ġfile : ĠFile ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġserialized Ġ= Ġdata . reversed (). toByteArray ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ Ġwhenever ( mock Orche strator . get Writable File ( any ())) Ġdo Return Ġfile ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġtested Writer . write ( data ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( mock File Handler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. write Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserialized , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator Ġ= Ġfake Decoration . separator Bytes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ðĿ ķ Ħ Ġwrite Ġelements Ġto Ġfile Ġ ðĿ ķ İ Ġwrite ( list )` ( ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġdata : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġ@ F org ery Ġfile : ĠFile ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġwhenever ( mock Orche strator . get Writable File ( any ())) Ġdo Return Ġfile ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġtested Writer . write ( data ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġargument Captor < ByteArray > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock File Handler , Ġtimes ( data . size )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. write Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsame ( file ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapture (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= Ġeq ( true ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator Ġ= Ġeq ( fake Decoration . separator Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( all Values ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly Elements Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . reversed (). toByteArray ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ðĿ ķ Ħ Ġnotify Ġsuccess Ġ ðĿ ķ İ Ġwrite ( element )` ( ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġdata : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ F org ery Ġfile : ĠFile ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġwhenever ( mock File Handler . write Data ( any (), Ġany (), Ġany (), Ġany ())) Ġdo Return Ġtrue ĊĠĠĠĠĠĠĠ Ġwhenever ( mock Orche strator . get Writable File ( any ())) Ġdo Return Ġfile ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġtested Writer . write ( data ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertThat ( successful Data ). contains Exactly ( data ) ĊĠĠĠĠĠĠĠ ĠassertThat ( failed Data ). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ðĿ ķ Ħ Ġnotify Ġfailure Ġ ðĿ ķ İ Ġwrite ( element ) Ġ{ Ġwriting Ġfailure Ġ} `( ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġdata : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ F org ery Ġfile : ĠFile ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġwhenever ( mock File Handler . write Data ( any (), Ġany (), Ġany (), Ġany ())) Ġdo Return Ġfalse ĊĠĠĠĠĠĠĠ Ġwhenever ( mock Orche strator . get Writable File ( any ())) Ġdo Return Ġfile ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġtested Writer . write ( data ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertThat ( successful Data ). isEmpty () ĊĠĠĠĠĠĠĠ ĠassertThat ( failed Data ). contains Exactly ( data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ðĿ ķ Ħ Ġdo Ġnothing Ġ ðĿ ķ İ Ġwrite ( element ) Ġ{ Ġserialization Ġfailure Ġ} `( ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġdata : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġwhenever ( mock Serializer . serialize ( data )) Ġdo Answer Ġstub Fail ing Serializer Answer ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġtested Writer . write ( data ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertThat ( successful Data ). isEmpty () ĊĠĠĠĠĠĠĠ ĠassertThat ( failed Data ). isEmpty () ĊĠĠĠĠĠĠĠ Ġverify Zero Interactions ( mock File Handler ) ĊĠĠĠ Ġ} Ċ } Ċ