4343import java .util .ArrayList ;
4444import java .util .Arrays ;
4545import java .util .List ;
46+ import java .util .Optional ;
4647import java .util .stream .Collectors ;
4748import java .util .stream .IntStream ;
4849
@@ -207,16 +208,16 @@ public void testExecuteMultipartUpload() throws IOException {
207208
208209 final S3Client client = configureMockClient (blobStore );
209210
210- final ArgumentCaptor <CreateMultipartUploadRequest > createMultipartUploadRequestArgCaptor = ArgumentCaptor .forClass (
211+ final var uploadId = randomIdentifier ();
212+ final ArgumentCaptor <CreateMultipartUploadRequest > createMultipartUploadRequestCaptor = ArgumentCaptor .forClass (
211213 CreateMultipartUploadRequest .class
212214 );
213- final CreateMultipartUploadResponse multipartUploadResponse = CreateMultipartUploadResponse .builder ()
214- .uploadId (randomAlphaOfLength (10 ))
215- .build ();
216- when (client .createMultipartUpload (createMultipartUploadRequestArgCaptor .capture ())).thenReturn (multipartUploadResponse );
215+ when (client .createMultipartUpload (createMultipartUploadRequestCaptor .capture ())).thenReturn (
216+ CreateMultipartUploadResponse .builder ().uploadId (uploadId ).build ()
217+ );
217218
218- final ArgumentCaptor <UploadPartRequest > uploadArgCaptor = ArgumentCaptor .forClass (UploadPartRequest .class );
219- final ArgumentCaptor <RequestBody > argumentCaptorBody = ArgumentCaptor .forClass (RequestBody .class ); // TODO NOMERGE: test anything?
219+ final ArgumentCaptor <UploadPartRequest > uploadPartRequestCaptor = ArgumentCaptor .forClass (UploadPartRequest .class );
220+ final ArgumentCaptor <RequestBody > uploadPartBodyCaptor = ArgumentCaptor .forClass (RequestBody .class );
220221
221222 final List <String > expectedEtags = new ArrayList <>();
222223 final long partSize = Math .min (bufferSize , blobSize );
@@ -226,21 +227,25 @@ public void testExecuteMultipartUpload() throws IOException {
226227 totalBytes += partSize ;
227228 } while (totalBytes < blobSize );
228229
229- when (client .uploadPart (uploadArgCaptor .capture (), argumentCaptorBody .capture ())).thenAnswer (invocationOnMock -> {
230+ when (client .uploadPart (uploadPartRequestCaptor .capture (), uploadPartBodyCaptor .capture ())).thenAnswer (invocationOnMock -> {
230231 final UploadPartRequest request = (UploadPartRequest ) invocationOnMock .getArguments ()[0 ];
231- final UploadPartResponse .Builder response = UploadPartResponse .builder ();
232- response .eTag (expectedEtags .get (request .partNumber () - 1 ));
233- return response ;
232+ final UploadPartResponse .Builder responseBuilder = UploadPartResponse .builder ();
233+ responseBuilder .eTag (expectedEtags .get (request .partNumber () - 1 ));
234+ return responseBuilder . build () ;
234235 });
235236
236- final ArgumentCaptor <CompleteMultipartUploadRequest > compArgCaptor = ArgumentCaptor .forClass (CompleteMultipartUploadRequest .class );
237- when (client .completeMultipartUpload (compArgCaptor .capture ())).thenReturn (CompleteMultipartUploadResponse .builder ().build ());
237+ final ArgumentCaptor <CompleteMultipartUploadRequest > completeMultipartUploadRequestCaptor = ArgumentCaptor .forClass (
238+ CompleteMultipartUploadRequest .class
239+ );
240+ when (client .completeMultipartUpload (completeMultipartUploadRequestCaptor .capture ())).thenReturn (
241+ CompleteMultipartUploadResponse .builder ().build ()
242+ );
238243
239244 final ByteArrayInputStream inputStream = new ByteArrayInputStream (new byte [0 ]);
240245 final S3BlobContainer blobContainer = new S3BlobContainer (blobPath , blobStore );
241246 blobContainer .executeMultipartUpload (randomPurpose (), blobStore , blobName , inputStream , blobSize );
242247
243- final CreateMultipartUploadRequest initRequest = createMultipartUploadRequestArgCaptor .getValue ();
248+ final CreateMultipartUploadRequest initRequest = createMultipartUploadRequestCaptor .getValue ();
244249 assertEquals (bucketName , initRequest .bucket ());
245250 assertEquals (blobPath .buildAsString () + blobName , initRequest .key ());
246251 assertEquals (storageClass , initRequest .storageClass ());
@@ -254,35 +259,37 @@ public void testExecuteMultipartUpload() throws IOException {
254259
255260 final Tuple <Long , Long > numberOfParts = S3BlobContainer .numberOfMultiparts (blobSize , bufferSize );
256261
257- final List <UploadPartRequest > uploadRequests = uploadArgCaptor .getAllValues ();
258- assertEquals (numberOfParts .v1 ().intValue (), uploadRequests .size ());
262+ final List <UploadPartRequest > uploadPartRequests = uploadPartRequestCaptor .getAllValues ();
263+ assertEquals (numberOfParts .v1 ().intValue (), uploadPartRequests .size ());
259264
260- for (int i = 0 ; i < uploadRequests .size (); i ++) {
261- final UploadPartRequest uploadRequest = uploadRequests .get (i );
265+ final List <RequestBody > uploadPartBodies = uploadPartBodyCaptor .getAllValues ();
266+ assertEquals (numberOfParts .v1 ().intValue (), uploadPartBodies .size ());
267+
268+ for (int i = 0 ; i < uploadPartRequests .size (); i ++) {
269+ final UploadPartRequest uploadRequest = uploadPartRequests .get (i );
262270
263271 assertEquals (bucketName , uploadRequest .bucket ());
264272 assertEquals (blobPath .buildAsString () + blobName , uploadRequest .key ());
265- // TODO NOMERGE: revisit, did I do this right? Not obvious uploadRequest's ID should be multipartUploadResponse's, revisit.
266- assertEquals (multipartUploadResponse .uploadId (), uploadRequest .uploadId ());
273+ assertEquals (uploadId , uploadRequest .uploadId ());
267274 assertEquals (i + 1 , uploadRequest .partNumber ().intValue ());
268- // TODO NOMERGE: no more input stream access in the request object -- understand test and verify this is OK
269- // assertEquals(inputStream, uploadRequest.getInputStream());
270275
271- if (i == (uploadRequests .size () - 1 )) {
272- assertTrue (uploadRequest .sdkPartType () == SdkPartType .LAST );
273- // TODO NOMERGE: investigate numberOfMultiparts and what the values represent, to find an equivalent
274- // assertEquals(numberOfParts.v2().longValue(), uploadRequest.getPartSize());
275- } else {
276- assertFalse (uploadRequest .sdkPartType () == SdkPartType .LAST );
277- // TODO NOMERGE: investigate numberOfMultiparts and what the values represent, to find an equivalent
278- // assertEquals(bufferSize, uploadRequest.getPartSize());
279- }
276+ assertEquals (
277+ uploadRequest .sdkPartType () + " at " + i + " of " + uploadPartRequests .size (),
278+ uploadRequest .sdkPartType () == SdkPartType .LAST ,
279+ i == uploadPartRequests .size () - 1
280+ );
281+
282+ assertEquals (
283+ "part " + i ,
284+ uploadRequest .sdkPartType () == SdkPartType .LAST ? Optional .of (numberOfParts .v2 ()) : Optional .of (bufferSize ),
285+ uploadPartBodies .get (i ).optionalContentLength ()
286+ );
280287 }
281288
282- final CompleteMultipartUploadRequest compRequest = compArgCaptor .getValue ();
289+ final CompleteMultipartUploadRequest compRequest = completeMultipartUploadRequestCaptor .getValue ();
283290 assertEquals (bucketName , compRequest .bucket ());
284291 assertEquals (blobPath .buildAsString () + blobName , compRequest .key ());
285- assertEquals (multipartUploadResponse . uploadId () , compRequest .uploadId ());
292+ assertEquals (uploadId , compRequest .uploadId ());
286293
287294 final List <String > actualETags = compRequest .multipartUpload ()
288295 .parts ()
0 commit comments