package Ġio . quart ic . how l . storage Ċ Ċ import Ġcom . amazonaws . services . s 3 . Amazon S 3 Ċ import Ġcom . amazonaws . services . s 3 . model . Copy Object Request Ċ import Ġcom . amazonaws . services . s 3 . model . Object Metadata Ċ import Ġcom . n ha ar man . mockito _ kotlin .* Ċ import Ġio . quart ic . common . secrets . Unsafe Secret Ċ import Ġio . quart ic . how l . storage . Storage Coords . Unmanaged Ċ import Ġorg . hamcrest . Matchers . has Item Ċ import Ġorg . junit . Assert . assertThat Ċ import Ġorg . junit . Test Ċ import Ġjava . time . Instant Ċ import Ġjava . util .* Ċ Ċ class ĠS 3 Storage Should Ġ{ ĊĠĠĠ Ġprivate Ġval Ġs 3 Ġ= Ġmock < Amazon S 3 >() ĊĠĠĠ Ġprivate Ġval Ġbucket Ġ= Ġ" my - bucket " ĊĠĠĠ Ġprivate Ġval Ġstorage Ġ= ĠS 3 Storage ( Unsafe Secret ( bucket )) Ġ{ Ġs 3 Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsource Ġ= ĠUn managed (" foo ") ĊĠĠĠ Ġprivate Ġval Ġdest Ġ= ĠUn managed (" bar ") ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġattach _ correct _ etag _ constraint _ to _ copy _ request () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġmock < Object Metadata > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġlast Modified Ġ} Ġdo Return ĠDate . from ( Instant . now ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ ĠcontentType Ġ} Ġdo Return Ġ" n oob / hole " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġcontent Length Ġ} Ġdo Return Ġ 4 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġe Tag Ġ} Ġdo Return Ġ" abcdef " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( s 3 . getObject Metadata ( bucket , Ġ" raw / foo ")). thenReturn ( metadata ) Ġ Ġ// ĠSuc ceed Ġfirst Ġtime ĊĊĠĠĠĠĠĠĠ Ġwhenever ( s 3 . copy Object ( any ())). thenReturn ( mock ()) ĊĊĠĠĠĠĠĠĠ Ġstorage . copy Object ( source , Ġdest ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcapt or Ġ= Ġargument Captor < Copy Object Request >() ĊĠĠĠĠĠĠĠ Ġverify ( s 3 ). copy Object ( capt or . capture ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( capt or . first Value . matching ET ag Constraints , Ġhas Item (" abcdef ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget _ etag _ again _ if _ copy _ request _ failed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġmock < Object Metadata > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġlast Modified Ġ} Ġdo Return ĠDate . from ( Instant . now ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ ĠcontentType Ġ} Ġdo Return Ġ" n oob / hole " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġcontent Length Ġ} Ġdo Return Ġ 4 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġe Tag Ġ} Ġdo Return Ġ" abcdef " Ġdo Return Ġ" gh ijkl " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( s 3 . getObject Metadata ( bucket , Ġ" raw / foo ")). thenReturn ( metadata ) ĊĊĠĠĠĠĠĠĠ Ġwhenever ( s 3 . copy Object ( any ())). thenReturn ( null ). thenReturn ( mock ()) Ġ Ġ// ĠFail Ġfirst Ġtime , Ġsucceed Ġsecond Ġtime ĊĊĠĠĠĠĠĠĠ Ġstorage . copy Object ( source , Ġdest ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcapt or Ġ= Ġargument Captor < Copy Object Request >() ĊĠĠĠĠĠĠĠ Ġverify ( s 3 , Ġtimes ( 2 )). copy Object ( capt or . capture ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( capt or . second Value . matching ET ag Constraints , Ġhas Item (" gh ijkl ")) ĊĠĠĠ Ġ} Ċ } Ċ