blob: cda138c24a1fed0792ec41ec1a2da7a565b10949 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.filesystem.integration;
import static org.jclouds.filesystem.util.Utils.isMacOSX;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import static org.assertj.core.api.Assertions.assertThat;
import com.google.common.collect.ImmutableList;
import com.google.common.hash.Hasher;
import com.google.common.hash.Hashing;
import com.google.common.io.BaseEncoding;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.blobstore.domain.BlobMetadata;
import org.jclouds.blobstore.domain.MultipartPart;
import org.jclouds.blobstore.domain.MultipartUpload;
import org.jclouds.blobstore.domain.Tier;
import org.jclouds.blobstore.BlobStore;
import org.jclouds.blobstore.integration.internal.BaseBlobIntegrationTest;
import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest;
import org.jclouds.blobstore.options.PutOptions;
import org.jclouds.filesystem.reference.FilesystemConstants;
import org.jclouds.filesystem.utils.TestUtils;
import org.jclouds.io.Payload;
import org.jclouds.io.Payloads;
import org.testng.annotations.Test;
import org.testng.SkipException;
@Test(groups = { "integration" }, singleThreaded = true, testName = "blobstore.FilesystemBlobIntegrationTest")
public class FilesystemBlobIntegrationTest extends BaseBlobIntegrationTest {
public FilesystemBlobIntegrationTest() {
provider = "filesystem";
BaseBlobStoreIntegrationTest.SANITY_CHECK_RETURNED_BUCKET_NAME = true;
}
@Override
protected Properties setupProperties() {
Properties props = super.setupProperties();
props.setProperty(FilesystemConstants.PROPERTY_BASEDIR, TestUtils.TARGET_BASE_DIR);
return props;
}
// Mac OS X HFS+ does not support UserDefinedFileAttributeView:
// https://bugs.openjdk.java.net/browse/JDK-8030048
@Override
public void checkContentMetadata(Blob blob) {
if (!isMacOSX()) {
super.checkContentMetadata(blob);
}
}
// Mac OS X HFS+ does not support UserDefinedFileAttributeView:
// https://bugs.openjdk.java.net/browse/JDK-8030048
@Override
protected void checkContentDisposition(Blob blob, String contentDisposition) {
if (!isMacOSX()) {
super.checkContentDisposition(blob, contentDisposition);
}
}
// Mac OS X HFS+ does not support UserDefinedFileAttributeView:
// https://bugs.openjdk.java.net/browse/JDK-8030048
@Override
protected void validateMetadata(BlobMetadata metadata) throws IOException {
if (!isMacOSX()) {
super.validateMetadata(metadata);
}
}
// Mac OS X HFS+ does not support UserDefinedFileAttributeView:
// https://bugs.openjdk.java.net/browse/JDK-8030048
@Test(dataProvider = "ignoreOnMacOSX")
@Override
public void testCreateBlobWithExpiry() throws InterruptedException {
super.testCreateBlobWithExpiry();
}
/*
* Java on OS X does not support extended attributes, which the filesystem
* backend uses to implement user metadata
*/
@Override
protected void checkUserMetadata(Map<String, String> userMetadata1, Map<String, String> userMetadata2) {
if (!isMacOSX()) {
super.checkUserMetadata(userMetadata1, userMetadata2);
}
}
@Override
protected void testPutBlobTierHelper(Tier tier, PutOptions options) throws Exception {
checkExtendedAttributesSupport();
super.testPutBlobTierHelper(tier, options);
}
@Override
public void testSetBlobAccess() throws Exception {
throw new SkipException("filesystem does not support anonymous access");
}
@Override
protected void checkMPUParts(Blob blob, List<MultipartPart> partsList) {
assertThat(blob.getMetadata().getETag()).endsWith(String.format("-%d\"", partsList.size()));
Hasher eTagHasher = Hashing.md5().newHasher();
for (MultipartPart part : partsList) {
eTagHasher.putBytes(BaseEncoding.base16().lowerCase().decode(part.partETag()));
}
String expectedETag = new StringBuilder("\"")
.append(eTagHasher.hash())
.append("-")
.append(partsList.size())
.append("\"")
.toString();
assertThat(blob.getMetadata().getETag()).isEqualTo(expectedETag);
}
@Test(groups = { "integration", "live" })
public void testMultipartUploadMultiplePartsKnownETag() throws Exception {
BlobStore blobStore = view.getBlobStore();
String container = getContainerName();
// Pre-computed ETag returned by AWS S3 for the MPU consisting of two 5MB parts filled with 'b'
String expectedETag = "\"84462a16f6a60478d50148808aa609c1-2\"";
int partSize = 5 * 1024 * 1024;
try {
String name = "blob-name";
BlobBuilder blobBuilder = blobStore.blobBuilder(name);
Blob blob = blobBuilder.build();
MultipartUpload mpu = blobStore.initiateMultipartUpload(container, blob.getMetadata(), new PutOptions());
byte[] content = new byte[partSize];
Arrays.fill(content, (byte) 'b');
Payload payload = Payloads.newByteArrayPayload(content);
payload.getContentMetadata().setContentLength((long) partSize);
MultipartPart part1 = blobStore.uploadMultipartPart(mpu, 1, payload);
MultipartPart part2 = blobStore.uploadMultipartPart(mpu, 2, payload);
blobStore.completeMultipartUpload(mpu, ImmutableList.of(part1, part2));
BlobMetadata newBlobMetadata = blobStore.blobMetadata(container, name);
assertThat(newBlobMetadata.getETag()).isEqualTo(expectedETag);
} finally {
returnContainer(container);
}
}
protected void checkExtendedAttributesSupport() {
if (isMacOSX()) {
throw new SkipException("filesystem does not support extended attributes in Mac OSX");
}
}
}