JCLOUDS-1281: Improve Swift DLO tests

Add DynamicLargeObjectApiLiveTest to Rackspace Cloud Files suite and
use correct regionId so that tests pass.  Also remove duplicative
test.
This commit is contained in:
Andrew Gaul 2017-11-07 09:41:11 -08:00
parent eaf3c779dc
commit 9dc85ecaab
4 changed files with 135 additions and 74 deletions

View File

@ -20,91 +20,70 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.jclouds.io.Payloads.newByteSourcePayload;
import static org.testng.Assert.assertNotNull;
import java.io.IOException;
import org.jclouds.blobstore.BlobStore;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.openstack.swift.v1.blobstore.RegionScopedBlobStoreContext;
import org.jclouds.openstack.swift.v1.domain.ObjectList;
import org.jclouds.openstack.swift.v1.domain.SwiftObject;
import org.jclouds.openstack.swift.v1.internal.BaseSwiftApiLiveTest;
import org.jclouds.openstack.swift.v1.options.ListContainerOptions;
import org.jclouds.utils.TestUtils;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableMap;
import com.google.common.io.ByteSource;
@Test(groups = "live", testName = "DynamicLargeObjectApiLiveTest", singleThreaded = true)
public class DynamicLargeObjectApiLiveTest extends BaseSwiftApiLiveTest {
private String defaultName = getClass().getSimpleName();
private String containerName = getClass().getSimpleName();
private static final ByteSource megOf1s = TestUtils.randomByteSource().slice(0, 1024 * 1024);
private static final ByteSource megOf2s = TestUtils.randomByteSource().slice(0, 1024 * 1024);
private String objectName = "myObject";
private String name = "foo";
@Test
public void testReplaceManifest() throws Exception {
@Override
@BeforeClass(groups = "live")
public void setup() {
super.setup();
for (String regionId : regions) {
assertReplaceManifest(regionId, defaultName);
uploadLargeFile(regionId);
getApi().getContainerApi(regionId).create(containerName);
}
}
@AfterClass(groups = "live")
public void tearDown() {
for (String regionId : regions) {
deleteAllObjectsInContainer(regionId, containerName);
getApi().getContainerApi(regionId).deleteIfEmpty(containerName);
}
}
@SuppressWarnings("deprecation")
@Test
public void uploadLargeFile(String regionId) throws IOException, InterruptedException {
long total_size = 0;
RegionScopedBlobStoreContext ctx = RegionScopedBlobStoreContext.class.cast(view);
BlobStore blobStore = ctx.getBlobStore();
String defaultContainerName = getContainerName();
// configure the blobstore to use multipart uploading of the file
for (int partNumber = 0; partNumber < 3; partNumber++) {
String objName = String.format("%s/%s/%s", objectName, "dlo", partNumber);
String data = "data" + partNumber;
ByteSource payload = ByteSource.wrap(data.getBytes(Charsets.UTF_8));
Blob blob = blobStore.blobBuilder(objName)
.payload(payload)
.build();
String etag = blobStore.putBlob(defaultContainerName, blob);
assertNotNull(etag);
total_size += data.length();
protected void assertReplaceManifest() throws Exception {
for (String regionId : regions) {
ObjectApi objectApi = getApi().getObjectApi(regionId, containerName);
String etag1s = objectApi.put(name + "/1", newByteSourcePayload(megOf1s));
awaitConsistency();
assertMegabyteAndETagMatches(regionId, containerName, name + "/1", etag1s);
String etag2s = objectApi.put(name + "/2", newByteSourcePayload(megOf2s));
awaitConsistency();
assertMegabyteAndETagMatches(regionId, containerName, name + "/2", etag2s);
awaitConsistency();
String etagOfEtags = getApi().getDynamicLargeObjectApi(regionId, containerName).putManifest(name,
ImmutableMap.of("myfoo", "Bar"));
assertNotNull(etagOfEtags);
awaitConsistency();
SwiftObject bigObject = getApi().getObjectApi(regionId, containerName).get(name);
assertThat(bigObject.getPayload().getContentMetadata().getContentLength()).isEqualTo(Long.valueOf(2 * 1024L * 1024L));
assertThat(bigObject.getMetadata()).isEqualTo(ImmutableMap.of("myfoo", "Bar"));
// segments are visible
assertThat(getApi().getContainerApi(regionId).get(containerName).getObjectCount()).isEqualTo(Long.valueOf(3));
}
getApi().getDynamicLargeObjectApi(regionId, defaultContainerName).putManifest(objectName,
ImmutableMap.of("myfoo", "Bar"));
SwiftObject bigObject = getApi().getObjectApi(regionId, defaultContainerName).get(objectName);
assertThat(bigObject.getETag()).isEqualTo("54bc1337d7a51660c40db39759cc1944");
assertThat(bigObject.getPayload().getContentMetadata().getContentLength()).isEqualTo(total_size);
assertThat(getApi().getContainerApi(regionId).get(defaultContainerName).getObjectCount()).isEqualTo(Long.valueOf(4));
}
@SuppressWarnings("deprecation")
protected void assertReplaceManifest(String regionId, String name) throws InterruptedException {
String containerName = getContainerName();
ObjectApi objectApi = getApi().getObjectApi(regionId, containerName);
String etag1s = objectApi.put(name + "/1", newByteSourcePayload(megOf1s));
awaitConsistency();
assertMegabyteAndETagMatches(regionId, containerName, name + "/1", etag1s);
String etag2s = objectApi.put(name + "/2", newByteSourcePayload(megOf2s));
awaitConsistency();
assertMegabyteAndETagMatches(regionId, containerName, name + "/2", etag2s);
awaitConsistency();
String etagOfEtags = getApi().getDynamicLargeObjectApi(regionId, containerName).putManifest(name,
ImmutableMap.of("myfoo", "Bar"));
assertNotNull(etagOfEtags);
awaitConsistency();
SwiftObject bigObject = getApi().getObjectApi(regionId, containerName).get(name);
assertThat(bigObject.getPayload().getContentMetadata().getContentLength()).isEqualTo(Long.valueOf(2 * 1024L * 1024L));
assertThat(bigObject.getMetadata()).isEqualTo(ImmutableMap.of("myfoo", "Bar"));
// segments are visible
assertThat(getApi().getContainerApi(regionId).get(containerName).getObjectCount()).isEqualTo(Long.valueOf(3));
}
protected void assertMegabyteAndETagMatches(String regionId, String containerName, String name, String etag1s) {
@ -112,15 +91,4 @@ public class DynamicLargeObjectApiLiveTest extends BaseSwiftApiLiveTest {
assertThat(object1s.getETag()).isEqualTo(etag1s);
assertThat(object1s.getPayload().getContentMetadata().getContentLength()).isEqualTo(Long.valueOf(1024L * 1024L));
}
protected void deleteAllObjectsInContainerDLO(String regionId, final String containerName) {
ObjectList objects = getApi().getObjectApi(regionId, containerName).list(new ListContainerOptions());
if (objects == null) {
return;
}
for (SwiftObject object : objects) {
String name = containerName + "/" + object.getName();
getApi().getObjectApi(regionId, containerName).delete(name);
}
}
}

View File

@ -0,0 +1,31 @@
/*
* 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.rackspace.cloudfiles.v1.features;
import org.jclouds.openstack.swift.v1.features.DynamicLargeObjectApiLiveTest;
import org.testng.annotations.Test;
/**
* Tests the live behavior of the OpenStack Object Storage {@link DynamicLargeObjectApi}
* via the {@link CloudFilesApi}.
*/
@Test(groups = "live", testName = "CloudFilesDynamicLargeObjectApiLiveTest")
public class CloudFilesDynamicLargeObjectApiLiveTest extends DynamicLargeObjectApiLiveTest {
public CloudFilesDynamicLargeObjectApiLiveTest() {
provider = "rackspace-cloudfiles";
}
}

View File

@ -0,0 +1,31 @@
/*
* 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.rackspace.cloudfiles.uk.features;
import org.jclouds.rackspace.cloudfiles.v1.features.CloudFilesDynamicLargeObjectApiLiveTest;
import org.testng.annotations.Test;
/**
* Tests the live behavior of the OpenStack Object Storage {@link DynamicLargeObjectApi}
* via the {@link CloudFilesApi}.
*/
@Test(groups = "live", testName = "CloudFilesUKDynamicLargeObjectApiLiveTest")
public final class CloudFilesUKDynamicLargeObjectApiLiveTest extends CloudFilesDynamicLargeObjectApiLiveTest {
public CloudFilesUKDynamicLargeObjectApiLiveTest() {
provider = "rackspace-cloudfiles-uk";
}
}

View File

@ -0,0 +1,31 @@
/*
* 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.rackspace.cloudfiles.us.features;
import org.jclouds.rackspace.cloudfiles.v1.features.CloudFilesDynamicLargeObjectApiLiveTest;
import org.testng.annotations.Test;
/**
* Tests the live behavior of the OpenStack Object Storage {@link DynamicLargeObjectApi}
* via the {@link CloudFilesApi}.
*/
@Test(groups = "live", testName = "CloudFilesUSDynamicLargeObjectApiLiveTest")
public final class CloudFilesUSDynamicLargeObjectApiLiveTest extends CloudFilesDynamicLargeObjectApiLiveTest {
public CloudFilesUSDynamicLargeObjectApiLiveTest() {
provider = "rackspace-cloudfiles-us";
}
}