18
18
import static org .assertj .core .api .Assertions .assertThat ;
19
19
import static software .amazon .awssdk .testutils .service .S3BucketUtils .temporaryBucketName ;
20
20
21
+ import java .util .ArrayList ;
22
+ import java .util .List ;
23
+ import org .apache .commons .lang3 .RandomStringUtils ;
21
24
import org .junit .AfterClass ;
22
25
import org .junit .BeforeClass ;
23
26
import org .junit .Test ;
27
+ import software .amazon .awssdk .core .ResponseBytes ;
24
28
import software .amazon .awssdk .core .sync .RequestBody ;
29
+ import software .amazon .awssdk .core .sync .ResponseTransformer ;
30
+ import software .amazon .awssdk .services .s3 .model .AbortMultipartUploadResponse ;
25
31
import software .amazon .awssdk .services .s3 .model .CompleteMultipartUploadResponse ;
26
32
import software .amazon .awssdk .services .s3 .model .CompletedMultipartUpload ;
27
33
import software .amazon .awssdk .services .s3 .model .CompletedPart ;
28
- import software .amazon .awssdk .services .s3 .model .CreateMultipartUploadResponse ;
34
+ import software .amazon .awssdk .services .s3 .model .GetObjectResponse ;
35
+ import software .amazon .awssdk .services .s3 .model .ListMultipartUploadsResponse ;
36
+ import software .amazon .awssdk .services .s3 .model .MultipartUpload ;
37
+ import software .amazon .awssdk .services .s3 .model .UploadPartRequest ;
29
38
import software .amazon .awssdk .services .s3 .model .UploadPartResponse ;
30
39
31
40
public class UploadMultiplePartIntegrationTest extends S3IntegrationTestBase {
32
41
33
42
private static final String BUCKET = temporaryBucketName (UploadMultiplePartIntegrationTest .class );
34
-
35
- private static final String KEY = "uploadpart" ;
43
+ private static final String CONTENT = RandomStringUtils .randomAscii (1000 );
36
44
37
45
@ BeforeClass
38
46
public static void setupFixture () {
@@ -45,26 +53,87 @@ public static void tearDownFixture() {
45
53
}
46
54
47
55
@ Test
48
- public void uploadMultiplePart () {
49
- CreateMultipartUploadResponse multipartUpload = s3 .createMultipartUpload (b ->
50
- b .bucket (BUCKET ).key (KEY ));
51
- long length = "helloworld" .getBytes ().length ;
52
- UploadPartResponse uploadPartResponse =
53
- s3 .uploadPart (b -> b .bucket (BUCKET ).key (KEY )
54
- .uploadId (multipartUpload .uploadId ())
55
- .partNumber (1 )
56
- .contentLength (length ), RequestBody .fromString ("helloworld" ));
57
-
58
- String etag = uploadPartResponse .eTag ();
56
+ public void uploadMultiplePart_complete () throws Exception {
57
+ String key = "uploadMultiplePart_complete" ;
58
+
59
+ // 1. Initiate multipartUpload request
60
+ String uploadId = initiateMultipartUpload (key );
61
+
62
+ int partCount = 1 ;
63
+ List <String > contentsToUpload = new ArrayList <>();
64
+
65
+ // 2. Upload each part
66
+ List <UploadPartResponse > uploadPartResponses = uploadParts (key , uploadId , partCount , contentsToUpload );
67
+
68
+ List <CompletedPart > completedParts = new ArrayList <>();
69
+
70
+ for (int i = 0 ; i < uploadPartResponses .size (); i ++) {
71
+ int partNumber = i + 1 ;
72
+ UploadPartResponse response = uploadPartResponses .get (i );
73
+ completedParts .add (CompletedPart .builder ().eTag (response .eTag ()).partNumber (partNumber ).build ());
74
+ }
59
75
76
+ // 3. Complete multipart upload
60
77
CompleteMultipartUploadResponse completeMultipartUploadResponse =
61
- s3 .completeMultipartUpload (b -> b .bucket (BUCKET ).key (KEY ).uploadId (multipartUpload .uploadId ())
78
+ s3 .completeMultipartUpload (b -> b .bucket (BUCKET )
79
+ .key (key )
80
+ .uploadId (uploadId )
62
81
.multipartUpload (CompletedMultipartUpload .builder ()
63
- .parts (CompletedPart .builder ().
64
- eTag (etag ).partNumber (1 ).build ())
82
+ .parts (completedParts )
65
83
.build ()).build ());
66
84
67
85
assertThat (completeMultipartUploadResponse ).isNotNull ();
86
+ verifyMultipartUploadResult (key , contentsToUpload );
87
+ }
88
+
89
+ @ Test
90
+ public void uploadMultiplePart_abort () {
91
+ String key = "uploadMultiplePart_abort" ;
92
+
93
+ // 1. Initiate multipartUpload request
94
+ String uploadId = initiateMultipartUpload (key );
95
+ int partCount = 3 ;
96
+
97
+ // 2. Upload each part
98
+ List <String > contentsToUpload = new ArrayList <>();
99
+ List <UploadPartResponse > uploadPartResponses = uploadParts (key , uploadId , partCount , contentsToUpload );
100
+
101
+ // 3. abort the multipart upload
102
+ AbortMultipartUploadResponse abortMultipartUploadResponse =
103
+ s3 .abortMultipartUpload (b -> b .bucket (BUCKET ).key (key ).uploadId (uploadId ));
104
+
105
+ // Verify no in-progress multipart uploads
106
+ ListMultipartUploadsResponse listMultipartUploadsResponse = s3 .listMultipartUploads (b -> b .bucket (BUCKET ));
107
+
108
+ List <MultipartUpload > uploads = listMultipartUploadsResponse .uploads ();
109
+
110
+ assertThat (uploads ).isEmpty ();
111
+ }
112
+
113
+ private void verifyMultipartUploadResult (String key , List <String > contentsToUpload ) throws Exception {
114
+ ResponseBytes <GetObjectResponse > objectAsBytes = s3 .getObject (b -> b .bucket (BUCKET ).key (key ),
115
+ ResponseTransformer .toBytes ());
116
+ String appendedString = String .join ("" , contentsToUpload );
117
+ assertThat (objectAsBytes .asUtf8String ()).isEqualTo (appendedString );
68
118
}
69
119
120
+ private List <UploadPartResponse > uploadParts (String key , String uploadId , int partCount , List <String > contentsToUpload ) {
121
+ List <UploadPartResponse > uploadPartResponses = new ArrayList <>();
122
+
123
+ for (int i = 0 ; i < partCount ; i ++) {
124
+ int partNumber = i + 1 ;
125
+ contentsToUpload .add (CONTENT );
126
+ UploadPartRequest uploadPartRequest = UploadPartRequest .builder ().bucket (BUCKET ).key (key )
127
+ .uploadId (uploadId )
128
+ .partNumber (partNumber )
129
+ .build ();
130
+
131
+ uploadPartResponses .add (s3 .uploadPart (uploadPartRequest , RequestBody .fromString (CONTENT )));
132
+ }
133
+ return uploadPartResponses ;
134
+ }
135
+
136
+ private String initiateMultipartUpload (String key ) {
137
+ return s3 .createMultipartUpload (b -> b .bucket (BUCKET ).key (key )).uploadId ();
138
+ }
70
139
}
0 commit comments