|
26 | 26 | */
|
27 | 27 | package com.emc.object.s3;
|
28 | 28 |
|
29 |
| -import com.emc.object.s3.bean.GetObjectResult; |
30 |
| -import com.emc.object.s3.bean.MultipartPart; |
31 |
| -import com.emc.object.s3.bean.MultipartPartETag; |
32 |
| -import com.emc.object.s3.bean.Upload; |
| 29 | +import com.emc.object.s3.bean.*; |
33 | 30 | import com.emc.object.s3.jersey.S3JerseyClient;
|
34 | 31 | import com.emc.object.s3.lfu.LargeFileMultipartSource;
|
35 | 32 | import com.emc.object.s3.lfu.LargeFileUpload;
|
36 | 33 | import com.emc.object.s3.lfu.LargeFileUploaderResumeContext;
|
37 | 34 | import com.emc.object.s3.lfu.PartMismatchException;
|
38 |
| -import com.emc.object.s3.request.AbortMultipartUploadRequest; |
39 |
| -import com.emc.object.s3.request.GetObjectRequest; |
40 |
| -import com.emc.object.s3.request.ListMultipartUploadsRequest; |
41 |
| -import com.emc.object.s3.request.UploadPartRequest; |
| 35 | +import com.emc.object.s3.request.*; |
42 | 36 | import com.emc.object.util.ProgressListener;
|
43 | 37 | import com.emc.rest.util.StreamUtil;
|
44 | 38 | import com.emc.util.RandomInputStream;
|
@@ -170,37 +164,75 @@ public void testLargeFileUploaderProgressListener() throws Exception {
|
170 | 164 | }
|
171 | 165 |
|
172 | 166 | @Test
|
173 |
| - public void testLFUCopy() { |
| 167 | + public void testLFUCopy() throws Exception { |
| 168 | + // enable versioning on the bucket |
| 169 | + client.setBucketVersioning(getTestBucket(), new VersioningConfiguration().withStatus(VersioningConfiguration.Status.Enabled)); |
| 170 | + |
174 | 171 | String srcKey = "lfu-source.bin";
|
175 | 172 | String dstKey = "lfu-single-copy.bin";
|
176 |
| - String dstKey2 = "lfu-multipart-copy.bin"; |
177 |
| - |
178 | 173 | byte[] data = new byte[(int) MockMultipartSource.totalSize];
|
179 | 174 | new Random().nextBytes(data);
|
| 175 | + String srcMD5Sum = DigestUtils.md5Hex(data); |
| 176 | + client.putObject(getTestBucket(), srcKey, data, null); |
| 177 | + String versionId0 = client.listVersions(getTestBucket(), null).getVersions().get(0).getVersionId(); |
| 178 | + S3ObjectMetadata sourceMetadata0 = client.getObjectMetadata(new GetObjectMetadataRequest(getTestBucket(), srcKey).withVersionId(versionId0)); |
| 179 | + Assert.assertEquals(MockMultipartSource.totalSize, sourceMetadata0.getContentLength().longValue()); |
| 180 | + Assert.assertEquals(srcMD5Sum, sourceMetadata0.getETag()); |
| 181 | + |
| 182 | + //Upload new Version Object |
| 183 | + new Random().nextBytes(data); |
| 184 | + String srcMD5SumNew = DigestUtils.md5Hex(data); |
180 | 185 | client.putObject(getTestBucket(), srcKey, data, null);
|
181 |
| - S3ObjectMetadata sourceMetadata = client.getObjectMetadata(getTestBucket(), srcKey); |
182 |
| - Assert.assertEquals(MockMultipartSource.totalSize, sourceMetadata.getContentLength().longValue()); |
| 186 | + String versionId1 = client.listVersions(getTestBucket(), null).getVersions().get(0).getVersionId(); |
| 187 | + S3ObjectMetadata sourceMetadata1 = client.getObjectMetadata(new GetObjectMetadataRequest(getTestBucket(), srcKey).withVersionId(versionId1)); |
| 188 | + Assert.assertEquals(MockMultipartSource.totalSize, sourceMetadata1.getContentLength().longValue()); |
| 189 | + Assert.assertEquals(srcMD5SumNew, sourceMetadata1.getETag()); |
183 | 190 |
|
184 |
| - //Single Copy |
| 191 | + //Single Copy from old version object |
185 | 192 | S3ObjectMetadata objectMetadata = new S3ObjectMetadata().addUserMetadata("key", "value");
|
186 | 193 | LargeFileUploader uploader = new TestLargeFileUploader(client, getTestBucket(), srcKey, getTestBucket(), dstKey)
|
| 194 | + .withObjectMetadata(objectMetadata) |
| 195 | + .withSourceVersionId(versionId0); |
| 196 | + uploader.upload(); |
| 197 | + Assert.assertEquals(0, uploader.getBytesTransferred()); |
| 198 | + Assert.assertEquals(srcMD5Sum, uploader.getETag()); |
| 199 | + Assert.assertEquals(MockMultipartSource.totalSize, client.getObjectMetadata(getTestBucket(), dstKey).getContentLength().longValue()); |
| 200 | + Assert.assertEquals(objectMetadata.getUserMetadata(), client.getObjectMetadata(getTestBucket(), dstKey).getUserMetadata()); |
| 201 | + |
| 202 | + //Single Copy from new version object (without providing version Id) |
| 203 | + uploader = new TestLargeFileUploader(client, getTestBucket(), srcKey, getTestBucket(), dstKey) |
187 | 204 | .withObjectMetadata(objectMetadata);
|
188 | 205 | uploader.upload();
|
189 | 206 | Assert.assertEquals(0, uploader.getBytesTransferred());
|
190 |
| - Assert.assertEquals(sourceMetadata.getETag(), uploader.getETag()); |
| 207 | + Assert.assertEquals(srcMD5SumNew, uploader.getETag()); |
| 208 | + Assert.assertEquals(MockMultipartSource.totalSize, client.getObjectMetadata(getTestBucket(), dstKey).getContentLength().longValue()); |
| 209 | + Assert.assertEquals(objectMetadata.getUserMetadata(), client.getObjectMetadata(getTestBucket(), dstKey).getUserMetadata()); |
| 210 | + |
| 211 | + //Multi Part Copy from old version object |
| 212 | + uploader = new TestLargeFileUploader(client, getTestBucket(), srcKey, getTestBucket(), dstKey) |
| 213 | + .withObjectMetadata(objectMetadata) |
| 214 | + .withPartSize(MockMultipartSource.partSize) |
| 215 | + .withMpuThreshold(MockMultipartSource.partSize) |
| 216 | + .withSourceVersionId(versionId0); |
| 217 | + uploader.upload(); |
| 218 | + Assert.assertEquals(0, uploader.getBytesTransferred()); |
| 219 | + Assert.assertTrue(uploader.getETag().contains("-")); // hyphen signifies multipart / updated object |
191 | 220 | Assert.assertEquals(MockMultipartSource.totalSize, client.getObjectMetadata(getTestBucket(), dstKey).getContentLength().longValue());
|
192 | 221 | Assert.assertEquals(objectMetadata.getUserMetadata(), client.getObjectMetadata(getTestBucket(), dstKey).getUserMetadata());
|
| 222 | + Assert.assertEquals(srcMD5Sum, DigestUtils.md5Hex(client.getObject(getTestBucket(), dstKey).getObject())); |
193 | 223 |
|
194 |
| - //Multi Part Copy |
195 |
| - LargeFileUploader uploader2 = new TestLargeFileUploader(client, getTestBucket(), srcKey, getTestBucket(), dstKey2) |
| 224 | + //Multi Part Copy from new version object |
| 225 | + uploader = new TestLargeFileUploader(client, getTestBucket(), srcKey, getTestBucket(), dstKey) |
196 | 226 | .withObjectMetadata(objectMetadata)
|
197 | 227 | .withPartSize(MockMultipartSource.partSize)
|
198 |
| - .withMpuThreshold(MockMultipartSource.partSize); |
199 |
| - uploader2.upload(); |
200 |
| - Assert.assertEquals(0, uploader2.getBytesTransferred()); |
201 |
| - Assert.assertTrue(uploader2.getETag().contains("-")); // hyphen signifies multipart / updated object |
202 |
| - Assert.assertEquals(MockMultipartSource.totalSize, client.getObjectMetadata(getTestBucket(), dstKey2).getContentLength().longValue()); |
203 |
| - Assert.assertEquals(objectMetadata.getUserMetadata(), client.getObjectMetadata(getTestBucket(), dstKey2).getUserMetadata()); |
| 228 | + .withMpuThreshold(MockMultipartSource.partSize) |
| 229 | + .withSourceVersionId(versionId1); |
| 230 | + uploader.upload(); |
| 231 | + Assert.assertEquals(0, uploader.getBytesTransferred()); |
| 232 | + Assert.assertTrue(uploader.getETag().contains("-")); // hyphen signifies multipart / updated object |
| 233 | + Assert.assertEquals(MockMultipartSource.totalSize, client.getObjectMetadata(getTestBucket(), dstKey).getContentLength().longValue()); |
| 234 | + Assert.assertEquals(objectMetadata.getUserMetadata(), client.getObjectMetadata(getTestBucket(), dstKey).getUserMetadata()); |
| 235 | + Assert.assertEquals(srcMD5SumNew, DigestUtils.md5Hex(client.getObject(getTestBucket(), dstKey).getObject())); |
204 | 236 | }
|
205 | 237 |
|
206 | 238 | @Test
|
@@ -244,7 +276,7 @@ public void testLFUCopyPauseResume() throws Exception {
|
244 | 276 | .withResumeContext(resumeContext);
|
245 | 277 | lfu.doMultipartUpload();
|
246 | 278 |
|
247 |
| - // Unfortunately, MPU Etag is not preserved even if copy parts matches the original multipart upload. |
| 279 | + // Unfortunately, MPU ETag is not preserved even if copy parts matches the original multipart upload. |
248 | 280 | // So the content verification is done by calculating md5sum instead of checking ETag.
|
249 | 281 | //Assert.assertEquals(mockMultipartSource.getMpuETag(), client.getObjectMetadata(getTestBucket(), dstKey).getETag());
|
250 | 282 | Assert.assertEquals(DigestUtils.md5Hex(client.getObject(getTestBucket(), srcKey).getObject()), DigestUtils.md5Hex(client.getObject(getTestBucket(), dstKey).getObject()));
|
|
0 commit comments