18
18
import software .amazon .awssdk .awscore .exception .AwsServiceException ;
19
19
import software .amazon .awssdk .core .sync .RequestBody ;
20
20
import software .amazon .awssdk .services .s3 .S3Client ;
21
- import software .amazon .awssdk .services .s3 .model .PutObjectRequest ;
22
- import software .amazon .awssdk .services .s3 .model .PutObjectResponse ;
21
+ import software .amazon .awssdk .services .s3 .model .*;
23
22
24
23
import java .io .IOException ;
25
24
import java .nio .file .Files ;
@@ -102,15 +101,101 @@ void shouldNotUploadDataIfAWSUpset(@TempDir Path tempDir) throws IOException, In
102
101
Mockito .when (sharingRoot .toString ()).thenReturn (tempDir .toString ());
103
102
Mockito .when (hpds .writePhenotypicData (q )).thenReturn (true );
104
103
Mockito .when (s3 .buildClientForSite ("bch" )).thenReturn (Optional .of (s3Client ));
105
- Mockito .when (s3Client .putObject (Mockito .any (PutObjectRequest . class ), Mockito . any ( RequestBody .class )))
104
+ Mockito .when (s3Client .createMultipartUpload (Mockito .any (CreateMultipartUploadRequest .class )))
106
105
.thenThrow (AwsServiceException .builder ().build ());
107
106
108
107
subject .uploadData (q , DataType .Phenotypic , "bch" );
109
108
110
- Mockito .verify (statusService , Mockito .times (1 )).setPhenotypicStatus (q , UploadStatus .Querying );
111
- Mockito .verify (statusService , Mockito .times (1 )).setPhenotypicStatus (q , UploadStatus .Uploading );
112
- Mockito .verify (s3Client , Mockito .times (1 )).putObject (Mockito .any (PutObjectRequest .class ), Mockito .any (RequestBody .class ));
113
- Mockito .verify (statusService , Mockito .times (1 )).setPhenotypicStatus (q , UploadStatus .Error );
109
+ Mockito .verify (statusService , Mockito .times (1 )).
110
+ setPhenotypicStatus (q , UploadStatus .Querying );
111
+ Mockito .verify (statusService , Mockito .times (1 )).
112
+ setPhenotypicStatus (q , UploadStatus .Uploading );
113
+ Mockito .verify (s3Client , Mockito .times (1 ))
114
+ .createMultipartUpload (Mockito .any (CreateMultipartUploadRequest .class ));
115
+ Mockito .verify (statusService , Mockito .times (1 )).
116
+ setPhenotypicStatus (q , UploadStatus .Error );
117
+ Mockito .verify (uploadLock , Mockito .times (1 )).acquire ();
118
+ Mockito .verify (uploadLock , Mockito .times (1 )).release ();
119
+ }
120
+
121
+ @ Test
122
+ void shouldNotUploadDataIfAWSUploadFails (@ TempDir Path tempDir ) throws IOException , InterruptedException {
123
+ Query q = new Query ();
124
+ q .setPicSureId ("my-id" );
125
+ q .setId ("my-id" );
126
+
127
+ Files .createDirectory (Path .of (tempDir .toString (), q .getPicSureId ()));
128
+ Files .writeString (Path .of (tempDir .toString (), q .getPicSureId (), DataType .Phenotypic .fileName ), ":)" );
129
+ ReflectionTestUtils .setField (subject , "roleARNs" , roleARNs );
130
+ CreateMultipartUploadResponse createResp = Mockito .mock (CreateMultipartUploadResponse .class );
131
+ Mockito .when (createResp .uploadId ()).thenReturn ("frank" );
132
+
133
+ Mockito .when (sharingRoot .toString ()).thenReturn (tempDir .toString ());
134
+ Mockito .when (hpds .writePhenotypicData (q )).thenReturn (true );
135
+ Mockito .when (s3 .buildClientForSite ("bch" )).thenReturn (Optional .of (s3Client ));
136
+ Mockito .when (s3Client .createMultipartUpload (Mockito .any (CreateMultipartUploadRequest .class )))
137
+ .thenReturn (createResp );
138
+ Mockito .when (s3Client .uploadPart (Mockito .any (UploadPartRequest .class ), Mockito .any (RequestBody .class )))
139
+ .thenThrow (AwsServiceException .builder ().build ());
140
+
141
+ subject .uploadData (q , DataType .Phenotypic , "bch" );
142
+
143
+ Mockito .verify (statusService , Mockito .times (1 )).
144
+ setPhenotypicStatus (q , UploadStatus .Querying );
145
+ Mockito .verify (statusService , Mockito .times (1 )).
146
+ setPhenotypicStatus (q , UploadStatus .Uploading );
147
+ Mockito .verify (s3Client , Mockito .times (1 ))
148
+ .createMultipartUpload (Mockito .any (CreateMultipartUploadRequest .class ));
149
+ Mockito .verify (s3Client , Mockito .times (1 ))
150
+ .uploadPart (Mockito .any (UploadPartRequest .class ), Mockito .any (RequestBody .class ));
151
+ Mockito .verify (statusService , Mockito .times (1 )).
152
+ setPhenotypicStatus (q , UploadStatus .Error );
153
+ Mockito .verify (uploadLock , Mockito .times (1 )).acquire ();
154
+ Mockito .verify (uploadLock , Mockito .times (1 )).release ();
155
+ }
156
+
157
+ @ Test
158
+ void shouldNotUploadDataWhenCompleteFails (@ TempDir Path tempDir ) throws IOException , InterruptedException {
159
+ Query q = new Query ();
160
+ q .setPicSureId ("my-id" );
161
+ q .setId ("my-id" );
162
+
163
+ Path fileToUpload = Path .of (tempDir .toString (), q .getPicSureId (), DataType .Phenotypic .fileName );
164
+ Files .createDirectory (Path .of (tempDir .toString (), q .getPicSureId ()));
165
+ Files .writeString (fileToUpload , ":)" );
166
+ ReflectionTestUtils .setField (subject , "roleARNs" , roleARNs );
167
+
168
+ CreateMultipartUploadResponse createResp = Mockito .mock (CreateMultipartUploadResponse .class );
169
+ Mockito .when (createResp .uploadId ()).thenReturn ("frank" );
170
+ UploadPartResponse uploadResp = Mockito .mock (UploadPartResponse .class );
171
+ Mockito .when (uploadResp .eTag ()).thenReturn ("gus" );
172
+
173
+ Mockito .when (sharingRoot .toString ()).thenReturn (tempDir .toString ());
174
+ Mockito .when (hpds .writePhenotypicData (q )).thenReturn (true );
175
+ Mockito .when (s3 .buildClientForSite ("bch" )).thenReturn (Optional .of (s3Client ));
176
+ Mockito .when (s3Client .uploadPart (Mockito .any (UploadPartRequest .class ), Mockito .any (RequestBody .class )))
177
+ .thenReturn (uploadResp );
178
+ Mockito .when (s3Client .createMultipartUpload (Mockito .any (CreateMultipartUploadRequest .class )))
179
+ .thenReturn (createResp );
180
+ Mockito .when (s3Client .completeMultipartUpload (Mockito .any (CompleteMultipartUploadRequest .class )))
181
+ .thenThrow (AwsServiceException .builder ().build ());
182
+
183
+
184
+ subject .uploadData (q , DataType .Phenotypic , "bch" );
185
+
186
+ Mockito .verify (statusService , Mockito .times (1 ))
187
+ .setPhenotypicStatus (q , UploadStatus .Querying );
188
+ Mockito .verify (statusService , Mockito .times (1 ))
189
+ .setPhenotypicStatus (q , UploadStatus .Uploading );
190
+ Mockito .verify (s3Client , Mockito .times (1 ))
191
+ .createMultipartUpload (Mockito .any (CreateMultipartUploadRequest .class ));
192
+ Mockito .verify (s3Client , Mockito .times (1 ))
193
+ .completeMultipartUpload (Mockito .any (CompleteMultipartUploadRequest .class ));
194
+ Mockito .verify (s3Client , Mockito .times (1 ))
195
+ .uploadPart (Mockito .any (UploadPartRequest .class ), Mockito .any (RequestBody .class ));
196
+ Mockito .verify (statusService , Mockito .times (1 ))
197
+ .setPhenotypicStatus (q , UploadStatus .Error );
198
+ Assertions .assertFalse (Files .exists (fileToUpload ));
114
199
Mockito .verify (uploadLock , Mockito .times (1 )).acquire ();
115
200
Mockito .verify (uploadLock , Mockito .times (1 )).release ();
116
201
}
@@ -126,18 +211,34 @@ void shouldUploadData(@TempDir Path tempDir) throws IOException, InterruptedExce
126
211
Files .writeString (fileToUpload , ":)" );
127
212
ReflectionTestUtils .setField (subject , "roleARNs" , roleARNs );
128
213
214
+ CreateMultipartUploadResponse createResp = Mockito .mock (CreateMultipartUploadResponse .class );
215
+ Mockito .when (createResp .uploadId ()).thenReturn ("frank" );
216
+ UploadPartResponse uploadResp = Mockito .mock (UploadPartResponse .class );
217
+ Mockito .when (uploadResp .eTag ()).thenReturn ("gus" );
218
+
129
219
Mockito .when (sharingRoot .toString ()).thenReturn (tempDir .toString ());
130
220
Mockito .when (hpds .writePhenotypicData (q )).thenReturn (true );
131
221
Mockito .when (s3 .buildClientForSite ("bch" )).thenReturn (Optional .of (s3Client ));
132
- Mockito .when (s3Client .putObject (Mockito .any (PutObjectRequest .class ), Mockito .any (RequestBody .class )))
133
- .thenReturn (Mockito .mock (PutObjectResponse .class ));
222
+ Mockito .when (s3Client .uploadPart (Mockito .any (UploadPartRequest .class ), Mockito .any (RequestBody .class )))
223
+ .thenReturn (uploadResp );
224
+ Mockito .when (s3Client .createMultipartUpload (Mockito .any (CreateMultipartUploadRequest .class )))
225
+ .thenReturn (createResp );
226
+
134
227
135
228
subject .uploadData (q , DataType .Phenotypic , "bch" );
136
229
137
- Mockito .verify (statusService , Mockito .times (1 )).setPhenotypicStatus (q , UploadStatus .Querying );
138
- Mockito .verify (statusService , Mockito .times (1 )).setPhenotypicStatus (q , UploadStatus .Uploading );
139
- Mockito .verify (s3Client , Mockito .times (1 )).putObject (Mockito .any (PutObjectRequest .class ), Mockito .any (RequestBody .class ));
140
- Mockito .verify (statusService , Mockito .times (1 )).setPhenotypicStatus (q , UploadStatus .Uploaded );
230
+ Mockito .verify (statusService , Mockito .times (1 ))
231
+ .setPhenotypicStatus (q , UploadStatus .Querying );
232
+ Mockito .verify (statusService , Mockito .times (1 ))
233
+ .setPhenotypicStatus (q , UploadStatus .Uploading );
234
+ Mockito .verify (s3Client , Mockito .times (1 ))
235
+ .createMultipartUpload (Mockito .any (CreateMultipartUploadRequest .class ));
236
+ Mockito .verify (s3Client , Mockito .times (1 ))
237
+ .completeMultipartUpload (Mockito .any (CompleteMultipartUploadRequest .class ));
238
+ Mockito .verify (s3Client , Mockito .times (1 ))
239
+ .uploadPart (Mockito .any (UploadPartRequest .class ), Mockito .any (RequestBody .class ));
240
+ Mockito .verify (statusService , Mockito .times (1 ))
241
+ .setPhenotypicStatus (q , UploadStatus .Uploaded );
141
242
Assertions .assertFalse (Files .exists (fileToUpload ));
142
243
Mockito .verify (uploadLock , Mockito .times (1 )).acquire ();
143
244
Mockito .verify (uploadLock , Mockito .times (1 )).release ();
0 commit comments