24
24
import static org .mockito .Mockito .when ;
25
25
26
26
import java .util .List ;
27
+ import java .util .Random ;
27
28
import java .util .concurrent .CompletableFuture ;
28
29
import org .junit .jupiter .api .BeforeEach ;
29
30
import org .junit .jupiter .api .Test ;
47
48
import software .amazon .awssdk .services .s3 .model .NoSuchBucketException ;
48
49
import software .amazon .awssdk .services .s3 .model .UploadPartCopyRequest ;
49
50
import software .amazon .awssdk .services .s3 .model .UploadPartCopyResponse ;
51
+ import software .amazon .awssdk .utils .BinaryUtils ;
50
52
import software .amazon .awssdk .utils .CompletableFutureUtils ;
53
+ import software .amazon .awssdk .utils .Md5Utils ;
51
54
52
55
class CopyObjectHelperTest {
53
56
@@ -56,13 +59,15 @@ class CopyObjectHelperTest {
56
59
private static final String DESTINATION_BUCKET = "destination" ;
57
60
private static final String DESTINATION_KEY = "destinationKey" ;
58
61
private static final String MULTIPART_ID = "multipartId" ;
62
+
63
+ private static final Long PART_SIZE_BYTES = 1024L ;
59
64
private S3AsyncClient s3AsyncClient ;
60
65
private CopyObjectHelper copyHelper ;
61
66
62
67
@ BeforeEach
63
68
public void setUp () {
64
69
s3AsyncClient = Mockito .mock (S3AsyncClient .class );
65
- copyHelper = new CopyObjectHelper (s3AsyncClient , 1024L );
70
+ copyHelper = new CopyObjectHelper (s3AsyncClient , PART_SIZE_BYTES );
66
71
}
67
72
68
73
@ Test
@@ -256,6 +261,35 @@ void multiPartCopy_contentSizeExceeds10000Parts_shouldAdjustPartSize() {
256
261
}
257
262
}
258
263
264
+ @ Test
265
+ public void multiPartCopy_sseCHeadersSetInOriginalRequest_includedInCompleteMultipart () {
266
+ String customerAlgorithm = "algorithm" ;
267
+ String customerKey = "key" ;
268
+ String customerKeyMd5 = "keyMd5" ;
269
+
270
+ CopyObjectRequest copyRequest = copyObjectRequest ().copy (r -> r .sseCustomerAlgorithm (customerAlgorithm )
271
+ .sseCustomerKey (customerKey )
272
+ .sseCustomerKeyMD5 (customerKeyMd5 ));
273
+
274
+ stubSuccessfulHeadObjectCall (2 * PART_SIZE_BYTES );
275
+ stubSuccessfulCreateMulipartCall ();
276
+ stubSuccessfulUploadPartCopyCalls ();
277
+ stubSuccessfulCompleteMultipartCall ();
278
+
279
+ copyHelper .copyObject (copyRequest ).join ();
280
+
281
+ ArgumentCaptor <CompleteMultipartUploadRequest > completeMultipartCaptor =
282
+ ArgumentCaptor .forClass (CompleteMultipartUploadRequest .class );
283
+
284
+ verify (s3AsyncClient ).completeMultipartUpload (completeMultipartCaptor .capture ());
285
+
286
+ CompleteMultipartUploadRequest completeRequest = completeMultipartCaptor .getValue ();
287
+
288
+ assertThat (completeRequest .sseCustomerAlgorithm ()).isEqualTo (customerAlgorithm );
289
+ assertThat (completeRequest .sseCustomerKey ()).isEqualTo (customerKey );
290
+ assertThat (completeRequest .sseCustomerKeyMD5 ()).isEqualTo (customerKeyMd5 );
291
+ }
292
+
259
293
@ Test
260
294
void copy_cancelResponseFuture_shouldPropagate () {
261
295
CopyObjectRequest copyObjectRequest = copyObjectRequest ();
0 commit comments