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,11 @@ void pause_singlePart_shouldResume() {
73
70
.source (smallFile )
74
71
.build ();
75
72
FileUpload fileUpload = tm .uploadFile (request );
76
- waitUntilFirstByteBufferDelivered ( fileUpload );
73
+ waitUntilMultipartUploadExists ( );
77
74
ResumableFileUpload resumableFileUpload = fileUpload .pause ();
78
- log .debug (() -> "Paused: " + resumableFileUpload );
75
+ log .info (() -> "Paused: " + resumableFileUpload );
79
76
80
- assertThat (resumableFileUpload .multipartUploadId ()).isEmpty ();
81
- assertThat (resumableFileUpload .partSizeInBytes ()).isEmpty ();
82
- assertThat (resumableFileUpload .totalNumOfParts ()).isEmpty ();
77
+ validateEmptyResumeToken (resumableFileUpload );
83
78
84
79
FileUpload resumedUpload = tm .resumeUploadFile (resumableFileUpload );
85
80
resumedUpload .completionFuture ().join ();
@@ -89,16 +84,17 @@ void pause_singlePart_shouldResume() {
89
84
void pause_fileNotChanged_shouldResume () {
90
85
UploadFileRequest request = UploadFileRequest .builder ()
91
86
.putObjectRequest (b -> b .bucket (BUCKET ).key (KEY ))
87
+ .addTransferListener (LoggingTransferListener .create ())
92
88
.source (largeFile )
93
89
.build ();
94
90
FileUpload fileUpload = tm .uploadFile (request );
95
- waitUntilFirstByteBufferDelivered ( fileUpload );
91
+ waitUntilMultipartUploadExists ( );
96
92
ResumableFileUpload resumableFileUpload = fileUpload .pause ();
97
93
log .info (() -> "Paused: " + resumableFileUpload );
98
94
99
95
assertThat (resumableFileUpload .multipartUploadId ()).isNotEmpty ();
100
96
assertThat (resumableFileUpload .partSizeInBytes ()).isNotEmpty ();
101
- assertThat (resumableFileUpload .totalNumOfParts ()).isNotEmpty ();
97
+ assertThat (resumableFileUpload .totalParts ()).isNotEmpty ();
102
98
103
99
verifyMultipartUploadIdExists (resumableFileUpload );
104
100
@@ -114,30 +110,35 @@ void pauseImmediately_resume_shouldStartFromBeginning() {
114
110
.build ();
115
111
FileUpload fileUpload = tm .uploadFile (request );
116
112
ResumableFileUpload resumableFileUpload = fileUpload .pause ();
117
- log .debug (() -> "Paused: " + resumableFileUpload );
113
+ log .info (() -> "Paused: " + resumableFileUpload );
118
114
119
- assertThat (resumableFileUpload .multipartUploadId ()).isEmpty ();
120
- assertThat (resumableFileUpload .partSizeInBytes ()).isEmpty ();
121
- assertThat (resumableFileUpload .totalNumOfParts ()).isEmpty ();
115
+ validateEmptyResumeToken (resumableFileUpload );
122
116
123
117
FileUpload resumedUpload = tm .resumeUploadFile (resumableFileUpload );
124
118
resumedUpload .completionFuture ().join ();
125
119
}
126
120
121
+ private static void validateEmptyResumeToken (ResumableFileUpload resumableFileUpload ) {
122
+ assertThat (resumableFileUpload .multipartUploadId ()).isEmpty ();
123
+ assertThat (resumableFileUpload .partSizeInBytes ()).isEmpty ();
124
+ assertThat (resumableFileUpload .totalParts ()).isEmpty ();
125
+ assertThat (resumableFileUpload .transferredParts ()).isEmpty ();
126
+ }
127
+
127
128
@ Test
128
129
void pause_fileChanged_resumeShouldStartFromBeginning () throws Exception {
129
130
UploadFileRequest request = UploadFileRequest .builder ()
130
131
.putObjectRequest (b -> b .bucket (BUCKET ).key (KEY ))
131
132
.source (largeFile )
132
133
.build ();
133
134
FileUpload fileUpload = tm .uploadFile (request );
134
- waitUntilFirstByteBufferDelivered ( fileUpload );
135
+ waitUntilMultipartUploadExists ( );
135
136
ResumableFileUpload resumableFileUpload = fileUpload .pause ();
136
- log .debug (() -> "Paused: " + resumableFileUpload );
137
+ log .info (() -> "Paused: " + resumableFileUpload );
137
138
138
139
assertThat (resumableFileUpload .multipartUploadId ()).isNotEmpty ();
139
140
assertThat (resumableFileUpload .partSizeInBytes ()).isNotEmpty ();
140
- assertThat (resumableFileUpload .totalNumOfParts ()).isNotEmpty ();
141
+ assertThat (resumableFileUpload .totalParts ()).isNotEmpty ();
141
142
verifyMultipartUploadIdExists (resumableFileUpload );
142
143
143
144
byte [] bytes = "helloworld" .getBytes (StandardCharsets .UTF_8 );
@@ -162,14 +163,14 @@ private void verifyMultipartUploadIdNotExist(ResumableFileUpload resumableFileUp
162
163
.hasCauseInstanceOf (NoSuchUploadException .class );
163
164
}
164
165
165
- private static void waitUntilFirstByteBufferDelivered ( FileUpload upload ) {
166
- Waiter <TransferProgressSnapshot > waiter = Waiter .builder (TransferProgressSnapshot .class )
167
- .addAcceptor (WaiterAcceptor .successOnResponseAcceptor (r -> r . transferredBytes () > 0 ))
166
+ private static void waitUntilMultipartUploadExists ( ) {
167
+ Waiter <ListMultipartUploadsResponse > waiter = Waiter .builder (ListMultipartUploadsResponse .class )
168
+ .addAcceptor (WaiterAcceptor .successOnResponseAcceptor (ListMultipartUploadsResponse :: hasUploads ))
168
169
.addAcceptor (WaiterAcceptor .retryOnResponseAcceptor (r -> true ))
169
170
.overrideConfiguration (o -> o .waitTimeout (Duration .ofMinutes (1 ))
170
- .maxAttempts (Integer . MAX_VALUE )
171
+ .maxAttempts (10 )
171
172
.backoffStrategy (FixedDelayBackoffStrategy .create (Duration .ofMillis (100 ))))
172
173
.build ();
173
- waiter .run (() -> upload . progress (). snapshot ( ));
174
+ waiter .run (() -> s3 . listMultipartUploads ( l -> l . bucket ( BUCKET ) ));
174
175
}
175
176
}
0 commit comments