2424import java .util .concurrent .ExecutorService ;
2525import java .util .concurrent .Executors ;
2626
27+ import com .oracle .bmc .retrier .DefaultRetryCondition ;
28+ import com .oracle .bmc .retrier .RetryConfiguration ;
2729import com .oracle .bmc .util .internal .Consumer ;
30+ import com .oracle .bmc .waiter .ExponentialBackoffDelayStrategy ;
2831import org .junit .After ;
2932import org .junit .Before ;
3033import org .junit .Rule ;
@@ -65,8 +68,14 @@ public class MultipartObjectAssemblerTest {
6568 private static final Map <String , String > OPC_META = new HashMap <>();
6669 private static final boolean ALLOW_OVERWRITE = false ;
6770
71+ private static final RetryConfiguration RETRY_CONFIGURATION = RetryConfiguration .builder ()
72+ .delayStrategy (new ExponentialBackoffDelayStrategy (120000 ))
73+ .retryCondition (new DefaultRetryCondition ())
74+ .build ();
75+
6876 private ExecutorService executorService ;
6977 private MultipartObjectAssembler assembler ;
78+ private MultipartObjectAssembler assemblerWithRetryConfiguration ;
7079
7180 @ Mock private Consumer <Invocation .Builder > mockInvocationCallback ;
7281
@@ -87,13 +96,52 @@ public void setUp() {
8796 .objectName (OBJECT )
8897 .service (service )
8998 .build ();
99+ assemblerWithRetryConfiguration =
100+ MultipartObjectAssembler .builder ()
101+ .allowOverwrite (ALLOW_OVERWRITE )
102+ .bucketName (BUCKET )
103+ .executorService (executorService )
104+ .invocationCallback (mockInvocationCallback )
105+ .namespaceName (NAMESPACE )
106+ .objectName (OBJECT )
107+ .service (service )
108+ .retryConfiguration (RETRY_CONFIGURATION )
109+ .build ();
90110 }
91111
92112 @ After
93113 public void tearDown () {
94114 executorService .shutdownNow ();
95115 }
96116
117+ @ Test
118+ public void newRequest_andVerifyManifestWithRetryConfiguration () {
119+ String uploadId = "uploadId" ;
120+
121+ initializeCreateMultipartUpload (uploadId );
122+
123+ MultipartManifest manifest =
124+ assemblerWithRetryConfiguration .newRequest (CONTENT_TYPE , CONTENT_LANGUAGE , CONTENT_ENCODING , OPC_META );
125+ assertNotNull (manifest );
126+ assertEquals (uploadId , manifest .getUploadId ());
127+
128+ ArgumentCaptor <CreateMultipartUploadRequest > captor =
129+ ArgumentCaptor .forClass (CreateMultipartUploadRequest .class );
130+ verify (service ).createMultipartUpload (captor .capture ());
131+
132+ CreateMultipartUploadRequest request = captor .getValue ();
133+ assertEquals (NAMESPACE , request .getNamespaceName ());
134+ assertEquals (BUCKET , request .getBucketName ());
135+ assertEquals (OBJECT , request .getCreateMultipartUploadDetails ().getObject ());
136+ assertEquals (CONTENT_TYPE , request .getCreateMultipartUploadDetails ().getContentType ());
137+ assertEquals (
138+ CONTENT_LANGUAGE , request .getCreateMultipartUploadDetails ().getContentLanguage ());
139+ assertEquals (
140+ CONTENT_ENCODING , request .getCreateMultipartUploadDetails ().getContentEncoding ());
141+ assertEquals (OPC_META , request .getCreateMultipartUploadDetails ().getMetadata ());
142+ assertEquals (mockInvocationCallback , request .getInvocationCallback ());
143+ }
144+
97145 @ Test
98146 public void newRequest_andVerifyManifest () {
99147 String uploadId = "uploadId" ;
@@ -302,6 +350,72 @@ public void addParts_allSuccessful_commit() throws Exception {
302350 file .delete ();
303351 }
304352
353+ @ Test
354+ public void addParts_allSuccessful_withRetryConfiguration_commit () throws Exception {
355+ String uploadId = "uploadId" ;
356+ initializeCreateMultipartUpload (uploadId );
357+ MultipartManifest manifest =
358+ assemblerWithRetryConfiguration .newRequest (CONTENT_TYPE , CONTENT_LANGUAGE , CONTENT_ENCODING , OPC_META );
359+
360+ byte [] bytes = "abcd" .getBytes ();
361+
362+ File file = File .createTempFile ("unitTest" , ".txt" );
363+ file .deleteOnExit ();
364+ try (FileOutputStream fos = new FileOutputStream (file )) {
365+ fos .write (bytes );
366+ }
367+
368+ String etag1 = "etag1" ;
369+ String etag2 = "etag2" ;
370+ UploadPartResponse uploadPartResponse1 = UploadPartResponse .builder ().eTag (etag1 ).build ();
371+ UploadPartResponse uploadPartResponse2 = UploadPartResponse .builder ().eTag (etag2 ).build ();
372+ when (service .uploadPart (any (UploadPartRequest .class )))
373+ .thenReturn (uploadPartResponse1 )
374+ .thenReturn (uploadPartResponse2 );
375+
376+ CommitMultipartUploadResponse finalCommitResponse =
377+ CommitMultipartUploadResponse .builder ().build ();
378+ when (service .commitMultipartUpload (any (CommitMultipartUploadRequest .class )))
379+ .thenReturn (finalCommitResponse );
380+
381+ String md5_1 = "md5_1" ;
382+ String md5_2 = "md5_2" ;
383+
384+ assemblerWithRetryConfiguration .addPart (file , md5_1 );
385+ assemblerWithRetryConfiguration .addPart (StreamUtils .createByteArrayInputStream (bytes ), bytes .length , md5_2 );
386+
387+ CommitMultipartUploadResponse commitResponse = assemblerWithRetryConfiguration .commit ();
388+ assertSame (finalCommitResponse , commitResponse );
389+
390+ ArgumentCaptor <CommitMultipartUploadRequest > commitCaptor =
391+ ArgumentCaptor .forClass (CommitMultipartUploadRequest .class );
392+ verify (service ).commitMultipartUpload (commitCaptor .capture ());
393+ CommitMultipartUploadRequest actualCommitRequest = commitCaptor .getValue ();
394+ assertEquals (NAMESPACE , actualCommitRequest .getNamespaceName ());
395+ assertEquals (BUCKET , actualCommitRequest .getBucketName ());
396+ assertEquals (OBJECT , actualCommitRequest .getObjectName ());
397+ assertEquals (uploadId , actualCommitRequest .getUploadId ());
398+ assertEquals (mockInvocationCallback , actualCommitRequest .getInvocationCallback ());
399+
400+ assertTrue (manifest .isUploadComplete ());
401+ assertTrue (manifest .isUploadSuccessful ());
402+ assertEquals (2 , manifest .listCompletedParts ().size ());
403+ assertEquals (1 , manifest .listCompletedParts ().get (0 ).getPartNum ().intValue ());
404+ assertEquals (etag1 , manifest .listCompletedParts ().get (0 ).getEtag ());
405+ assertEquals (2 , manifest .listCompletedParts ().get (1 ).getPartNum ().intValue ());
406+ assertEquals (etag2 , manifest .listCompletedParts ().get (1 ).getEtag ());
407+
408+ ArgumentCaptor <UploadPartRequest > uploadCaptor =
409+ ArgumentCaptor .forClass (UploadPartRequest .class );
410+ verify (service , times (2 )).uploadPart (uploadCaptor .capture ());
411+ verifyUploadPart (uploadCaptor .getAllValues ().get (0 ), uploadId , 1 , md5_1 );
412+ verifyUploadPart (uploadCaptor .getAllValues ().get (1 ), uploadId , 2 , md5_2 );
413+
414+ uploadCaptor .getAllValues ().forEach (r -> assertSame (RETRY_CONFIGURATION , r .getRetryConfiguration ()));
415+
416+ file .delete ();
417+ }
418+
305419 @ Test
306420 public void addParts_someFailed_commitFailure () throws Exception {
307421 String uploadId = "uploadId" ;
0 commit comments