@@ -211,4 +211,78 @@ internal class MultipartServiceTest : ServiceTestBase() {
211211 val bucketName = " bucketName"
212212 iut.verifyMultipartUploadExists(bucketName, uploadId)
213213 }
214+
215+ @Test
216+ fun testVerifyPartNumberLimits_boundaryMax_success () {
217+ val partNumber = " 10000"
218+ iut.verifyPartNumberLimits(partNumber)
219+ }
220+
221+ @Test
222+ fun testVerifyPartNumberLimits_negativeNumberFailure () {
223+ val partNumber = " -1"
224+ assertThatThrownBy { iut.verifyPartNumberLimits(partNumber) }
225+ .isEqualTo(S3Exception .INVALID_PART_NUMBER )
226+ }
227+
228+ @Test
229+ fun testVerifyMultipartParts_withRequestedParts_keyNotFoundFailure () {
230+ val bucketName = " bucketName"
231+ val key = " missingKey"
232+ val uploadId = UUID .randomUUID()
233+ // create bucket but do not add the key to metadata so getID(key) returns null
234+ givenBucket(bucketName)
235+
236+ val requestedParts = emptyList<CompletedPart >()
237+
238+ assertThatThrownBy { iut.verifyMultipartParts(bucketName, key, uploadId, requestedParts) }
239+ .isEqualTo(S3Exception .INVALID_PART )
240+ }
241+
242+ @Test
243+ fun testVerifyMultipartParts_withRequestedParts_missingUploadedPartFailure () {
244+ val bucketName = " bucketName"
245+ val key = " key"
246+ val uploadId = UUID .randomUUID()
247+ val bucketMetadata = givenBucket(bucketName)
248+ val id = bucketMetadata.addKey(key)
249+ // Only part 1 was uploaded
250+ val uploadedParts = givenParts(1 , MultipartService .MINIMUM_PART_SIZE )
251+ whenever(multipartStore.getMultipartUploadParts(bucketMetadata, id, uploadId)).thenReturn(uploadedParts)
252+
253+ // But request contains part 2 which does not exist in uploaded parts
254+ val requestedParts = listOf (
255+ CompletedPart (
256+ null ,
257+ null ,
258+ null ,
259+ null ,
260+ null ,
261+ " \" nonexistent-etag\" " ,
262+ 2
263+ )
264+ )
265+
266+ assertThatThrownBy { iut.verifyMultipartParts(bucketName, key, uploadId, requestedParts) }
267+ .isEqualTo(S3Exception .INVALID_PART )
268+ }
269+
270+ @Test
271+ fun testVerifyMultipartParts_idPath_noSuchUploadFailure () {
272+ val bucketName = " bucketName"
273+ val id = UUID .randomUUID()
274+ val uploadId = UUID .randomUUID()
275+ val bucketMetadata = givenBucket(bucketName)
276+
277+ // Simulate missing upload -> MultipartService should translate to NO_SUCH_UPLOAD_MULTIPART
278+ whenever(
279+ multipartStore.getMultipartUpload(
280+ ArgumentMatchers .eq(bucketMetadata),
281+ ArgumentMatchers .eq(uploadId)
282+ )
283+ ).thenThrow(IllegalArgumentException ())
284+
285+ assertThatThrownBy { iut.verifyMultipartParts(bucketName, id, uploadId) }
286+ .isEqualTo(S3Exception .NO_SUCH_UPLOAD_MULTIPART )
287+ }
214288}
0 commit comments