@Override protected void validateMetadata(BlobMetadata metadata) throws IOException { if (!isMacOSX()) { super.validateMetadata(metadata); } }
@Override public Void apply(Blob from) { try { validateMetadata(from.getMetadata(), container, name); assertEquals(md5Supplier(from.getPayload()), oneHundredOneConstitutionsMD5); checkContentDisposition(from, expectedContentDisposition); } catch (IOException e) { Throwables.propagate(e); } return null; }
@Override public Void call() throws Exception { try { Blob blob = view.getBlobStore().getBlob(container, name); validateMetadata(blob.getMetadata(), container, name); assertEquals(hashAndClose(blob.getPayload().openStream(), md5()), supplier.hash(md5())); } catch (IOException e) { Throwables.propagate(e); } return null; } }));
@Test(groups = { "integration", "live" }) public void testGetRange() throws InterruptedException, IOException { String container = getContainerName(); try { String name = "apples"; addObjectAndValidateContent(container, name); Blob blob1 = view.getBlobStore().getBlob(container, name, range(0, 5)); validateMetadata(blob1.getMetadata(), container, name); assertEquals(getContentAsStringOrNullAndClose(blob1), TEST_STRING.substring(0, 6)); Blob blob2 = view.getBlobStore().getBlob(container, name, range(6, TEST_STRING.length())); validateMetadata(blob2.getMetadata(), container, name); assertEquals(getContentAsStringOrNullAndClose(blob2), TEST_STRING.substring(6, TEST_STRING.length())); } finally { returnContainer(container); } }
@Test(groups = { "integration", "live" }) public void testGetTwoRanges() throws InterruptedException, IOException { String container = getContainerName(); try { String name = "apples"; addObjectAndValidateContent(container, name); Blob blob = view.getBlobStore().getBlob(container, name, range(0, 5).range(6, TEST_STRING.length())); validateMetadata(blob.getMetadata(), container, name); assertEquals(getContentAsStringOrNullAndClose(blob), TEST_STRING); } finally { returnContainer(container); } }
@Test(groups = { "integration", "live" }) public void testGetTwoRanges() throws InterruptedException, IOException { String container = getContainerName(); try { String name = "apples"; addObjectAndValidateContent(container, name); Blob blob = view.getBlobStore().getBlob(container, name, range(0, 5).range(6, TEST_STRING.length())); validateMetadata(blob.getMetadata(), container, name); assertEquals(getContentAsStringOrNullAndClose(blob), TEST_STRING); } finally { returnContainer(container); } }
@Test(groups = { "integration", "live" }) public void testGetRange() throws InterruptedException, IOException { String container = getContainerName(); try { String name = "apples"; addObjectAndValidateContent(container, name); Blob blob1 = view.getBlobStore().getBlob(container, name, range(0, 5)); validateMetadata(blob1.getMetadata(), container, name); assertEquals(getContentAsStringOrNullAndClose(blob1), TEST_STRING.substring(0, 6)); assertThat(blob1.getAllHeaders().get(HttpHeaders.CONTENT_RANGE)).containsExactly("bytes 0-5/46"); Blob blob2 = view.getBlobStore().getBlob(container, name, range(6, TEST_STRING.length())); validateMetadata(blob2.getMetadata(), container, name); assertEquals(getContentAsStringOrNullAndClose(blob2), TEST_STRING.substring(6, TEST_STRING.length())); assertThat(blob2.getAllHeaders().get(HttpHeaders.CONTENT_RANGE)).containsExactly("bytes 6-45/46"); /* RFC 2616 14.35.1 "If the entity is shorter than the specified suffix-length, the entire entity-body is used." */ Blob blob3 = view.getBlobStore().getBlob(container, name, new GetOptions().tail(TEST_STRING.length() + 10)); validateMetadata(blob3.getMetadata(), container, name); assertEquals(getContentAsStringOrNullAndClose(blob3), TEST_STRING); // not all providers return Content-Range for non-partial responses } finally { returnContainer(container); } }
@Test(groups = { "integration", "live" }) public void testMetadata() throws InterruptedException, IOException { String name = "hello"; // NOTE all metadata in jclouds comes out as lowercase, in an effort to // normalize the // providers. Blob blob = view.getBlobStore().blobBuilder(name).userMetadata(ImmutableMap.of("Adrian", "powderpuff")) .payload(TEST_STRING).contentType(MediaType.TEXT_PLAIN).calculateMD5().build(); String container = getContainerName(); try { assertNull(view.getBlobStore().blobMetadata(container, "powderpuff")); addBlobToContainer(container, blob); Blob newObject = validateContent(container, name); BlobMetadata metadata = newObject.getMetadata(); validateMetadata(metadata); validateMetadata(metadata, container, name); validateMetadata(view.getBlobStore().blobMetadata(container, name)); // write 2 items with the same name to ensure that provider doesn't // accept dupes blob.getMetadata().getUserMetadata().put("Adrian", "wonderpuff"); blob.getMetadata().getUserMetadata().put("Adrian", "powderpuff"); addBlobToContainer(container, blob); validateMetadata(view.getBlobStore().blobMetadata(container, name)); } finally { returnContainer(container); } }
validateMetadata(metadata); validateMetadata(metadata, container, name); validateMetadata(view.getBlobStore().blobMetadata(container, name)); addBlobToContainer(container, blob); awaitConsistency(); validateMetadata(view.getBlobStore().blobMetadata(container, name));
@Test(groups = { "integration", "live" }) public void testPutObjectStream() throws InterruptedException, IOException, ExecutionException { PayloadBlobBuilder blobBuilder = view.getBlobStore().blobBuilder("streaming").payload( new ByteSourcePayload(ByteSource.wrap("foo".getBytes()))); addContentMetadata(blobBuilder); Blob blob = blobBuilder.build(); String container = getContainerName(); try { assertNotNull(view.getBlobStore().putBlob(container, blob)); awaitConsistency(); blob = view.getBlobStore().getBlob(container, blob.getMetadata().getName()); String returnedString = getContentAsStringOrNullAndClose(blob); assertEquals(returnedString, "foo"); validateMetadata(blob.getMetadata(), container, blob.getMetadata().getName()); checkContentMetadata(blob); PageSet<? extends StorageMetadata> set = view.getBlobStore().list(container); assert set.size() == 1 : set; } finally { returnContainer(container); } }
@Test(groups = { "integration", "live" }, dataProvider = "putTests") public void testPutObject(String name, String type, Object content, Object realObject) throws InterruptedException, IOException { PayloadBlobBuilder blobBuilder = view.getBlobStore().blobBuilder(name).payload(Payloads.newPayload(content)) .contentType(type); addContentMetadata(blobBuilder); if (content instanceof InputStream) { blobBuilder.calculateMD5(); } Blob blob = blobBuilder.build(); String container = getContainerName(); try { assertNotNull(view.getBlobStore().putBlob(container, blob)); blob = view.getBlobStore().getBlob(container, blob.getMetadata().getName()); validateMetadata(blob.getMetadata(), container, name); checkContentMetadata(blob); String returnedString = getContentAsStringOrNullAndClose(blob); assertEquals(returnedString, realObject); PageSet<? extends StorageMetadata> set = view.getBlobStore().list(container); assert set.size() == 1 : set; } finally { returnContainer(container); } }
@Test(groups = { "integration", "live" }, dataProvider = "putTests") public void testPutObject(String name, String type, Object content, Object realObject) throws InterruptedException, IOException { PayloadBlobBuilder blobBuilder = view.getBlobStore().blobBuilder(name).payload(Payloads.newPayload(content)) .contentType(type); addContentMetadata(blobBuilder); Blob blob = blobBuilder.build(); String container = getContainerName(); try { assertNotNull(view.getBlobStore().putBlob(container, blob)); awaitConsistency(); blob = view.getBlobStore().getBlob(container, blob.getMetadata().getName()); validateMetadata(blob.getMetadata(), container, name); checkContentMetadata(blob); String returnedString = getContentAsStringOrNullAndClose(blob); assertEquals(returnedString, realObject); PageSet<? extends StorageMetadata> set = view.getBlobStore().list(container); assert set.size() == 1 : set; } finally { returnContainer(container); } }
@Test(groups = { "integration", "live" }) public void testPutObjectStream() throws InterruptedException, IOException, ExecutionException { PayloadBlobBuilder blobBuilder = view.getBlobStore().blobBuilder("streaming").payload( new StreamingPayload(new WriteTo() { @Override public void writeTo(OutputStream outstream) throws IOException { outstream.write("foo".getBytes()); } })); addContentMetadata(blobBuilder); Blob blob = blobBuilder.build(); String container = getContainerName(); try { assertNotNull(view.getBlobStore().putBlob(container, blob)); blob = view.getBlobStore().getBlob(container, blob.getMetadata().getName()); String returnedString = getContentAsStringOrNullAndClose(blob); assertEquals(returnedString, "foo"); validateMetadata(blob.getMetadata(), container, blob.getMetadata().getName()); checkContentMetadata(blob); PageSet<? extends StorageMetadata> set = view.getBlobStore().list(container); assert set.size() == 1 : set; } finally { returnContainer(container); } }
Closeables2.closeQuietly(is); validateMetadata(blob.getMetadata(), container, blob.getMetadata().getName()); checkContentMetadata(blob); checkUserMetadata(blob.getMetadata().getUserMetadata(), userMetadata);
@Test(groups = { "integration", "live" }) public void testGetRangeMultipart() throws InterruptedException, IOException { String container = getContainerName(); InputStream expect = null; InputStream actual = null; try { String name = "apples"; long length = getMinimumMultipartBlobSize(); ByteSource byteSource = TestUtils.randomByteSource().slice(0, length); Blob blob = view.getBlobStore().blobBuilder(name) .payload(byteSource) .contentLength(length) .build(); view.getBlobStore().putBlob(container, blob, new PutOptions().multipart(true)); blob = view.getBlobStore().getBlob(container, name, range(0, 5)); validateMetadata(blob.getMetadata(), container, name); expect = byteSource.slice(0, 6).openStream(); actual = blob.getPayload().openStream(); assertThat(actual).hasContentEqualTo(expect); } finally { Closeables2.closeQuietly(expect); Closeables2.closeQuietly(actual); returnContainer(container); } }