26
26
import java .time .Duration ;
27
27
import org .junit .jupiter .api .AfterAll ;
28
28
import org .junit .jupiter .api .BeforeAll ;
29
- import org .junit .jupiter .api .Disabled ;
30
29
import org .junit .jupiter .api .Test ;
31
30
import software .amazon .awssdk .core .retry .backoff .FixedDelayBackoffStrategy ;
32
31
import software .amazon .awssdk .core .waiters .Waiter ;
33
32
import software .amazon .awssdk .core .waiters .WaiterAcceptor ;
34
- import software .amazon .awssdk .services .s3 .S3AsyncClient ;
33
+ import software .amazon .awssdk .services .s3 .model . ListMultipartUploadsResponse ;
35
34
import software .amazon .awssdk .services .s3 .model .ListPartsResponse ;
36
35
import software .amazon .awssdk .services .s3 .model .NoSuchUploadException ;
37
36
import software .amazon .awssdk .testutils .RandomTempFile ;
38
37
import software .amazon .awssdk .transfer .s3 .model .FileUpload ;
39
38
import software .amazon .awssdk .transfer .s3 .model .ResumableFileUpload ;
40
39
import software .amazon .awssdk .transfer .s3 .model .UploadFileRequest ;
41
- import software .amazon .awssdk .transfer .s3 .progress .TransferProgressSnapshot ;
40
+ import software .amazon .awssdk .transfer .s3 .progress .LoggingTransferListener ;
42
41
import software .amazon .awssdk .utils .Logger ;
43
42
44
- // TODO: re-enable tests
45
- @ Disabled ("Disable tests because they are flaky right now due to crt bug" )
46
43
public class S3TransferManagerUploadPauseResumeIntegrationTest extends S3IntegrationTestBase {
47
44
private static final Logger log = Logger .loggerFor (S3TransferManagerUploadPauseResumeIntegrationTest .class );
48
45
private static final String BUCKET = temporaryBucketName (S3TransferManagerUploadPauseResumeIntegrationTest .class );
@@ -73,13 +70,10 @@ void pause_singlePart_shouldResume() {
73
70
.source (smallFile )
74
71
.build ();
75
72
FileUpload fileUpload = tm .uploadFile (request );
76
- waitUntilFirstByteBufferDelivered (fileUpload );
77
73
ResumableFileUpload resumableFileUpload = fileUpload .pause ();
78
74
log .debug (() -> "Paused: " + resumableFileUpload );
79
75
80
- assertThat (resumableFileUpload .multipartUploadId ()).isEmpty ();
81
- assertThat (resumableFileUpload .partSizeInBytes ()).isEmpty ();
82
- assertThat (resumableFileUpload .totalNumOfParts ()).isEmpty ();
76
+ validateEmptyResumeToken (resumableFileUpload );
83
77
84
78
FileUpload resumedUpload = tm .resumeUploadFile (resumableFileUpload );
85
79
resumedUpload .completionFuture ().join ();
@@ -89,16 +83,17 @@ void pause_singlePart_shouldResume() {
89
83
void pause_fileNotChanged_shouldResume () {
90
84
UploadFileRequest request = UploadFileRequest .builder ()
91
85
.putObjectRequest (b -> b .bucket (BUCKET ).key (KEY ))
86
+ .addTransferListener (LoggingTransferListener .create ())
92
87
.source (largeFile )
93
88
.build ();
94
89
FileUpload fileUpload = tm .uploadFile (request );
95
- waitUntilFirstByteBufferDelivered ( fileUpload );
90
+ waitUntilMultipartUploadExists ( );
96
91
ResumableFileUpload resumableFileUpload = fileUpload .pause ();
97
- log .info (() -> "Paused: " + resumableFileUpload );
92
+ log .debug (() -> "Paused: " + resumableFileUpload );
98
93
99
94
assertThat (resumableFileUpload .multipartUploadId ()).isNotEmpty ();
100
95
assertThat (resumableFileUpload .partSizeInBytes ()).isNotEmpty ();
101
- assertThat (resumableFileUpload .totalNumOfParts ()).isNotEmpty ();
96
+ assertThat (resumableFileUpload .totalParts ()).isNotEmpty ();
102
97
103
98
verifyMultipartUploadIdExists (resumableFileUpload );
104
99
@@ -116,9 +111,7 @@ void pauseImmediately_resume_shouldStartFromBeginning() {
116
111
ResumableFileUpload resumableFileUpload = fileUpload .pause ();
117
112
log .debug (() -> "Paused: " + resumableFileUpload );
118
113
119
- assertThat (resumableFileUpload .multipartUploadId ()).isEmpty ();
120
- assertThat (resumableFileUpload .partSizeInBytes ()).isEmpty ();
121
- assertThat (resumableFileUpload .totalNumOfParts ()).isEmpty ();
114
+ validateEmptyResumeToken (resumableFileUpload );
122
115
123
116
FileUpload resumedUpload = tm .resumeUploadFile (resumableFileUpload );
124
117
resumedUpload .completionFuture ().join ();
@@ -131,13 +124,13 @@ void pause_fileChanged_resumeShouldStartFromBeginning() throws Exception {
131
124
.source (largeFile )
132
125
.build ();
133
126
FileUpload fileUpload = tm .uploadFile (request );
134
- waitUntilFirstByteBufferDelivered ( fileUpload );
127
+ waitUntilMultipartUploadExists ( );
135
128
ResumableFileUpload resumableFileUpload = fileUpload .pause ();
136
129
log .debug (() -> "Paused: " + resumableFileUpload );
137
130
138
131
assertThat (resumableFileUpload .multipartUploadId ()).isNotEmpty ();
139
132
assertThat (resumableFileUpload .partSizeInBytes ()).isNotEmpty ();
140
- assertThat (resumableFileUpload .totalNumOfParts ()).isNotEmpty ();
133
+ assertThat (resumableFileUpload .totalParts ()).isNotEmpty ();
141
134
verifyMultipartUploadIdExists (resumableFileUpload );
142
135
143
136
byte [] bytes = "helloworld" .getBytes (StandardCharsets .UTF_8 );
@@ -162,14 +155,21 @@ private void verifyMultipartUploadIdNotExist(ResumableFileUpload resumableFileUp
162
155
.hasCauseInstanceOf (NoSuchUploadException .class );
163
156
}
164
157
165
- private static void waitUntilFirstByteBufferDelivered ( FileUpload upload ) {
166
- Waiter <TransferProgressSnapshot > waiter = Waiter .builder (TransferProgressSnapshot .class )
167
- .addAcceptor (WaiterAcceptor .successOnResponseAcceptor (r -> r . transferredBytes () > 0 ))
158
+ private static void waitUntilMultipartUploadExists ( ) {
159
+ Waiter <ListMultipartUploadsResponse > waiter = Waiter .builder (ListMultipartUploadsResponse .class )
160
+ .addAcceptor (WaiterAcceptor .successOnResponseAcceptor (ListMultipartUploadsResponse :: hasUploads ))
168
161
.addAcceptor (WaiterAcceptor .retryOnResponseAcceptor (r -> true ))
169
162
.overrideConfiguration (o -> o .waitTimeout (Duration .ofMinutes (1 ))
170
- .maxAttempts (Integer . MAX_VALUE )
163
+ .maxAttempts (10 )
171
164
.backoffStrategy (FixedDelayBackoffStrategy .create (Duration .ofMillis (100 ))))
172
165
.build ();
173
- waiter .run (() -> upload .progress ().snapshot ());
166
+ waiter .run (() -> s3 .listMultipartUploads (l -> l .bucket (BUCKET )));
167
+ }
168
+
169
+ private static void validateEmptyResumeToken (ResumableFileUpload resumableFileUpload ) {
170
+ assertThat (resumableFileUpload .multipartUploadId ()).isEmpty ();
171
+ assertThat (resumableFileUpload .partSizeInBytes ()).isEmpty ();
172
+ assertThat (resumableFileUpload .totalParts ()).isEmpty ();
173
+ assertThat (resumableFileUpload .transferredParts ()).isEmpty ();
174
174
}
175
175
}
0 commit comments