15
15
16
16
package software .amazon .awssdk .transfer .s3 .internal ;
17
17
18
+ import static org .assertj .core .api .Assertions .assertThat ;
19
+ import static org .assertj .core .api .Assertions .assertThatThrownBy ;
20
+ import static org .mockito .Mockito .when ;
21
+ import static software .amazon .awssdk .transfer .s3 .SizeConstant .MB ;
22
+
23
+ import com .google .common .jimfs .Jimfs ;
24
+ import java .io .File ;
25
+ import java .io .IOException ;
26
+ import java .nio .charset .StandardCharsets ;
27
+ import java .nio .file .FileSystem ;
28
+ import java .nio .file .Files ;
29
+ import java .time .Instant ;
30
+ import java .util .UUID ;
31
+ import java .util .concurrent .CompletableFuture ;
18
32
import nl .jqno .equalsverifier .EqualsVerifier ;
33
+ import org .apache .commons .lang3 .RandomStringUtils ;
34
+ import org .junit .jupiter .api .AfterAll ;
35
+ import org .junit .jupiter .api .BeforeAll ;
36
+ import org .junit .jupiter .api .BeforeEach ;
19
37
import org .junit .jupiter .api .Test ;
38
+ import org .mockito .Mockito ;
39
+ import software .amazon .awssdk .crt .CrtRuntimeException ;
40
+ import software .amazon .awssdk .crt .s3 .S3MetaRequest ;
20
41
import software .amazon .awssdk .services .s3 .internal .crt .S3MetaRequestPauseObservable ;
42
+ import software .amazon .awssdk .services .s3 .model .PutObjectResponse ;
21
43
import software .amazon .awssdk .transfer .s3 .internal .model .DefaultFileUpload ;
44
+ import software .amazon .awssdk .transfer .s3 .internal .progress .DefaultTransferProgressSnapshot ;
45
+ import software .amazon .awssdk .transfer .s3 .model .CompletedFileUpload ;
46
+ import software .amazon .awssdk .transfer .s3 .model .ResumableFileUpload ;
47
+ import software .amazon .awssdk .transfer .s3 .model .UploadFileRequest ;
48
+ import software .amazon .awssdk .transfer .s3 .progress .TransferProgress ;
49
+
50
+ class DefaultFileUploadTest {
51
+ private S3MetaRequest metaRequest ;
52
+ private static FileSystem fileSystem ;
53
+ private static File file ;
54
+ private static final String TOKEN = "{\" total_num_parts\" :10,\" partition_size\" :8388608,"
55
+ + "\" type\" :\" AWS_S3_META_REQUEST_TYPE_PUT_OBJECT\" ,\" multipart_upload_id\" :\" someId\" }" ;
56
+
57
+ @ BeforeAll
58
+ public static void setUp () throws IOException {
59
+ fileSystem = Jimfs .newFileSystem ();
60
+ file = File .createTempFile ("test" , UUID .randomUUID ().toString ());
61
+ Files .write (file .toPath (), RandomStringUtils .random (2000 ).getBytes (StandardCharsets .UTF_8 ));
62
+ }
22
63
23
- public class DefaultFileUploadTest {
64
+ @ AfterAll
65
+ public static void tearDown () throws IOException {
66
+ file .delete ();
67
+ }
68
+
69
+ @ BeforeEach
70
+ void setUpBeforeEachTest () {
71
+ metaRequest = Mockito .mock (S3MetaRequest .class );
72
+ }
24
73
25
74
@ Test
26
- public void equals_hashcode () {
75
+ void equals_hashcode () {
27
76
EqualsVerifier .forClass (DefaultFileUpload .class )
28
77
.withNonnullFields ("completionFuture" , "progress" , "request" , "observable" , "resumableFileUpload" )
29
- .withPrefabValues (S3MetaRequestPauseObservable .class , new S3MetaRequestPauseObservable (), new S3MetaRequestPauseObservable ())
78
+ .withPrefabValues (S3MetaRequestPauseObservable .class , new S3MetaRequestPauseObservable (),
79
+ new S3MetaRequestPauseObservable ())
30
80
.verify ();
31
81
}
82
+
83
+ @ Test
84
+ void pause_futureCompleted_shouldReturnNormally () {
85
+ PutObjectResponse putObjectResponse = PutObjectResponse .builder ()
86
+ .build ();
87
+ CompletableFuture <CompletedFileUpload > future =
88
+ CompletableFuture .completedFuture (CompletedFileUpload .builder ()
89
+ .response (putObjectResponse )
90
+ .build ());
91
+ TransferProgress transferProgress = Mockito .mock (TransferProgress .class );
92
+ when (transferProgress .snapshot ()).thenReturn (DefaultTransferProgressSnapshot .builder ()
93
+ .sdkResponse (putObjectResponse )
94
+ .transferredBytes (0L )
95
+ .build ());
96
+ S3MetaRequestPauseObservable observable = new S3MetaRequestPauseObservable ();
97
+
98
+ UploadFileRequest request = uploadFileRequest ();
99
+
100
+ DefaultFileUpload fileUpload =
101
+ new DefaultFileUpload (future , transferProgress , observable , request );
102
+
103
+ observable .subscribe (metaRequest );
104
+
105
+ ResumableFileUpload resumableFileUpload = fileUpload .pause ();
106
+ Mockito .verify (metaRequest , Mockito .never ()).pause ();
107
+ assertThat (resumableFileUpload .totalNumOfParts ()).isEmpty ();
108
+ assertThat (resumableFileUpload .partSizeInBytes ()).isEmpty ();
109
+ assertThat (resumableFileUpload .multipartUploadId ()).isEmpty ();
110
+ assertThat (resumableFileUpload .fileLength ()).isEqualTo (file .length ());
111
+ assertThat (resumableFileUpload .uploadFileRequest ()).isEqualTo (request );
112
+ assertThat (resumableFileUpload .fileLastModified ()).isEqualTo (Instant .ofEpochMilli (file .lastModified ()));
113
+ }
114
+
115
+ @ Test
116
+ void pauseTwice_shouldReturnTheSame () {
117
+ CompletableFuture <CompletedFileUpload > future =
118
+ new CompletableFuture <>();
119
+ TransferProgress transferProgress = Mockito .mock (TransferProgress .class );
120
+ when (transferProgress .snapshot ()).thenReturn (DefaultTransferProgressSnapshot .builder ()
121
+ .transferredBytes (1000L )
122
+ .build ());
123
+ UploadFileRequest request = uploadFileRequest ();
124
+
125
+ S3MetaRequestPauseObservable observable = new S3MetaRequestPauseObservable ();
126
+ when (metaRequest .pause ()).thenReturn (TOKEN );
127
+ observable .subscribe (metaRequest );
128
+
129
+ DefaultFileUpload fileUpload =
130
+ new DefaultFileUpload (future , transferProgress , observable , request );
131
+
132
+ ResumableFileUpload resumableFileUpload = fileUpload .pause ();
133
+ ResumableFileUpload resumableFileUpload2 = fileUpload .pause ();
134
+
135
+ assertThat (resumableFileUpload ).isEqualTo (resumableFileUpload2 );
136
+ }
137
+
138
+ @ Test
139
+ void pause_crtThrowException_shouldPropogate () {
140
+ CompletableFuture <CompletedFileUpload > future =
141
+ new CompletableFuture <>();
142
+ TransferProgress transferProgress = Mockito .mock (TransferProgress .class );
143
+ when (transferProgress .snapshot ()).thenReturn (DefaultTransferProgressSnapshot .builder ()
144
+ .transferredBytes (1000L )
145
+ .build ());
146
+ UploadFileRequest request = uploadFileRequest ();
147
+
148
+ S3MetaRequestPauseObservable observable = new S3MetaRequestPauseObservable ();
149
+ CrtRuntimeException exception = new CrtRuntimeException ("exception" );
150
+ when (metaRequest .pause ()).thenThrow (exception );
151
+ observable .subscribe (metaRequest );
152
+
153
+ DefaultFileUpload fileUpload =
154
+ new DefaultFileUpload (future , transferProgress , observable , request );
155
+
156
+ assertThatThrownBy (() -> fileUpload .pause ()).isSameAs (exception );
157
+ }
158
+
159
+ @ Test
160
+ void pause_futureNotComplete_shouldPause () {
161
+ CompletableFuture <CompletedFileUpload > future =
162
+ new CompletableFuture <>();
163
+ TransferProgress transferProgress = Mockito .mock (TransferProgress .class );
164
+ when (transferProgress .snapshot ()).thenReturn (DefaultTransferProgressSnapshot .builder ()
165
+ .transferredBytes (0L )
166
+ .build ());
167
+ S3MetaRequestPauseObservable observable = new S3MetaRequestPauseObservable ();
168
+ when (metaRequest .pause ()).thenReturn (TOKEN );
169
+ UploadFileRequest request = uploadFileRequest ();
170
+
171
+ DefaultFileUpload fileUpload =
172
+ new DefaultFileUpload (future , transferProgress , observable , request );
173
+
174
+ observable .subscribe (metaRequest );
175
+
176
+ ResumableFileUpload resumableFileUpload = fileUpload .pause ();
177
+ Mockito .verify (metaRequest ).pause ();
178
+ assertThat (resumableFileUpload .totalNumOfParts ()).hasValue (10 );
179
+ assertThat (resumableFileUpload .partSizeInBytes ()).hasValue (8 * MB );
180
+ assertThat (resumableFileUpload .multipartUploadId ()).hasValue ("someId" );
181
+ assertThat (resumableFileUpload .fileLength ()).isEqualTo (file .length ());
182
+ assertThat (resumableFileUpload .uploadFileRequest ()).isEqualTo (request );
183
+ assertThat (resumableFileUpload .fileLastModified ()).isEqualTo (Instant .ofEpochMilli (file .lastModified ()));
184
+ }
185
+
186
+ @ Test
187
+ void pause_singlePart_shouldPause () {
188
+ PutObjectResponse putObjectResponse = PutObjectResponse .builder ()
189
+ .build ();
190
+ CompletableFuture <CompletedFileUpload > future =
191
+ new CompletableFuture <>();
192
+ TransferProgress transferProgress = Mockito .mock (TransferProgress .class );
193
+ when (transferProgress .snapshot ()).thenReturn (DefaultTransferProgressSnapshot .builder ()
194
+ .sdkResponse (putObjectResponse )
195
+ .transferredBytes (0L )
196
+ .build ());
197
+ S3MetaRequestPauseObservable observable = new S3MetaRequestPauseObservable ();
198
+ when (metaRequest .pause ()).thenThrow (new CrtRuntimeException (6 ));
199
+ UploadFileRequest request = uploadFileRequest ();
200
+
201
+ DefaultFileUpload fileUpload =
202
+ new DefaultFileUpload (future , transferProgress , observable , request );
203
+
204
+ observable .subscribe (metaRequest );
205
+
206
+ ResumableFileUpload resumableFileUpload = fileUpload .pause ();
207
+ Mockito .verify (metaRequest ).pause ();
208
+ assertThat (resumableFileUpload .totalNumOfParts ()).isEmpty ();
209
+ assertThat (resumableFileUpload .partSizeInBytes ()).isEmpty ();
210
+ assertThat (resumableFileUpload .multipartUploadId ()).isEmpty ();
211
+ assertThat (resumableFileUpload .fileLength ()).isEqualTo (file .length ());
212
+ assertThat (resumableFileUpload .uploadFileRequest ()).isEqualTo (request );
213
+ assertThat (resumableFileUpload .fileLastModified ()).isEqualTo (Instant .ofEpochMilli (file .lastModified ()));
214
+ }
215
+
216
+ private UploadFileRequest uploadFileRequest () {
217
+ return UploadFileRequest .builder ()
218
+ .source (file )
219
+ .putObjectRequest (p -> p .key ("test" ).bucket ("bucket" ))
220
+ .build ();
221
+ }
32
222
}
0 commit comments