42
42
import org .junit .Test ;
43
43
import org .mockito .ArgumentCaptor ;
44
44
import org .mockito .stubbing .Answer ;
45
+ import software .amazon .awssdk .core .ResponseBytes ;
45
46
import software .amazon .awssdk .core .async .AsyncRequestBody ;
46
47
import software .amazon .awssdk .core .async .AsyncResponseTransformer ;
47
48
import software .amazon .awssdk .core .async .DrainingSubscriber ;
50
51
import software .amazon .awssdk .services .s3 .model .PutObjectRequest ;
51
52
import software .amazon .awssdk .services .s3 .model .PutObjectResponse ;
52
53
import software .amazon .awssdk .transfer .s3 .CompletedFileUpload ;
54
+ import software .amazon .awssdk .transfer .s3 .Download ;
53
55
import software .amazon .awssdk .transfer .s3 .DownloadFileRequest ;
56
+ import software .amazon .awssdk .transfer .s3 .DownloadRequest ;
54
57
import software .amazon .awssdk .transfer .s3 .FileDownload ;
55
58
import software .amazon .awssdk .transfer .s3 .FileUpload ;
56
59
import software .amazon .awssdk .transfer .s3 .S3TransferManager ;
60
+ import software .amazon .awssdk .transfer .s3 .Upload ;
57
61
import software .amazon .awssdk .transfer .s3 .UploadFileRequest ;
62
+ import software .amazon .awssdk .transfer .s3 .UploadRequest ;
58
63
import software .amazon .awssdk .transfer .s3 .progress .TransferListener ;
59
64
60
65
public class S3TransferManagerListenerTest {
@@ -80,7 +85,7 @@ public void methodTeardown() {
80
85
}
81
86
82
87
@ Test
83
- public void upload_success_shouldInvokeListener () throws Exception {
88
+ public void uploadFile_success_shouldInvokeListener () throws Exception {
84
89
TransferListener listener = mock (TransferListener .class );
85
90
86
91
Path path = newTempFile ();
@@ -124,7 +129,48 @@ public void upload_success_shouldInvokeListener() throws Exception {
124
129
}
125
130
126
131
@ Test
127
- public void download_success_shouldInvokeListener () throws Exception {
132
+ public void upload_success_shouldInvokeListener () throws Exception {
133
+ TransferListener listener = mock (TransferListener .class );
134
+
135
+ UploadRequest uploadRequest = UploadRequest .builder ()
136
+ .putObjectRequest (r -> r .bucket ("bucket" )
137
+ .key ("key" ))
138
+ .requestBody (AsyncRequestBody .fromString ("foo" ))
139
+ .overrideConfiguration (b -> b .addListener (listener ))
140
+ .build ();
141
+ Upload upload = tm .upload (uploadRequest );
142
+
143
+ ArgumentCaptor <TransferListener .Context .TransferInitiated > captor1 =
144
+ ArgumentCaptor .forClass (TransferListener .Context .TransferInitiated .class );
145
+ verify (listener , timeout (1000 ).times (1 )).transferInitiated (captor1 .capture ());
146
+ TransferListener .Context .TransferInitiated ctx1 = captor1 .getValue ();
147
+ assertThat (ctx1 .request ()).isSameAs (uploadRequest );
148
+ assertThat (ctx1 .progressSnapshot ().transferSizeInBytes ()).hasValue (3L );
149
+ assertThat (ctx1 .progressSnapshot ().bytesTransferred ()).isZero ();
150
+
151
+ ArgumentCaptor <TransferListener .Context .BytesTransferred > captor2 =
152
+ ArgumentCaptor .forClass (TransferListener .Context .BytesTransferred .class );
153
+ verify (listener , timeout (1000 ).times (1 )).bytesTransferred (captor2 .capture ());
154
+ TransferListener .Context .BytesTransferred ctx2 = captor2 .getValue ();
155
+ assertThat (ctx2 .request ()).isSameAs (uploadRequest );
156
+ assertThat (ctx2 .progressSnapshot ().transferSizeInBytes ()).hasValue (3L );
157
+ assertThat (ctx2 .progressSnapshot ().bytesTransferred ()).isPositive ();
158
+
159
+ ArgumentCaptor <TransferListener .Context .TransferComplete > captor3 =
160
+ ArgumentCaptor .forClass (TransferListener .Context .TransferComplete .class );
161
+ verify (listener , timeout (1000 ).times (1 )).transferComplete (captor3 .capture ());
162
+ TransferListener .Context .TransferComplete ctx3 = captor3 .getValue ();
163
+ assertThat (ctx3 .request ()).isSameAs (uploadRequest );
164
+ assertThat (ctx3 .progressSnapshot ().transferSizeInBytes ()).hasValue (3L );
165
+ assertThat (ctx3 .progressSnapshot ().bytesTransferred ()).isEqualTo (3L );
166
+ assertThat (ctx3 .completedTransfer ()).isSameAs (upload .completionFuture ().get ());
167
+
168
+ upload .completionFuture ().join ();
169
+ verifyNoMoreInteractions (listener );
170
+ }
171
+
172
+ @ Test
173
+ public void downloadFile_success_shouldInvokeListener () throws Exception {
128
174
TransferListener listener = mock (TransferListener .class );
129
175
130
176
DownloadFileRequest downloadRequest = DownloadFileRequest .builder ()
@@ -167,7 +213,52 @@ public void download_success_shouldInvokeListener() throws Exception {
167
213
}
168
214
169
215
@ Test
170
- public void upload_failure_shouldInvokeListener () throws Exception {
216
+ public void download_success_shouldInvokeListener () throws Exception {
217
+ TransferListener listener = mock (TransferListener .class );
218
+
219
+ DownloadRequest <ResponseBytes <GetObjectResponse >> downloadRequest =
220
+ DownloadRequest .builder ()
221
+ .getObjectRequest (r -> r .bucket (
222
+ "bucket" )
223
+ .key ("key" ))
224
+ .responseTransformer (AsyncResponseTransformer .toBytes ())
225
+ .overrideConfiguration (b -> b .addListener (listener ))
226
+ .build ();
227
+ Download <ResponseBytes <GetObjectResponse >> download = tm .download (downloadRequest );
228
+
229
+ ArgumentCaptor <TransferListener .Context .TransferInitiated > captor1 =
230
+ ArgumentCaptor .forClass (TransferListener .Context .TransferInitiated .class );
231
+ verify (listener , timeout (1000 ).times (1 )).transferInitiated (captor1 .capture ());
232
+ TransferListener .Context .TransferInitiated ctx1 = captor1 .getValue ();
233
+ assertThat (ctx1 .request ()).isSameAs (downloadRequest );
234
+ // transferSize is not known until we receive GetObjectResponse header
235
+ assertThat (ctx1 .progressSnapshot ().transferSizeInBytes ()).isNotPresent ();
236
+ assertThat (ctx1 .progressSnapshot ().bytesTransferred ()).isZero ();
237
+
238
+ ArgumentCaptor <TransferListener .Context .BytesTransferred > captor2 =
239
+ ArgumentCaptor .forClass (TransferListener .Context .BytesTransferred .class );
240
+ verify (listener , timeout (1000 ).times (1 )).bytesTransferred (captor2 .capture ());
241
+ TransferListener .Context .BytesTransferred ctx2 = captor2 .getValue ();
242
+ assertThat (ctx2 .request ()).isSameAs (downloadRequest );
243
+ // transferSize should now be known
244
+ assertThat (ctx2 .progressSnapshot ().transferSizeInBytes ()).hasValue (contentLength );
245
+ assertThat (ctx2 .progressSnapshot ().bytesTransferred ()).isPositive ();
246
+
247
+ ArgumentCaptor <TransferListener .Context .TransferComplete > captor3 =
248
+ ArgumentCaptor .forClass (TransferListener .Context .TransferComplete .class );
249
+ verify (listener , timeout (1000 ).times (1 )).transferComplete (captor3 .capture ());
250
+ TransferListener .Context .TransferComplete ctx3 = captor3 .getValue ();
251
+ assertThat (ctx3 .request ()).isSameAs (downloadRequest );
252
+ assertThat (ctx3 .progressSnapshot ().transferSizeInBytes ()).hasValue (contentLength );
253
+ assertThat (ctx3 .progressSnapshot ().bytesTransferred ()).isEqualTo (contentLength );
254
+ assertThat (ctx3 .completedTransfer ()).isSameAs (download .completionFuture ().get ());
255
+
256
+ download .completionFuture ().join ();
257
+ verifyNoMoreInteractions (listener );
258
+ }
259
+
260
+ @ Test
261
+ public void uploadFile_failure_shouldInvokeListener () throws Exception {
171
262
TransferListener listener = mock (TransferListener .class );
172
263
173
264
Path path = newTempFile ();
0 commit comments